sp_atomic_test.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <boost/config.hpp>
  2. // sp_atomic_test.cpp
  3. //
  4. // Copyright (c) 2008 Peter Dimov
  5. //
  6. // Distributed under the Boost Software License, Version 1.0.
  7. // See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt
  9. #include <boost/detail/lightweight_test.hpp>
  10. #include <boost/shared_ptr.hpp>
  11. #include <boost/memory_order.hpp>
  12. //
  13. struct X
  14. {
  15. };
  16. #define BOOST_TEST_SP_EQ( p, q ) BOOST_TEST( p == q && !( p < q ) && !( q < p ) )
  17. int main()
  18. {
  19. boost::shared_ptr<X> px( new X );
  20. {
  21. boost::shared_ptr<X> p2 = boost::atomic_load( &px );
  22. BOOST_TEST_SP_EQ( p2, px );
  23. boost::shared_ptr<X> px2( new X );
  24. boost::atomic_store( &px, px2 );
  25. BOOST_TEST_SP_EQ( px, px2 );
  26. p2 = boost::atomic_load( &px );
  27. BOOST_TEST_SP_EQ( p2, px );
  28. BOOST_TEST_SP_EQ( p2, px2 );
  29. boost::shared_ptr<X> px3( new X );
  30. boost::shared_ptr<X> p3 = boost::atomic_exchange( &px, px3 );
  31. BOOST_TEST_SP_EQ( p3, px2 );
  32. BOOST_TEST_SP_EQ( px, px3 );
  33. boost::shared_ptr<X> px4( new X );
  34. boost::shared_ptr<X> cmp;
  35. bool r = boost::atomic_compare_exchange( &px, &cmp, px4 );
  36. BOOST_TEST( !r );
  37. BOOST_TEST_SP_EQ( px, px3 );
  38. BOOST_TEST_SP_EQ( cmp, px3 );
  39. r = boost::atomic_compare_exchange( &px, &cmp, px4 );
  40. BOOST_TEST( r );
  41. BOOST_TEST_SP_EQ( px, px4 );
  42. }
  43. //
  44. px.reset();
  45. {
  46. boost::shared_ptr<X> p2 = boost::atomic_load_explicit( &px, boost::memory_order_acquire );
  47. BOOST_TEST_SP_EQ( p2, px );
  48. boost::shared_ptr<X> px2( new X );
  49. boost::atomic_store_explicit( &px, px2, boost::memory_order_release );
  50. BOOST_TEST_SP_EQ( px, px2 );
  51. boost::shared_ptr<X> p3 = boost::atomic_exchange_explicit( &px, boost::shared_ptr<X>(), boost::memory_order_acq_rel );
  52. BOOST_TEST_SP_EQ( p3, px2 );
  53. BOOST_TEST_SP_EQ( px, p2 );
  54. boost::shared_ptr<X> px4( new X );
  55. boost::shared_ptr<X> cmp( px2 );
  56. bool r = boost::atomic_compare_exchange_explicit( &px, &cmp, px4, boost::memory_order_acquire, boost::memory_order_relaxed );
  57. BOOST_TEST( !r );
  58. BOOST_TEST_SP_EQ( px, p2 );
  59. BOOST_TEST_SP_EQ( cmp, p2 );
  60. r = boost::atomic_compare_exchange_explicit( &px, &cmp, px4, boost::memory_order_release, boost::memory_order_acquire );
  61. BOOST_TEST( r );
  62. BOOST_TEST_SP_EQ( px, px4 );
  63. }
  64. return boost::report_errors();
  65. }