Fixed SplitList destroying sequence
authorkhizmax <libcds.dev@gmail.com>
Wed, 14 Sep 2016 20:30:49 +0000 (23:30 +0300)
committerkhizmax <libcds.dev@gmail.com>
Wed, 14 Sep 2016 20:30:49 +0000 (23:30 +0300)
cds/intrusive/impl/michael_list.h
cds/intrusive/michael_list_nogc.h
cds/intrusive/michael_list_rcu.h
cds/intrusive/split_list.h
cds/intrusive/split_list_nogc.h
cds/intrusive/split_list_rcu.h
cds/opt/options.h

index d279a21..759b13c 100644 (file)
@@ -5,7 +5,7 @@
 
     Source code repo: http://github.com/khizmax/libcds/
     Download: http://sourceforge.net/projects/libcds/files/
-    
+
     Redistribution and use in source and binary forms, with or without
     modification, are permitted provided that the following conditions are met:
 
index 2fa260c..90455a2 100644 (file)
@@ -5,7 +5,7 @@
 
     Source code repo: http://github.com/khizmax/libcds/
     Download: http://sourceforge.net/projects/libcds/files/
-    
+
     Redistribution and use in source and binary forms, with or without
     modification, are permitted provided that the following conditions are met:
 
index 1b215c1..7fbc68e 100644 (file)
@@ -5,7 +5,7 @@
 
     Source code repo: http://github.com/khizmax/libcds/
     Download: http://sourceforge.net/projects/libcds/files/
-    
+
     Redistribution and use in source and binary forms, with or without
     modification, are permitted provided that the following conditions are met:
 
index 7391a10..0025811 100644 (file)
@@ -403,6 +403,15 @@ namespace cds { namespace intrusive {
             init();
         }
 
+        /// Destroys split-list set
+        ~SplitListSet()
+        {
+            // list contains aux node that cannot be retired
+            // all aux nodes will be destroyed by bucket table dtor
+            m_List.clear();
+            gc::force_dispose();
+        }
+
     public:
         /// Inserts new node
         /**
@@ -837,7 +846,7 @@ namespace cds { namespace intrusive {
         /// Clears the set (non-atomic)
         /**
             The function unlink all items from the set.
-            The function is not atomic. Therefore, \p clear may be used only for debugging purposes.
+            The function is not atomic. After call the split-list can be non-empty.
 
             For each item the \p disposer is called after unlinking.
         */
@@ -1213,10 +1222,12 @@ namespace cds { namespace intrusive {
 
     protected:
         //@cond
-        typedef typename cds::details::type_padding< bucket_table, traits::padding >::type padded_bucket_table;
+        static unsigned const c_padding = cds::opt::actual_padding< traits::padding >::value;
+
+        typedef typename cds::details::type_padding< bucket_table, c_padding >::type padded_bucket_table;
         padded_bucket_table     m_Buckets;          ///< bucket table
 
-        typedef typename cds::details::type_padding< ordered_list_wrapper, traits::padding>::type padded_ordered_list;
+        typedef typename cds::details::type_padding< ordered_list_wrapper, c_padding >::type padded_ordered_list;
         padded_ordered_list     m_List;             ///< Ordered list containing split-list items
 
         atomics::atomic<size_t> m_nBucketCountLog2; ///< log2( current bucket count )
index 1544609..f4f146f 100644 (file)
@@ -205,6 +205,11 @@ namespace cds { namespace intrusive {
             init();
         }
 
+        /// Destroys split-list
+        ~SplitListSet()
+        {
+            m_List.clear();
+        }
     public:
         /// Inserts new node
         /**
index 8ea2078..9791aa2 100644 (file)
@@ -298,6 +298,13 @@ namespace cds { namespace intrusive {
             init();
         }
 
+        /// Destroys split-list
+        ~SplitListSet()
+        {
+            m_List.clear();
+            gc::force_dispose();
+        }
+
     public:
         /// Inserts new node
         /**
index 53e124c..7a124aa 100644 (file)
@@ -372,7 +372,7 @@ namespace opt {
 
         /// Apply padding only for tiny data when data size is less than required padding
         /**
-            The flag means that if your data size is less than the casheline size, the padding is applyed.
+            The flag means that if your data size is less than the cacheline size, the padding is applyed.
             Otherwise no padding will be applyed.
 
             This flag is applyed for padding value: