GitHub #364: Avoid ConcurrentModificationException during shutdown.
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 ba482f9..5eb3ab0 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 @@
}
@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 d48ce3b..398286d 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 @@
* @return current contents
*/
public Collection<ExecutionData> getContents() {
- return entries.values();
+ return new ArrayList<ExecutionData>(entries.values());
}
/**
@@ -164,7 +165,7 @@
* 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 1fef5aa..636244e 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>