From ebb638008a4dad4a2c16cbf6fdf265073d6cc550 Mon Sep 17 00:00:00 2001 From: khizmax Date: Sat, 14 Mar 2015 20:48:54 +0300 Subject: [PATCH] Added more checking --- cds/memory/vyukov_queue_pool.h | 7 ++++--- cds/sync/injecting_monitor.h | 7 +++++++ cds/sync/pool_monitor.h | 11 +++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/cds/memory/vyukov_queue_pool.h b/cds/memory/vyukov_queue_pool.h index 938f158e..c7be7f43 100644 --- a/cds/memory/vyukov_queue_pool.h +++ b/cds/memory/vyukov_queue_pool.h @@ -405,8 +405,9 @@ namespace cds { namespace memory { //@cond void preallocate_pool() { - m_pFirst = cxx_allocator().NewArray( m_Queue.capacity() ); - m_pLast = m_pFirst + m_Queue.capacity(); + size_t const nCount = m_Queue.capacity(); + m_pFirst = cxx_allocator().NewArray( nCount ); + m_pLast = m_pFirst + nCount; for ( value_type * p = m_pFirst; p < m_pLast; ++p ) CDS_VERIFY( m_Queue.push( *p )) ; // must be true @@ -474,7 +475,7 @@ namespace cds { namespace memory { if ( p ) { assert( from_pool( p )); - m_Queue.push( *p ); + CDS_VERIFY( m_Queue.push( *p )); } } }; diff --git a/cds/sync/injecting_monitor.h b/cds/sync/injecting_monitor.h index 1588b204..323866e8 100644 --- a/cds/sync/injecting_monitor.h +++ b/cds/sync/injecting_monitor.h @@ -34,6 +34,13 @@ namespace cds { namespace sync { /// Node injection struct node_injection { mutable lock_type m_Lock; ///< Node spin-lock + + //@cond + CDS_CONSTEXPR bool check_free() const + { + return true; + } + //@endcond }; /// Makes exclusive access to node \p p diff --git a/cds/sync/pool_monitor.h b/cds/sync/pool_monitor.h index 1e73711a..2c544cb7 100644 --- a/cds/sync/pool_monitor.h +++ b/cds/sync/pool_monitor.h @@ -33,13 +33,13 @@ namespace cds { namespace sync { typedef Counter event_counter; ///< measure type event_counter m_nLockCount; ///< Number of monitor \p lock() call - event_counter m_nUnlockCount; ///< Number of monitor \p unlock call + event_counter m_nUnlockCount; ///< Number of monitor \p unlock() call event_counter m_nMaxLocked; ///< Max number of simuntaneously locked mutexes event_counter m_nLockContention; ///< Number of \p lock() contenton event_counter m_nUnlockContention; ///< Number of \p unlock() contention event_counter m_nLockAllocation; ///< Number of the lock allocation from the pool event_counter m_nLockDeallocation; ///< Number of the lock deallocation - event_counter m_nMaxAllocated; ///< Max number of sumultanouusly allocated mutexes + event_counter m_nMaxAllocated; ///< Max number of sumultaneously allocated mutexes //@cond void onLock() @@ -127,6 +127,7 @@ namespace cds { namespace sync { mutable atomics::atomic m_RefSpin; ///< Spin-lock for \p m_pLock (bit 0) + reference counter mutable lock_type * m_pLock; ///< Node-level lock + //@cond node_injection() : m_RefSpin( 0 ) , m_pLock( nullptr ) @@ -137,6 +138,12 @@ namespace cds { namespace sync { assert( m_pLock == nullptr ); assert( m_RefSpin.load( atomics::memory_order_relaxed ) == 0 ); } + + bool check_free() const + { + return m_pLock == nullptr && m_RefSpin.load( atomics::memory_order_acquire ) == 0; + } + //@endcond }; /// Initializes the pool of 256 preallocated mutexes -- 2.34.1