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