]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/smart_ptr/test/sp_atomic_test.cpp
1 #include <boost/config.hpp>
5 // Copyright (c) 2008 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/detail/lightweight_test.hpp>
13 #include <boost/shared_ptr.hpp>
14 #include <boost/memory_order.hpp>
22 #define BOOST_TEST_SP_EQ( p, q ) BOOST_TEST( p == q && !( p < q ) && !( q < p ) )
26 boost::shared_ptr
<X
> px( new X
);
29 boost::shared_ptr
<X
> p2
= boost::atomic_load( &px
);
30 BOOST_TEST_SP_EQ( p2
, px
);
32 boost::shared_ptr
<X
> px2( new X
);
33 boost::atomic_store( &px
, px2
);
34 BOOST_TEST_SP_EQ( px
, px2
);
36 p2
= boost::atomic_load( &px
);
37 BOOST_TEST_SP_EQ( p2
, px
);
38 BOOST_TEST_SP_EQ( p2
, px2
);
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
);
45 boost::shared_ptr
<X
> px4( new X
);
46 boost::shared_ptr
<X
> cmp
;
48 bool r
= boost::atomic_compare_exchange( &px
, &cmp
, px4
);
50 BOOST_TEST_SP_EQ( px
, px3
);
51 BOOST_TEST_SP_EQ( cmp
, px3
);
53 r
= boost::atomic_compare_exchange( &px
, &cmp
, px4
);
55 BOOST_TEST_SP_EQ( px
, px4
);
63 boost::shared_ptr
<X
> p2
= boost::atomic_load_explicit( &px
, boost::memory_order_acquire
);
64 BOOST_TEST_SP_EQ( p2
, px
);
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
);
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
);
74 boost::shared_ptr
<X
> px4( new X
);
75 boost::shared_ptr
<X
> cmp( px2
);
77 bool r
= boost::atomic_compare_exchange_explicit( &px
, &cmp
, px4
, boost::memory_order_acquire
, boost::memory_order_relaxed
);
79 BOOST_TEST_SP_EQ( px
, p2
);
80 BOOST_TEST_SP_EQ( cmp
, p2
);
82 r
= boost::atomic_compare_exchange_explicit( &px
, &cmp
, px4
, boost::memory_order_release
, boost::memory_order_acquire
);
84 BOOST_TEST_SP_EQ( px
, px4
);
87 return boost::report_errors();