From 4f8e1e58427147b7a9a784639e2170d34c5d3221 Mon Sep 17 00:00:00 2001
From: fujuntang <fujuntang@smartai.com>
Date: 星期五, 19 十一月 2021 16:09:35 +0800
Subject: [PATCH] Optimize the logic to avoid the possible issue.
---
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