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