Fixed bug in RCU batch_retire()
[libcds.git] / cds / urcu / details / sig_buffered.h
index 05b98623a602dcde29bd1f74d6861f87283b5402..d1c4569c54c7bc12f4732a79e130825866d720fb 100644 (file)
@@ -172,8 +172,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));
             }
         }
 
@@ -182,8 +183,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