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: [email protected]
For additional commands, e-mail: [email protected]