Bus Messages 1.0
Bus Message Serialization Library
Loading...
Searching...
No Matches
ibusmessagequeue.h
Go to the documentation of this file.
1/*
2* Copyright 2025 Ingemar Hedvall
3* SPDX-License-Identifier: MIT
4*/
15#pragma once
16
17#include <cstdint>
18#include <deque>
19#include <vector>
20#include <memory>
21#include <mutex>
22#include <atomic>
23#include <chrono>
24#include <condition_variable>
25
26#include "bus/ibusmessage.h"
27
28namespace bus {
29
41class IBusMessageQueue {
42public:
43 IBusMessageQueue() = default;
45
50 void Push(const std::shared_ptr<IBusMessage>& message);
51
60 void Push(const std::vector<uint8_t>& message_buffer);
61
70 void PushFront(const std::shared_ptr<IBusMessage>& message);
71
80 std::shared_ptr<IBusMessage> Pop();
81
89 template < class Rep, class Period >
90 std::shared_ptr<IBusMessage> PopWait(const std::chrono::duration<Rep,
91 Period>& rel_time);
92
97 [[nodiscard]] size_t MessageSize() const;
98
103 [[nodiscard]] size_t Size() const;
104
109 [[nodiscard]] bool Empty() const;
110
117 template < class Rep, class Period >
118 void EmptyWait(const std::chrono::duration<Rep, Period>& rel_time);
119
123 virtual void Start();
124
128 virtual void Stop();
129
133 void Clear();
134
135private:
136 std::deque<std::shared_ptr<IBusMessage>> queue_;
137 mutable std::mutex queue_mutex_;
138 std::atomic<size_t> queue_size_ = 0;
139 std::condition_variable queue_not_empty_;
140};
141
142template< class Rep, class Period >
143std::shared_ptr<IBusMessage> IBusMessageQueue::PopWait(const std::chrono::duration<Rep,
144 Period>& rel_time) {
145 std::unique_lock lock(queue_mutex_);
146 queue_not_empty_.wait_for(lock, rel_time, [&] () ->bool {
147 return queue_size_.load() > 0;
148 });
149
150 std::shared_ptr<IBusMessage> message;
151 if (!queue_.empty()) {
152 message = std::move(queue_.front());
153 queue_.pop_front();
154 queue_size_ = queue_.size();
155 } else {
156 queue_size_ = 0;
157 }
158
159 return message;
160}
161
162template< class Rep, class Period >
163void IBusMessageQueue::EmptyWait(const std::chrono::duration<Rep, Period>& rel_time) {
164 std::unique_lock lock(queue_mutex_);
165 queue_not_empty_.wait_for(lock, rel_time, [&] () ->bool {
166 return queue_size_.load() > 0;
167 });
168}
169} // bus
170
171
bool Empty() const
Returns true if the queue is empty.
size_t MessageSize() const
Retuns the size of next message.
virtual ~IBusMessageQueue()
Destructor.
void Clear()
Removes all messages in the queue.
void Push(const std::shared_ptr< IBusMessage > &message)
Adds a message to the end of the queue.
virtual void Stop()
Stops the queue.
void Push(const std::vector< uint8_t > &message_buffer)
Adds a serialized message to the queue.
size_t Size() const
Retuns the number messages in the queue.
virtual void Start()
Initialize the queue.
std::shared_ptr< IBusMessage > PopWait(const std::chrono::duration< Rep, Period > &rel_time)
Blocks a period if queue is empty otherwise returning a message.
Definition ibusmessagequeue.h:143
std::shared_ptr< IBusMessage > Pop()
Extract a message from the front of the queue.
void EmptyWait(const std::chrono::duration< Rep, Period > &rel_time)
Waits a period or direct if the queue not is empty.
Definition ibusmessagequeue.h:163
void PushFront(const std::shared_ptr< IBusMessage > &message)
Adds a message first in the queue.
Defines an interface against a bus message.
Main namespace for the MDF library.
Definition buslogstream.h:24