diff --git a/src/lockhelper.h b/src/lockhelper.h index e829967..e8178b6 100644 --- a/src/lockhelper.h +++ b/src/lockhelper.h @@ -13,40 +13,44 @@ class LockHelper CPP_DISABLE_COPY_MOVE(LockHelper) public: - LockHelper(QueueHandle_t _xMutex, TickType_t xTicksToWait=portMAX_DELAY) : - xMutex{_xMutex} - { - locked = xSemaphoreTakeRecursive(xMutex, xTicksToWait); - } + LockHelper(SemaphoreHandle_t xMutex, TickType_t xTicksToWait = portMAX_DELAY) : + m_xMutex{xMutex}, + m_locked{xSemaphoreTake(m_xMutex, xTicksToWait) == pdPASS} + {} ~LockHelper() { - if (locked) - xSemaphoreGiveRecursive(xMutex); + if (m_locked) + xSemaphoreGive(m_xMutex); } - bool lock(TickType_t xTicksToWait=portMAX_DELAY) + bool lock(TickType_t xTicksToWait = portMAX_DELAY) { - if (locked) + if (m_locked) return false; - locked = xSemaphoreTakeRecursive(xMutex, xTicksToWait); + m_locked = xSemaphoreTake(m_xMutex, xTicksToWait); - return locked; + return m_locked; } bool unlock() { - if (!locked) + if (!m_locked) return false; - locked = !xSemaphoreGiveRecursive(xMutex); + m_locked = !xSemaphoreGive(m_xMutex); - return locked; + return m_locked; + } + + bool locked() const + { + return m_locked; } private: - const QueueHandle_t xMutex; - bool locked; + const SemaphoreHandle_t m_xMutex; + bool m_locked; }; } // namespace espcpputils diff --git a/src/lockingqueue.h b/src/lockingqueue.h index 6bddf85..a6ad258 100644 --- a/src/lockingqueue.h +++ b/src/lockingqueue.h @@ -10,8 +10,8 @@ // local includes #include "delayedconstruction.h" -#include "wrappers/recursive_mutex_semaphore.h" -#include "recursivelockhelper.h" +#include "wrappers/mutex_semaphore.h" +#include "lockhelper.h" namespace espcpputils { template @@ -28,7 +28,7 @@ public: std::size_t size() const { return m_size; } private: - espcpputils::recursive_mutex_semaphore m_lock; + espcpputils::mutex_semaphore m_lock; std::queue m_queue; std::size_t m_size{}; // double-buffered to allow for reading without taking a lock }; @@ -36,7 +36,7 @@ private: template void LockingQueue::push(const T &val) { - RecursiveLockHelper helper{m_lock.handle}; + LockHelper helper{m_lock.handle}; m_queue.push(val); m_size = m_queue.size(); } @@ -44,7 +44,7 @@ void LockingQueue::push(const T &val) template void LockingQueue::push(T &&val) { - RecursiveLockHelper helper{m_lock.handle}; + LockHelper helper{m_lock.handle}; m_queue.emplace(std::move(val)); m_size = m_queue.size(); } @@ -52,7 +52,7 @@ void LockingQueue::push(T &&val) template std::optional LockingQueue::tryPop() { - RecursiveLockHelper helper{m_lock.handle}; + LockHelper helper{m_lock.handle}; if (m_queue.empty()) return std::nullopt; @@ -65,7 +65,7 @@ std::optional LockingQueue::tryPop() template void LockingQueue::clear() { - RecursiveLockHelper helper{m_lock.handle}; + LockHelper helper{m_lock.handle}; m_queue = {}; } } // namespace espcpputils diff --git a/src/recursivelockhelper.h b/src/recursivelockhelper.h index f9136d8..d9810f3 100644 --- a/src/recursivelockhelper.h +++ b/src/recursivelockhelper.h @@ -13,40 +13,44 @@ class RecursiveLockHelper CPP_DISABLE_COPY_MOVE(RecursiveLockHelper) public: - RecursiveLockHelper(QueueHandle_t _xMutex, TickType_t xTicksToWait=portMAX_DELAY) : - xMutex{_xMutex} - { - locked = xSemaphoreTakeRecursive(xMutex, xTicksToWait); - } + RecursiveLockHelper(SemaphoreHandle_t _xMutex, TickType_t xTicksToWait = portMAX_DELAY) : + m_xMutex{xMutex}, + m_locked{xSemaphoreTakeRecursive(xMutex, xTicksToWait) == pdPASS} + {} ~RecursiveLockHelper() { - if (locked) - xSemaphoreGiveRecursive(xMutex); + if (m_locked) + xSemaphoreGiveRecursive(m_xMutex); } - bool lock(TickType_t xTicksToWait=portMAX_DELAY) + bool lock(TickType_t xTicksToWait = portMAX_DELAY) { - if (locked) + if (m_locked) return false; - locked = xSemaphoreTakeRecursive(xMutex, xTicksToWait); + m_locked = xSemaphoreTakeRecursive(m_xMutex, xTicksToWait); - return locked; + return m_locked; } bool unlock() { - if (!locked) + if (!m_locked) return false; - locked = !xSemaphoreGiveRecursive(xMutex); + m_locked = !xSemaphoreGiveRecursive(m_xMutex); - return locked; + return m_locked; + } + + bool locked() const + { + return m_locked; } private: - const QueueHandle_t xMutex; - bool locked; + const SemaphoreHandle_t m_xMutex; + bool m_locked; }; } // namespace espcpputils