HLCC Documentation 3.0.1
Loading...
Searching...
No Matches
ciiOldbDataPointAsync.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2020-2025 European Southern Observatory (ESO)
2//
3// SPDX-License-Identifier: LGPL-3.0-only
4
5/*
6 * ciiOldbDataPointAsync.hpp
7 *
8 * Created on: Jul 2, 2021
9 * Author: hsommer
10 */
11#define BOOST_THREAD_PROVIDES_FUTURE
12#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
13#define BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY // see https://www.javaer101.com/en/article/84361855.html
14
15#ifndef HLCC_OLDBMUX_CIIOLDBDATAPOINTASYNC_HPP
16#define HLCC_OLDBMUX_CIIOLDBDATAPOINTASYNC_HPP
17
19
20#include "ciiOldbDataPoint.hpp"
21#include "ciiOldbDpValue.hpp"
22#include "ciiOldbDpQuality.hpp"
23
24#include <log4cplus/logger.h>
25#include <rad/logger.hpp>
26
27#include <boost/thread/future.hpp>
28#include <boost/asio/thread_pool.hpp>
29#include <boost/asio/post.hpp>
30
31#include <atomic>
32#include <mutex>
33
34
35namespace hlcc::oldbmux {
36
72template<typename T>
74
75public:
76
77 // See declaration below.
78 struct OldbData;
80
85 std::string name, std::shared_ptr<elt::oldb::CiiOldbDataPoint<T>> delegate,
86 boost::asio::thread_pool& async_exec, const log4cplus::Logger& logger,
87 std::size_t buffer_capacity = 1 );
88
89 virtual ~CiiOldbDataPointAsync();
90
91 std::shared_ptr<elt::oldb::CiiOldbDpValue<T>> ReadValue(
92 bool check_bad_quality = true);
93
94 boost::future<typename CiiOldbDataPointAsync<T>::OldbData> WriteValue(
95 const T& value,
96 int64_t timestamp = elt::oldb::CiiOldbUtil::Now(),
97 elt::oldb::CiiOldbDpQuality quality = elt::oldb::CiiOldbDpQuality::OK,
98 bool is_disable_publishing = false);
99
100 boost::future<typename CiiOldbDataPointAsync<T>::OldbData> SetQuality(
101 elt::oldb::CiiOldbDpQuality quality,
102 bool is_disable_publishing = false);
103
104private:
105
111 boost::future<typename CiiOldbDataPointAsync<T>::OldbData> WriteAsync(
112 OldbData&& new_data,
113 bool is_disable_publishing);
114
120 void WriteBufferToOldb();
121
122
129 std::condition_variable m_sync_dtor_cv;
130
154 int m_sync_dtor_n_writing;
155
162 std::mutex m_sync_dtor_mutex;
163
164
165 const log4cplus::Logger logger;
166
170 const std::string name;
171
179 const std::shared_ptr<elt::oldb::CiiOldbDataPoint<T>> delegate;
180
187
192 boost::asio::thread_pool& async_exec;
193
198 std::atomic<bool> is_async_processing;
199};
200
201
202
214template<typename T>
216
217public:
218
222 OldbData(elt::oldb::CiiOldbDpQuality quality)
223 : m_value {std::nullopt},
224 m_timestamp {std::nullopt},
225 m_quality {quality}
226 { }
227
231 OldbData(std::optional<T> value, std::optional<int64_t> timestamp, std::optional<elt::oldb::CiiOldbDpQuality> quality)
232 : m_value {value},
233 m_timestamp {timestamp},
234 m_quality {quality}
235 { }
236
240 virtual ~OldbData() = default;
241
242 OldbData(const OldbData&) = delete;
243 OldbData& operator=(const OldbData&) = delete;
244
245 OldbData(OldbData&&) = default;
247
248 std::optional<T> GetValue() const {
249 return m_value;
250 }
251 void SetValue(T value) {
252 m_value = value;
253 }
254 std::optional<int64_t> GetTimestamp() const {
255 return m_timestamp;
256 }
257 void SetTimestamp(int64_t timestamp) {
258 m_timestamp = timestamp;
259 }
260 std::optional<elt::oldb::CiiOldbDpQuality> GetQuality() const {
261 return m_quality;
262 }
263private:
267 std::optional<T> m_value;
268
274 std::optional<int64_t> m_timestamp;
275
279 std::optional<elt::oldb::CiiOldbDpQuality> m_quality;
280};
281
282
287template<typename T>
289
290public:
291 OldbDataWithPromise(std::optional<T> value, std::optional<int64_t> timestamp, std::optional<elt::oldb::CiiOldbDpQuality> quality, boost::promise<OldbData>&& promise)
292 : OldbData {value, timestamp, quality},
293 m_promise {std::move(promise)}
294 { }
295
296 virtual ~OldbDataWithPromise() = default;
297
300
301 // creates memberwise moves incl base class.
303
305
306 boost::promise<CiiOldbDataPointAsync<T>::OldbData>* GetPromise(){
307 return &m_promise;
308 }
309
310private:
311 boost::promise<CiiOldbDataPointAsync<T>::OldbData> m_promise;
312};
313
314} // namespace hlcc::oldbmux
315
316
317// include template class definition from separate header file.
319
320#endif /* HLCC_OLDBMUX_CIIOLDBDATAPOINTASYNC_HPP */
CiiOldbDataPointAsync class source file.
CiiOldbDataPointAsync(std::string name, std::shared_ptr< elt::oldb::CiiOldbDataPoint< T > > delegate, boost::asio::thread_pool &async_exec, const log4cplus::Logger &logger, std::size_t buffer_capacity=1)
Constructor.
Definition ciiOldbDataPointAsync.ipp:62
std::shared_ptr< elt::oldb::CiiOldbDpValue< T > > ReadValue(bool check_bad_quality=true)
Definition ciiOldbDataPointAsync.ipp:165
boost::future< typename CiiOldbDataPointAsync< T >::OldbData > WriteValue(const T &value, int64_t timestamp=elt::oldb::CiiOldbUtil::Now(), elt::oldb::CiiOldbDpQuality quality=elt::oldb::CiiOldbDpQuality::OK, bool is_disable_publishing=false)
Definition ciiOldbDataPointAsync.ipp:177
boost::future< typename CiiOldbDataPointAsync< T >::OldbData > SetQuality(elt::oldb::CiiOldbDpQuality quality, bool is_disable_publishing=false)
Definition ciiOldbDataPointAsync.ipp:193
virtual ~CiiOldbDataPointAsync()
Definition ciiOldbDataPointAsync.ipp:136
A first-in first-out buffer with a fixed size that replaces its oldest element if full.
Definition circularBufferConcurrent.hpp:54
Definition ciiOldbDataPointAsync.hpp:35
Value type for data for buffering and writing to OLDB. This subclass is used internally by CiiOldbDat...
Definition ciiOldbDataPointAsync.hpp:288
OldbDataWithPromise(std::optional< T > value, std::optional< int64_t > timestamp, std::optional< elt::oldb::CiiOldbDpQuality > quality, boost::promise< OldbData > &&promise)
Definition ciiOldbDataPointAsync.hpp:291
OldbDataWithPromise & operator=(const OldbDataWithPromise &)=delete
OldbDataWithPromise & operator=(OldbDataWithPromise &&other)=default
OldbDataWithPromise(OldbDataWithPromise &&other)=default
boost::promise< CiiOldbDataPointAsync< T >::OldbData > * GetPromise()
Definition ciiOldbDataPointAsync.hpp:306
OldbDataWithPromise(const OldbDataWithPromise &)=delete
Value type for data for buffering and writing to OLDB. This base class is used as an interface toward...
Definition ciiOldbDataPointAsync.hpp:215
void SetTimestamp(int64_t timestamp)
Definition ciiOldbDataPointAsync.hpp:257
std::optional< T > GetValue() const
Definition ciiOldbDataPointAsync.hpp:248
std::optional< int64_t > GetTimestamp() const
Definition ciiOldbDataPointAsync.hpp:254
OldbData(std::optional< T > value, std::optional< int64_t > timestamp, std::optional< elt::oldb::CiiOldbDpQuality > quality)
Definition ciiOldbDataPointAsync.hpp:231
OldbData & operator=(const OldbData &)=delete
OldbData(elt::oldb::CiiOldbDpQuality quality)
Definition ciiOldbDataPointAsync.hpp:222
virtual ~OldbData()=default
Destructor.
OldbData & operator=(OldbData &&)=default
std::optional< elt::oldb::CiiOldbDpQuality > GetQuality() const
Definition ciiOldbDataPointAsync.hpp:260
void SetValue(T value)
Definition ciiOldbDataPointAsync.hpp:251