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