Fixed bug in RCU batch_retire()
[libcds.git] / cds / urcu / details / gpi.h
index b72ffec6ebd50a1a90c397455b92423ded267062..23c105e18b938f3b37bdf3b8542676a6a2924898 100644 (file)
@@ -130,16 +130,27 @@ namespace cds { namespace urcu {
             }
         }
 
+        /// Retires the pointer chain until \p Func returns \p nullptr retired pointer
+        template <typename Func>
+        void batch_retire( Func e )
+        {
+            retired_ptr p{ e() };
+            if ( p.m_p ) {
+                synchronize();
+                while ( p.m_p ) {
+                    retired_ptr pr( p );
+                    p = e();
+                    pr.free();
+                }
+            }
+        }
+
         /// Waits to finish a grace period
         void synchronize()
         {
-            atomics::atomic_thread_fence( atomics::memory_order_acquire );
-            {
-                std::unique_lock<lock_type> sl( m_Lock );
-                flip_and_wait();
-                flip_and_wait();
-            }
-            atomics::atomic_thread_fence( atomics::memory_order_release );
+            std::unique_lock<lock_type> sl( m_Lock );
+            flip_and_wait();
+            flip_and_wait();
         }
 
         //@cond