From e1376034693549323f7d0a7539429502efbe93e4 Mon Sep 17 00:00:00 2001
From: Martin Killenberg <martin.killenberg@desy.de>
Date: Thu, 9 Jul 2020 14:49:56 +0200
Subject: [PATCH] fixed functionality of MetaDataPropagatingRegisterDecorator
 which was broken in 19eb02f40b

---
 .../MetaDataPropagatingRegisterDecorator.h    |  4 ++++
 src/MetaDataPropagatingRegisterDecorator.cc   | 20 +++++++++++--------
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/include/MetaDataPropagatingRegisterDecorator.h b/include/MetaDataPropagatingRegisterDecorator.h
index 8a56a57c..4ab371e3 100644
--- a/include/MetaDataPropagatingRegisterDecorator.h
+++ b/include/MetaDataPropagatingRegisterDecorator.h
@@ -30,6 +30,10 @@ namespace ChimeraTK {
 
     /** value of validity flag from last read operation */
     DataValidity lastValidity{DataValidity::ok};
+
+    using TransferElement::_dataValidity;
+    using NDRegisterAccessorDecorator<T>::_target;
+    using NDRegisterAccessorDecorator<T>::buffer_2D;
   };
 
   DECLARE_TEMPLATE_FOR_CHIMERATK_USER_TYPES(MetaDataPropagatingRegisterDecorator);
diff --git a/src/MetaDataPropagatingRegisterDecorator.cc b/src/MetaDataPropagatingRegisterDecorator.cc
index b79fbb68..e283826b 100644
--- a/src/MetaDataPropagatingRegisterDecorator.cc
+++ b/src/MetaDataPropagatingRegisterDecorator.cc
@@ -13,26 +13,30 @@ namespace ChimeraTK {
     }
 
     // Check if the data validity flag changed. If yes, propagate this information to the owning module.
-    auto valid = ChimeraTK::NDRegisterAccessorDecorator<T>::dataValidity();
-    if(valid != lastValidity) {
-      if(valid == DataValidity::faulty)
+    if(_dataValidity != lastValidity) {
+      if(_dataValidity == DataValidity::faulty)
         _owner->incrementDataFaultCounter();
       else
         _owner->decrementDataFaultCounter();
-      lastValidity = valid;
+      lastValidity = _dataValidity;
     }
   }
 
   template<typename T>
   void MetaDataPropagatingRegisterDecorator<T>::doPreWrite(TransferType type, VersionNumber versionNumber) {
-    if(TransferElement::_dataValidity == DataValidity::faulty) { // the application has manualy set the validity to faulty
-      ChimeraTK::NDRegisterAccessorDecorator<T>::setDataValidity(DataValidity::faulty);
+    // We cannot use NDRegisterAccessorDecorator<T> here because we need a different implementation of setting the target data validity.
+    // So we have a complete implemetation here.
+    if(_dataValidity == DataValidity::faulty) { // the application has manualy set the validity to faulty
+      _target->setDataValidity(DataValidity::faulty);
     }
     else { // automatic propagation of the owner validity
-      ChimeraTK::NDRegisterAccessorDecorator<T>::setDataValidity(_owner->getDataValidity());
+      _target->setDataValidity(_owner->getDataValidity());
     }
 
-    NDRegisterAccessorDecorator<T, T>::doPreWrite(type, versionNumber);
+    for(unsigned int i = 0; i < _target->getNumberOfChannels(); ++i) {
+      buffer_2D[i].swap(_target->accessChannel(i));
+    }
+    _target->preWrite(type, versionNumber);
   }
 
 } // namespace ChimeraTK
-- 
GitLab