From c06ded451794bf252d5c8471c35b61c108bb9ade Mon Sep 17 00:00:00 2001
From: Christian Wulf <chw@informatik.uni-kiel.de>
Date: Sat, 1 Aug 2015 15:11:28 +0200
Subject: [PATCH] fixed concurrency bugs

---
 .../java/teetime/framework/ThreadService.java     | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/main/java/teetime/framework/ThreadService.java b/src/main/java/teetime/framework/ThreadService.java
index 88189c89..00b46972 100644
--- a/src/main/java/teetime/framework/ThreadService.java
+++ b/src/main/java/teetime/framework/ThreadService.java
@@ -1,6 +1,7 @@
 package teetime.framework;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -23,12 +24,12 @@ class ThreadService extends AbstractService<ThreadService> {
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(ThreadService.class);
 
-	private final List<Thread> consumerThreads = new LinkedList<Thread>();
-	private final List<Thread> finiteProducerThreads = new LinkedList<Thread>();
-	private final List<Thread> infiniteProducerThreads = new LinkedList<Thread>();
+	private final List<Thread> consumerThreads = Collections.synchronizedList(new LinkedList<Thread>());
+	private final List<Thread> finiteProducerThreads = Collections.synchronizedList(new LinkedList<Thread>());
+	private final List<Thread> infiniteProducerThreads = Collections.synchronizedList(new LinkedList<Thread>());
 
 	private final SignalingCounter runnableCounter = new SignalingCounter();
-	private final Set<Stage> threadableStages = new HashSet<Stage>();
+	private final Set<Stage> threadableStages = Collections.synchronizedSet(new HashSet<Stage>());
 
 	private final Configuration configuration;
 
@@ -77,17 +78,17 @@ class ThreadService extends AbstractService<ThreadService> {
 			throw new IllegalStateException("No stage was added using the addThreadableStage(..) method. Add at least one stage.");
 		}
 
-		A2InvalidThreadAssignmentCheck checker = new A2InvalidThreadAssignmentCheck(threadableStages);
+		A2InvalidThreadAssignmentCheck checker = new A2InvalidThreadAssignmentCheck(newThreadableStages);
 		checker.check();
 
 		A3PipeInstantiation pipeVisitor = new A3PipeInstantiation();
 		traversor = new Traverser(pipeVisitor, Direction.BOTH);
 		traversor.traverse(startStage);
 
-		A4StageAttributeSetter attributeSetter = new A4StageAttributeSetter(configuration, threadableStages);
+		A4StageAttributeSetter attributeSetter = new A4StageAttributeSetter(configuration, newThreadableStages);
 		attributeSetter.setAttributes();
 
-		for (Stage stage : threadableStages) {
+		for (Stage stage : newThreadableStages) {
 			categorizeThreadableStage(stage);
 		}
 
-- 
GitLab