55 "refer to the guidelines for replacement options: "
56 "control.ros.org/rolling/doc/realtime_tools/doc/index.html#guidelines")]]
RealtimeBuffer
62 non_realtime_data_ =
new T();
63 realtime_data_ =
new T();
74 non_realtime_data_ =
new T(data);
75 realtime_data_ =
new T(data);
80 if (non_realtime_data_) {
81 delete non_realtime_data_;
84 delete realtime_data_;
88 RealtimeBuffer(
const RealtimeBuffer & source)
91 non_realtime_data_ =
new T();
92 realtime_data_ =
new T();
95 writeFromNonRT(*source.readFromNonRT());
103 if (
this == &source) {
108 writeFromNonRT(*source.readFromNonRT());
116 std::unique_lock<std::mutex> guard(mutex_, std::try_to_lock);
117 if (guard.owns_lock()) {
119 if (new_data_available_) {
120 T * tmp = realtime_data_;
121 realtime_data_ = non_realtime_data_;
122 non_realtime_data_ = tmp;
123 new_data_available_ =
false;
126 return realtime_data_;
129 T * readFromNonRT()
const
131 std::lock_guard<std::mutex> guard(mutex_);
133 if (new_data_available_) {
134 return non_realtime_data_;
136 return realtime_data_;
140 void writeFromNonRT(
const T & data)
143 std::lock_guard<std::mutex> guard(mutex_);
145 std::unique_lock<std::mutex> guard(mutex_, std::defer_lock);
146 while (!guard.try_lock()) {
147 std::this_thread::sleep_for(std::chrono::microseconds(500));
152 *non_realtime_data_ = data;
153 new_data_available_ =
true;
156 void initRT(
const T & data)
158 *non_realtime_data_ = data;
159 *realtime_data_ = data;
165 if (non_realtime_data_) {
166 delete non_realtime_data_;
168 if (realtime_data_) {
169 delete realtime_data_;
173 non_realtime_data_ =
new T();
174 realtime_data_ =
new T();
179 T * non_realtime_data_;
180 bool new_data_available_;
183 mutable std::mutex mutex_;