Move cds/intrusive/base.h to cds/intrusive/details directory
authorkhizmax <libcds.dev@gmail.com>
Sat, 27 Sep 2014 14:29:35 +0000 (18:29 +0400)
committerkhizmax <libcds.dev@gmail.com>
Sat, 27 Sep 2014 14:29:35 +0000 (18:29 +0400)
23 files changed:
cds/container/base.h
cds/intrusive/base.h [deleted file]
cds/intrusive/basket_queue.h
cds/intrusive/cuckoo_set.h
cds/intrusive/details/base.h [new file with mode: 0644]
cds/intrusive/details/ellen_bintree_base.h
cds/intrusive/details/single_link_struct.h
cds/intrusive/lazy_list_base.h
cds/intrusive/michael_list_base.h
cds/intrusive/michael_set_base.h
cds/intrusive/mspriority_queue.h
cds/intrusive/optimistic_queue.h
cds/intrusive/segmented_queue.h
cds/intrusive/skip_list_base.h
cds/intrusive/split_list_base.h
cds/intrusive/striped_set.h
cds/intrusive/tsigas_cycle_queue.h
cds/intrusive/vyukov_mpmc_cycle_queue.h
projects/Win/vc12/cds.vcxproj
projects/Win/vc12/cds.vcxproj.filters
tests/test-hdr/queue/hdr_intrusive_msqueue.h
tests/test-hdr/queue/hdr_intrusive_segmented_queue.h
tests/test-hdr/queue/hdr_segmented_queue.h

index bd6ed3e0a1dc8b8b64c33a5f5f207c4367edfde4..0a8372faaa36d7eeb3b4d85af70209f2c50b7582 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_CONTAINER_BASE_H
 #define __CDS_CONTAINER_BASE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/details/allocator.h>
 
 namespace cds {
diff --git a/cds/intrusive/base.h b/cds/intrusive/base.h
deleted file mode 100644 (file)
index 8fa8e4f..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-//$$CDS-header$$
-
-#ifndef __CDS_INTRUSIVE_BASE_H
-#define __CDS_INTRUSIVE_BASE_H
-
-#include <cds/intrusive/node_traits.h>
-#include <cds/details/allocator.h>
-#include <cds/algo/backoff_strategy.h>
-
-namespace cds {
-
-/// Intrusive containers
-/**
-    @ingroup cds_intrusive_containers
-    The namespace cds::intrusive contains intrusive lock-free containers.
-    The idea comes from \p boost::intrusive library, see http://boost.org/doc/ as a good introduction to intrusive approach.
-    The intrusive containers of libcds library is developed as close to boost::intrusive
-
-    In terms of lock-free approach, the main advantage of intrusive containers is
-    that no memory allocation is performed to maintain container items.
-    However, additional requirements is imposed for types and values that can be stored in intrusive container.
-    See the container documentation for details.
-
-    Restriction for Gidenstam's garbage collector cds::gc::HRC:
-    the Gidenstam's garbage collector makes additional requirements to type of item in intrusive container.
-    Therefore, for this GC only \p base_hook is allowed as the value of opt::hook option.
-
-    \anchor cds_intrusive_item_destroying
-    \par Destroying items
-
-    It should be very careful when destroying an item removed from intrusive container.
-    In other threads the references to popped item may exists some time after removing.
-    To destroy the removed item in thread-safe manner you should call static function \p retire
-    of garbage collector you use, for example:
-    \code
-    struct destroyer  {
-        void operator ()( my_type * p )
-        {
-            delete p;
-        }
-    };
-
-    typedef cds::intrusive::TreiberStack< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > stack;
-    stack s;
-
-    // ....
-
-    my_type * p = s.pop();
-
-    if ( p ) {
-        // It is wrong
-        // delete p;
-
-        // It is correct
-        cds::gc:HP::retire< destroyer >( p );
-    }
-    \endcode
-    The situation becomes even more complicated when you want store items in different intrusive containers.
-    In this case the best way is using reference counting:
-    \code
-    struct my_type {
-        ...
-        std::atomic<unsigned int> nRefCount;
-
-        my_type()
-            : nRefCount(0)
-        {}
-    };
-
-    struct destroyer  {
-        void operator ()( my_type * p )
-        {
-            if ( --p->nRefCount == 0 )
-                delete p    ;   // delete only after no reference pointing to p
-        }
-    };
-
-    typedef cds::intrusive::TreiberStack< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > stack;
-    typedef cds::intrusive::MSQueue< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > queue;
-    stack s;
-    queue q;
-
-    my_type * v = new my_type();
-
-    v.nRefCount++   ; // increment counter before pushing the item to the stack
-    s.push(v);
-
-    v.nRefCount++   ; // increment counter before pushing the item to the queue
-    q.push(v);
-
-    // ....
-
-    my_type * ps = s.pop();
-    if ( ps ) {
-        // It is wrong
-        // delete ps;
-
-        // It is correct
-        cds::gc:HP::retire< destroyer >( ps );
-    }
-
-    my_type * pq = q.pop();
-    if ( pq ) {
-        // It is wrong
-        // delete pq;
-
-        // It is correct
-        cds::gc:HP::retire< destroyer >( pq );
-    }
-    \endcode
-    Violation of these rules may lead to a crash.
-
-    \par Intrusive containers and Hazard Pointer-like garbage collectors
-
-    If you develop your intrusive container based on <b>libcds</b> library framework, you should
-    take in the account the following.
-    The main idea of garbage collectors (GC) based on Hazard Pointer schema is protecting a shared pointer
-    by publishing it as a "hazard" one i.e. as a pointer that is changing at the current time and cannot be
-    deleted at this moment. In intrusive container paradigm, the pointer to the node of the container
-    and the pointer to the item stored in the container are not equal in the general case.
-    However, any pointer to the node should be castable to the appropriate pointer to the container's item.
-    In general, any item can be placed to some different intrusive containers simultaneously,
-    and each of those container holds a unique pointer to its node that refers to the same item.
-    When we protect a pointer, we want to protect an <b>item</b> pointer that is the invariant
-    for any container stored that item. In your intrusive container, instead of protecting by GC's guard a pointer to an node
-    you should convert it to the pointer to the item and then protect resulting item pointer.
-    Otherwise an unpredictable result may occur.
-
-*/
-namespace intrusive {
-
-    /// @defgroup cds_intrusive_containers Intrusive containers
-    /** @defgroup cds_intrusive_helper Helper structs for intrusive containers
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_stack Stack
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_queue Queue
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_priority_queue Priority queue
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_deque Deque
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_map Set
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_tree Tree
-        @ingroup cds_intrusive_containers
-    */
-    /** @defgroup cds_intrusive_list List
-        @ingroup cds_intrusive_containers
-    */
-
-}} // namespace cds::intrusuve
-
-#endif  // #ifndef __CDS_INTRUSIVE_BASE_H
index 3a2d4aeda79cb5c67598945a729a94edb67177ac..331127a029b7870e7c43e40d076eddaf5d0e7d79 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_INTRUSIVE_BASKET_QUEUE_H
 
 #include <type_traits>
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/details/marked_ptr.h>
 #include <cds/intrusive/queue_stat.h>
 #include <cds/intrusive/details/single_link_struct.h>
index 790a785240939147bd1f9f1b94ac429d621ae06f..87404c7a23a5f4da2169ce091ccb289618a54642 100644 (file)
@@ -6,7 +6,7 @@
 #include <memory>
 #include <type_traits>
 #include <mutex>
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/opt/compare.h>
 #include <cds/opt/hash.h>
 #include <cds/lock/array.h>
diff --git a/cds/intrusive/details/base.h b/cds/intrusive/details/base.h
new file mode 100644 (file)
index 0000000..0845569
--- /dev/null
@@ -0,0 +1,160 @@
+//$$CDS-header$$
+
+#ifndef __CDS_INTRUSIVE_DETAILS_BASE_H
+#define __CDS_INTRUSIVE_DETAILS_BASE_H
+
+#include <cds/intrusive/node_traits.h>
+#include <cds/details/allocator.h>
+#include <cds/algo/backoff_strategy.h>
+
+namespace cds {
+
+/// Intrusive containers
+/**
+    @ingroup cds_intrusive_containers
+    The namespace cds::intrusive contains intrusive lock-free containers.
+    The idea comes from \p boost::intrusive library, see http://boost.org/doc/ as a good introduction to intrusive approach.
+    The intrusive containers of libcds library is developed as close to boost::intrusive
+
+    In terms of lock-free approach, the main advantage of intrusive containers is
+    that no memory allocation is performed to maintain container items.
+    However, additional requirements is imposed for types and values that can be stored in intrusive container.
+    See the container documentation for details.
+
+    Restriction for Gidenstam's garbage collector cds::gc::HRC:
+    the Gidenstam's garbage collector makes additional requirements to type of item in intrusive container.
+    Therefore, for this GC only \p base_hook is allowed as the value of opt::hook option.
+
+    \anchor cds_intrusive_item_destroying
+    \par Destroying items
+
+    It should be very careful when destroying an item removed from intrusive container.
+    In other threads the references to popped item may exists some time after removing.
+    To destroy the removed item in thread-safe manner you should call static function \p retire
+    of garbage collector you use, for example:
+    \code
+    struct destroyer  {
+        void operator ()( my_type * p )
+        {
+            delete p;
+        }
+    };
+
+    typedef cds::intrusive::TreiberStack< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > stack;
+    stack s;
+
+    // ....
+
+    my_type * p = s.pop();
+
+    if ( p ) {
+        // It is wrong
+        // delete p;
+
+        // It is correct
+        cds::gc:HP::retire< destroyer >( p );
+    }
+    \endcode
+    The situation becomes even more complicated when you want store items in different intrusive containers.
+    In this case the best way is using reference counting:
+    \code
+    struct my_type {
+        ...
+        std::atomic<unsigned int> nRefCount;
+
+        my_type()
+            : nRefCount(0)
+        {}
+    };
+
+    struct destroyer  {
+        void operator ()( my_type * p )
+        {
+            if ( --p->nRefCount == 0 )
+                delete p    ;   // delete only after no reference pointing to p
+        }
+    };
+
+    typedef cds::intrusive::TreiberStack< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > stack;
+    typedef cds::intrusive::MSQueue< cds::gc::HP, my_type, cds::opt::disposer< destroyer > > queue;
+    stack s;
+    queue q;
+
+    my_type * v = new my_type();
+
+    v.nRefCount++   ; // increment counter before pushing the item to the stack
+    s.push(v);
+
+    v.nRefCount++   ; // increment counter before pushing the item to the queue
+    q.push(v);
+
+    // ....
+
+    my_type * ps = s.pop();
+    if ( ps ) {
+        // It is wrong
+        // delete ps;
+
+        // It is correct
+        cds::gc:HP::retire< destroyer >( ps );
+    }
+
+    my_type * pq = q.pop();
+    if ( pq ) {
+        // It is wrong
+        // delete pq;
+
+        // It is correct
+        cds::gc:HP::retire< destroyer >( pq );
+    }
+    \endcode
+    Violation of these rules may lead to a crash.
+
+    \par Intrusive containers and Hazard Pointer-like garbage collectors
+
+    If you develop your intrusive container based on <b>libcds</b> library framework, you should
+    take in the account the following.
+    The main idea of garbage collectors (GC) based on Hazard Pointer schema is protecting a shared pointer
+    by publishing it as a "hazard" one i.e. as a pointer that is changing at the current time and cannot be
+    deleted at this moment. In intrusive container paradigm, the pointer to the node of the container
+    and the pointer to the item stored in the container are not equal in the general case.
+    However, any pointer to the node should be castable to the appropriate pointer to the container's item.
+    In general, any item can be placed to some different intrusive containers simultaneously,
+    and each of those container holds a unique pointer to its node that refers to the same item.
+    When we protect a pointer, we want to protect an <b>item</b> pointer that is the invariant
+    for any container stored that item. In your intrusive container, instead of protecting by GC's guard a pointer to an node
+    you should convert it to the pointer to the item and then protect resulting item pointer.
+    Otherwise an unpredictable result may occur.
+
+*/
+namespace intrusive {
+
+    /// @defgroup cds_intrusive_containers Intrusive containers
+    /** @defgroup cds_intrusive_helper Helper structs for intrusive containers
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_stack Stack
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_queue Queue
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_priority_queue Priority queue
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_deque Deque
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_map Set
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_tree Tree
+        @ingroup cds_intrusive_containers
+    */
+    /** @defgroup cds_intrusive_list List
+        @ingroup cds_intrusive_containers
+    */
+
+}} // namespace cds::intrusuve
+
+#endif  // #ifndef __CDS_INTRUSIVE_DETAILS_BASE_H
index f35ac11be2d04ac357ec7009936904cbbb7d4718..644c5b763855a7f2334ead47d9cea8ee7812c6af 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_INTRUSIVE_DETAILS_ELLEN_BINTREE_BASE_H
 
 #include <type_traits>
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/opt/options.h>
 #include <cds/urcu/options.h>
 #include <cds/details/marked_ptr.h>
index d3e3cc85c5e0bdc677a0bd6b0ba22722e8b4f63e..86363980be1458f982693ec5311aa65da8d798f3 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_DETAILS_SINGLE_LINK_STRUCT_H
 #define __CDS_INTRUSIVE_DETAILS_SINGLE_LINK_STRUCT_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/gc/default_gc.h>
 #include <cds/cxx11_atomic.h>
 #include <cds/gc/hrc.h>
index 3afdef67e2d128dd3eaa2308967a68943d6b8e80..c4c12cbd69ede68787242dcf6be4d837be3a60e5 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_LAZY_LIST_BASE_H
 #define __CDS_INTRUSIVE_LAZY_LIST_BASE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/opt/compare.h>
 #include <cds/details/marked_ptr.h>
 #include <cds/ref.h>
index 684271625d1038941f3567e1ba3337584d5f8435..33861c60c083f5a3c8855d611f508a30de63b441 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_INTRUSIVE_MICHAEL_LIST_BASE_H
 
 #include <type_traits>
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/opt/compare.h>
 #include <cds/cxx11_atomic.h>
 #include <cds/details/marked_ptr.h>
index f68b5a3b446e584ede4a598c3eb88d832984c69a..f0fe594697e57b620bea709c8fb3d2ce2cd823b9 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_MICHAEL_SET_BASE_H
 #define __CDS_INTRUSIVE_MICHAEL_SET_BASE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/opt/compare.h>
 #include <cds/opt/hash.h>
 #include <cds/algo/bitop.h>
index bd94dab3b51460122d51ddd48040dfccc316e055..ffe3adb27c8c127d61ac00a8c764e55b504c60f0 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H
 #define __CDS_INTRUSIVE_MSPRIORITY_QUEUE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/lock/spinlock.h>
 #include <cds/os/thread.h>
 #include <cds/details/bit_reverse_counter.h>
index e1d57948b1ed8cc1525bb10b698c38795aaf178b..d0d3cc9e89e3ad6766bf209db1d80839425292f5 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_INTRUSIVE_OPTIMISTIC_QUEUE_H
 
 #include <type_traits>
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/cxx11_atomic.h>
 #include <cds/gc/default_gc.h>
 #include <cds/gc/hrc/gc_fwd.h>
index 2376e489f133c2b3aa0cded816742b896022adc4..36e8abf188b91481bbfe2f668fccfad40eeec8f6 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_INTRUSIVE_SEGMENTED_QUEUE_H
 
 #include <mutex>
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/details/marked_ptr.h>
 #include <cds/algo/int_algo.h>
 #include <cds/lock/spinlock.h>
index 5e046961f828177365e5cabc50c74058ad5666ca..5419dc4e04c8b2e81944a6e79386c2e14edae530 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_SKIP_LIST_BASE_H
 #define __CDS_INTRUSIVE_SKIP_LIST_BASE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/details/marked_ptr.h>
 #include <cds/algo/bitop.h>
 #include <cds/os/timer.h>
index c8c99ed37adaf6fdae76de37f9de625d69c1475e..1c86abcc04f1b93225a9481a6d997babdde25ffc 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_SPLIT_LIST_BASE_H
 #define __CDS_INTRUSIVE_SPLIT_LIST_BASE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/cxx11_atomic.h>
 #include <cds/details/allocator.h>
 #include <cds/algo/int_algo.h>
index f038f3112599398c5c3ed84d2a76760f907d96d1..61feae6fdd75e1ea8fcf16770f4da044c3e6d55d 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_STRIPED_SET_H
 #define __CDS_INTRUSIVE_STRIPED_SET_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/intrusive/striped_set/adapter.h>
 #include <cds/intrusive/striped_set/striping_policy.h>
 
index aeb22f56adb90151a1111bf80338f60a82d31ecc..5d6108ca17b84de1ce5aab1d4e3c427c146a8d53 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_TSIGAS_CYCLE_QUEUE_H
 #define __CDS_INTRUSIVE_TSIGAS_CYCLE_QUEUE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/cxx11_atomic.h>
 #include <cds/details/bounded_container.h>
 #include <cds/opt/buffer.h>
index 9355e0e04f09f13a26d63aab6fcc37386b9b682b..165cdb46509e9553938ba4a697c33dbcdc4d51b1 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H
 #define __CDS_INTRUSIVE_VYUKOV_MPMC_CYCLE_QUEUE_H
 
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/container/vyukov_mpmc_cycle_queue.h>
 
 namespace cds { namespace intrusive {
index b1f56060b7b0beadc23852fc2c56bbb94c867529..bcd93d7671602fa38fc58e8843c91bd7f73457c3 100644 (file)
     <ClInclude Include="..\..\..\cds\gc\ptb_impl.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\basket_queue.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\cuckoo_set.h" />\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\base.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\details\dummy_node_holder.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\details\ellen_bintree_base.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\details\single_link_struct.h" />\r
     <ClInclude Include="..\..\..\cds\opt\options.h" />\r
     <ClInclude Include="..\..\..\cds\opt\permutation.h" />\r
     <ClInclude Include="..\..\..\cds\opt\value_cleaner.h" />\r
-    <ClInclude Include="..\..\..\cds\intrusive\base.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\fcstack.h" />\r
     <ClInclude Include="..\..\..\cds\intrusive\lazy_list_base.h" />\r
index 27e6442c5ae255bcdeb05b900cf1534a8e6923bb..ebbbe23d53f7286479436310711ad13e37054b1a 100644 (file)
     <ClInclude Include="..\..\..\cds\opt\value_cleaner.h">\r
       <Filter>Header Files\cds\opt</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\cds\intrusive\base.h">\r
-      <Filter>Header Files\cds\intrusive</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\cds\intrusive\fcqueue.h">\r
       <Filter>Header Files\cds\intrusive</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\cds\intrusive\details\single_link_struct.h">\r
       <Filter>Header Files\cds\intrusive\details</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\intrusive\details\base.h">\r
+      <Filter>Header Files\cds\intrusive\details</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index 2bac05fa7b82104fe586bac67e398849fd2ad7c5..0b3cb8608f46824fd018800dbcccb927282fa34e 100644 (file)
@@ -1,7 +1,7 @@
 //$$CDS-header$$
 
 #include "cppunit/cppunit_proxy.h"
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 
 namespace queue {
     namespace ci = cds::intrusive;
index 2881b5211091aa2590e9120679d0b7c6b602563f..a448c3ee0c947202f5608b3abf3d45798dfa545c 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDSHDR_QUEUE_INTRUSIVE_SEGMENTED_QUEUE_H
 
 #include "cppunit/cppunit_proxy.h"
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include "size_check.h"
 
 namespace queue {
index d1e42919b08e0ff6f814b8334346a115efd5492a..633358b9042dce48bae56b8dc046b0fecb9170c2 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDSHDR_QUEUE_SEGMENTED_QUEUE_H
 
 #include "cppunit/cppunit_proxy.h"
-#include <cds/intrusive/base.h>
+#include <cds/intrusive/details/base.h>
 #include <cds/ref.h>
 #include "size_check.h"