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/detail/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 
main()24 int main()
25 {
26     boost::shared_ptr<X> px( new X );
27 
28     {
29         boost::shared_ptr<X> p2 = boost::atomic_load( &px );
30         BOOST_TEST_SP_EQ( p2, px );
31 
32         boost::shared_ptr<X> px2( new X );
33         boost::atomic_store( &px, px2 );
34         BOOST_TEST_SP_EQ( px, px2 );
35 
36         p2 = boost::atomic_load( &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( &px, 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( &px, &cmp, 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( &px, &cmp, 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( &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( &px, px2, boost::memory_order_release );
68         BOOST_TEST_SP_EQ( px, px2 );
69 
70         boost::shared_ptr<X> p3 = boost::atomic_exchange_explicit( &px, 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( &px, &cmp, 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( &px, &cmp, 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