15 #ifndef __SHM_PS_LIB_H__
16 #define __SHM_PS_LIB_H__
31 #include <sys/types.h>
62 Publisher(std::string name =
"",
int buffer_num = 3,
PERM perm = DEFAULT_PERM);
78 std::unique_ptr<SharedMemory> shared_memory;
79 std::unique_ptr<RingBuffer> ring_buffer;
108 bool waitFor(uint64_t timeout_usec);
109 void setDataExpiryTime_us(uint64_t time_us);
112 std::string shm_name;
113 std::unique_ptr<SharedMemory> shared_memory;
114 std::unique_ptr<RingBuffer> ring_buffer;
115 int current_reading_buffer;
116 uint64_t data_expiry_time_us;
137 template <
typename T>
140 , shm_buf_num(buffer_num)
142 , shared_memory(nullptr)
143 , ring_buffer(nullptr)
144 , data_size(sizeof(T))
146 if (!std::is_standard_layout<T>::value)
148 throw std::runtime_error(
"shm::Publisher: Be setted not POD class!");
153 throw std::runtime_error(
"shm::Publisher: Please set name!");
157 shared_memory = std::make_unique<SharedMemoryPosix>(shm_name, O_RDWR | O_CREAT, shm_perm);
158 }
catch (
const std::runtime_error& e) {
159 throw std::runtime_error(
"shm::Publisher: " + std::string(e.what()));
161 shared_memory->connect(RingBuffer::getSize(
sizeof(T), shm_buf_num));
163 if (shared_memory->isDisconnected())
165 throw std::runtime_error(
"shm::Publisher: Cannot get memory!");
168 ring_buffer = std::make_unique<RingBuffer>(shared_memory->getPtr(),
sizeof(T), shm_buf_num);
181 template <
typename T>
185 int oldest_buffer = ring_buffer->getOldestBufferNum();
186 for (
size_t i = 0; i < 10; i++)
188 if (ring_buffer->allocateBuffer(oldest_buffer))
193 oldest_buffer = ring_buffer->getOldestBufferNum();
196 (
reinterpret_cast<T *
>(ring_buffer->getDataList()))[oldest_buffer] = data;
199 clock_gettime(CLOCK_MONOTONIC_RAW, &t);
200 ring_buffer->setTimestamp_us(((uint64_t) t.tv_sec * 1000000L) + ((uint64_t) t.tv_nsec / 1000L), oldest_buffer);
202 ring_buffer->signal();
214 template <
typename T>
217 , shared_memory(nullptr)
218 , ring_buffer(nullptr)
219 , current_reading_buffer(0)
220 , data_expiry_time_us(2000000)
222 if (!std::is_standard_layout<T>::value)
224 throw std::runtime_error(
"shm::Subscriber: Be setted not POD class!");
229 throw std::runtime_error(
"shm::Subscriber: Please set name!");
233 shared_memory = std::make_unique<SharedMemoryPosix>(shm_name, O_RDWR,
static_cast<PERM>(0));
234 }
catch (
const std::runtime_error& e) {
235 throw std::runtime_error(
"shm::Subscriber: " + std::string(e.what()));
249 template <
typename T>
253 if (shared_memory->isDisconnected())
255 if (ring_buffer !=
nullptr)
259 shared_memory->connect();
260 if (shared_memory->isDisconnected())
266 if (shared_memory->getPtr() ==
nullptr) {
270 ring_buffer = std::make_unique<RingBuffer>(shared_memory->getPtr());
271 }
catch (
const std::bad_alloc& e)
276 ring_buffer->setDataExpiryTime_us(data_expiry_time_us);
278 int newest_buffer = ring_buffer->getNewestBufferNum();
279 if (newest_buffer < 0)
282 return (
reinterpret_cast<T*
>(ring_buffer->getDataList()))[current_reading_buffer];
285 current_reading_buffer = newest_buffer;
286 return (
reinterpret_cast<T*
>(ring_buffer->getDataList()))[current_reading_buffer];
290 template <
typename T>
294 if (shared_memory->isDisconnected())
296 if (ring_buffer !=
nullptr)
300 shared_memory->connect();
301 if (shared_memory->isDisconnected())
305 ring_buffer = std::make_unique<RingBuffer>(shared_memory->getPtr());
306 ring_buffer->setDataExpiryTime_us(data_expiry_time_us);
309 return ring_buffer->waitFor(timeout_usec);
313 template <
typename T>
315 Subscriber<T>::setDataExpiryTime_us(uint64_t time_us)
317 data_expiry_time_us = time_us;
318 if (ring_buffer !=
nullptr)
320 ring_buffer->setDataExpiryTime_us(data_expiry_time_us);
共有メモリにトピックを出力する出版者を表現するクラス
void publish(const T &data)
トピックの書き込み
Publisher(std::string name="", int buffer_num=3, PERM perm=DEFAULT_PERM)
コンストラクタ
共有メモリからトピックを取得する購読者を表現するクラス
const T subscribe(bool *state)
トピックを読み込む
Subscriber(std::string name="")
コンストラクタ
共有メモリへのアクセス方法やリングバッファなどの基本的なクラスの定義