From 0d75631b1b5e8dbb4e259c0ae21c1551ea3ed6aa Mon Sep 17 00:00:00 2001 From: Christian Wulf <chw@informatik.uni-kiel.de> Date: Sat, 1 Aug 2015 10:12:00 +0200 Subject: [PATCH] changed algorithm order; filtered stages visiting at runtime --- ...or.java => A1ThreadableStageCollector.java} | 2 +- ...ava => A2InvalidThreadAssignmentCheck.java} | 18 ++---------------- ...antiation.java => A3PipeInstantiation.java} | 2 +- .../java/teetime/framework/StageState.java | 1 + .../java/teetime/framework/ThreadService.java | 14 +++++++------- src/main/java/teetime/framework/Traverser.java | 3 ++- 6 files changed, 14 insertions(+), 26 deletions(-) rename src/main/java/teetime/framework/{A2ThreadableStageCollector.java => A1ThreadableStageCollector.java} (92%) rename src/main/java/teetime/framework/{A3InvalidThreadAssignmentCheck.java => A2InvalidThreadAssignmentCheck.java} (78%) rename src/main/java/teetime/framework/{A1PipeInstantiation.java => A3PipeInstantiation.java} (96%) diff --git a/src/main/java/teetime/framework/A2ThreadableStageCollector.java b/src/main/java/teetime/framework/A1ThreadableStageCollector.java similarity index 92% rename from src/main/java/teetime/framework/A2ThreadableStageCollector.java rename to src/main/java/teetime/framework/A1ThreadableStageCollector.java index efe44233..d19cb065 100644 --- a/src/main/java/teetime/framework/A2ThreadableStageCollector.java +++ b/src/main/java/teetime/framework/A1ThreadableStageCollector.java @@ -5,7 +5,7 @@ import java.util.Set; import teetime.framework.pipe.IPipe; -public class A2ThreadableStageCollector implements IPipeVisitor { +public class A1ThreadableStageCollector implements IPipeVisitor { private final Set<Stage> threadableStages = new HashSet<Stage>(); private final Set<IPipe<?>> visitedPipes = new HashSet<IPipe<?>>(); diff --git a/src/main/java/teetime/framework/A3InvalidThreadAssignmentCheck.java b/src/main/java/teetime/framework/A2InvalidThreadAssignmentCheck.java similarity index 78% rename from src/main/java/teetime/framework/A3InvalidThreadAssignmentCheck.java rename to src/main/java/teetime/framework/A2InvalidThreadAssignmentCheck.java index 83840262..c04006f8 100644 --- a/src/main/java/teetime/framework/A3InvalidThreadAssignmentCheck.java +++ b/src/main/java/teetime/framework/A2InvalidThreadAssignmentCheck.java @@ -7,13 +7,13 @@ import teetime.framework.pipe.IPipe; import com.carrotsearch.hppc.ObjectIntHashMap; import com.carrotsearch.hppc.ObjectIntMap; -public class A3InvalidThreadAssignmentCheck { +public class A2InvalidThreadAssignmentCheck { private static final int DEFAULT_COLOR = 0; private final Set<Stage> threadableStages; - public A3InvalidThreadAssignmentCheck(final Set<Stage> threadableStages) { + public A2InvalidThreadAssignmentCheck(final Set<Stage> threadableStages) { this.threadableStages = threadableStages; } @@ -28,7 +28,6 @@ public class A3InvalidThreadAssignmentCheck { ThreadPainter threadPainter = new ThreadPainter(colors, color, threadableStages); Traverser traverser = new Traverser(threadPainter); traverser.traverse(threadableStage); - // threadPainter.check(threadableStage); } } @@ -45,19 +44,6 @@ public class A3InvalidThreadAssignmentCheck { this.threadableStages = threadableStages; } - // TODO consider to implement it as IPipeVisitor(FORWARD) - - // public void check(final Stage stage) { - // for (OutputPort<?> outputPort : stage.getOutputPorts()) { - // if (outputPort.pipe != DummyPipe.INSTANCE) { - // Stage nextStage = checkPipe(outputPort.pipe); - // if (nextStage != null) { - // check(nextStage); - // } - // } - // } - // } - @Override public VisitorBehavior visit(final IPipe<?> pipe) { Stage targetStage = pipe.getTargetPort().getOwningStage(); diff --git a/src/main/java/teetime/framework/A1PipeInstantiation.java b/src/main/java/teetime/framework/A3PipeInstantiation.java similarity index 96% rename from src/main/java/teetime/framework/A1PipeInstantiation.java rename to src/main/java/teetime/framework/A3PipeInstantiation.java index 3b7c8aab..1e1e38c4 100644 --- a/src/main/java/teetime/framework/A1PipeInstantiation.java +++ b/src/main/java/teetime/framework/A3PipeInstantiation.java @@ -10,7 +10,7 @@ import teetime.framework.pipe.SingleElementPipeFactory; import teetime.framework.pipe.SpScPipeFactory; import teetime.framework.pipe.UnboundedSpScPipeFactory; -public class A1PipeInstantiation implements IPipeVisitor { +public class A3PipeInstantiation implements IPipeVisitor { private static final IPipeFactory interBoundedThreadPipeFactory = new SpScPipeFactory(); private static final IPipeFactory interUnboundedThreadPipeFactory = new UnboundedSpScPipeFactory(); diff --git a/src/main/java/teetime/framework/StageState.java b/src/main/java/teetime/framework/StageState.java index 9ea6f9f3..233948a8 100644 --- a/src/main/java/teetime/framework/StageState.java +++ b/src/main/java/teetime/framework/StageState.java @@ -17,6 +17,7 @@ package teetime.framework; public enum StageState { + /** First state of a stage */ CREATED, INITIALIZED, VALIDATING, VALIDATED, diff --git a/src/main/java/teetime/framework/ThreadService.java b/src/main/java/teetime/framework/ThreadService.java index c33d9a07..a48cadd1 100644 --- a/src/main/java/teetime/framework/ThreadService.java +++ b/src/main/java/teetime/framework/ThreadService.java @@ -45,12 +45,8 @@ class ThreadService extends AbstractService<ThreadService> { // TODO visit(port) only // TODO use decorator pattern to combine all analyzes so that only one traverser pass is necessary IPortVisitor portVisitor = new A0UnconnectedPort(); - IPipeVisitor pipeVisitor = new A1PipeInstantiation(); - Traverser traversor = new Traverser(portVisitor, pipeVisitor, Direction.BOTH); - traversor.traverse(startStage); - - A2ThreadableStageCollector stageCollector = new A2ThreadableStageCollector(); - traversor = new Traverser(stageCollector, Direction.BOTH); + A1ThreadableStageCollector stageCollector = new A1ThreadableStageCollector(); + Traverser traversor = new Traverser(portVisitor, stageCollector, Direction.BOTH); traversor.traverse(startStage); threadableStages = stageCollector.getThreadableStages(); @@ -58,9 +54,13 @@ class ThreadService extends AbstractService<ThreadService> { throw new IllegalStateException("No stage was added using the addThreadableStage(..) method. Add at least one stage."); } - A3InvalidThreadAssignmentCheck checker = new A3InvalidThreadAssignmentCheck(threadableStages); + A2InvalidThreadAssignmentCheck checker = new A2InvalidThreadAssignmentCheck(threadableStages); checker.check(); + IPipeVisitor pipeVisitor = new A3PipeInstantiation(); + traversor = new Traverser(pipeVisitor, Direction.BOTH); + traversor.traverse(startStage); + A4StageAttributeSetter attributeSetter = new A4StageAttributeSetter(configuration, threadableStages); attributeSetter.setAttributes(); diff --git a/src/main/java/teetime/framework/Traverser.java b/src/main/java/teetime/framework/Traverser.java index d430e33d..ffd4cde1 100644 --- a/src/main/java/teetime/framework/Traverser.java +++ b/src/main/java/teetime/framework/Traverser.java @@ -65,7 +65,8 @@ public class Traverser { } public void traverse(final Stage stage) { - if (!visitedStages.add(stage)) { + if (!visitedStages.add(stage) || stage.getCurrentState() != StageState.CREATED) { + // do not visit (1) an already visited stage and (2) a stage that currently run (runtime visiting) return; } -- GitLab