ros2_control - rolling
realtime_box.h
1 // Copyright (c) 2009, Willow Garage, Inc.
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 //
9 // * Redistributions in binary form must reproduce the above copyright
10 // notice, this list of conditions and the following disclaimer in the
11 // documentation and/or other materials provided with the distribution.
12 //
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 HOLDER 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 // Author: Stuart Glaser
30 
31 #ifndef REALTIME_TOOLS__REALTIME_BOX_H__
32 #define REALTIME_TOOLS__REALTIME_BOX_H__
33 
34 #include <mutex>
35 #include <string>
36 
37 namespace realtime_tools
38 {
45 template <class T>
47 {
48 public:
49  explicit RealtimeBox(const T & initial = T()) : thing_(initial) {}
50 
51  void set(const T & value)
52  {
53  std::lock_guard<std::mutex> guard(thing_lock_RT_);
54  thing_ = value;
55  }
56 
57  void get(T & ref)
58  {
59  std::lock_guard<std::mutex> guard(thing_lock_RT_);
60  ref = thing_;
61  }
62 
63 private:
64  // The thing that's in the box.
65  T thing_;
66 
67  // Protects access to the thing in the box. This mutex is
68  // guaranteed to be locked for no longer than the duration of the
69  // copy, so as long as the copy is realtime safe and the OS has
70  // priority inheritance for mutexes, this lock can be safely locked
71  // from within realtime.
72  std::mutex thing_lock_RT_;
73 };
74 
75 } // namespace realtime_tools
76 
77 #endif // REALTIME_TOOLS__REALTIME_BOX_H_
Definition: realtime_box.h:47
Definition: async_function_handler.hpp:38