Extend urcu::raw_ptr move assignment
[libcds.git] / cds / intrusive / details / raw_ptr_disposer.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()
         {