Fixed bug in RCU batch_retire()
authorkhizmax <libcds.dev@gmail.com>
Sun, 12 Jul 2015 07:57:06 +0000 (10:57 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sun, 12 Jul 2015 07:57:06 +0000 (10:57 +0300)
cds/urcu/details/gpb.h
cds/urcu/details/gpi.h
cds/urcu/details/gpt.h
cds/urcu/details/sig_buffered.h
cds/urcu/details/sig_threaded.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
index ce9bb53a9370f75818acf96cae23e54111818681..23c105e18b938f3b37bdf3b8542676a6a2924898 100644 (file)
@@ -137,8 +137,11 @@ namespace cds { namespace urcu {
             retired_ptr p{ e() };
             if ( p.m_p ) {
                 synchronize();
-                for ( ; p.m_p; p = e() )
-                    p.free();
+                while ( p.m_p ) {
+                    retired_ptr pr( p );
+                    p = e();
+                    pr.free();
+                }
             }
         }
 
index 1f5941481f91156ec8a09ba4f54846dce0971482..4699ef2f3b9f710bc44d60d2617b19df07912806 100644 (file)
@@ -178,8 +178,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));
             }
         }
 
@@ -188,8 +189,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));
+            }
         }
 
 
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
index 93e1aa240aeb77e7996cba6653e7fc9752c315d2..f4031862ee193ad891cd983213e0f5a6e776f9a9 100644 (file)
@@ -177,8 +177,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));
             }
         }
 
@@ -187,8 +188,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));
+            }
         }