diff --git a/src/main/java/teetime/framework/AbstractRunnableStage.java b/src/main/java/teetime/framework/AbstractRunnableStage.java index 86e66379f006ecf6228614ad0787965b1e88ec93..96906facb7a1bf0eebb35e376493dd6c4a135ebe 100644 --- a/src/main/java/teetime/framework/AbstractRunnableStage.java +++ b/src/main/java/teetime/framework/AbstractRunnableStage.java @@ -32,13 +32,14 @@ abstract class AbstractRunnableStage implements Runnable { @Override public final void run() { this.logger.debug("Executing runnable stage..."); + final Stage stage = this.stage; try { beforeStageExecution(); do { executeStage(); - } while (!this.stage.shouldBeTerminated()); + } while (!stage.shouldBeTerminated()); afterStageExecution(); @@ -50,7 +51,7 @@ abstract class AbstractRunnableStage implements Runnable { throw e; } - this.logger.debug("Finished runnable stage. (" + this.stage.getId() + ")"); + this.logger.debug("Finished runnable stage. (" + stage.getId() + ")"); } protected abstract void beforeStageExecution(); diff --git a/src/main/java/teetime/framework/AbstractStage.java b/src/main/java/teetime/framework/AbstractStage.java index 12c339e67f152c75c7bf61a94660dc44f2d38320..459bce985c113b1a433c684948d0dcf874400ede 100644 --- a/src/main/java/teetime/framework/AbstractStage.java +++ b/src/main/java/teetime/framework/AbstractStage.java @@ -67,7 +67,7 @@ public abstract class AbstractStage extends Stage { if (!this.signalAlreadyReceived(signal, inputPort)) { signal.trigger(this); - for (OutputPort<?> outputPort : this.outputPortList) { + for (OutputPort<?> outputPort : outputPortList) { outputPort.sendSignal(signal); } } @@ -87,10 +87,14 @@ public abstract class AbstractStage extends Stage { */ protected boolean signalAlreadyReceived(final ISignal signal, final InputPort<?> inputPort) { if (this.triggeredSignals.contains(signal)) { - this.logger.trace("Got signal: " + signal + " again from input port: " + inputPort); + if (logger.isTraceEnabled()) { + logger.trace("Got signal: " + signal + " again from input port: " + inputPort); + } return true; } else { - this.logger.trace("Got signal: " + signal + " from input port: " + inputPort); + if (logger.isTraceEnabled()) { + logger.trace("Got signal: " + signal + " from input port: " + inputPort); + } this.triggeredSignals.add(signal); return false; } diff --git a/src/main/java/teetime/framework/RunnableConsumerStage.java b/src/main/java/teetime/framework/RunnableConsumerStage.java index 1def6debf106b609bdd40cbb4bd003ed9fb12301..fd0bff4a6bb307e17db64fb9cf06dac79a6f8120 100644 --- a/src/main/java/teetime/framework/RunnableConsumerStage.java +++ b/src/main/java/teetime/framework/RunnableConsumerStage.java @@ -15,8 +15,6 @@ */ package teetime.framework; -import java.util.Arrays; - import teetime.framework.idle.IdleStrategy; import teetime.framework.idle.YieldStrategy; import teetime.framework.pipe.IPipe; @@ -25,6 +23,8 @@ import teetime.framework.signal.ISignal; final class RunnableConsumerStage extends AbstractRunnableStage { private final IdleStrategy idleStrategy; + // cache the input ports here since getInputPorts() always returns a new copy + private final InputPort<?>[] inputPorts; /** * Creates a new instance with the {@link YieldStrategy} as default idle strategy. @@ -39,11 +39,13 @@ final class RunnableConsumerStage extends AbstractRunnableStage { public RunnableConsumerStage(final Stage stage, final IdleStrategy idleStrategy) { super(stage); this.idleStrategy = idleStrategy; + this.inputPorts = stage.getInputPorts(); // FIXME should getInputPorts() really be defined in Stage? } @Override protected void beforeStageExecution() { logger.trace("ENTRY beforeStageExecution"); + final Stage stage = this.stage; do { checkforSignals(); @@ -76,14 +78,12 @@ final class RunnableConsumerStage extends AbstractRunnableStage { @SuppressWarnings("PMD.DataflowAnomalyAnalysis") private void checkforSignals() { - // FIXME should getInputPorts() really be defined in Stage? - InputPort<?>[] inputPorts = stage.getInputPorts(); - logger.debug("Checking signals for: " + Arrays.toString(inputPorts)); + final Stage stage = this.stage; for (InputPort<?> inputPort : inputPorts) { - IPipe pipe = inputPort.getPipe(); + final IPipe pipe = inputPort.getPipe(); if (pipe instanceof AbstractInterThreadPipe) { - AbstractInterThreadPipe intraThreadPipe = (AbstractInterThreadPipe) pipe; - ISignal signal = intraThreadPipe.getSignal(); + final AbstractInterThreadPipe intraThreadPipe = (AbstractInterThreadPipe) pipe; + final ISignal signal = intraThreadPipe.getSignal(); if (null != signal) { stage.onSignal(signal, inputPort); }