RTC Toolkit  0.1.0-alpha
messageQueue.hpp
Go to the documentation of this file.
1 
9 #ifndef RTCTK_DATATASK_MESSAGEQUEUE_HPP
10 #define RTCTK_DATATASK_MESSAGEQUEUE_HPP
11 
12 #include <mutex>
13 #include <condition_variable>
14 #include <queue>
15 #include <optional>
16 
17 namespace rtctk::dataTask {
22 template <class T>
23 class MessageQueue {
24 public:
25 
26  inline void Post(T const& value) {
27  {
28  std::unique_lock<std::mutex> lock(m_mtx);
29  m_queue.push(value);
30  }
31  m_cv.notify_one();
32  }
33 
34  inline T Pend() {
35  std::unique_lock<std::mutex> lock(m_mtx);
36  m_cv.wait(lock, [&]{return not m_queue.empty();});
37  auto ret = m_queue.front();
38  m_queue.pop();
39  return ret;
40  }
41 
42  template <class Rep, class Period>
43  inline T Pend(std::chrono::duration<Rep, Period> timeout) {
44  std::unique_lock<std::mutex> lock(m_mtx);
45  auto to = m_cv.wait_for(lock, timeout, [&]{return not m_queue.empty();});
46  if(to == false) {
47  throw(std::runtime_error("MessageQueue.Pend() timed out"));
48  }
49  auto ret = m_queue.front();
50  m_queue.pop();
51  return ret;
52  }
53 
54  inline std::optional<T> TryPend() { // TODO: revisit naming
55  std::unique_lock<std::mutex> lock(m_mtx);
56  if(not m_queue.empty()) {
57  auto ret = m_queue.front();
58  m_queue.pop();
59  return ret;
60  }else {
61  return {};
62  }
63  }
64 
65  inline void Clear() {
66  std::unique_lock<std::mutex> lock(m_mtx);
67  while(not m_queue.empty()) {
68  m_queue.pop();
69  }
70  }
71 
72 private:
73  std::mutex m_mtx;
74  std::condition_variable m_cv;
75  std::queue<T> m_queue;
76 };
77 
78 } // namespace
79 
80 #endif
rtctk::dataTask::MessageQueue::Pend
T Pend(std::chrono::duration< Rep, Period > timeout)
Definition: messageQueue.hpp:43
rtctk::dataTask::MessageQueue::TryPend
std::optional< T > TryPend()
Definition: messageQueue.hpp:54
rtctk::dataTask::MessageQueue::Post
void Post(T const &value)
Definition: messageQueue.hpp:26
rtctk::dataTask
Definition: messageQueue.hpp:17
rtctk::dataTask::MessageQueue::Clear
void Clear()
Definition: messageQueue.hpp:65
rtctk::dataTask::MessageQueue
Definition: messageQueue.hpp:23
rtctk::dataTask::MessageQueue::Pend
T Pend()
Definition: messageQueue.hpp:34