From 9e1c58c4dac27125d84e6d92d8aed46f3db73038 Mon Sep 17 00:00:00 2001 From: Martin Hierholzer <martin.hierholzer@desy.de> Date: Wed, 5 Feb 2020 17:20:08 +0100 Subject: [PATCH] fix wrong read-type for initial values when reading from devices through FanOut --- src/VariableNetworkNode.cc | 43 +++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/VariableNetworkNode.cc b/src/VariableNetworkNode.cc index 01fe8135..5ba14e18 100644 --- a/src/VariableNetworkNode.cc +++ b/src/VariableNetworkNode.cc @@ -394,21 +394,21 @@ namespace ChimeraTK { /*********************************************************************************************************************/ VariableNetworkNode::InitialValueMode VariableNetworkNode::hasInitialValue() const { - if(getType() == NodeType::ControlSystem) { - return InitialValueMode::Push; - } - if(getType() == NodeType::Device || getType() == NodeType::Constant) { - if(getOwner().getTriggerType() == VariableNetwork::TriggerType::feeder) { - return InitialValueMode::Poll; - } - else { - assert(getOwner().getTriggerType() == VariableNetwork::TriggerType::external || - getOwner().getTriggerType() == VariableNetwork::TriggerType::pollingConsumer); + if(getDirection().dir == VariableDirection::feeding) { + if(getType() == NodeType::ControlSystem) { return InitialValueMode::Push; } - } - assert(getType() == NodeType::Application); - if(getDirection().dir == VariableDirection::feeding) { + if(getType() == NodeType::Device || getType() == NodeType::Constant) { + if(getOwner().getTriggerType() == VariableNetwork::TriggerType::feeder) { + return InitialValueMode::Poll; + } + else { + assert(getOwner().getTriggerType() == VariableNetwork::TriggerType::external || + getOwner().getTriggerType() == VariableNetwork::TriggerType::pollingConsumer); + return InitialValueMode::Push; + } + } + assert(getType() == NodeType::Application); if(pdata->hasInitialValue) { return InitialValueMode::Push; } @@ -416,7 +416,22 @@ namespace ChimeraTK { return InitialValueMode::None; } } - return getOwner().getFeedingNode().hasInitialValue(); + else { + auto feederInitialValue = getOwner().getFeedingNode().hasInitialValue(); + if(getOwner().countConsumingNodes() == 1) { + return feederInitialValue; + } + else { + if(feederInitialValue != InitialValueMode::None) { + // More then one consuming node: FanOut in between. Need to wait for FanOut to process the initial value! + // If the FanOut is a ConsumingFanOut, InitialValueMode::Push doesn't hurt as that fan out is always poll-type + return InitialValueMode::Push; + } + else { + return InitialValueMode::None; + } + } + } } } // namespace ChimeraTK -- GitLab