ChimeraTK-DeviceAccess 03.25.00
Loading...
Searching...
No Matches
DataConsistencyRealm.cc
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
4
5namespace ChimeraTK::async {
6
7 /********************************************************************************************************************/
8
10 // event id will be 0 e.g. if value still comes from the config file (even values changed through the panel will
11 // have some macro pulse number attached). See spec B.3.1.1.
12 if(DataConsistencyKey::BaseType(eventId) == 0) {
13 return ChimeraTK::VersionNumber{nullptr};
14 }
15
16 // acquire lock
17 auto lock = std::lock_guard(_mapMutex);
18
19 // check if entry already exists
20 // Note: the second part of the condition "eventId > _latestKey - maxSizeEventIdMap" has been rewritten like this
21 // to prevent negative overflows.
22 if(eventId <= _latestKey && eventId + maxSizeEventIdMap > _latestKey) {
23 auto index = _versionHistory.size() - (_latestKey - eventId) - 1;
24 return _versionHistory[index];
25 }
26
27 // special case: map is empty right now, we need to make the first entries.
28 if(_versionHistory.empty()) {
29 auto nElementsToInsert = std::min(DataConsistencyKey::BaseType(eventId), maxSizeEventIdMap);
30 for(size_t i = 0; i < nElementsToInsert; ++i) {
31 _versionHistory.push_back({});
32 }
33 _latestKey = eventId;
34
35 return _versionHistory.back();
36 }
37
38 // check if eventId too old (cf. spec B.3.1.3.1.2)
39 // Note: the condition "eventId <= _latestKey - maxSizeEventIdMap" is rewritten like this to prevent
40 // negative overflows
41 if(eventId + maxSizeEventIdMap <= _latestKey) {
42 return ChimeraTK::VersionNumber{nullptr};
43 }
44
45 // determine how many elements to insert (according to spec B.3.1.3.2 we must not leave any gaps)
46 auto nElementsToInsert = std::min((eventId - _latestKey), maxSizeEventIdMap);
47
48 // insert new entries
49 for(size_t i = 0; i < nElementsToInsert; ++i) {
50 _versionHistory.push_back(VersionNumber{});
51 }
52 _latestKey = eventId;
53
54 // return the requested entry
55 return _versionHistory.back();
56 }
57
58 /********************************************************************************************************************/
59
60} // namespace ChimeraTK::async
Class for generating and holding version numbers without exposing a numeric representation.
uint64_t BaseType
Numeric data type for the key. Must be a valid UserType for the register accessors.
ChimeraTK::VersionNumber getVersion(const DataConsistencyKey &eventId)