Added copyright and license
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_optimisticqueue_dhp.cpp
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8     
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
29 */
30
31 #include "hdr_intrusive_msqueue.h"
32 #include <cds/gc/dhp.h>
33 #include <cds/intrusive/optimistic_queue.h>
34
35 namespace queue {
36
37 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
38
39     namespace {
40         struct base_hook_item: public ci::optimistic_queue::node< cds::gc::DHP >
41         {
42             int nVal;
43             int nDisposeCount;
44
45             base_hook_item()
46                 : nDisposeCount(0)
47             {}
48         };
49
50         struct member_hook_item
51         {
52             int nVal;
53             int nDisposeCount;
54             ci::optimistic_queue::node< cds::gc::DHP > hMember;
55
56             member_hook_item()
57                 : nDisposeCount(0)
58             {}
59         };
60
61         // DHP base hook
62         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
63             typename ci::optimistic_queue::make_traits<
64                 ci::opt::hook<
65                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
66                 >
67                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
68                 ,co::memory_model< co::v::relaxed_ordering >
69             >::type
70         > OptimisticQueue_DHP_base;
71
72         // DHP member hook
73         struct traits_OptimisticQueue_DHP_member : public OptimisticQueue_DHP_base::traits
74         {
75             typedef ci::optimistic_queue::member_hook <
76                 offsetof( member_hook_item, hMember ),
77                 ci::opt::gc < cds::gc::DHP >
78             > hook;
79         };
80         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item, traits_OptimisticQueue_DHP_member > OptimisticQueue_DHP_member;
81
82         /// DHP base hook + item counter
83         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
84             typename ci::optimistic_queue::make_traits<
85                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
86                 ,ci::opt::hook<
87                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
88                 >
89                 ,co::item_counter< cds::atomicity::item_counter >
90             >::type
91         > OptimisticQueue_DHP_base_ic;
92
93         // DHP member hook + item counter
94         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
95             typename ci::optimistic_queue::make_traits<
96                 cds::opt::type_traits< traits_OptimisticQueue_DHP_member >
97                 ,co::item_counter< cds::atomicity::item_counter >
98             >::type
99        > OptimisticQueue_DHP_member_ic;
100
101         // DHP base hook + stat
102         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
103             typename ci::optimistic_queue::make_traits<
104                 ci::opt::hook<
105                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
106                 >
107                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
108                 ,co::stat< ci::optimistic_queue::stat<> >
109             >::type
110         > OptimisticQueue_DHP_base_stat;
111
112         // DHP member hook + stat
113         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
114             typename ci::optimistic_queue::make_traits<
115                 cds::opt::type_traits< OptimisticQueue_DHP_base_stat::traits >
116                 , ci::opt::hook<
117                     ci::optimistic_queue::member_hook<
118                         offsetof(member_hook_item, hMember),
119                         ci::opt::gc<cds::gc::DHP>
120                     >
121                 >
122             >::type
123         > OptimisticQueue_DHP_member_stat;
124
125         // DHP base hook + padding
126         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
127             typename ci::optimistic_queue::make_traits<
128                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
129                 ,ci::opt::hook<
130                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
131                 >
132                 ,co::padding< 32 >
133             >::type
134         > OptimisticQueue_DHP_base_align;
135
136         // DHP member hook + padding
137         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
138             typename ci::optimistic_queue::make_traits<
139                 ci::opt::hook<
140                     ci::optimistic_queue::member_hook<
141                         offsetof(member_hook_item, hMember),
142                         ci::opt::gc<cds::gc::DHP>
143                     >
144                 >
145                 ,co::padding< 32 >
146                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
147             >::type
148         > OptimisticQueue_DHP_member_align;
149
150         // DHP base hook + no padding
151         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
152             typename ci::optimistic_queue::make_traits<
153                 ci::opt::hook<
154                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
155                 >
156                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
157                 ,co::padding< co::no_special_padding >
158             >::type
159         > OptimisticQueue_DHP_base_noalign;
160
161         // DHP member hook + no padding
162         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
163             typename ci::optimistic_queue::make_traits<
164                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
165                 ,ci::opt::hook<
166                     ci::optimistic_queue::member_hook<
167                         offsetof(member_hook_item, hMember),
168                         ci::opt::gc<cds::gc::DHP>
169                     >
170                 >
171                 ,co::padding< co::no_special_padding >
172             >::type
173         > OptimisticQueue_DHP_member_noalign;
174
175
176         // DHP base hook + cache padding
177         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
178             typename ci::optimistic_queue::make_traits<
179                 ci::opt::hook<
180                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
181                 >
182                 ,co::padding< co::cache_line_padding >
183                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
184             >::type
185         > OptimisticQueue_DHP_base_cachealign;
186
187         // DHP member hook + cache padding
188         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
189             typename ci::optimistic_queue::make_traits<
190                 ci::opt::hook<
191                     ci::optimistic_queue::member_hook<
192                         offsetof(member_hook_item, hMember),
193                         ci::opt::gc<cds::gc::DHP>
194                     >
195                 >
196                 ,co::padding< co::cache_line_padding >
197                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
198             >::type
199         > OptimisticQueue_DHP_member_cachealign;
200     }
201
202     TEST(OptimisticQueue_DHP_base)
203     TEST(OptimisticQueue_DHP_member)
204     TEST(OptimisticQueue_DHP_base_ic)
205     TEST(OptimisticQueue_DHP_member_ic)
206     TEST(OptimisticQueue_DHP_base_stat)
207     TEST(OptimisticQueue_DHP_member_stat)
208     TEST(OptimisticQueue_DHP_base_align)
209     TEST(OptimisticQueue_DHP_member_align)
210     TEST(OptimisticQueue_DHP_base_noalign)
211     TEST(OptimisticQueue_DHP_member_noalign)
212     TEST(OptimisticQueue_DHP_base_cachealign)
213     TEST(OptimisticQueue_DHP_member_cachealign)
214 }