54 : new_data_available_(
false)
57 non_realtime_data_ =
new T();
58 realtime_data_ =
new T();
67 : new_data_available_(false)
70 non_realtime_data_ =
new T(data);
71 realtime_data_ =
new T(data);
76 if (non_realtime_data_) {
delete non_realtime_data_;}
77 if (realtime_data_) {
delete realtime_data_;}
80 RealtimeBuffer(
const RealtimeBuffer & source)
83 non_realtime_data_ =
new T();
84 realtime_data_ =
new T();
87 writeFromNonRT(*source.readFromNonRT());
95 if (
this == &source) {
return *
this;}
98 writeFromNonRT(*source.readFromNonRT());
106 std::unique_lock<std::mutex> guard(mutex_, std::try_to_lock);
107 if (guard.owns_lock()) {
109 if (new_data_available_) {
110 T * tmp = realtime_data_;
111 realtime_data_ = non_realtime_data_;
112 non_realtime_data_ = tmp;
113 new_data_available_ =
false;
116 return realtime_data_;
119 T * readFromNonRT()
const
121 std::lock_guard<std::mutex> guard(mutex_);
123 if (new_data_available_) {
124 return non_realtime_data_;
126 return realtime_data_;
130 void writeFromNonRT(
const T & data)
133 std::lock_guard<std::mutex> guard(mutex_);
135 std::unique_lock<std::mutex> guard(mutex_, std::defer_lock);
136 while (!guard.try_lock()) {
137 std::this_thread::sleep_for(std::chrono::microseconds(500));
142 *non_realtime_data_ = data;
143 new_data_available_ =
true;
146 void initRT(
const T & data)
148 *non_realtime_data_ = data;
149 *realtime_data_ = data;
155 if (non_realtime_data_) {
delete non_realtime_data_;}
156 if (realtime_data_) {
delete realtime_data_;}
159 non_realtime_data_ =
new T();
160 realtime_data_ =
new T();
165 T * non_realtime_data_;
166 bool new_data_available_;
169 mutable std::mutex mutex_;