1 | #include <boost/config.hpp> |
2 | |
3 | // sp_atomic_test.cpp |
4 | // |
5 | // Copyright (c) 2008 Peter Dimov |
6 | // |
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 |
10 | |
11 | |
12 | #include <boost/core/lightweight_test.hpp> |
13 | #include <boost/shared_ptr.hpp> |
14 | #include <boost/memory_order.hpp> |
15 | |
16 | // |
17 | |
18 | struct X |
19 | { |
20 | }; |
21 | |
22 | #define BOOST_TEST_SP_EQ( p, q ) BOOST_TEST( p == q && !( p < q ) && !( q < p ) ) |
23 | |
24 | int main() |
25 | { |
26 | boost::shared_ptr<X> px( new X ); |
27 | |
28 | { |
29 | boost::shared_ptr<X> p2 = boost::atomic_load( p: &px ); |
30 | BOOST_TEST_SP_EQ( p2, px ); |
31 | |
32 | boost::shared_ptr<X> px2( new X ); |
33 | boost::atomic_store( p: &px, r: px2 ); |
34 | BOOST_TEST_SP_EQ( px, px2 ); |
35 | |
36 | p2 = boost::atomic_load( p: &px ); |
37 | BOOST_TEST_SP_EQ( p2, px ); |
38 | BOOST_TEST_SP_EQ( p2, px2 ); |
39 | |
40 | boost::shared_ptr<X> px3( new X ); |
41 | boost::shared_ptr<X> p3 = boost::atomic_exchange( p: &px, r: px3 ); |
42 | BOOST_TEST_SP_EQ( p3, px2 ); |
43 | BOOST_TEST_SP_EQ( px, px3 ); |
44 | |
45 | boost::shared_ptr<X> px4( new X ); |
46 | boost::shared_ptr<X> cmp; |
47 | |
48 | bool r = boost::atomic_compare_exchange( p: &px, v: &cmp, w: px4 ); |
49 | BOOST_TEST( !r ); |
50 | BOOST_TEST_SP_EQ( px, px3 ); |
51 | BOOST_TEST_SP_EQ( cmp, px3 ); |
52 | |
53 | r = boost::atomic_compare_exchange( p: &px, v: &cmp, w: px4 ); |
54 | BOOST_TEST( r ); |
55 | BOOST_TEST_SP_EQ( px, px4 ); |
56 | } |
57 | |
58 | // |
59 | |
60 | px.reset(); |
61 | |
62 | { |
63 | boost::shared_ptr<X> p2 = boost::atomic_load_explicit( p: &px, boost::memory_order_acquire ); |
64 | BOOST_TEST_SP_EQ( p2, px ); |
65 | |
66 | boost::shared_ptr<X> px2( new X ); |
67 | boost::atomic_store_explicit( p: &px, r: px2, boost::memory_order_release ); |
68 | BOOST_TEST_SP_EQ( px, px2 ); |
69 | |
70 | boost::shared_ptr<X> p3 = boost::atomic_exchange_explicit( p: &px, r: boost::shared_ptr<X>(), boost::memory_order_acq_rel ); |
71 | BOOST_TEST_SP_EQ( p3, px2 ); |
72 | BOOST_TEST_SP_EQ( px, p2 ); |
73 | |
74 | boost::shared_ptr<X> px4( new X ); |
75 | boost::shared_ptr<X> cmp( px2 ); |
76 | |
77 | bool r = boost::atomic_compare_exchange_explicit( p: &px, v: &cmp, w: px4, boost::memory_order_acquire, boost::memory_order_relaxed ); |
78 | BOOST_TEST( !r ); |
79 | BOOST_TEST_SP_EQ( px, p2 ); |
80 | BOOST_TEST_SP_EQ( cmp, p2 ); |
81 | |
82 | r = boost::atomic_compare_exchange_explicit( p: &px, v: &cmp, w: px4, boost::memory_order_release, boost::memory_order_acquire ); |
83 | BOOST_TEST( r ); |
84 | BOOST_TEST_SP_EQ( px, px4 ); |
85 | } |
86 | |
87 | return boost::report_errors(); |
88 | } |
89 | |