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