Fixed bug in RCU batch_retire()
[libcds.git] / cds / urcu / details / gpb.h
index 9441f26b433bd2b3f273dc9ee091720c138eb3cc..94e27b65de3e51feb7d7afe32c7255e0dce5eeaf 100644 (file)
@@ -174,8 +174,9 @@ namespace cds { namespace urcu {
         {
             uint64_t nEpoch = m_nCurEpoch.load( atomics::memory_order_relaxed );
             while ( itFirst != itLast ) {
-                push_buffer( epoch_retired_ptr( *itFirst, nEpoch ));
+                epoch_retired_ptr ep( *itFirst, nEpoch );
                 ++itFirst;
+                push_buffer( std::move(ep) );
             }
         }
 
@@ -184,8 +185,11 @@ namespace cds { namespace urcu {
         void batch_retire( Func e )
         {
             uint64_t nEpoch = m_nCurEpoch.load( atomics::memory_order_relaxed );
-            for ( retired_ptr p{ e() }; p.m_p; p = e() )
-                push_buffer( epoch_retired_ptr( p, nEpoch ));
+            for ( retired_ptr p{ e() }; p.m_p; ) {
+                epoch_retired_ptr ep( p, nEpoch );
+                p = e();
+                push_buffer( std::move(ep));
+            }
         }
 
         /// Wait to finish a grace period and then clear the buffer