ChimeraTK-ApplicationCore 04.08.00
Loading...
Searching...
No Matches
ExceptionHandlingDecorator.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Deutsches Elektronen-Synchrotron DESY, MSK, ChimeraTK Project <chimeratk-support@desy.de>
2// SPDX-License-Identifier: LGPL-3.0-or-later
3#pragma once
4
5#include "Application.h"
6#include "RecoveryHelper.h"
7
8#include <ChimeraTK/NDRegisterAccessor.h>
9#include <ChimeraTK/NDRegisterAccessorDecorator.h>
10
11#include <boost/smart_ptr/shared_ptr.hpp>
12
13namespace ChimeraTK {
14
17 template<typename UserType>
18 class ExceptionHandlingDecorator : public ChimeraTK::NDRegisterAccessorDecorator<UserType> {
19 public:
25 ExceptionHandlingDecorator(boost::shared_ptr<ChimeraTK::NDRegisterAccessor<UserType>> accessor,
26 const VariableNetworkNode& networkNode, boost::shared_ptr<RecoveryHelper> recoveryHelper);
27
29
30 void doPreWrite(TransferType type, VersionNumber versionNumber) override;
31
32 void doPostWrite(TransferType type, VersionNumber versionNumber) override;
33
34 void doPostRead(TransferType type, bool hasNewData) override;
35
36 void doPreRead(TransferType type) override;
37
38 bool doWriteTransfer(VersionNumber versionNumber) override;
39 bool doWriteTransferDestructively(VersionNumber versionNumber) override;
40
41 protected:
42 using ChimeraTK::NDRegisterAccessor<UserType>::buffer_2D;
43 using ChimeraTK::NDRegisterAccessorDecorator<UserType>::_target;
44 using ChimeraTK::TransferElement::_versionNumber;
45 using ChimeraTK::TransferElement::_dataValidity;
46 using ChimeraTK::TransferElement::_activeException;
47
48 boost::weak_ptr<DeviceManager> _deviceManager;
49
51
53
54 boost::shared_ptr<RecoveryHelper> _recoveryHelper{nullptr};
55 // store the recoveryAccessor separately. The RecoveryHelper only contains a pointer to TransferElement and can't be
56 // used to fill in data.
57 boost::shared_ptr<NDRegisterAccessor<UserType>> _recoveryAccessor{nullptr};
58
60
61 // We have to throw in read transfers because the outermost TransferElement has to see the exception
63 // For writing we must not throw. The overridden doWriteTransfer() must return the correct data loss flag.
67 bool _hasReportedException{false}; // valid only with wait_forNewData
68
69 template<typename Callable>
70 bool genericWriteWrapper(Callable writeFunction);
71 };
72
74
75} /* namespace ChimeraTK */
Decorator of the NDRegisterAccessor which facilitates tests of the application.
boost::weak_ptr< DeviceManager > _deviceManager
boost::shared_ptr< RecoveryHelper > _recoveryHelper
void doPostRead(TransferType type, bool hasNewData) override
void doPreWrite(TransferType type, VersionNumber versionNumber) override
void doPostWrite(TransferType type, VersionNumber versionNumber) override
bool doWriteTransferDestructively(VersionNumber versionNumber) override
bool doWriteTransfer(VersionNumber versionNumber) override
boost::shared_ptr< NDRegisterAccessor< UserType > > _recoveryAccessor
Class describing a node of a variable network.
InvalidityTracer application module.
DECLARE_TEMPLATE_FOR_CHIMERATK_USER_TYPES(DebugPrintAccessorDecorator)
Struct to define the direction of variables.
Definition Flags.h:13