realtime_buffer.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 hiDOF, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Willow Garage, Inc. nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 /*
31  * Publishing ROS messages is difficult, as the publish function is
32  * not realtime safe. This class provides the proper locking so that
33  * you can call publish in realtime and a separate (non-realtime)
34  * thread will ensure that the message gets published over ROS.
35  *
36  * Author: Wim Meeussen
37  */
38 
39 #ifndef REALTIME_TOOLS__REALTIME_BUFFER_H_
40 #define REALTIME_TOOLS__REALTIME_BUFFER_H_
41 
42 #include <boost/thread/mutex.hpp>
43 
44 namespace realtime_tools
45 {
46 
47 template <class T>
49 {
50  public:
52  : new_data_available_(false)
53  {
54  // allocate memory
55  non_realtime_data_ = new T();
56  realtime_data_ = new T();
57  }
58 
64  RealtimeBuffer(const T& data)
65  {
66  // allocate memory
67  non_realtime_data_ = new T(data);
68  realtime_data_ = new T(data);
69  }
70 
72  {
74  delete non_realtime_data_;
75  if (realtime_data_)
76  delete realtime_data_;
77  }
78 
80  {
81  // allocate memory
82  non_realtime_data_ = new T();
83  realtime_data_ = new T();
84 
85  // Copy the data from old RTB to new RTB
86  writeFromNonRT(*source.readFromNonRT());
87  }
88 
93  {
94  if (this == &source)
95  return *this;
96 
97  // Copy the data from old RTB to new RTB
98  writeFromNonRT(*source.readFromNonRT());
99 
100  return *this;
101  }
102 
104  {
105  // Check if the data is currently being written to (is locked)
106  if (mutex_.try_lock())
107  {
108  // swap pointers
110  {
111  T* tmp = realtime_data_;
113  non_realtime_data_ = tmp;
114  new_data_available_ = false;
115  }
116  mutex_.unlock();
117  }
118  return realtime_data_;
119  }
120 
121  T* readFromNonRT() const
122  {
123  boost::mutex::scoped_lock lock(mutex_);
124 
126  return non_realtime_data_;
127  else
128  return realtime_data_;
129  }
130 
131  void writeFromNonRT(const T& data)
132  {
133  // get lock
134  lock();
135 
136  // copy data into non-realtime buffer
137  *non_realtime_data_ = data;
138  new_data_available_ = true;
139 
140  // release lock
141  mutex_.unlock();
142  }
143 
144  void initRT(const T& data)
145  {
146  *non_realtime_data_ = data;
147  *realtime_data_ = data;
148  }
149 
150  private:
151  void lock()
152  {
153 #ifdef NON_POLLING
154  mutex_.lock();
155 #else
156  while (!mutex_.try_lock())
157  usleep(500);
158 #endif
159  }
160 
164 
165  // Set as mutable so that readFromNonRT() can be performed on a const buffer
166  mutable boost::mutex mutex_;
167 
168 }; // class
169 }// namespace
170 
171 #endif
void writeFromNonRT(const T &data)
RealtimeBuffer & operator=(const RealtimeBuffer &source)
Custom assignment operator.
RealtimeBuffer(const RealtimeBuffer &source)
RealtimeBuffer(const T &data)
Constructor for objects that don&#39;t have a default constructor.


realtime_tools
Author(s): Stuart Glaser
autogenerated on Mon Mar 22 2021 02:20:09