You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2012/02/17 16:15:33 UTC
svn commit: r1245602 - in /jmeter/trunk:
src/components/org/apache/jmeter/visualizers/
src/core/org/apache/jmeter/util/ src/core/org/apache/jmeter/visualizers/
xdocs/
Author: pmouawad
Date: Fri Feb 17 15:15:33 2012
New Revision: 1245602
URL: http://svn.apache.org/viewvc?rev=1245602&view=rev
Log:
Bug 52694 - Deadlock in GUI related to non AWT Threads updating GUI
Modified:
jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java
jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
jmeter/trunk/xdocs/changes.xml
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java Fri Feb 17 15:15:33 2012
@@ -50,14 +50,18 @@ public class AssertionVisualizer extends
}
public void add(SampleResult sample) {
- StringBuilder sb = new StringBuilder(100);
+ final StringBuilder sb = new StringBuilder(100);
sb.append(sample.getSampleLabel());
sb.append(getAssertionResult(sample));
sb.append("\n"); // $NON-NLS-1$
- synchronized (textArea) {
- textArea.append(sb.toString());
- textArea.setCaretPosition(textArea.getText().length());
- }
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ synchronized (textArea) {
+ textArea.append(sb.toString());
+ textArea.setCaretPosition(textArea.getText().length());
+ }
+ }
+ });
}
public void clearData() {
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java Fri Feb 17 15:15:33 2012
@@ -58,13 +58,16 @@ public class ComparisonVisualizer extend
init();
}
- public void add(SampleResult sample) {
-
- DefaultMutableTreeNode currNode = new DefaultMutableTreeNode(sample);
- treeModel.insertNodeInto(currNode, root, root.getChildCount());
- if (root.getChildCount() == 1) {
- resultsTree.expandPath(new TreePath(root));
- }
+ public void add(final SampleResult sample) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ DefaultMutableTreeNode currNode = new DefaultMutableTreeNode(sample);
+ treeModel.insertNodeInto(currNode, root, root.getChildCount());
+ if (root.getChildCount() == 1) {
+ resultsTree.expandPath(new TreePath(root));
+ }
+ }
+ });
}
public String getLabelResource() {
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java Fri Feb 17 15:15:33 2012
@@ -103,9 +103,14 @@ public class DistributionGraphVisualizer
}
}
- public synchronized void add(SampleResult res) {
- model.addSample(res);
- updateGui(model.getCurrentSample());
+ public void add(final SampleResult res) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ // made currentSample volatile
+ model.addSample(res);
+ updateGui(model.getCurrentSample());
+ }
+ });
}
public String getLabelResource() {
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java Fri Feb 17 15:15:33 2012
@@ -126,8 +126,12 @@ public class GraphVisualizer extends Abs
updateYAxis();
}
- public void add(SampleResult res) {
- updateGui(model.addSample(res));
+ public void add(final SampleResult res) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ updateGui(model.addSample(res));
+ }
+ });
}
public String getLabelResource() {
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java Fri Feb 17 15:15:33 2012
@@ -122,11 +122,16 @@ public class MailerVisualizer extends Ab
}
}
- public synchronized void add(SampleResult res) {
+ public void add(final SampleResult res) {
if (getModel() != null) {
- MailerModel model = ((MailerResultCollector) getModel()).getMailerModel();
- model.add(res);//this is a different model from the one used by the result collector
- updateVisualizer(model);
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ MailerModel model = ((MailerResultCollector) getModel()).getMailerModel();
+ // method called by add is synchronized
+ model.add(res);//this is a different model from the one used by the result collector
+ updateVisualizer(model);
+ }
+ });
}
}
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java Fri Feb 17 15:15:33 2012
@@ -91,8 +91,12 @@ public class SplineVisualizer extends Ab
setGUI();
}
- public void add(SampleResult res) {
- model.add(res);
+ public void add(final SampleResult res) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ model.add(res);
+ }
+ });
}
public String getLabelResource() {
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java Fri Feb 17 15:15:33 2012
@@ -268,8 +268,7 @@ public class StatGraphVisualizer extends
return "aggregate_graph_title"; //$NON-NLS-1$
}
- public void add(SampleResult res) {
- SamplingStatCalculator row = null;
+ public void add(final SampleResult res) {
final String sampleLabel = res.getSampleLabel();
Matcher matcher = null;
if (columnSelection.isSelected() && columnMatchLabel.getText() != null && columnMatchLabel.getText().length() > 0) {
@@ -277,17 +276,22 @@ public class StatGraphVisualizer extends
matcher = pattern.matcher(sampleLabel);
}
if ((matcher == null) || (matcher.find())) {
- synchronized (lock) {
- row = tableRows.get(sampleLabel);
- if (row == null) {
- row = new SamplingStatCalculator(sampleLabel);
- tableRows.put(row.getLabel(), row);
- model.insertRow(row, model.getRowCount() - 1);
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ SamplingStatCalculator row = null;
+ synchronized (lock) {
+ row = tableRows.get(sampleLabel);
+ if (row == null) {
+ row = new SamplingStatCalculator(sampleLabel);
+ tableRows.put(row.getLabel(), row);
+ model.insertRow(row, model.getRowCount() - 1);
+ }
+ }
+ row.addSample(res);
+ tableRows.get(TOTAL_ROW_LABEL).addSample(res);
+ model.fireTableDataChanged();
}
- }
- row.addSample(res);
- tableRows.get(TOTAL_ROW_LABEL).addSample(res);
- model.fireTableDataChanged();
+ });
}
}
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java Fri Feb 17 15:15:33 2012
@@ -163,28 +163,32 @@ public class StatVisualizer extends Abst
return "aggregate_report"; //$NON-NLS-1$
}
- public void add(SampleResult res) {
- SamplingStatCalculator row = null;
- final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());
- synchronized (lock) {
- row = tableRows.get(sampleLabel);
- if (row == null) {
- row = new SamplingStatCalculator(sampleLabel);
- tableRows.put(row.getLabel(), row);
- model.insertRow(row, model.getRowCount() - 1);
+ public void add(final SampleResult res) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ SamplingStatCalculator row = null;
+ final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());
+ synchronized (lock) {
+ row = tableRows.get(sampleLabel);
+ if (row == null) {
+ row = new SamplingStatCalculator(sampleLabel);
+ tableRows.put(row.getLabel(), row);
+ model.insertRow(row, model.getRowCount() - 1);
+ }
+ }
+ /*
+ * Synch is needed because multiple threads can update the counts.
+ */
+ synchronized(row) {
+ row.addSample(res);
+ }
+ SamplingStatCalculator tot = tableRows.get(TOTAL_ROW_LABEL);
+ synchronized(tot) {
+ tot.addSample(res);
+ }
+ model.fireTableDataChanged();
}
- }
- /*
- * Synch is needed because multiple threads can update the counts.
- */
- synchronized(row) {
- row.addSample(res);
- }
- SamplingStatCalculator tot = tableRows.get(TOTAL_ROW_LABEL);
- synchronized(tot) {
- tot.addSample(res);
- }
- model.fireTableDataChanged();
+ });
}
/**
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java Fri Feb 17 15:15:33 2012
@@ -159,28 +159,32 @@ public class SummaryReport extends Abstr
return "summary_report"; //$NON-NLS-1$
}
- public void add(SampleResult res) {
- Calculator row = null;
+ public void add(final SampleResult res) {
final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());
- synchronized (lock) {
- row = tableRows.get(sampleLabel);
- if (row == null) {
- row = new Calculator(sampleLabel);
- tableRows.put(row.getLabel(), row);
- model.insertRow(row, model.getRowCount() - 1);
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ Calculator row = null;
+ synchronized (lock) {
+ row = tableRows.get(sampleLabel);
+ if (row == null) {
+ row = new Calculator(sampleLabel);
+ tableRows.put(row.getLabel(), row);
+ model.insertRow(row, model.getRowCount() - 1);
+ }
+ }
+ /*
+ * Synch is needed because multiple threads can update the counts.
+ */
+ synchronized(row) {
+ row.addSample(res);
+ }
+ Calculator tot = tableRows.get(TOTAL_ROW_LABEL);
+ synchronized(tot) {
+ tot.addSample(res);
+ }
+ model.fireTableDataChanged();
}
- }
- /*
- * Synch is needed because multiple threads can update the counts.
- */
- synchronized(row) {
- row.addSample(res);
- }
- Calculator tot = tableRows.get(TOTAL_ROW_LABEL);
- synchronized(tot) {
- tot.addSample(res);
- }
- model.fireTableDataChanged();
+ });
}
/**
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java Fri Feb 17 15:15:33 2012
@@ -155,34 +155,38 @@ public class TableVisualizer extends Abs
deviationField.setText(Long.toString((long) calc.getStandardDeviation()));
}
- public void add(SampleResult res) {
- if (childSamples.isSelected()) {
- SampleResult[] subResults = res.getSubResults();
- if (subResults.length > 0) {
- for (SampleResult sr : subResults) {
- add(sr);
+ public void add(final SampleResult res) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ if (childSamples.isSelected()) {
+ SampleResult[] subResults = res.getSubResults();
+ if (subResults.length > 0) {
+ for (SampleResult sr : subResults) {
+ add(sr);
+ }
+ return;
+ }
+ }
+ synchronized (calc) {
+ calc.addSample(res);
+ int count = calc.getCount();
+ TableSample newS = new TableSample(
+ count,
+ res.getSampleCount(),
+ res.getStartTime(),
+ res.getThreadName(),
+ res.getSampleLabel(),
+ res.getTime(),
+ res.isSuccessful(),
+ res.getBytes());
+ model.addRow(newS);
+ }
+ updateTextFields(res);
+ if (autoscroll.isSelected()) {
+ table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));
}
- return;
}
- }
- synchronized (calc) {
- calc.addSample(res);
- int count = calc.getCount();
- TableSample newS = new TableSample(
- count,
- res.getSampleCount(),
- res.getStartTime(),
- res.getThreadName(),
- res.getSampleLabel(),
- res.getTime(),
- res.isSuccessful(),
- res.getBytes());
- model.addRow(newS);
- }
- updateTextFields(res);
- if (autoscroll.isSelected()) {
- table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));
- }
+ });
}
public synchronized void clearData() {
Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java Fri Feb 17 15:15:33 2012
@@ -122,8 +122,12 @@ implements ActionListener, TreeSelection
}
/** {@inheritDoc} */
- public void add(SampleResult sample) {
- updateGui(sample);
+ public void add(final SampleResult sample) {
+ JMeterUtils.runSafe(new Runnable() {
+ public void run() {
+ updateGui(sample);
+ }
+ });
}
/**
Modified: jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java Fri Feb 17 15:15:33 2012
@@ -27,6 +27,7 @@ import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
@@ -45,6 +46,7 @@ import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
import org.apache.commons.io.IOUtils;
import org.apache.jmeter.gui.GuiPackage;
@@ -1264,5 +1266,23 @@ public class JMeterUtils implements Unit
}
return linkedHeaders;
}
-
+
+ /**
+ * Run the runnable in AWT Thread if current thread is not AWT thread
+ * otherwise runs call {@link SwingUtilities#invokeAndWait(Runnable)}
+ * @param runnable {@link Runnable}
+ */
+ public static final void runSafe(Runnable runnable) {
+ if(SwingUtilities.isEventDispatchThread()) {
+ runnable.run();
+ } else {
+ try {
+ SwingUtilities.invokeAndWait(runnable);
+ } catch (InterruptedException e) {
+ throw new Error(e);
+ } catch (InvocationTargetException e) {
+ throw new Error(e);
+ }
+ }
+ }
}
Modified: jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java Fri Feb 17 15:15:33 2012
@@ -38,7 +38,7 @@ public class SamplingStatCalculator {
private String label;
- private Sample currentSample;
+ private volatile Sample currentSample;
public SamplingStatCalculator(){ // Only for use by test code
this("");
Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1245602&r1=1245601&r2=1245602&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Fri Feb 17 15:15:33 2012
@@ -101,6 +101,7 @@ or a Debug Sampler with all fields set t
<ul>
<li>Bug 52639 - JSplitPane divider for log panel should be hidden if log is not activated</li>
<li>Bug 52672 - Change Controller action deletes all but one child samplers</li>
+<li>Bug 52694 - Deadlock in GUI related to non AWT Threads updating GUI</li>
</ul>
<!-- =================== Improvements =================== -->
Re: svn commit: r1245602 - in /jmeter/trunk: src/components/org/apache/jmeter/visualizers/
src/core/org/apache/jmeter/util/ src/core/org/apache/jmeter/visualizers/ xdocs/
Posted by sebb <se...@gmail.com>.
On 17 February 2012 15:15, <pm...@apache.org> wrote:
> Author: pmouawad
> Date: Fri Feb 17 15:15:33 2012
> New Revision: 1245602
>
> URL: http://svn.apache.org/viewvc?rev=1245602&view=rev
> Log:
> Bug 52694 - Deadlock in GUI related to non AWT Threads updating GUI
>
> Modified:
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java
> jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
> jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
> jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
> jmeter/trunk/xdocs/changes.xml
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/AssertionVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -50,14 +50,18 @@ public class AssertionVisualizer extends
> }
>
> public void add(SampleResult sample) {
> - StringBuilder sb = new StringBuilder(100);
> + final StringBuilder sb = new StringBuilder(100);
> sb.append(sample.getSampleLabel());
> sb.append(getAssertionResult(sample));
> sb.append("\n"); // $NON-NLS-1$
> - synchronized (textArea) {
> - textArea.append(sb.toString());
> - textArea.setCaretPosition(textArea.getText().length());
> - }
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + synchronized (textArea) {
> + textArea.append(sb.toString());
StringBuilder is not thread-safe.
Probably won't cause an issue, but it would be safer to convert to
String which is passed to the runnable.
> + textArea.setCaretPosition(textArea.getText().length());
> + }
> + }
> + });
> }
>
> public void clearData() {
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/ComparisonVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -58,13 +58,16 @@ public class ComparisonVisualizer extend
> init();
> }
>
> - public void add(SampleResult sample) {
> -
> - DefaultMutableTreeNode currNode = new DefaultMutableTreeNode(sample);
> - treeModel.insertNodeInto(currNode, root, root.getChildCount());
> - if (root.getChildCount() == 1) {
> - resultsTree.expandPath(new TreePath(root));
> - }
> + public void add(final SampleResult sample) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + DefaultMutableTreeNode currNode = new DefaultMutableTreeNode(sample);
> + treeModel.insertNodeInto(currNode, root, root.getChildCount());
> + if (root.getChildCount() == 1) {
> + resultsTree.expandPath(new TreePath(root));
> + }
> + }
> + });
> }
>
> public String getLabelResource() {
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/DistributionGraphVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -103,9 +103,14 @@ public class DistributionGraphVisualizer
> }
> }
>
> - public synchronized void add(SampleResult res) {
> - model.addSample(res);
> - updateGui(model.getCurrentSample());
> + public void add(final SampleResult res) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + // made currentSample volatile
> + model.addSample(res);
> + updateGui(model.getCurrentSample());
> + }
> + });
> }
>
> public String getLabelResource() {
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/GraphVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -126,8 +126,12 @@ public class GraphVisualizer extends Abs
> updateYAxis();
> }
>
> - public void add(SampleResult res) {
> - updateGui(model.addSample(res));
> + public void add(final SampleResult res) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + updateGui(model.addSample(res));
> + }
> + });
> }
>
> public String getLabelResource() {
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/MailerVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -122,11 +122,16 @@ public class MailerVisualizer extends Ab
> }
> }
>
> - public synchronized void add(SampleResult res) {
> + public void add(final SampleResult res) {
> if (getModel() != null) {
> - MailerModel model = ((MailerResultCollector) getModel()).getMailerModel();
> - model.add(res);//this is a different model from the one used by the result collector
> - updateVisualizer(model);
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + MailerModel model = ((MailerResultCollector) getModel()).getMailerModel();
> + // method called by add is synchronized
> + model.add(res);//this is a different model from the one used by the result collector
> + updateVisualizer(model);
> + }
> + });
> }
> }
>
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/SplineVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -91,8 +91,12 @@ public class SplineVisualizer extends Ab
> setGUI();
> }
>
> - public void add(SampleResult res) {
> - model.add(res);
> + public void add(final SampleResult res) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + model.add(res);
> + }
> + });
> }
>
> public String getLabelResource() {
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatGraphVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -268,8 +268,7 @@ public class StatGraphVisualizer extends
> return "aggregate_graph_title"; //$NON-NLS-1$
> }
>
> - public void add(SampleResult res) {
> - SamplingStatCalculator row = null;
> + public void add(final SampleResult res) {
> final String sampleLabel = res.getSampleLabel();
> Matcher matcher = null;
> if (columnSelection.isSelected() && columnMatchLabel.getText() != null && columnMatchLabel.getText().length() > 0) {
> @@ -277,17 +276,22 @@ public class StatGraphVisualizer extends
> matcher = pattern.matcher(sampleLabel);
> }
> if ((matcher == null) || (matcher.find())) {
> - synchronized (lock) {
> - row = tableRows.get(sampleLabel);
> - if (row == null) {
> - row = new SamplingStatCalculator(sampleLabel);
> - tableRows.put(row.getLabel(), row);
> - model.insertRow(row, model.getRowCount() - 1);
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + SamplingStatCalculator row = null;
> + synchronized (lock) {
> + row = tableRows.get(sampleLabel);
> + if (row == null) {
> + row = new SamplingStatCalculator(sampleLabel);
> + tableRows.put(row.getLabel(), row);
> + model.insertRow(row, model.getRowCount() - 1);
> + }
> + }
> + row.addSample(res);
> + tableRows.get(TOTAL_ROW_LABEL).addSample(res);
> + model.fireTableDataChanged();
> }
> - }
> - row.addSample(res);
> - tableRows.get(TOTAL_ROW_LABEL).addSample(res);
> - model.fireTableDataChanged();
> + });
> }
> }
>
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/StatVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -163,28 +163,32 @@ public class StatVisualizer extends Abst
> return "aggregate_report"; //$NON-NLS-1$
> }
>
> - public void add(SampleResult res) {
> - SamplingStatCalculator row = null;
> - final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());
> - synchronized (lock) {
> - row = tableRows.get(sampleLabel);
> - if (row == null) {
> - row = new SamplingStatCalculator(sampleLabel);
> - tableRows.put(row.getLabel(), row);
> - model.insertRow(row, model.getRowCount() - 1);
> + public void add(final SampleResult res) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + SamplingStatCalculator row = null;
> + final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());
> + synchronized (lock) {
> + row = tableRows.get(sampleLabel);
> + if (row == null) {
> + row = new SamplingStatCalculator(sampleLabel);
> + tableRows.put(row.getLabel(), row);
> + model.insertRow(row, model.getRowCount() - 1);
> + }
> + }
> + /*
> + * Synch is needed because multiple threads can update the counts.
> + */
> + synchronized(row) {
> + row.addSample(res);
> + }
> + SamplingStatCalculator tot = tableRows.get(TOTAL_ROW_LABEL);
> + synchronized(tot) {
> + tot.addSample(res);
> + }
> + model.fireTableDataChanged();
> }
> - }
> - /*
> - * Synch is needed because multiple threads can update the counts.
> - */
> - synchronized(row) {
> - row.addSample(res);
> - }
> - SamplingStatCalculator tot = tableRows.get(TOTAL_ROW_LABEL);
> - synchronized(tot) {
> - tot.addSample(res);
> - }
> - model.fireTableDataChanged();
> + });
> }
>
> /**
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/SummaryReport.java Fri Feb 17 15:15:33 2012
> @@ -159,28 +159,32 @@ public class SummaryReport extends Abstr
> return "summary_report"; //$NON-NLS-1$
> }
>
> - public void add(SampleResult res) {
> - Calculator row = null;
> + public void add(final SampleResult res) {
> final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());
> - synchronized (lock) {
> - row = tableRows.get(sampleLabel);
> - if (row == null) {
> - row = new Calculator(sampleLabel);
> - tableRows.put(row.getLabel(), row);
> - model.insertRow(row, model.getRowCount() - 1);
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + Calculator row = null;
> + synchronized (lock) {
> + row = tableRows.get(sampleLabel);
> + if (row == null) {
> + row = new Calculator(sampleLabel);
> + tableRows.put(row.getLabel(), row);
> + model.insertRow(row, model.getRowCount() - 1);
> + }
> + }
> + /*
> + * Synch is needed because multiple threads can update the counts.
> + */
> + synchronized(row) {
> + row.addSample(res);
> + }
> + Calculator tot = tableRows.get(TOTAL_ROW_LABEL);
> + synchronized(tot) {
> + tot.addSample(res);
> + }
> + model.fireTableDataChanged();
> }
> - }
> - /*
> - * Synch is needed because multiple threads can update the counts.
> - */
> - synchronized(row) {
> - row.addSample(res);
> - }
> - Calculator tot = tableRows.get(TOTAL_ROW_LABEL);
> - synchronized(tot) {
> - tot.addSample(res);
> - }
> - model.fireTableDataChanged();
> + });
> }
>
> /**
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/TableVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -155,34 +155,38 @@ public class TableVisualizer extends Abs
> deviationField.setText(Long.toString((long) calc.getStandardDeviation()));
> }
>
> - public void add(SampleResult res) {
> - if (childSamples.isSelected()) {
> - SampleResult[] subResults = res.getSubResults();
> - if (subResults.length > 0) {
> - for (SampleResult sr : subResults) {
> - add(sr);
> + public void add(final SampleResult res) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + if (childSamples.isSelected()) {
> + SampleResult[] subResults = res.getSubResults();
> + if (subResults.length > 0) {
> + for (SampleResult sr : subResults) {
> + add(sr);
> + }
> + return;
> + }
> + }
> + synchronized (calc) {
> + calc.addSample(res);
> + int count = calc.getCount();
> + TableSample newS = new TableSample(
> + count,
> + res.getSampleCount(),
> + res.getStartTime(),
> + res.getThreadName(),
> + res.getSampleLabel(),
> + res.getTime(),
> + res.isSuccessful(),
> + res.getBytes());
> + model.addRow(newS);
> + }
> + updateTextFields(res);
> + if (autoscroll.isSelected()) {
> + table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));
> }
> - return;
> }
> - }
> - synchronized (calc) {
> - calc.addSample(res);
> - int count = calc.getCount();
> - TableSample newS = new TableSample(
> - count,
> - res.getSampleCount(),
> - res.getStartTime(),
> - res.getThreadName(),
> - res.getSampleLabel(),
> - res.getTime(),
> - res.isSuccessful(),
> - res.getBytes());
> - model.addRow(newS);
> - }
> - updateTextFields(res);
> - if (autoscroll.isSelected()) {
> - table.scrollRectToVisible(table.getCellRect(table.getRowCount() - 1, 0, true));
> - }
> + });
> }
>
> public synchronized void clearData() {
>
> Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (original)
> +++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java Fri Feb 17 15:15:33 2012
> @@ -122,8 +122,12 @@ implements ActionListener, TreeSelection
> }
>
> /** {@inheritDoc} */
> - public void add(SampleResult sample) {
> - updateGui(sample);
> + public void add(final SampleResult sample) {
> + JMeterUtils.runSafe(new Runnable() {
> + public void run() {
> + updateGui(sample);
> + }
> + });
> }
>
> /**
>
> Modified: jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java Fri Feb 17 15:15:33 2012
> @@ -27,6 +27,7 @@ import java.io.FileInputStream;
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.InputStreamReader;
> +import java.lang.reflect.InvocationTargetException;
> import java.net.InetAddress;
> import java.net.URL;
> import java.net.UnknownHostException;
> @@ -45,6 +46,7 @@ import javax.swing.ImageIcon;
> import javax.swing.JButton;
> import javax.swing.JComboBox;
> import javax.swing.JOptionPane;
> +import javax.swing.SwingUtilities;
>
> import org.apache.commons.io.IOUtils;
> import org.apache.jmeter.gui.GuiPackage;
> @@ -1264,5 +1266,23 @@ public class JMeterUtils implements Unit
> }
> return linkedHeaders;
> }
> -
> +
> + /**
> + * Run the runnable in AWT Thread if current thread is not AWT thread
> + * otherwise runs call {@link SwingUtilities#invokeAndWait(Runnable)}
> + * @param runnable {@link Runnable}
> + */
> + public static final void runSafe(Runnable runnable) {
> + if(SwingUtilities.isEventDispatchThread()) {
> + runnable.run();
> + } else {
> + try {
> + SwingUtilities.invokeAndWait(runnable);
> + } catch (InterruptedException e) {
> + throw new Error(e);
> + } catch (InvocationTargetException e) {
> + throw new Error(e);
> + }
> + }
> + }
> }
>
> Modified: jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java
> URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java (original)
> +++ jmeter/trunk/src/core/org/apache/jmeter/visualizers/SamplingStatCalculator.java Fri Feb 17 15:15:33 2012
> @@ -38,7 +38,7 @@ public class SamplingStatCalculator {
>
> private String label;
>
> - private Sample currentSample;
> + private volatile Sample currentSample;
>
> public SamplingStatCalculator(){ // Only for use by test code
> this("");
>
> Modified: jmeter/trunk/xdocs/changes.xml
> URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1245602&r1=1245601&r2=1245602&view=diff
> ==============================================================================
> --- jmeter/trunk/xdocs/changes.xml (original)
> +++ jmeter/trunk/xdocs/changes.xml Fri Feb 17 15:15:33 2012
> @@ -101,6 +101,7 @@ or a Debug Sampler with all fields set t
> <ul>
> <li>Bug 52639 - JSplitPane divider for log panel should be hidden if log is not activated</li>
> <li>Bug 52672 - Change Controller action deletes all but one child samplers</li>
> +<li>Bug 52694 - Deadlock in GUI related to non AWT Threads updating GUI</li>
> </ul>
>
> <!-- =================== Improvements =================== -->
>
>