private CompositeModuleInterpreterActor(Factory factory) { super( factory.interpreterProperties, factory.stagingArea.getAnnotatedExecutionTrace(), factory.moduleId); module = factory.module; stagingArea = factory.stagingArea; interpreterPropsProvider = factory.interpreterPropsProvider; recomputedInPorts = factory.recomputedInPorts; requestedOutPorts = factory.requestedOutPorts; int numSubmodules = module.getModules().size(); childExecutors = new ActorRef[numSubmodules]; outPortsRequiringValue = (BitSet) requestedOutPorts.clone(); childActorMap = new HashMap<>(numSubmodules); dependencyGraph = new DependencyGraph(module, requestedOutPorts); for (InPortNode inPortNode : dependencyGraph.inPortNodes()) { HasValue hasValue = factory.inPortsHasValueList.get(inPortNode.getElement().getInIndex()); assert hasValue != HasValue.PENDING_VALUE_CHECK; inPortNode.setHasValue(hasValue); } inPortReceivedMessage = new BitSet(module.getInPorts().size()); submoduleOutPortsReceivedMessage = new BitSet[numSubmodules]; for (RuntimeModule submodule : module.getModules()) { submoduleOutPortsReceivedMessage[submodule.getIndex()] = new BitSet(submodule.getOutPorts().size()); } computeResumeState = new ComputeResumeState(dependencyGraph, recomputedInPorts, this::asynchronousHasValueCheck); }
/** * Triggers all in-ports that either are in state {@link PortState#READY} or that received a value * while the state of this actor was {@link State#STARTING}. */ private void initialInPortsTrigger() { assert state == State.STARTING; state = State.REPLAY; // Trigger all in-ports whose state is READY dependencyGraph .inPortNodes() .stream() .filter(node -> node.getPortState() == PortState.READY) .forEach(node -> transmitValueFromInPort(node.getElement())); // Trigger all in-ports who received a value while state was STARTING inPortReceivedMessage.stream().forEach(this::inPortHasSignal); }