Author: sebb
Date: Sat Sep 17 10:48:04 2011
New Revision: 1171944

URL: http://svn.apache.org/viewvc?rev=1171944&view=rev
Log:
Bug 47921 - Variables not released for GC after JMeterThread exits.

Modified:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/Controller.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/GenericController.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/AbstractThreadGroup.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/Controller.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/Controller.java?rev=1171944&r1=1171943&r2=1171944&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/Controller.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/Controller.java Sat 
Sep 17 10:48:04 2011
@@ -56,4 +56,10 @@ public interface Controller extends Test
      * Called to initialize a controller at the beginning of a test iteration.
      */
     public void initialize();
+
+    /**
+     * Unregister IterationListener
+     * @param iterationListener {@link LoopIterationListener}
+     */
+    public void removeIterationListener(LoopIterationListener 
iterationListener);
 }

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/GenericController.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/GenericController.java?rev=1171944&r1=1171943&r2=1171944&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/GenericController.java 
(original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/control/GenericController.java 
Sat Sep 17 10:48:04 2011
@@ -333,6 +333,20 @@ public class GenericController extends A
          */
         iterationListeners.addFirst(lis);
     }
+    
+    /**
+     * Remove listener
+     */
+    public void removeIterationListener(LoopIterationListener 
iterationListener) {
+        for (Iterator<LoopIterationListener> iterator = 
iterationListeners.iterator(); iterator.hasNext();) {
+            LoopIterationListener listener = iterator.next();
+            if(listener == iterationListener)
+            {
+                iterator.remove();
+                break; // can only match once
+            }
+        }
+    }
 
     protected void fireIterEvents() {
         if (isFirst()) {

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/AbstractThreadGroup.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/AbstractThreadGroup.java?rev=1171944&r1=1171943&r2=1171944&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/AbstractThreadGroup.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/AbstractThreadGroup.java
 Sat Sep 17 10:48:04 2011
@@ -111,6 +111,11 @@ public abstract class AbstractThreadGrou
     public void addIterationListener(LoopIterationListener lis) {
         getSamplerController().addIterationListener(lis);
     }
+    
+    /** {@inheritDoc} */
+    public void removeIterationListener(LoopIterationListener 
iterationListener) {
+        getSamplerController().removeIterationListener(iterationListener);
+    }
 
     /** {@inheritDoc} */
     public void initialize() {

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java?rev=1171944&r1=1171943&r2=1171944&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterContext.java 
Sat Sep 17 10:48:04 2011
@@ -65,6 +65,7 @@ public class JMeterContext {
         samplingStarted = false;
         threadNum = 0;
         readBuffer = null;
+        thread = null;
     }
 
     /**

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java?rev=1171944&r1=1171943&r2=1171944&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java 
Sat Sep 17 10:48:04 2011
@@ -239,8 +239,10 @@ public class JMeterThread implements Run
     public void run() {
         // threadContext is not thread-safe, so keep within thread
         JMeterContext threadContext = JMeterContextService.getContext();
+        LoopIterationListener iterationListener=null;
+
         try {
-            initRun(threadContext);
+            iterationListener = initRun(threadContext);
             while (running) {
                 Sampler firstSampler = controller.next();
                 Sampler sam = firstSampler;
@@ -299,7 +301,7 @@ public class JMeterThread implements Run
         } finally {
             threadContext.clear();
             log.info("Thread finished: " + threadName);
-            threadFinished();
+            threadFinished(iterationListener);
             monitor.threadFinished(this); // Tell the engine we are done
             JMeterContextService.removeContext(); // Remove the ThreadLocal 
entry
         }
@@ -470,9 +472,10 @@ public class JMeterThread implements Run
 
     /**
      * @param threadContext
+     * @return 
      *
      */
-    private void initRun(JMeterContext threadContext) {
+    private IterationListener initRun(JMeterContext threadContext) {
         threadContext.setVariables(threadVars);
         threadContext.setThreadNum(getThreadNum());
         threadContext.getVariables().put(LAST_SAMPLE_OK, TRUE);
@@ -496,11 +499,13 @@ public class JMeterThread implements Run
             threadContext.setSamplingStarted(true);
         }
         controller.initialize();
-        controller.addIterationListener(new IterationListener());
+        IterationListener iterationListener = new IterationListener();
+        controller.addIterationListener(iterationListener);
         if (!startEarlier) {
             threadContext.setSamplingStarted(true);
         }
         threadStarted();
+        return iterationListener;
     }
 
     private void threadStarted() {
@@ -514,7 +519,7 @@ public class JMeterThread implements Run
         testTree.traverse(startup); // call ThreadListener.threadStarted()
     }
 
-    private void threadFinished() {
+    private void threadFinished(LoopIterationListener iterationListener) {
         ThreadListenerTraverser shut = new ThreadListenerTraverser(false);
         testTree.traverse(shut); // call ThreadListener.threadFinished()
         JMeterContextService.decrNumberOfThreads();
@@ -523,6 +528,9 @@ public class JMeterThread implements Run
         if (gp != null){// check there is a GUI
             gp.getMainFrame().updateCounts();
         }
+        if (iterationListener != null) { // probably not possible, but check 
anyway
+            controller.removeIterationListener(iterationListener);
+        }
     }
 
     private static class ThreadListenerTraverser implements HashTreeTraverser {
@@ -708,7 +716,7 @@ public class JMeterThread implements Run
         }
     }
 
-    private void notifyTestListeners() {
+    void notifyTestListeners() {
         threadVars.incIteration();
         Iterator<TestListener> iter = testListeners.iterator();
         while (iter.hasNext()) {

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1171944&r1=1171943&r2=1171944&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Sat Sep 17 10:48:04 2011
@@ -118,6 +118,7 @@ This can be overridden by setting the JM
 <ul>
 <li>Bug 51831 - Cannot disable UDP server or change the maximum UDP port</li>
 <li>Bug 51821 - Add short-cut for Enabling / Disabling (sub)tree or branches 
in test plan.</li>
+<li>Bug 47921 - Variables not released for GC after JMeterThread exits.</li>
 </ul>
 
 <!-- ==================================================== -->



---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@jakarta.apache.org
For additional commands, e-mail: notifications-h...@jakarta.apache.org

Reply via email to