From 5c912c70e9333298ff48f7ea15424f72ca977b99 Mon Sep 17 00:00:00 2001 From: Fu Juntang <StrongTiger_001@163.com> Date: 星期五, 17 九月 2021 09:43:55 +0800 Subject: [PATCH] Add the heartbeat logic feature. --- src/queue/array_lock_free_queue.h | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/queue/array_lock_free_queue.h b/src/queue/array_lock_free_queue.h index 24efd10..8e415fa 100644 --- a/src/queue/array_lock_free_queue.h +++ b/src/queue/array_lock_free_queue.h @@ -235,7 +235,9 @@ } #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE - AtomicAdd(&m_count, 1); + if (m_count < Q_SIZE) { + AtomicAdd(&m_count, 1); + } #endif return true; } @@ -275,7 +277,9 @@ if (CAS(&m_readIndex, currentReadIndex, (currentReadIndex + 1))) { #ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE // m_count.fetch_sub(1); - AtomicSub(&m_count, 1); + if (m_count > 0) { + AtomicSub(&m_count, 1); + } #endif return true; } @@ -295,6 +299,7 @@ template<typename ELEM_T, typename Allocator> ELEM_T &ArrayLockFreeQueue<ELEM_T, Allocator>::operator[](unsigned int i) { +#ifdef _WITH_LOCK_FREE_Q_KEEP_REAL_SIZE int currentCount = m_count; uint32_t currentReadIndex = m_readIndex; if (i >= currentCount) { @@ -302,6 +307,9 @@ << " is out of range\n"; std::exit(EXIT_FAILURE); } +#else + uint32_t currentReadIndex = m_readIndex; +#endif return m_theQueue[countToIndex(currentReadIndex + i)]; } -- Gitblit v1.8.0