Extend urcu::raw_ptr move assignment
authorkhizmax <libcds.dev@gmail.com>
Fri, 11 Mar 2016 21:56:41 +0000 (00:56 +0300)
committerkhizmax <libcds.dev@gmail.com>
Fri, 11 Mar 2016 21:56:41 +0000 (00:56 +0300)
cds/intrusive/details/raw_ptr_disposer.h
cds/urcu/raw_ptr.h

index 0975d8a769fdf7822cd9c15242dff0c1da95620d..de03f802c908de85b082ae0d9fa5f4fe3930e0f3 100644 (file)
@@ -69,15 +69,23 @@ namespace cds { namespace intrusive { namespace details {
             apply();
         }
 
-        raw_ptr_disposer& operator=(raw_ptr_disposer&& d)
+        raw_ptr_disposer& combine(raw_ptr_disposer&& d)
         {
-            assert( pReclaimedChain == nullptr );
-            pReclaimedChain = d.pReclaimedChain;
+            if ( pReclaimedChain == nullptr )
+                pReclaimedChain = d.pReclaimedChain;
+            else if ( d.pReclaimedChain ) {
+                // union reclaimed chains
+                node_type * pEnd = d.pReclaimedChain;
+                for ( ; pEnd->m_pDelChain; pEnd = pEnd->m_pDelChain );
+                pEnd->m_pDelChain = pReclaimedChain;
+                pReclaimedChain = d.pReclaimedChain;
+            }
             d.pReclaimedChain = nullptr;
             return *this;
         }
 
         raw_ptr_disposer& operator=(raw_ptr_disposer const& d) = delete;
+        raw_ptr_disposer& operator=( raw_ptr_disposer&& d ) = delete;
 
         void apply()
         {
index 374ac81d43b6eedd570a01300343a21679eef800..c277edfe7388ba3a66c29fe3985ef0dca86ef8df 100644 (file)
@@ -47,7 +47,7 @@ namespace cds { namespace urcu {
         outside RCU lock.
 
         The object of \p %raw_ptr solves that problem: it contains the pointer to the node found
-        and a chain of nodes that were reclaimed during traversing. The \p %raw_ptr object destructor
+        and a chain of nodes that were be reclaimed during traversing. The \p %raw_ptr object destructor
         frees the chain (but not the node found) passing it to RCU \p batch_retire().
 
         The object of \p %raw_ptr class must be destructed only outside RCU-lock of current thread.
@@ -136,16 +136,12 @@ namespace cds { namespace urcu {
         /// Move assignment operator
         /**
             This operator may be called only inside RCU-lock.
-            The \p this should be empty.
         */
         raw_ptr& operator=( raw_ptr&& p ) CDS_NOEXCEPT
         {
-            assert( empty() );
-            if ( !rcu::is_locked() )
-                release();
-
+            assert( rcu::is_locked());
             m_ptr = p.m_ptr;
-            m_Enum = std::move( p.m_Enum );
+            m_Enum.combine(  std::move( p.m_Enum ));
             p.m_ptr = nullptr;
             return *this;
         }