From 51c37fb8c52c63c06fc1c97b3361cc05e1a54341 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Wed, 12 May 2021 20:37:52 +0200 Subject: [PATCH] Fixed bug with incorrect size after queue clear and moved destruction of queue out of locking time --- src/lockingqueue.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lockingqueue.h b/src/lockingqueue.h index a6ad258..a556d7d 100644 --- a/src/lockingqueue.h +++ b/src/lockingqueue.h @@ -1,6 +1,7 @@ #pragma once // system includes +#include #include #include @@ -25,12 +26,12 @@ public: void clear(); - std::size_t size() const { return m_size; } + std::size_t size() const { return m_size.load(); } private: espcpputils::mutex_semaphore m_lock; std::queue m_queue; - std::size_t m_size{}; // double-buffered to allow for reading without taking a lock + std::atomic m_size{}; // double-buffered to allow for reading without taking a lock }; template @@ -65,7 +66,16 @@ std::optional LockingQueue::tryPop() template void LockingQueue::clear() { - LockHelper helper{m_lock.handle}; - m_queue = {}; + std::queue empty; + + { + LockHelper helper{m_lock.handle}; + //m_queue.clear(); + //m_queue = {}; + std::swap(empty, m_queue); + m_size = {}; + } + + // Deconstructing here the queue as the lock is already given back again } } // namespace espcpputils