3 #include "hdr_intrusive_msqueue.h"
5 #include <cds/intrusive/msqueue.h>
10 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
13 typedef IntrusiveQueueHeaderTest::base_hook_item< ci::msqueue::node<cds::gc::HP > > base_item_type;
14 typedef IntrusiveQueueHeaderTest::member_hook_item< ci::msqueue::node<cds::gc::HP > > member_item_type;
16 typedef ci::MSQueue< cds::gc::HP, base_item_type,
17 typename ci::msqueue::make_traits<
18 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
23 typedef ci::MSQueue< cds::gc::HP, base_item_type,
24 typename ci::msqueue::make_traits<
25 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
26 ,co::item_counter< cds::atomicity::item_counter >
27 ,co::memory_model< co::v::sequential_consistent >
29 > MSQueue_HP_default_ic;
32 typedef ci::MSQueue< cds::gc::HP, base_item_type,
33 typename ci::msqueue::make_traits<
34 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
35 ,co::stat< ci::msqueue::stat<> >
37 > MSQueue_HP_default_stat;
40 typedef ci::MSQueue< cds::gc::HP, base_item_type,
41 typename ci::msqueue::make_traits<
43 ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
45 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
50 typedef ci::MSQueue< cds::gc::HP, member_item_type,
51 typename ci::msqueue::make_traits<
53 ci::msqueue::member_hook<
54 offsetof( member_item_type, hMember ),
55 ci::opt::gc<cds::gc::HP>
58 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
62 /// HP base hook + item counter
63 typedef ci::MSQueue< cds::gc::HP, base_item_type,
64 typename ci::msqueue::make_traits<
65 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
67 ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
69 ,co::item_counter< cds::atomicity::item_counter >
70 ,co::memory_model< co::v::relaxed_ordering >
74 // HP member hook + item counter
75 typedef ci::MSQueue< cds::gc::HP, member_item_type,
76 typename ci::msqueue::make_traits<
78 ci::msqueue::member_hook<
79 offsetof( member_item_type, hMember ),
80 ci::opt::gc<cds::gc::HP>
83 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
84 ,co::item_counter< cds::atomicity::item_counter >
86 > MSQueue_HP_member_ic;
88 // HP base hook + stat
89 typedef ci::MSQueue< cds::gc::HP, base_item_type,
90 typename ci::msqueue::make_traits<
92 ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
94 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
95 ,co::stat< ci::msqueue::stat<> >
97 > MSQueue_HP_base_stat;
99 // HP member hook + stat
100 typedef ci::MSQueue< cds::gc::HP, member_item_type,
101 typename ci::msqueue::make_traits<
103 ci::msqueue::member_hook<
104 offsetof( member_item_type, hMember ),
105 ci::opt::gc<cds::gc::HP>
108 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
109 ,co::stat< ci::msqueue::stat<> >
111 > MSQueue_HP_member_stat;
113 // HP base hook + alignment
114 typedef ci::MSQueue< cds::gc::HP, base_item_type,
115 typename ci::msqueue::make_traits<
116 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
118 ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
122 > MSQueue_HP_base_align;
124 // HP member hook + alignment
125 typedef ci::MSQueue< cds::gc::HP, member_item_type,
126 typename ci::msqueue::make_traits<
128 ci::msqueue::member_hook<
129 offsetof( member_item_type, hMember ),
130 ci::opt::gc<cds::gc::HP>
134 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
136 > MSQueue_HP_member_align;
138 // HP base hook + no alignment
139 struct traits_MSQueue_HP_base_noalign : public ci::msqueue::traits {
140 typedef ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> > hook;
141 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
142 enum { alignment = co::no_special_alignment };
144 typedef ci::MSQueue< cds::gc::HP, base_item_type, traits_MSQueue_HP_base_noalign > MSQueue_HP_base_noalign;
146 // HP member hook + no alignment
147 struct traits_MSQueue_HP_member_noalign : public ci::msqueue::traits {
148 typedef ci::msqueue::member_hook <
149 offsetof( member_item_type, hMember ),
150 ci::opt::gc < cds::gc::HP >
152 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
153 enum { alignment = co::no_special_alignment };
155 typedef ci::MSQueue< cds::gc::HP, member_item_type, traits_MSQueue_HP_member_noalign > MSQueue_HP_member_noalign;
158 // HP base hook + cache alignment
159 struct traits_MSQueue_HP_base_cachealign : public traits_MSQueue_HP_base_noalign
161 enum { alignment = co::cache_line_alignment };
163 typedef ci::MSQueue< cds::gc::HP, base_item_type, traits_MSQueue_HP_base_cachealign > MSQueue_HP_base_cachealign;
165 // HP member hook + cache alignment
166 struct traits_MSQueue_HP_member_cachealign : public traits_MSQueue_HP_member_noalign
168 enum { alignment = co::cache_line_alignment };
170 typedef ci::MSQueue< cds::gc::HP, member_item_type, traits_MSQueue_HP_member_cachealign > MSQueue_HP_member_cachealign;
174 TEST(MSQueue_HP_default)
175 TEST(MSQueue_HP_default_ic)
176 TEST(MSQueue_HP_default_stat)
177 TEST(MSQueue_HP_base)
178 TEST(MSQueue_HP_member)
179 TEST(MSQueue_HP_base_ic)
180 TEST(MSQueue_HP_member_ic)
181 TEST(MSQueue_HP_base_stat)
182 TEST(MSQueue_HP_member_stat)
183 TEST(MSQueue_HP_base_align)
184 TEST(MSQueue_HP_member_align)
185 TEST(MSQueue_HP_base_noalign)
186 TEST(MSQueue_HP_member_noalign)
187 TEST(MSQueue_HP_base_cachealign)
188 TEST(MSQueue_HP_member_cachealign)
191 CPPUNIT_TEST_SUITE_REGISTRATION(queue::IntrusiveQueueHeaderTest);