diff --git a/include/villas/queue.hpp b/include/villas/queue.hpp index 7892a41e5..25c3a8a9b 100644 --- a/include/villas/queue.hpp +++ b/include/villas/queue.hpp @@ -24,7 +24,6 @@ #pragma once #include -#include #include namespace villas { @@ -34,15 +33,20 @@ class Queue { protected: std::queue queue; + std::mutex mtx; public: void push(T p) { + std::unique_lock guard(mtx); + queue.push(p); } T pop() { + std::unique_lock guard(mtx); + T res = queue.front(); queue.pop(); @@ -51,6 +55,8 @@ public: bool empty() { + std::unique_lock guard(mtx); + return queue.empty(); } diff --git a/include/villas/queue_signalled.hpp b/include/villas/queue_signalled.hpp index 98a9e1f2a..91fede327 100644 --- a/include/villas/queue_signalled.hpp +++ b/include/villas/queue_signalled.hpp @@ -34,14 +34,11 @@ template class QueueSignalled : public Queue { private: - std::mutex mutex; std::condition_variable cv; public: void push(const T& data) { - std::lock_guard l(mutex); - Queue::push(data); cv.notify_one(); @@ -49,19 +46,15 @@ public: T pop() { - std::unique_lock l(mutex); + std::unique_lock l(Queue::mtx); - while (Queue::empty()) + while (Queue::queue.empty()) cv.wait(l); - return Queue::pop(); - } + T res = Queue::queue.front(); + Queue::queue.pop(); - bool empty() - { - std::unique_lock l(mutex); - - return Queue::empty(); + return res; } };