Fixed rare double-free in DHP SMR
authorkhizmax <libcds.dev@gmail.com>
Sat, 28 Nov 2015 10:25:38 +0000 (13:25 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sat, 28 Nov 2015 10:25:38 +0000 (13:25 +0300)
cds/gc/details/dhp.h
src/dhp_gc.cpp

index 14c52a3f68164e57ca59252666014632ebd6500c..5825a9cc65b49009f83528cdd037dd7672106c4d 100644 (file)
@@ -297,11 +297,13 @@ namespace cds { namespace gc {
                 privatize_result privatize() CDS_NOEXCEPT
                 {
                     privatize_result res;
-                    res.first = m_pHead.exchange( nullptr, atomics::memory_order_acq_rel );
 
                     // Item counter is needed only as a threshold for \p scan() function
                     // So, we may clear the item counter without synchronization with m_pHead
                     res.second = m_nItemCount.exchange( 0, atomics::memory_order_relaxed );
+
+                    res.first = m_pHead.exchange( nullptr, atomics::memory_order_acq_rel );
+
                     return res;
                 }
 
index cdafe5def60ceea7c30bf3b001705757d877336a..a5d22487b2225827ece14c3772acadbaf8c532b2 100644 (file)
@@ -19,11 +19,11 @@ namespace cds { namespace gc { namespace dhp {
             size_t const m_nBucketCount;
             item_type *  m_Buckets;
 
-            item_type&  bucket( retired_ptr_node& node )
+            item_type&  bucket( retired_ptr_node& node ) const
             {
                 return bucket( node.m_ptr.m_p );
             }
-            item_type&  bucket( guard_data::guarded_ptr p )
+            item_type&  bucket( guard_data::guarded_ptr p ) const
             {
                 return m_Buckets[ std::hash<guard_data::guarded_ptr>()( p ) & (m_nBucketCount - 1)  ];
             }