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