SkipList: improved dtor
authorkhizmax <libcds.dev@gmail.com>
Sat, 24 Dec 2016 08:51:34 +0000 (11:51 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sat, 24 Dec 2016 08:51:34 +0000 (11:51 +0300)
cds/intrusive/impl/skip_list.h
cds/intrusive/skip_list_rcu.h

index fb29f20a1ec231b24599c38fc2594ab20978652d..db291380ded5bc49bb888aba59dd936aeb590e3d 100644 (file)
@@ -442,7 +442,7 @@ namespace cds { namespace intrusive {
         /// Clears and destructs the skip-list
         ~SkipListSet()
         {
-            clear();
+            destroy();
         }
 
     public:
@@ -1682,8 +1682,19 @@ namespace cds { namespace intrusive {
         {
             unsigned int nCur = m_nHeight.load( memory_model::memory_order_relaxed );
             if ( nCur < nHeight )
-                m_nHeight.compare_exchange_strong( nCur, nHeight, memory_model::memory_order_release, atomics::memory_order_relaxed );
+                m_nHeight.compare_exchange_strong( nCur, nHeight, memory_model::memory_order_relaxed, atomics::memory_order_relaxed );
         }
+
+        void destroy()
+        {
+            node_type* p = m_Head.head()->next( 0 ).load( atomics::memory_order_relaxed ).ptr();
+            while ( p ) {
+                node_type* pNext = p->next( 0 ).load( atomics::memory_order_relaxed ).ptr();
+                dispose_node( node_traits::to_value_ptr( p ));
+                p = pNext;
+            }
+        }
+
         //@endcond
 
     private:
index 79d9f5b2fe7b3ec156e453b17c9f7cf75813137a..52dccdd76b6a95adbdf667020090d26750845e3e 100644 (file)
@@ -697,7 +697,7 @@ namespace cds { namespace intrusive {
         /// Clears and destructs the skip-list
         ~SkipListSet()
         {
-            clear();
+            destroy();
         }
 
     public:
@@ -2002,6 +2002,17 @@ namespace cds { namespace intrusive {
             if ( nCur < nHeight )
                 m_nHeight.compare_exchange_strong( nCur, nHeight, memory_model::memory_order_release, atomics::memory_order_relaxed );
         }
+
+        void destroy()
+        {
+            node_type* p = m_Head.head()->next( 0 ).load( atomics::memory_order_relaxed ).ptr();
+            while ( p ) {
+                node_type* pNext = p->next( 0 ).load( atomics::memory_order_relaxed ).ptr();
+                dispose_node( node_traits::to_value_ptr( p ) );
+                p = pNext;
+            }
+        }
+
         //@endcond
     };