]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/atomic_sp_test.cpp
1 #include <boost/config.hpp>
5 // Copyright 2008, 2017 Peter Dimov
7 // Distributed under the Boost Software License, Version 1.0.
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
12 #include <boost/smart_ptr/atomic_shared_ptr.hpp>
13 #include <boost/core/lightweight_test.hpp>
14 #include <boost/memory_order.hpp>
22 #define BOOST_TEST_SP_EQ( p, q ) BOOST_TEST( p == q && !( p < q ) && !( q < p ) )
26 // default constructor
29 boost::atomic_shared_ptr
<X
> apx
;
31 boost::shared_ptr
<X
> p2
= apx
.load();
33 BOOST_TEST_EQ( p2
.get(), (X
*)0 );
34 BOOST_TEST_EQ( p2
.use_count(), 0 );
37 // shared_ptr constructor
40 boost::shared_ptr
<X
> px( new X
);
41 boost::atomic_shared_ptr
<X
> apx( px
);
43 boost::shared_ptr
<X
> p2
= apx
.load();
45 BOOST_TEST_EQ( px
, p2
);
46 BOOST_TEST_EQ( px
.use_count(), 3 );
47 BOOST_TEST_EQ( p2
.use_count(), 3 );
50 // shared_ptr assignment
53 boost::shared_ptr
<X
> px0( new X
);
54 boost::atomic_shared_ptr
<X
> apx( px0
);
56 boost::shared_ptr
<X
> px( new X
);
59 boost::shared_ptr
<X
> p2
= apx
.load();
61 BOOST_TEST_EQ( px
, p2
);
62 BOOST_TEST_EQ( px
.use_count(), 3 );
63 BOOST_TEST_EQ( p2
.use_count(), 3 );
69 boost::shared_ptr
<X
> px( new X
);
70 boost::atomic_shared_ptr
<X
> apx( px
);
72 boost::shared_ptr
<X
> p2
= apx
.load( boost::memory_order_acquire
);
74 BOOST_TEST_EQ( px
, p2
);
75 BOOST_TEST_EQ( px
.use_count(), 3 );
76 BOOST_TEST_EQ( p2
.use_count(), 3 );
79 // operator shared_ptr
82 boost::shared_ptr
<X
> px( new X
);
83 boost::atomic_shared_ptr
<X
> apx( px
);
85 boost::shared_ptr
<X
> p2
= apx
;
87 BOOST_TEST_EQ( px
, p2
);
88 BOOST_TEST_EQ( px
.use_count(), 3 );
89 BOOST_TEST_EQ( p2
.use_count(), 3 );
95 boost::shared_ptr
<X
> px0( new X
);
96 boost::atomic_shared_ptr
<X
> apx( px0
);
98 boost::shared_ptr
<X
> px( new X
);
101 boost::shared_ptr
<X
> p2
= apx
.load();
103 BOOST_TEST_EQ( px
, p2
);
104 BOOST_TEST_EQ( px
.use_count(), 3 );
105 BOOST_TEST_EQ( p2
.use_count(), 3 );
111 boost::shared_ptr
<X
> px0( new X
);
112 boost::atomic_shared_ptr
<X
> apx( px0
);
114 boost::shared_ptr
<X
> px( new X
);
115 apx
.store( px
, boost::memory_order_release
);
117 boost::shared_ptr
<X
> p2
= apx
.load();
119 BOOST_TEST_EQ( px
, p2
);
120 BOOST_TEST_EQ( px
.use_count(), 3 );
121 BOOST_TEST_EQ( p2
.use_count(), 3 );
127 boost::shared_ptr
<X
> px0( new X
);
128 boost::atomic_shared_ptr
<X
> apx( px0
);
130 boost::shared_ptr
<X
> px( new X
);
131 boost::shared_ptr
<X
> p1
= apx
.exchange( px
);
133 BOOST_TEST_EQ( px0
, p1
);
134 BOOST_TEST_EQ( px0
.use_count(), 2 );
135 BOOST_TEST_EQ( p1
.use_count(), 2 );
137 boost::shared_ptr
<X
> p2
= apx
.load();
139 BOOST_TEST_EQ( px
, p2
);
140 BOOST_TEST_EQ( px
.use_count(), 3 );
141 BOOST_TEST_EQ( p2
.use_count(), 3 );
147 boost::shared_ptr
<X
> px0( new X
);
148 boost::atomic_shared_ptr
<X
> apx( px0
);
150 boost::shared_ptr
<X
> px( new X
);
151 boost::shared_ptr
<X
> p1
= apx
.exchange( px
, boost::memory_order_acq_rel
);
153 BOOST_TEST_EQ( px0
, p1
);
154 BOOST_TEST_EQ( px0
.use_count(), 2 );
155 BOOST_TEST_EQ( p1
.use_count(), 2 );
157 boost::shared_ptr
<X
> p2
= apx
.load();
159 BOOST_TEST_EQ( px
, p2
);
160 BOOST_TEST_EQ( px
.use_count(), 3 );
161 BOOST_TEST_EQ( p2
.use_count(), 3 );
164 // compare_exchange_weak
167 boost::shared_ptr
<X
> px( new X
);
168 boost::atomic_shared_ptr
<X
> apx( px
);
170 boost::shared_ptr
<X
> px2( new X
);
171 boost::shared_ptr
<X
> cmp
;
173 bool r
= apx
.compare_exchange_weak( cmp
, px2
);
175 BOOST_TEST_SP_EQ( apx
.load(), px
);
176 BOOST_TEST_SP_EQ( cmp
, px
);
178 r
= apx
.compare_exchange_weak( cmp
, px2
);
180 BOOST_TEST_SP_EQ( apx
.load(), px2
);
183 // compare_exchange_weak, w/ mo
186 boost::shared_ptr
<X
> px( new X
);
187 boost::atomic_shared_ptr
<X
> apx( px
);
189 boost::shared_ptr
<X
> px2( new X
);
190 boost::shared_ptr
<X
> cmp
;
192 bool r
= apx
.compare_exchange_weak( cmp
, px2
, boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
194 BOOST_TEST_SP_EQ( apx
.load(), px
);
195 BOOST_TEST_SP_EQ( cmp
, px
);
197 r
= apx
.compare_exchange_weak( cmp
, px2
, boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
199 BOOST_TEST_SP_EQ( apx
.load(), px2
);
202 // compare_exchange_weak, rv
205 boost::shared_ptr
<X
> px( new X
);
206 boost::atomic_shared_ptr
<X
> apx( px
);
208 boost::shared_ptr
<X
> cmp
;
210 bool r
= apx
.compare_exchange_weak( cmp
, boost::shared_ptr
<X
>() );
213 BOOST_TEST_SP_EQ( apx
.load(), px
);
214 BOOST_TEST_SP_EQ( cmp
, px
);
216 r
= apx
.compare_exchange_weak( cmp
, boost::shared_ptr
<X
>() );
219 BOOST_TEST( apx
.load().get() == 0 );
220 BOOST_TEST( apx
.load().use_count() == 0 );
223 // compare_exchange_weak, rv, w/ mo
226 boost::shared_ptr
<X
> px( new X
);
227 boost::atomic_shared_ptr
<X
> apx( px
);
229 boost::shared_ptr
<X
> cmp
;
231 bool r
= apx
.compare_exchange_weak( cmp
, boost::shared_ptr
<X
>(), boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
234 BOOST_TEST_SP_EQ( apx
.load(), px
);
235 BOOST_TEST_SP_EQ( cmp
, px
);
237 r
= apx
.compare_exchange_weak( cmp
, boost::shared_ptr
<X
>(), boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
240 BOOST_TEST( apx
.load().get() == 0 );
241 BOOST_TEST( apx
.load().use_count() == 0 );
244 // compare_exchange_strong
247 boost::shared_ptr
<X
> px( new X
);
248 boost::atomic_shared_ptr
<X
> apx( px
);
250 boost::shared_ptr
<X
> px2( new X
);
251 boost::shared_ptr
<X
> cmp
;
253 bool r
= apx
.compare_exchange_strong( cmp
, px2
);
255 BOOST_TEST_SP_EQ( apx
.load(), px
);
256 BOOST_TEST_SP_EQ( cmp
, px
);
258 r
= apx
.compare_exchange_strong( cmp
, px2
);
260 BOOST_TEST_SP_EQ( apx
.load(), px2
);
263 // compare_exchange_strong, w/ mo
266 boost::shared_ptr
<X
> px( new X
);
267 boost::atomic_shared_ptr
<X
> apx( px
);
269 boost::shared_ptr
<X
> px2( new X
);
270 boost::shared_ptr
<X
> cmp
;
272 bool r
= apx
.compare_exchange_strong( cmp
, px2
, boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
274 BOOST_TEST_SP_EQ( apx
.load(), px
);
275 BOOST_TEST_SP_EQ( cmp
, px
);
277 r
= apx
.compare_exchange_strong( cmp
, px2
, boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
279 BOOST_TEST_SP_EQ( apx
.load(), px2
);
282 // compare_exchange_strong, rv
285 boost::shared_ptr
<X
> px( new X
);
286 boost::atomic_shared_ptr
<X
> apx( px
);
288 boost::shared_ptr
<X
> cmp
;
290 bool r
= apx
.compare_exchange_strong( cmp
, boost::shared_ptr
<X
>() );
293 BOOST_TEST_SP_EQ( apx
.load(), px
);
294 BOOST_TEST_SP_EQ( cmp
, px
);
296 r
= apx
.compare_exchange_strong( cmp
, boost::shared_ptr
<X
>() );
299 BOOST_TEST( apx
.load().get() == 0 );
300 BOOST_TEST( apx
.load().use_count() == 0 );
303 // compare_exchange_strong, rv, w/ mo
306 boost::shared_ptr
<X
> px( new X
);
307 boost::atomic_shared_ptr
<X
> apx( px
);
309 boost::shared_ptr
<X
> cmp
;
311 bool r
= apx
.compare_exchange_strong( cmp
, boost::shared_ptr
<X
>(), boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
314 BOOST_TEST_SP_EQ( apx
.load(), px
);
315 BOOST_TEST_SP_EQ( cmp
, px
);
317 r
= apx
.compare_exchange_strong( cmp
, boost::shared_ptr
<X
>(), boost::memory_order_seq_cst
, boost::memory_order_seq_cst
);
320 BOOST_TEST( apx
.load().get() == 0 );
321 BOOST_TEST( apx
.load().use_count() == 0 );
324 return boost::report_errors();