Main Page
Namespaces
Classes
Files
File List
include
realtime_tools
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>
48
class
RealtimeBuffer
49
{
50
public
:
51
RealtimeBuffer
()
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
71
~RealtimeBuffer
()
72
{
73
if
(
non_realtime_data_
)
74
delete
non_realtime_data_
;
75
if
(
realtime_data_
)
76
delete
realtime_data_
;
77
}
78
79
RealtimeBuffer
(
const
RealtimeBuffer
&source)
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
92
RealtimeBuffer
&
operator =
(
const
RealtimeBuffer
& source)
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
103
T*
readFromRT
()
104
{
105
// Check if the data is currently being written to (is locked)
106
if
(
mutex_
.try_lock())
107
{
108
// swap pointers
109
if
(
new_data_available_
)
110
{
111
T* tmp =
realtime_data_
;
112
realtime_data_
=
non_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
125
if
(
new_data_available_
)
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
161
T*
realtime_data_
;
162
T*
non_realtime_data_
;
163
bool
new_data_available_
;
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
realtime_tools::RealtimeBuffer::lock
void lock()
Definition:
realtime_buffer.h:151
realtime_tools::RealtimeBuffer::non_realtime_data_
T * non_realtime_data_
Definition:
realtime_buffer.h:162
realtime_tools::RealtimeBuffer::readFromRT
T * readFromRT()
Definition:
realtime_buffer.h:103
realtime_tools::RealtimeBuffer::mutex_
boost::mutex mutex_
Definition:
realtime_buffer.h:166
realtime_tools::RealtimeBuffer::~RealtimeBuffer
~RealtimeBuffer()
Definition:
realtime_buffer.h:71
realtime_tools::RealtimeBuffer::writeFromNonRT
void writeFromNonRT(const T &data)
Definition:
realtime_buffer.h:131
realtime_tools::RealtimeBuffer::operator=
RealtimeBuffer & operator=(const RealtimeBuffer &source)
Custom assignment operator.
Definition:
realtime_buffer.h:92
realtime_tools::RealtimeBuffer::RealtimeBuffer
RealtimeBuffer()
Definition:
realtime_buffer.h:51
realtime_tools::RealtimeBuffer::initRT
void initRT(const T &data)
Definition:
realtime_buffer.h:144
realtime_tools::RealtimeBuffer::readFromNonRT
T * readFromNonRT() const
Definition:
realtime_buffer.h:121
realtime_tools::RealtimeBuffer::RealtimeBuffer
RealtimeBuffer(const RealtimeBuffer &source)
Definition:
realtime_buffer.h:79
realtime_tools::RealtimeBuffer::RealtimeBuffer
RealtimeBuffer(const T &data)
Constructor for objects that don't have a default constructor.
Definition:
realtime_buffer.h:64
realtime_tools::RealtimeBuffer::new_data_available_
bool new_data_available_
Definition:
realtime_buffer.h:163
realtime_tools
Definition:
realtime_box.h:40
realtime_tools::RealtimeBuffer::realtime_data_
T * realtime_data_
Definition:
realtime_buffer.h:161
realtime_tools::RealtimeBuffer
Definition:
realtime_buffer.h:48
realtime_tools
Author(s): Stuart Glaser
autogenerated on Mon Mar 22 2021 02:20:09