From 86dcd6ee77fd5ecd4862016a1aa437f904dd3855 Mon Sep 17 00:00:00 2001 From: Ge Wang Date: Tue, 14 May 2024 03:56:17 -0700 Subject: [PATCH] add mutex synchronization for XCircleBuffer --- src/core/util_buffers.h | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/util_buffers.h b/src/core/util_buffers.h index d0df5b5d0..b32704fab 100644 --- a/src/core/util_buffers.h +++ b/src/core/util_buffers.h @@ -44,6 +44,7 @@ #include #include #include // added 1.5.2.5 (ge) for "lock-free" circle buffer +#include // added 1.5.2.5 (ge) hmm so much for "lock-free" #define DWORD__ t_CKUINT #define SINT__ t_CKINT @@ -390,6 +391,8 @@ class XCircleBuffer std::atomic_ulong m_readIndex; // num elements std::atomic_ulong m_numElements; + // mutex | 1.5.2.5 (ge) + std::mutex m_mutex; }; @@ -420,7 +423,8 @@ XCircleBuffer::XCircleBuffer( long length ) template XCircleBuffer::~XCircleBuffer() { - + CK_SAFE_DELETE_ARRAY( m_buffer ); + m_length = m_readIndex = m_writeIndex = m_numElements = 0; } @@ -433,6 +437,9 @@ XCircleBuffer::~XCircleBuffer() template void XCircleBuffer::init( long length ) { + // 1.5.2.5 (ge) added + std::lock_guard lock(m_mutex); + // clean up is necessary if( m_buffer ) { @@ -496,6 +503,9 @@ long XCircleBuffer::length() const template void XCircleBuffer::clear() { + // 1.5.2.5 (ge) added + std::lock_guard lock(m_mutex); + // zero out m_readIndex = m_writeIndex = m_numElements = 0; } @@ -559,6 +569,9 @@ void XCircleBuffer::advanceRead() template void XCircleBuffer::put( const T & item ) { + // 1.5.2.5 (ge) added + std::lock_guard lock(m_mutex); + // sanity check if( m_buffer == NULL ) return; @@ -615,6 +628,9 @@ bool XCircleBuffer::more() const template long XCircleBuffer::peek( T * array, long numItems, unsigned long stride ) { + // 1.5.2.5 (ge) added + std::lock_guard lock(m_mutex); + // sanity check if( m_buffer == NULL ) return 0; @@ -666,6 +682,9 @@ long XCircleBuffer::peek( T * array, long numItems, unsigned long stride ) template long XCircleBuffer::pop( long numItems ) { + // 1.5.2.5 (ge) added + std::lock_guard lock(m_mutex); + // sanity check if( m_buffer == NULL ) return 0; @@ -694,6 +713,9 @@ long XCircleBuffer::pop( long numItems ) template bool XCircleBuffer::get( T * result ) { + // 1.5.2.5 (ge) added + std::lock_guard lock(m_mutex); + // sanity check if( m_buffer == NULL || m_readIndex == m_writeIndex ) return false;