aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc R. Hoffmann <hoffmann@mountainminds.com>2015-12-04 18:36:41 +0100
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2015-12-04 18:36:41 +0100
commit12164ffe369af12b0d34f828f6fe0358c01a4efc (patch)
tree930f9ea3499f0698e48a52aded8fb5d4e767f0d7
parentfd06abc547af2b2fffa788318759708e3c57fe0e (diff)
downloadjacoco-12164ffe369af12b0d34f828f6fe0358c01a4efc.tar.gz
GitHub #364: Avoid ConcurrentModificationException during shutdown.
-rw-r--r--org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java14
-rw-r--r--org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java5
-rw-r--r--org.jacoco.doc/docroot/doc/changes.html2
3 files changed, 19 insertions, 2 deletions
diff --git a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java
index ba482f9b..5eb3ab07 100644
--- a/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java
+++ b/org.jacoco.core.test/src/org/jacoco/core/data/ExecutionDataStoreTest.java
@@ -64,6 +64,20 @@ public class ExecutionDataStoreTest implements IExecutionDataVisitor {
}
@Test
+ public void testReentrantAccept() {
+ final boolean[] probes = new boolean[] { false, false, true };
+ store.put(new ExecutionData(1000, "Sample0", probes));
+ store.put(new ExecutionData(1001, "Sample1", probes));
+ store.accept(new IExecutionDataVisitor() {
+ public void visitClassExecution(ExecutionData data) {
+ store.put(new ExecutionData(1002, "Sample2", probes));
+ ExecutionDataStoreTest.this.visitClassExecution(data);
+ }
+ });
+ assertEquals(2, dataOutput.size());
+ }
+
+ @Test
public void testGetContents() {
final boolean[] probes = new boolean[] {};
final ExecutionData a = new ExecutionData(1000, "A", probes);
diff --git a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
index d48ce3b5..398286d8 100644
--- a/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
+++ b/org.jacoco.core/src/org/jacoco/core/data/ExecutionDataStore.java
@@ -11,6 +11,7 @@
*******************************************************************************/
package org.jacoco.core.data;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -154,7 +155,7 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* @return current contents
*/
public Collection<ExecutionData> getContents() {
- return entries.values();
+ return new ArrayList<ExecutionData>(entries.values());
}
/**
@@ -164,7 +165,7 @@ public final class ExecutionDataStore implements IExecutionDataVisitor {
* interface to write content to
*/
public void accept(final IExecutionDataVisitor visitor) {
- for (final ExecutionData data : entries.values()) {
+ for (final ExecutionData data : getContents()) {
visitor.visitClassExecution(data);
}
}
diff --git a/org.jacoco.doc/docroot/doc/changes.html b/org.jacoco.doc/docroot/doc/changes.html
index 1fef5aa9..636244e8 100644
--- a/org.jacoco.doc/docroot/doc/changes.html
+++ b/org.jacoco.doc/docroot/doc/changes.html
@@ -33,6 +33,8 @@
<ul>
<li>Fix <code>MBeanClient</code> example
(GitHub <a href="https://github.com/jacoco/jacoco/issues/333">#333</a>).</li>
+ <li>Avoid <code>ConcurrentModificationException</code> during shutdown
+ (GitHub <a href="https://github.com/jacoco/jacoco/issues/364">#364</a>).</li>
</ul>
<h3>API Changes</h3>