Added copyright and license
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_moirqueue_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/intrusive/moir_queue.h>
33 #include <cds/gc/dhp.h>
34
35 namespace queue {
36
37 #define TEST(X)     void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
38
39     namespace {
40         typedef IntrusiveQueueHeaderTest::base_hook_item< ci::msqueue::node<cds::gc::DHP > > base_item_type;
41         typedef IntrusiveQueueHeaderTest::member_hook_item< ci::msqueue::node<cds::gc::DHP > > member_item_type;
42
43         // DHP base hook
44         typedef ci::MoirQueue< cds::gc::DHP, base_item_type,
45             typename ci::msqueue::make_traits<
46             ci::opt::hook<
47             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
48             >
49             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
50             >::type
51         > MoirQueue_DHP_base;
52
53         // DHP member hook
54         typedef ci::MoirQueue< cds::gc::DHP, member_item_type,
55             typename ci::msqueue::make_traits<
56             ci::opt::hook<
57             ci::msqueue::member_hook<
58             offsetof( member_item_type, hMember ),
59             ci::opt::gc<cds::gc::DHP>
60             >
61             >
62             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
63             >::type
64         > MoirQueue_DHP_member;
65
66         /// DHP base hook + item counter
67         typedef ci::MoirQueue< cds::gc::DHP, base_item_type,
68             typename ci::msqueue::make_traits<
69             ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
70             , ci::opt::hook<
71             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
72             >
73             , co::item_counter< cds::atomicity::item_counter >
74             , co::memory_model< co::v::relaxed_ordering >
75             >::type
76         > MoirQueue_DHP_base_ic;
77
78         // DHP member hook + item counter
79         typedef ci::MoirQueue< cds::gc::DHP, member_item_type,
80             typename ci::msqueue::make_traits<
81             ci::opt::hook<
82             ci::msqueue::member_hook<
83             offsetof( member_item_type, hMember ),
84             ci::opt::gc<cds::gc::DHP>
85             >
86             >
87             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
88             , co::item_counter< cds::atomicity::item_counter >
89             >::type
90         > MoirQueue_DHP_member_ic;
91
92         // DHP base hook + stat
93         typedef ci::MoirQueue< cds::gc::DHP, base_item_type,
94             typename ci::msqueue::make_traits<
95             ci::opt::hook<
96             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
97             >
98             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
99             , co::stat< ci::msqueue::stat<> >
100             >::type
101         > MoirQueue_DHP_base_stat;
102
103         // DHP member hook + stat
104         typedef ci::MoirQueue< cds::gc::DHP, member_item_type,
105             typename ci::msqueue::make_traits<
106             ci::opt::hook<
107             ci::msqueue::member_hook<
108             offsetof( member_item_type, hMember ),
109             ci::opt::gc<cds::gc::DHP>
110             >
111             >
112             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
113             , co::stat< ci::msqueue::stat<> >
114             >::type
115         > MoirQueue_DHP_member_stat;
116
117         // DHP base hook + padding
118         typedef ci::MoirQueue< cds::gc::DHP, base_item_type,
119             typename ci::msqueue::make_traits<
120             ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
121             , ci::opt::hook<
122             ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> >
123             >
124             , co::padding< 32 >
125             >::type
126         > MoirQueue_DHP_base_align;
127
128         // DHP member hook + padding
129         typedef ci::MoirQueue< cds::gc::DHP, member_item_type,
130             typename ci::msqueue::make_traits<
131             ci::opt::hook<
132             ci::msqueue::member_hook<
133             offsetof( member_item_type, hMember ),
134             ci::opt::gc<cds::gc::DHP>
135             >
136             >
137             , co::padding< 32 >
138             , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
139             >::type
140         > MoirQueue_DHP_member_align;
141
142         // DHP base hook + no padding
143         struct traits_MoirQueue_DHP_base_noalign : public ci::msqueue::traits {
144             typedef ci::msqueue::base_hook< ci::opt::gc<cds::gc::DHP> > hook;
145             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
146             enum { padding = co::no_special_padding };
147         };
148         typedef ci::MoirQueue< cds::gc::DHP, base_item_type, traits_MoirQueue_DHP_base_noalign > MoirQueue_DHP_base_noalign;
149
150         // DHP member hook + no padding
151         struct traits_MoirQueue_DHP_member_noalign : public ci::msqueue::traits {
152             typedef ci::msqueue::member_hook <
153                 offsetof( member_item_type, hMember ),
154                 ci::opt::gc < cds::gc::DHP >
155             > hook;
156             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
157             enum { padding = co::no_special_padding };
158         };
159         typedef ci::MoirQueue< cds::gc::DHP, member_item_type, traits_MoirQueue_DHP_member_noalign > MoirQueue_DHP_member_noalign;
160
161
162         // DHP base hook + cache padding
163         struct traits_MoirQueue_DHP_base_cachealign : public traits_MoirQueue_DHP_base_noalign
164         {
165             enum { padding = co::cache_line_padding };
166         };
167         typedef ci::MoirQueue< cds::gc::DHP, base_item_type, traits_MoirQueue_DHP_base_cachealign > MoirQueue_DHP_base_cachealign;
168
169         // DHP member hook + cache padding
170         struct traits_MoirQueue_DHP_member_cachealign : public traits_MoirQueue_DHP_member_noalign
171         {
172             enum { padding = co::cache_line_padding };
173         };
174         typedef ci::MoirQueue< cds::gc::DHP, member_item_type, traits_MoirQueue_DHP_member_cachealign > MoirQueue_DHP_member_cachealign;
175     }   // namespace
176
177     TEST(MoirQueue_DHP_base)
178     TEST(MoirQueue_DHP_member)
179     TEST(MoirQueue_DHP_base_ic)
180     TEST(MoirQueue_DHP_member_ic)
181     TEST(MoirQueue_DHP_base_stat)
182     TEST(MoirQueue_DHP_member_stat)
183     TEST(MoirQueue_DHP_base_align)
184     TEST(MoirQueue_DHP_member_align)
185     TEST(MoirQueue_DHP_base_noalign)
186     TEST(MoirQueue_DHP_member_noalign)
187     TEST(MoirQueue_DHP_base_cachealign)
188     TEST(MoirQueue_DHP_member_cachealign)
189
190 } // namespace queue