3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/intrusive/msqueue.h>
5 #include <cds/gc/dhp.h>
9 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
12 typedef IntrusiveQueueHeaderTest::base_hook_item< ci::msqueue::node<cds::gc::DHP > > base_item_type;
13 typedef IntrusiveQueueHeaderTest::member_hook_item< ci::msqueue::node<cds::gc::DHP > > member_item_type;
16 typedef ci::MSQueue< cds::gc::DHP, base_item_type,
17 typename ci::msqueue::make_traits<
19 ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
21 , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
26 typedef ci::MSQueue< cds::gc::DHP, member_item_type,
27 typename ci::msqueue::make_traits<
29 ci::msqueue::member_hook<
30 offsetof( member_item_type, hMember ),
31 ci::opt::gc<cds::gc::DHP>
34 , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
38 /// DHP base hook + item counter
39 typedef ci::MSQueue< cds::gc::DHP, base_item_type,
40 typename ci::msqueue::make_traits<
41 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
43 ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
45 , co::item_counter< cds::atomicity::item_counter >
46 , co::memory_model< co::v::relaxed_ordering >
48 > MSQueue_DHP_base_ic;
50 // DHP member hook + item counter
51 typedef ci::MSQueue< cds::gc::DHP, member_item_type,
52 typename ci::msqueue::make_traits<
54 ci::msqueue::member_hook<
55 offsetof( member_item_type, hMember ),
56 ci::opt::gc<cds::gc::DHP>
59 , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
60 , co::item_counter< cds::atomicity::item_counter >
62 > MSQueue_DHP_member_ic;
64 // DHP base hook + stat
65 typedef ci::MSQueue< cds::gc::DHP, base_item_type,
66 typename ci::msqueue::make_traits<
68 ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
70 , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
71 , co::stat< ci::msqueue::stat<> >
73 > MSQueue_DHP_base_stat;
75 // DHP member hook + stat
76 typedef ci::MSQueue< cds::gc::DHP, member_item_type,
77 typename ci::msqueue::make_traits<
79 ci::msqueue::member_hook<
80 offsetof( member_item_type, hMember ),
81 ci::opt::gc<cds::gc::DHP>
84 , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
85 , co::stat< ci::msqueue::stat<> >
87 > MSQueue_DHP_member_stat;
89 // DHP base hook + alignment
90 typedef ci::MSQueue< cds::gc::DHP, base_item_type,
91 typename ci::msqueue::make_traits<
92 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
94 ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
98 > MSQueue_DHP_base_align;
100 // DHP member hook + alignment
101 typedef ci::MSQueue< cds::gc::DHP, member_item_type,
102 typename ci::msqueue::make_traits<
104 ci::msqueue::member_hook<
105 offsetof( member_item_type, hMember ),
106 ci::opt::gc<cds::gc::DHP>
109 , co::alignment< 32 >
110 , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
112 > MSQueue_DHP_member_align;
114 // DHP base hook + no alignment
115 struct traits_MSQueue_DHP_base_noalign : public ci::msqueue::traits {
116 typedef ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> > hook;
117 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
118 enum { alignment = co::no_special_alignment };
120 typedef ci::MSQueue< cds::gc::DHP, base_item_type, traits_MSQueue_DHP_base_noalign > MSQueue_DHP_base_noalign;
122 // DHP member hook + no alignment
123 struct traits_MSQueue_DHP_member_noalign : public ci::msqueue::traits {
124 typedef ci::msqueue::member_hook <
125 offsetof( member_item_type, hMember ),
126 ci::opt::gc < cds::gc::DHP >
128 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
129 enum { alignment = co::no_special_alignment };
131 typedef ci::MSQueue< cds::gc::DHP, member_item_type, traits_MSQueue_DHP_member_noalign > MSQueue_DHP_member_noalign;
134 // DHP base hook + cache alignment
135 struct traits_MSQueue_DHP_base_cachealign : public traits_MSQueue_DHP_base_noalign
137 enum { alignment = co::cache_line_alignment };
139 typedef ci::MSQueue< cds::gc::DHP, base_item_type, traits_MSQueue_DHP_base_cachealign > MSQueue_DHP_base_cachealign;
141 // DHP member hook + cache alignment
142 struct traits_MSQueue_DHP_member_cachealign : public traits_MSQueue_DHP_member_noalign
144 enum { alignment = co::cache_line_alignment };
146 typedef ci::MSQueue< cds::gc::DHP, member_item_type, traits_MSQueue_DHP_member_cachealign > MSQueue_DHP_member_cachealign;
149 TEST(MSQueue_DHP_base)
150 TEST(MSQueue_DHP_member)
151 TEST(MSQueue_DHP_base_ic)
152 TEST(MSQueue_DHP_member_ic)
153 TEST(MSQueue_DHP_base_stat)
154 TEST(MSQueue_DHP_member_stat)
155 TEST(MSQueue_DHP_base_align)
156 TEST(MSQueue_DHP_member_align)
157 TEST(MSQueue_DHP_base_noalign)
158 TEST(MSQueue_DHP_member_noalign)
159 TEST(MSQueue_DHP_base_cachealign)
160 TEST(MSQueue_DHP_member_cachealign)