diff options
author | Marc R. Hoffmann <hoffmann@mountainminds.com> | 2015-12-04 18:36:41 +0100 |
---|---|---|
committer | Marc R. Hoffmann <hoffmann@mountainminds.com> | 2015-12-04 18:36:41 +0100 |
commit | 12164ffe369af12b0d34f828f6fe0358c01a4efc (patch) | |
tree | 930f9ea3499f0698e48a52aded8fb5d4e767f0d7 | |
parent | fd06abc547af2b2fffa788318759708e3c57fe0e (diff) | |
download | jacoco-12164ffe369af12b0d34f828f6fe0358c01a4efc.tar.gz |
GitHub #364: Avoid ConcurrentModificationException during shutdown.
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> |