passenger 6.1.0 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +32 -2
- data/Rakefile +6 -13
- data/bin/passenger-install-apache2-module +15 -19
- data/bin/passenger-install-nginx-module +42 -44
- data/bin/passenger-status +9 -10
- data/build/common_library.rb +4 -4
- data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +1 -1
- data/build/test_basics.rb +4 -3
- data/dev/copy_boost_headers +54 -40
- data/dev/ruby_server.rb +1 -1
- data/src/agent/Core/Config.h +1 -1
- data/src/agent/Core/Controller/Config.h +1 -1
- data/src/agent/Watchdog/Config.h +1 -1
- data/src/cxx_supportlib/Constants.h +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +8 -1
- data/src/cxx_supportlib/vendor-modified/boost/assert.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic.hpp +94 -110
- data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic_flag.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic_ref.hpp +14 -14
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/addressof.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_flag_impl.hpp +52 -24
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_impl.hpp +641 -285
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_ref_impl.hpp +593 -260
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_cast.hpp +37 -24
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_fp_cast.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/cas_based_exchange.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/chrono.hpp +93 -0
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/classify.hpp +16 -17
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/config.hpp +25 -34
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_aarch32.hpp +204 -97
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_aarch64.hpp +251 -122
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_alpha.hpp +56 -56
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_arm.hpp +129 -129
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_ppc.hpp +253 -125
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_sparc.hpp +25 -25
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +193 -126
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_arm.hpp +57 -57
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_x86.hpp +96 -97
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_operations_emulated.hpp +24 -24
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_cas_based.hpp +10 -10
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_gcc_atomic.hpp +27 -24
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_gcc_sync.hpp +39 -37
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_linux_arm.hpp +17 -17
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extending_cas_based_arithmetic.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_fp_ops_emulated.hpp +12 -12
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_fp_ops_generic.hpp +21 -21
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_emulated.hpp +30 -30
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_aarch32.hpp +170 -98
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_aarch64.hpp +209 -119
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_arm.hpp +95 -95
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_ppc.hpp +148 -76
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_x86.hpp +293 -123
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_generic.hpp +87 -71
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_msvc_arm.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_msvc_x86.hpp +88 -88
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_operations.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_aarch32.hpp +4 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_aarch64.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_alpha.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_arm.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_ppc.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_sparc.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_x86.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_msvc_arm.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_msvc_x86.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_operations.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_operations_emulated.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_gcc_atomic.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_gcc_sync.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_linux_arm.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fp_ops_emulated.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fp_ops_generic.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +110 -49
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/gcc_atomic_memory_order_utils.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/has_posix_clock_traits.hpp +51 -0
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/int_sizes.hpp +26 -32
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/integral_conversions.hpp +15 -15
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/interlocked.hpp +69 -30
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/intptr.hpp +8 -8
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/lock_pool.hpp +51 -31
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/memory_order_utils.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/once_flag.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_arm_common.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_ppc_common.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/platform.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/storage_traits.hpp +31 -31
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/alignment_of.hpp +2 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/has_unique_object_representations.hpp +2 -5
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_floating_point.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_iec559.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_integral.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_signed.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_trivially_copyable.hpp +20 -13
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_trivially_default_constructible.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/make_signed.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/make_unsigned.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_darwin_ulock.hpp +90 -16
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_dragonfly_umtx.hpp +80 -11
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_emulated.hpp +160 -15
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_freebsd_umtx.hpp +327 -38
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_futex.hpp +276 -33
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_generic.hpp +260 -20
- data/src/cxx_supportlib/vendor-modified/boost/atomic/fences.hpp +4 -3
- data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic.hpp +14 -18
- data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic_flag.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic_ref.hpp +13 -13
- data/src/cxx_supportlib/vendor-modified/boost/atomic/posix_clock_traits_fwd.hpp +59 -0
- data/src/cxx_supportlib/vendor-modified/boost/atomic/thread_pause.hpp +102 -0
- data/src/cxx_supportlib/vendor-modified/boost/atomic/wait_result.hpp +56 -0
- data/src/cxx_supportlib/vendor-modified/boost/atomic.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +5 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +108 -41
- data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +1235 -1009
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +3 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/algorithm.hpp +56 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_helpers.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_lib.h +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +23 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +0 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +88 -23
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/operator_new_helpers.hpp +68 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +72 -13
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +13 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +8 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +31 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +37 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +19 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +23 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +72 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +3 -10
- data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +54 -23
- data/src/cxx_supportlib/vendor-modified/boost/container/pmr/devector.hpp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +19 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +32 -5
- data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +27 -2
- data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +22 -0
- data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +37 -17
- data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +23 -1
- data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +41 -20
- data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +5 -8
- data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_fwd.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_is_avalanching.hpp +57 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/bit.hpp +29 -29
- data/src/cxx_supportlib/vendor-modified/boost/core/cmath.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/core/data.hpp +15 -1
- data/src/cxx_supportlib/vendor-modified/boost/core/default_allocator.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/demangle.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/assert.hpp +18 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_sleep.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/static_assert.hpp +42 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +16 -10
- data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +35 -27
- data/src/cxx_supportlib/vendor-modified/boost/core/scoped_enum.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/core/size.hpp +14 -0
- data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +20 -9
- data/src/cxx_supportlib/vendor-modified/boost/cregex.hpp +0 -5
- data/src/cxx_supportlib/vendor-modified/boost/describe/detail/config.hpp +8 -0
- data/src/cxx_supportlib/vendor-modified/boost/describe/modifiers.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/foreach.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_rebind.hpp +9 -0
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +43 -64
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/config_def.hpp +0 -83
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/config_undef.hpp +1 -5
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/eval_if_default.hpp +44 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/facade_iterator_category.hpp +103 -117
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/conjunction.hpp +53 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/disjunction.hpp +53 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/negation.hpp +53 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/type_identity.hpp +54 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +32 -38
- data/src/cxx_supportlib/vendor-modified/boost/iterator/enable_if_convertible.hpp +84 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/interoperable.hpp +22 -34
- data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +16 -16
- data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_adaptor.hpp +162 -309
- data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_categories.hpp +52 -161
- data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_concepts.hpp +3 -11
- data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_facade.hpp +804 -977
- data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_traits.hpp +24 -17
- data/src/cxx_supportlib/vendor-modified/boost/iterator/min_category.hpp +83 -0
- data/src/cxx_supportlib/vendor-modified/boost/iterator/minimum_category.hpp +11 -73
- data/src/cxx_supportlib/vendor-modified/boost/iterator/reverse_iterator.hpp +56 -57
- data/src/cxx_supportlib/vendor-modified/boost/iterator/transform_iterator.hpp +123 -156
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/buffer_view.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +36 -33
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +43 -50
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +23 -27
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +10 -11
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_basic_unlockedbuf.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +6 -7
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/type_traits.hpp +81 -0
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +8 -9
- data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/wide_posix_api.cpp +1 -12
- data/src/cxx_supportlib/vendor-modified/boost/memory_order.hpp +8 -26
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/iterator_to_raw_pointer.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/std_ns_begin.hpp +6 -0
- data/src/cxx_supportlib/vendor-modified/boost/move/detail/unique_ptr_meta_utils.hpp +2 -2
- data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +11 -44
- data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +34 -0
- data/src/cxx_supportlib/vendor-modified/boost/mp11/set.hpp +33 -1
- data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/mpl/and.hpp +4 -8
- data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/na_assert.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/ptr_to_ref.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/mpl/bitand.hpp +2 -6
- data/src/cxx_supportlib/vendor-modified/boost/mpl/bitor.hpp +2 -6
- data/src/cxx_supportlib/vendor-modified/boost/mpl/or.hpp +2 -6
- data/src/cxx_supportlib/vendor-modified/boost/pool/pool.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/pool/simple_segregated_storage.hpp +0 -13
- data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_seq_256.hpp +190 -190
- data/src/cxx_supportlib/vendor-modified/boost/random/beta_distribution.hpp +12 -2
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/config.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/size.hpp +41 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/detail/xoshiro_base.hpp +472 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/discrete_distribution.hpp +7 -10
- data/src/cxx_supportlib/vendor-modified/boost/random/gamma_distribution.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/random/generalized_inverse_gaussian_distribution.hpp +339 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/hyperexponential_distribution.hpp +12 -14
- data/src/cxx_supportlib/vendor-modified/boost/random/inverse_gaussian_distribution.hpp +226 -0
- data/src/cxx_supportlib/vendor-modified/boost/random/mersenne_twister.hpp +1 -4
- data/src/cxx_supportlib/vendor-modified/boost/random/mixmax.hpp +63 -63
- data/src/cxx_supportlib/vendor-modified/boost/random/piecewise_constant_distribution.hpp +7 -10
- data/src/cxx_supportlib/vendor-modified/boost/random/piecewise_linear_distribution.hpp +8 -11
- data/src/cxx_supportlib/vendor-modified/boost/random/seed_seq.hpp +1 -3
- data/src/cxx_supportlib/vendor-modified/boost/random/splitmix64.hpp +1 -4
- data/src/cxx_supportlib/vendor-modified/boost/random/xoshiro.hpp +488 -0
- data/src/cxx_supportlib/vendor-modified/boost/random.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/concepts.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/detail/has_member_size.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/detail/msvc_has_iterator_workaround.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/has_range_iterator.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/range/iterator.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/range/iterator_range_core.hpp +4 -1
- data/src/cxx_supportlib/vendor-modified/boost/range/size_type.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +35 -18
- data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +18 -101
- data/src/cxx_supportlib/vendor-modified/boost/regex/pattern_except.hpp +0 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/pending/object_cache.hpp +0 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/pending/unicode_iterator.hpp +0 -6
- data/src/cxx_supportlib/vendor-modified/boost/regex/regex_traits.hpp +0 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/user.hpp +4 -10
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex.hpp +63 -17
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex_creator.hpp +71 -16
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex_parser.hpp +22 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/c_regex_traits.hpp +11 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/char_regex_traits.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/cpp_regex_traits.hpp +11 -8
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/cregex.hpp +2 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/error_type.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/icu.hpp +40 -38
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/iterator_category.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/iterator_traits.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/match_flags.hpp +39 -37
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/match_results.hpp +46 -9
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/mem_block_cache.hpp +4 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/object_cache.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/pattern_except.hpp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher.hpp +57 -8
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher_common.hpp +21 -6
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher_non_recursive.hpp +18 -3
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regbase.hpp +4 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex.hpp +6 -6
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_format.hpp +23 -18
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_fwd.hpp +9 -9
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_grep.hpp +9 -5
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_iterator.hpp +11 -7
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_match.hpp +10 -7
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_merge.hpp +4 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_raw_buffer.hpp +3 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_replace.hpp +6 -2
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_search.hpp +12 -9
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_split.hpp +6 -3
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_token_iterator.hpp +16 -11
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_traits.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_traits_defaults.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_workaround.hpp +2 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/states.hpp +7 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/sub_match.hpp +54 -49
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/syntax_type.hpp +64 -62
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/u32regex_iterator.hpp +16 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/u32regex_token_iterator.hpp +12 -0
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/unicode_iterator.hpp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex/v5/w32_regex_traits.hpp +3 -1
- data/src/cxx_supportlib/vendor-modified/boost/regex.hpp +0 -4
- data/src/cxx_supportlib/vendor-modified/boost/regex_fwd.hpp +0 -4
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count.hpp +1 -43
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/deprecated_macros.hpp +7 -7
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/shared_count.hpp +2 -77
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base.hpp +1 -64
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_nt.hpp +3 -3
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +0 -77
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_cxx20_constexpr.hpp +37 -0
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock.hpp +5 -28
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ptr.hpp +41 -40
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_array.hpp +0 -15
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_ptr.hpp +0 -18
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_ptr.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +1 -1
- data/src/cxx_supportlib/vendor-modified/boost/tuple/detail/tuple_basic.hpp +1 -0
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/integral_constant.hpp +8 -6
- data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_complete.hpp +31 -10
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +34 -8
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +6 -4
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +9 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +5 -5
- data/src/cxx_supportlib/vendor-modified/boost/unordered/{unordered_printers.hpp → detail/unordered_printers.hpp} +34 -36
- data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +6 -49
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +6 -1
- data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
- data/src/nginx_module/ContentHandler.c +2 -0
- data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +3 -5
- data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +3 -5
- data/src/ruby_supportlib/phusion_passenger/config/install_agent_command.rb +3 -5
- data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +3 -5
- data/src/ruby_supportlib/phusion_passenger/config/installation_utils.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +2 -2
- data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +5 -3
- data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +2 -2
- data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +6 -13
- data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +29 -30
- data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +2 -3
- data/src/ruby_supportlib/phusion_passenger/standalone/config_utils.rb +2 -0
- data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/json.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/utils/terminal_choice_menu.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +1 -1
- data/src/ruby_supportlib/phusion_passenger.rb +8 -8
- metadata +26 -99
- data/src/cxx_supportlib/vendor-modified/boost/align/aligned_alloc.hpp +0 -47
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc_posix.hpp +0 -41
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc_sunos.hpp +0 -34
- data/src/cxx_supportlib/vendor-modified/boost/align/detail/is_alignment.hpp +0 -28
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/pause.hpp +0 -68
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/conditional.hpp +0 -42
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/integral_constant.hpp +0 -46
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_enum.hpp +0 -42
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_function.hpp +0 -42
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_nothrow_default_constructible.hpp +0 -46
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/remove_cv.hpp +0 -42
- data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_on_address.hpp +0 -64
- data/src/cxx_supportlib/vendor-modified/boost/cerrno.hpp +0 -15
- data/src/cxx_supportlib/vendor-modified/boost/detail/indirect_traits.hpp +0 -195
- data/src/cxx_supportlib/vendor-modified/boost/detail/select_type.hpp +0 -36
- data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/enable_if.hpp +0 -83
- data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/internals.hpp +0 -35
- data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex.cpp +0 -120
- data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex_debug.cpp +0 -59
- data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/static_mutex.cpp +0 -189
- data/src/cxx_supportlib/vendor-modified/boost/libs/system/src/error_code.cpp +0 -31
- data/src/cxx_supportlib/vendor-modified/boost/regex/config/borland.hpp +0 -72
- data/src/cxx_supportlib/vendor-modified/boost/regex/config/cwchar.hpp +0 -207
- data/src/cxx_supportlib/vendor-modified/boost/regex/pending/static_mutex.hpp +0 -182
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex.hpp +0 -797
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +0 -1598
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +0 -3174
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/c_regex_traits.hpp +0 -511
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/char_regex_traits.hpp +0 -81
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cpp_regex_traits.hpp +0 -1237
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cregex.hpp +0 -213
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/error_type.hpp +0 -59
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/icu.hpp +0 -1516
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/indexed_bit_flag.hpp +0 -54
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/iterator_category.hpp +0 -91
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/iterator_traits.hpp +0 -135
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +0 -161
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_results.hpp +0 -716
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/mem_block_cache.hpp +0 -183
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/object_cache.hpp +0 -171
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/pattern_except.hpp +0 -128
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +0 -645
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +0 -1030
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +0 -1947
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_recursive.hpp +0 -1131
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/primary_transform.hpp +0 -146
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/protected_call.hpp +0 -83
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regbase.hpp +0 -180
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex.hpp +0 -166
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +0 -1158
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_fwd.hpp +0 -73
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_grep.hpp +0 -155
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_iterator.hpp +0 -195
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_match.hpp +0 -382
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_merge.hpp +0 -93
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_raw_buffer.hpp +0 -241
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_replace.hpp +0 -99
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_search.hpp +0 -217
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_split.hpp +0 -174
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_token_iterator.hpp +0 -327
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits.hpp +0 -189
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +0 -997
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +0 -237
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/states.hpp +0 -321
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/sub_match.hpp +0 -516
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/syntax_type.hpp +0 -105
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_iterator.hpp +0 -185
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_token_iterator.hpp +0 -360
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/unicode_iterator.hpp +0 -871
- data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +0 -1229
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_gcc.hpp +0 -79
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp +0 -63
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp +0 -88
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_pt.hpp +0 -104
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_spin.hpp +0 -69
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_sync.hpp +0 -72
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +0 -163
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_aix.hpp +0 -152
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +0 -185
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp +0 -148
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +0 -170
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +0 -200
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +0 -194
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +0 -179
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +0 -186
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_pt.hpp +0 -147
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +0 -174
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_spin.hpp +0 -141
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_sync.hpp +0 -165
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +0 -163
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +0 -30
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp +0 -69
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +0 -128
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_nt.hpp +0 -96
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_pt.hpp +0 -86
- data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_sync.hpp +0 -94
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
4
4
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
5
5
|
*
|
|
6
|
-
* Copyright (c) 2020 Andrey Semashev
|
|
6
|
+
* Copyright (c) 2020-2025 Andrey Semashev
|
|
7
7
|
*/
|
|
8
8
|
/*!
|
|
9
9
|
* \file atomic/detail/atomic_ref_impl.hpp
|
|
@@ -15,8 +15,12 @@
|
|
|
15
15
|
#define BOOST_ATOMIC_DETAIL_ATOMIC_REF_IMPL_HPP_INCLUDED_
|
|
16
16
|
|
|
17
17
|
#include <cstddef>
|
|
18
|
+
#include <chrono>
|
|
19
|
+
#include <utility>
|
|
20
|
+
#include <type_traits>
|
|
18
21
|
#include <boost/assert.hpp>
|
|
19
22
|
#include <boost/memory_order.hpp>
|
|
23
|
+
#include <boost/atomic/wait_result.hpp>
|
|
20
24
|
#include <boost/atomic/detail/config.hpp>
|
|
21
25
|
#include <boost/atomic/detail/addressof.hpp>
|
|
22
26
|
#include <boost/atomic/detail/storage_traits.hpp>
|
|
@@ -27,10 +31,7 @@
|
|
|
27
31
|
#include <boost/atomic/detail/core_operations_emulated.hpp>
|
|
28
32
|
#include <boost/atomic/detail/memory_order_utils.hpp>
|
|
29
33
|
#include <boost/atomic/detail/type_traits/is_signed.hpp>
|
|
30
|
-
#include <boost/atomic/detail/type_traits/remove_cv.hpp>
|
|
31
34
|
#include <boost/atomic/detail/type_traits/alignment_of.hpp>
|
|
32
|
-
#include <boost/atomic/detail/type_traits/conditional.hpp>
|
|
33
|
-
#include <boost/atomic/detail/type_traits/integral_constant.hpp>
|
|
34
35
|
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
|
35
36
|
#include <boost/atomic/detail/bitwise_fp_cast.hpp>
|
|
36
37
|
#include <boost/atomic/detail/fp_operations.hpp>
|
|
@@ -54,55 +55,57 @@ namespace detail {
|
|
|
54
55
|
template< typename T, bool Signed, bool Interprocess >
|
|
55
56
|
struct is_atomic_ref_lock_free
|
|
56
57
|
{
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
using value_type = T;
|
|
59
|
+
using core_operations = atomics::detail::core_operations< sizeof(value_type), Signed, Interprocess >;
|
|
60
|
+
using storage_type = typename core_operations::storage_type;
|
|
60
61
|
|
|
61
|
-
static
|
|
62
|
+
static constexpr bool value = sizeof(value_type) == sizeof(storage_type) && core_operations::is_always_lock_free;
|
|
62
63
|
};
|
|
63
64
|
|
|
64
65
|
template< typename T, bool Signed, bool Interprocess >
|
|
65
66
|
class base_atomic_ref_common
|
|
66
67
|
{
|
|
67
68
|
public:
|
|
68
|
-
|
|
69
|
+
using value_type = T;
|
|
69
70
|
|
|
70
71
|
protected:
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
using unqualified_value_type = typename std::remove_cv< value_type >::type;
|
|
73
|
+
using core_operations = typename std::conditional<
|
|
73
74
|
atomics::detail::is_atomic_ref_lock_free< T, Signed, Interprocess >::value,
|
|
74
75
|
atomics::detail::core_operations< sizeof(value_type), Signed, Interprocess >,
|
|
75
76
|
atomics::detail::core_operations_emulated< sizeof(value_type), atomics::detail::alignment_of< value_type >::value, Signed, Interprocess >
|
|
76
|
-
>::type
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
77
|
+
>::type;
|
|
78
|
+
using wait_operations = atomics::detail::wait_operations< core_operations >;
|
|
79
|
+
using value_arg_type = typename std::conditional< sizeof(value_type) <= sizeof(void*), value_type, value_type const& >::type;
|
|
80
|
+
using storage_type = typename core_operations::storage_type;
|
|
80
81
|
static_assert(sizeof(storage_type) == sizeof(value_type), "Boost.Atomic internal error: atomic_ref storage size doesn't match the value size");
|
|
81
82
|
|
|
82
83
|
public:
|
|
83
|
-
static
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
static constexpr std::size_t required_alignment =
|
|
85
|
+
atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment ?
|
|
86
|
+
core_operations::storage_alignment : atomics::detail::alignment_of< value_type >::value;
|
|
87
|
+
static constexpr bool is_always_lock_free = core_operations::is_always_lock_free;
|
|
88
|
+
static constexpr bool always_has_native_wait_notify = wait_operations::always_has_native_wait_notify;
|
|
86
89
|
|
|
87
90
|
protected:
|
|
88
91
|
value_type* m_value;
|
|
89
92
|
|
|
90
93
|
public:
|
|
91
|
-
BOOST_FORCEINLINE explicit base_atomic_ref_common(value_type& v)
|
|
94
|
+
BOOST_FORCEINLINE explicit base_atomic_ref_common(value_type& v) noexcept : m_value(atomics::detail::addressof(v))
|
|
92
95
|
{
|
|
93
96
|
BOOST_ATOMIC_DETAIL_CLEAR_PADDING(const_cast< unqualified_value_type* >(m_value));
|
|
94
97
|
}
|
|
95
98
|
|
|
96
|
-
BOOST_FORCEINLINE value_type& value() const
|
|
99
|
+
BOOST_FORCEINLINE value_type& value() const noexcept { return *m_value; }
|
|
97
100
|
|
|
98
101
|
protected:
|
|
99
|
-
BOOST_FORCEINLINE storage_type& storage() const
|
|
102
|
+
BOOST_FORCEINLINE storage_type& storage() const noexcept
|
|
100
103
|
{
|
|
101
104
|
return *reinterpret_cast< storage_type* >(const_cast< unqualified_value_type* >(m_value));
|
|
102
105
|
}
|
|
103
106
|
|
|
104
107
|
public:
|
|
105
|
-
BOOST_FORCEINLINE bool is_lock_free() const
|
|
108
|
+
BOOST_FORCEINLINE bool is_lock_free() const noexcept
|
|
106
109
|
{
|
|
107
110
|
// C++20 specifies that is_lock_free returns true if operations on *all* objects of the atomic_ref<T> type are lock-free.
|
|
108
111
|
// This does not allow to return true or false depending on the referenced object runtime alignment. Currently, Boost.Atomic
|
|
@@ -110,17 +113,17 @@ public:
|
|
|
110
113
|
return is_always_lock_free;
|
|
111
114
|
}
|
|
112
115
|
|
|
113
|
-
BOOST_FORCEINLINE bool has_native_wait_notify() const
|
|
116
|
+
BOOST_FORCEINLINE bool has_native_wait_notify() const noexcept
|
|
114
117
|
{
|
|
115
118
|
return wait_operations::has_native_wait_notify(this->storage());
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
BOOST_FORCEINLINE void notify_one() const
|
|
121
|
+
BOOST_FORCEINLINE void notify_one() const noexcept
|
|
119
122
|
{
|
|
120
123
|
wait_operations::notify_one(this->storage());
|
|
121
124
|
}
|
|
122
125
|
|
|
123
|
-
BOOST_FORCEINLINE void notify_all() const
|
|
126
|
+
BOOST_FORCEINLINE void notify_all() const noexcept
|
|
124
127
|
{
|
|
125
128
|
wait_operations::notify_all(this->storage());
|
|
126
129
|
}
|
|
@@ -128,11 +131,11 @@ public:
|
|
|
128
131
|
|
|
129
132
|
#if defined(BOOST_NO_CXX17_INLINE_VARIABLES)
|
|
130
133
|
template< typename T, bool Signed, bool Interprocess >
|
|
131
|
-
|
|
134
|
+
constexpr std::size_t base_atomic_ref_common< T, Signed, Interprocess >::required_alignment;
|
|
132
135
|
template< typename T, bool Signed, bool Interprocess >
|
|
133
|
-
|
|
136
|
+
constexpr bool base_atomic_ref_common< T, Signed, Interprocess >::is_always_lock_free;
|
|
134
137
|
template< typename T, bool Signed, bool Interprocess >
|
|
135
|
-
|
|
138
|
+
constexpr bool base_atomic_ref_common< T, Signed, Interprocess >::always_has_native_wait_notify;
|
|
136
139
|
#endif
|
|
137
140
|
|
|
138
141
|
|
|
@@ -145,31 +148,34 @@ class base_atomic_ref< T, void, Interprocess > :
|
|
|
145
148
|
public base_atomic_ref_common< T, false, Interprocess >
|
|
146
149
|
{
|
|
147
150
|
private:
|
|
148
|
-
|
|
151
|
+
using base_type = base_atomic_ref_common< T, false, Interprocess >;
|
|
149
152
|
|
|
150
153
|
public:
|
|
151
|
-
|
|
154
|
+
using value_type = typename base_type::value_type;
|
|
152
155
|
|
|
153
156
|
protected:
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
157
|
+
using core_operations = typename base_type::core_operations;
|
|
158
|
+
using wait_operations = typename base_type::wait_operations;
|
|
159
|
+
using storage_type = typename base_type::storage_type;
|
|
160
|
+
using value_arg_type = typename base_type::value_arg_type;
|
|
158
161
|
|
|
159
162
|
private:
|
|
163
|
+
using cxchg_use_bitwise_cast =
|
|
160
164
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
161
|
-
|
|
165
|
+
std::true_type;
|
|
162
166
|
#else
|
|
163
|
-
|
|
167
|
+
std::integral_constant< bool, atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment >;
|
|
164
168
|
#endif
|
|
165
169
|
|
|
166
170
|
public:
|
|
167
|
-
|
|
168
|
-
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v)
|
|
171
|
+
base_atomic_ref(base_atomic_ref const&) = default;
|
|
172
|
+
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v) noexcept : base_type(v)
|
|
169
173
|
{
|
|
170
174
|
}
|
|
171
175
|
|
|
172
|
-
|
|
176
|
+
base_atomic_ref& operator=(base_atomic_ref const&) = delete;
|
|
177
|
+
|
|
178
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
173
179
|
{
|
|
174
180
|
BOOST_ASSERT(order != memory_order_consume);
|
|
175
181
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -178,7 +184,7 @@ public:
|
|
|
178
184
|
core_operations::store(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order);
|
|
179
185
|
}
|
|
180
186
|
|
|
181
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const
|
|
187
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const noexcept
|
|
182
188
|
{
|
|
183
189
|
BOOST_ASSERT(order != memory_order_release);
|
|
184
190
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -186,12 +192,12 @@ public:
|
|
|
186
192
|
return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
|
|
187
193
|
}
|
|
188
194
|
|
|
189
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
195
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
190
196
|
{
|
|
191
197
|
return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order));
|
|
192
198
|
}
|
|
193
199
|
|
|
194
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
200
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
195
201
|
{
|
|
196
202
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
197
203
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -200,12 +206,12 @@ public:
|
|
|
200
206
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
201
207
|
}
|
|
202
208
|
|
|
203
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
209
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
204
210
|
{
|
|
205
211
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
206
212
|
}
|
|
207
213
|
|
|
208
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
214
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
209
215
|
{
|
|
210
216
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
211
217
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -214,12 +220,12 @@ public:
|
|
|
214
220
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
215
221
|
}
|
|
216
222
|
|
|
217
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
223
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
218
224
|
{
|
|
219
225
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
220
226
|
}
|
|
221
227
|
|
|
222
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const
|
|
228
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const noexcept
|
|
223
229
|
{
|
|
224
230
|
BOOST_ASSERT(order != memory_order_release);
|
|
225
231
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -227,31 +233,65 @@ public:
|
|
|
227
233
|
return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), order));
|
|
228
234
|
}
|
|
229
235
|
|
|
230
|
-
|
|
236
|
+
template< typename Clock, typename Duration >
|
|
237
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
238
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const
|
|
239
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
240
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
241
|
+
{
|
|
242
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
243
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
244
|
+
|
|
245
|
+
bool timed_out = false;
|
|
246
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
247
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
template< typename Rep, typename Period >
|
|
251
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
252
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const
|
|
253
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
254
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
255
|
+
{
|
|
256
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
257
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
258
|
+
|
|
259
|
+
bool timed_out = false;
|
|
260
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
261
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
262
|
+
}
|
|
231
263
|
|
|
232
264
|
private:
|
|
233
|
-
BOOST_FORCEINLINE bool
|
|
265
|
+
BOOST_FORCEINLINE bool
|
|
266
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
234
267
|
{
|
|
235
|
-
return core_operations::compare_exchange_strong(
|
|
268
|
+
return core_operations::compare_exchange_strong(
|
|
269
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
236
270
|
}
|
|
237
271
|
|
|
238
|
-
BOOST_FORCEINLINE bool
|
|
272
|
+
BOOST_FORCEINLINE bool
|
|
273
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
239
274
|
{
|
|
240
275
|
storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
|
|
241
|
-
const bool res = core_operations::compare_exchange_strong(
|
|
276
|
+
const bool res = core_operations::compare_exchange_strong(
|
|
277
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
242
278
|
expected = atomics::detail::bitwise_cast< value_type >(old_value);
|
|
243
279
|
return res;
|
|
244
280
|
}
|
|
245
281
|
|
|
246
|
-
BOOST_FORCEINLINE bool
|
|
282
|
+
BOOST_FORCEINLINE bool
|
|
283
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
247
284
|
{
|
|
248
|
-
return core_operations::compare_exchange_weak(
|
|
285
|
+
return core_operations::compare_exchange_weak(
|
|
286
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
249
287
|
}
|
|
250
288
|
|
|
251
|
-
BOOST_FORCEINLINE bool
|
|
289
|
+
BOOST_FORCEINLINE bool
|
|
290
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
252
291
|
{
|
|
253
292
|
storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
|
|
254
|
-
const bool res = core_operations::compare_exchange_weak(
|
|
293
|
+
const bool res = core_operations::compare_exchange_weak(
|
|
294
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
255
295
|
expected = atomics::detail::bitwise_cast< value_type >(old_value);
|
|
256
296
|
return res;
|
|
257
297
|
}
|
|
@@ -264,31 +304,35 @@ class base_atomic_ref< T, const int, Interprocess > :
|
|
|
264
304
|
public base_atomic_ref_common< T, false, Interprocess >
|
|
265
305
|
{
|
|
266
306
|
private:
|
|
267
|
-
|
|
307
|
+
using base_type = base_atomic_ref_common< T, false, Interprocess >;
|
|
268
308
|
|
|
269
309
|
public:
|
|
270
|
-
|
|
310
|
+
using value_type = typename base_type::value_type;
|
|
271
311
|
|
|
272
312
|
protected:
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
313
|
+
using core_operations = typename base_type::core_operations;
|
|
314
|
+
using wait_operations = typename base_type::wait_operations;
|
|
315
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
316
|
+
using storage_type = typename base_type::storage_type;
|
|
317
|
+
using value_arg_type = typename base_type::value_arg_type;
|
|
277
318
|
|
|
278
319
|
private:
|
|
320
|
+
using cxchg_use_bitwise_cast =
|
|
279
321
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
280
|
-
|
|
322
|
+
std::true_type;
|
|
281
323
|
#else
|
|
282
|
-
|
|
324
|
+
std::integral_constant< bool, atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment >;
|
|
283
325
|
#endif
|
|
284
326
|
|
|
285
327
|
public:
|
|
286
|
-
|
|
287
|
-
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v)
|
|
328
|
+
base_atomic_ref(base_atomic_ref const&) = default;
|
|
329
|
+
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v) noexcept : base_type(v)
|
|
288
330
|
{
|
|
289
331
|
}
|
|
290
332
|
|
|
291
|
-
|
|
333
|
+
base_atomic_ref& operator=(base_atomic_ref const&) = delete;
|
|
334
|
+
|
|
335
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
292
336
|
{
|
|
293
337
|
BOOST_ASSERT(order != memory_order_consume);
|
|
294
338
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -297,7 +341,7 @@ public:
|
|
|
297
341
|
core_operations::store(this->storage(), static_cast< storage_type >(v), order);
|
|
298
342
|
}
|
|
299
343
|
|
|
300
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const
|
|
344
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const noexcept
|
|
301
345
|
{
|
|
302
346
|
BOOST_ASSERT(order != memory_order_release);
|
|
303
347
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -305,12 +349,12 @@ public:
|
|
|
305
349
|
return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
|
|
306
350
|
}
|
|
307
351
|
|
|
308
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
352
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
309
353
|
{
|
|
310
354
|
return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), static_cast< storage_type >(v), order));
|
|
311
355
|
}
|
|
312
356
|
|
|
313
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
357
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
314
358
|
{
|
|
315
359
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
316
360
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -319,12 +363,12 @@ public:
|
|
|
319
363
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
320
364
|
}
|
|
321
365
|
|
|
322
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
366
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
323
367
|
{
|
|
324
368
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
325
369
|
}
|
|
326
370
|
|
|
327
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
371
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
328
372
|
{
|
|
329
373
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
330
374
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -333,12 +377,125 @@ public:
|
|
|
333
377
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
334
378
|
}
|
|
335
379
|
|
|
336
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
380
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
337
381
|
{
|
|
338
382
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
339
383
|
}
|
|
340
384
|
|
|
341
|
-
BOOST_FORCEINLINE value_type
|
|
385
|
+
BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
386
|
+
{
|
|
387
|
+
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_and(this->storage(), static_cast< storage_type >(v), order));
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
391
|
+
{
|
|
392
|
+
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_or(this->storage(), static_cast< storage_type >(v), order));
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
396
|
+
{
|
|
397
|
+
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) const noexcept
|
|
401
|
+
{
|
|
402
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::fetch_complement(this->storage(), order));
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
406
|
+
{
|
|
407
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_and(this->storage(), static_cast< storage_type >(v), order));
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
411
|
+
{
|
|
412
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_or(this->storage(), static_cast< storage_type >(v), order));
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
416
|
+
{
|
|
417
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) const noexcept
|
|
421
|
+
{
|
|
422
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_complement(this->storage(), order));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
426
|
+
{
|
|
427
|
+
extra_operations::opaque_and(this->storage(), static_cast< storage_type >(v), order);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
431
|
+
{
|
|
432
|
+
extra_operations::opaque_or(this->storage(), static_cast< storage_type >(v), order);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
436
|
+
{
|
|
437
|
+
extra_operations::opaque_xor(this->storage(), static_cast< storage_type >(v), order);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) const noexcept
|
|
441
|
+
{
|
|
442
|
+
extra_operations::opaque_complement(this->storage(), order);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
446
|
+
{
|
|
447
|
+
return extra_operations::and_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
451
|
+
{
|
|
452
|
+
return extra_operations::or_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
456
|
+
{
|
|
457
|
+
return extra_operations::xor_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) const noexcept
|
|
461
|
+
{
|
|
462
|
+
return extra_operations::complement_and_test(this->storage(), order);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) const noexcept
|
|
466
|
+
{
|
|
467
|
+
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
468
|
+
return extra_operations::bit_test_and_set(this->storage(), bit_number, order);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) const noexcept
|
|
472
|
+
{
|
|
473
|
+
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
474
|
+
return extra_operations::bit_test_and_reset(this->storage(), bit_number, order);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) const noexcept
|
|
478
|
+
{
|
|
479
|
+
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
480
|
+
return extra_operations::bit_test_and_complement(this->storage(), bit_number, order);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
BOOST_FORCEINLINE value_type operator&=(value_type v) const noexcept
|
|
484
|
+
{
|
|
485
|
+
return bitwise_and(v);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
BOOST_FORCEINLINE value_type operator|=(value_type v) const noexcept
|
|
489
|
+
{
|
|
490
|
+
return bitwise_or(v);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
BOOST_FORCEINLINE value_type operator^=(value_type v) const noexcept
|
|
494
|
+
{
|
|
495
|
+
return bitwise_xor(v);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const noexcept
|
|
342
499
|
{
|
|
343
500
|
BOOST_ASSERT(order != memory_order_release);
|
|
344
501
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -346,15 +503,44 @@ public:
|
|
|
346
503
|
return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order));
|
|
347
504
|
}
|
|
348
505
|
|
|
349
|
-
|
|
506
|
+
template< typename Clock, typename Duration >
|
|
507
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
508
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const
|
|
509
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
510
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
511
|
+
{
|
|
512
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
513
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
514
|
+
|
|
515
|
+
bool timed_out = false;
|
|
516
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
517
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
template< typename Rep, typename Period >
|
|
521
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
522
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const
|
|
523
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
524
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
525
|
+
{
|
|
526
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
527
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
528
|
+
|
|
529
|
+
bool timed_out = false;
|
|
530
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
531
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
532
|
+
}
|
|
350
533
|
|
|
351
534
|
private:
|
|
352
|
-
BOOST_FORCEINLINE bool
|
|
535
|
+
BOOST_FORCEINLINE bool
|
|
536
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
353
537
|
{
|
|
354
|
-
return core_operations::compare_exchange_strong(
|
|
538
|
+
return core_operations::compare_exchange_strong(
|
|
539
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
355
540
|
}
|
|
356
541
|
|
|
357
|
-
BOOST_FORCEINLINE bool
|
|
542
|
+
BOOST_FORCEINLINE bool
|
|
543
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
358
544
|
{
|
|
359
545
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
360
546
|
const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -362,12 +548,15 @@ private:
|
|
|
362
548
|
return res;
|
|
363
549
|
}
|
|
364
550
|
|
|
365
|
-
BOOST_FORCEINLINE bool
|
|
551
|
+
BOOST_FORCEINLINE bool
|
|
552
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
366
553
|
{
|
|
367
|
-
return core_operations::compare_exchange_weak(
|
|
554
|
+
return core_operations::compare_exchange_weak(
|
|
555
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
368
556
|
}
|
|
369
557
|
|
|
370
|
-
BOOST_FORCEINLINE bool
|
|
558
|
+
BOOST_FORCEINLINE bool
|
|
559
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
371
560
|
{
|
|
372
561
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
373
562
|
const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -383,34 +572,37 @@ class base_atomic_ref< T, int, Interprocess > :
|
|
|
383
572
|
public base_atomic_ref_common< T, atomics::detail::is_signed< T >::value, Interprocess >
|
|
384
573
|
{
|
|
385
574
|
private:
|
|
386
|
-
|
|
575
|
+
using base_type = base_atomic_ref_common< T, atomics::detail::is_signed< T >::value, Interprocess >;
|
|
387
576
|
|
|
388
577
|
public:
|
|
389
|
-
|
|
390
|
-
|
|
578
|
+
using value_type = typename base_type::value_type;
|
|
579
|
+
using difference_type = typename base_type::value_type;
|
|
391
580
|
|
|
392
581
|
protected:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
582
|
+
using core_operations = typename base_type::core_operations;
|
|
583
|
+
using wait_operations = typename base_type::wait_operations;
|
|
584
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
585
|
+
using storage_type = typename base_type::storage_type;
|
|
586
|
+
using value_arg_type = value_type;
|
|
398
587
|
|
|
399
588
|
private:
|
|
589
|
+
using cxchg_use_bitwise_cast =
|
|
400
590
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
401
|
-
|
|
591
|
+
std::true_type;
|
|
402
592
|
#else
|
|
403
|
-
|
|
593
|
+
std::integral_constant< bool, atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment >;
|
|
404
594
|
#endif
|
|
405
595
|
|
|
406
596
|
public:
|
|
407
|
-
|
|
408
|
-
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v)
|
|
597
|
+
base_atomic_ref(base_atomic_ref const&) = default;
|
|
598
|
+
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v) noexcept : base_type(v)
|
|
409
599
|
{
|
|
410
600
|
}
|
|
411
601
|
|
|
602
|
+
base_atomic_ref& operator=(base_atomic_ref const&) = delete;
|
|
603
|
+
|
|
412
604
|
// Standard methods
|
|
413
|
-
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
605
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
414
606
|
{
|
|
415
607
|
BOOST_ASSERT(order != memory_order_consume);
|
|
416
608
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -419,7 +611,7 @@ public:
|
|
|
419
611
|
core_operations::store(this->storage(), static_cast< storage_type >(v), order);
|
|
420
612
|
}
|
|
421
613
|
|
|
422
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const
|
|
614
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const noexcept
|
|
423
615
|
{
|
|
424
616
|
BOOST_ASSERT(order != memory_order_release);
|
|
425
617
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -427,22 +619,22 @@ public:
|
|
|
427
619
|
return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
|
|
428
620
|
}
|
|
429
621
|
|
|
430
|
-
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
622
|
+
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
431
623
|
{
|
|
432
624
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_add(this->storage(), static_cast< storage_type >(v), order));
|
|
433
625
|
}
|
|
434
626
|
|
|
435
|
-
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
627
|
+
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
436
628
|
{
|
|
437
629
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_sub(this->storage(), static_cast< storage_type >(v), order));
|
|
438
630
|
}
|
|
439
631
|
|
|
440
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
632
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
441
633
|
{
|
|
442
634
|
return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), static_cast< storage_type >(v), order));
|
|
443
635
|
}
|
|
444
636
|
|
|
445
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
637
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
446
638
|
{
|
|
447
639
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
448
640
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -451,12 +643,12 @@ public:
|
|
|
451
643
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
452
644
|
}
|
|
453
645
|
|
|
454
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
646
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
455
647
|
{
|
|
456
648
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
457
649
|
}
|
|
458
650
|
|
|
459
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
651
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
460
652
|
{
|
|
461
653
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
462
654
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -465,207 +657,207 @@ public:
|
|
|
465
657
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
466
658
|
}
|
|
467
659
|
|
|
468
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
660
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
469
661
|
{
|
|
470
662
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
471
663
|
}
|
|
472
664
|
|
|
473
|
-
BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
665
|
+
BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
474
666
|
{
|
|
475
667
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_and(this->storage(), static_cast< storage_type >(v), order));
|
|
476
668
|
}
|
|
477
669
|
|
|
478
|
-
BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
670
|
+
BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
479
671
|
{
|
|
480
672
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_or(this->storage(), static_cast< storage_type >(v), order));
|
|
481
673
|
}
|
|
482
674
|
|
|
483
|
-
BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
675
|
+
BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
484
676
|
{
|
|
485
677
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
486
678
|
}
|
|
487
679
|
|
|
488
680
|
// Boost.Atomic extensions
|
|
489
|
-
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) const
|
|
681
|
+
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) const noexcept
|
|
490
682
|
{
|
|
491
683
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::fetch_negate(this->storage(), order));
|
|
492
684
|
}
|
|
493
685
|
|
|
494
|
-
BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) const
|
|
686
|
+
BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) const noexcept
|
|
495
687
|
{
|
|
496
688
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::fetch_complement(this->storage(), order));
|
|
497
689
|
}
|
|
498
690
|
|
|
499
|
-
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
691
|
+
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
500
692
|
{
|
|
501
693
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::add(this->storage(), static_cast< storage_type >(v), order));
|
|
502
694
|
}
|
|
503
695
|
|
|
504
|
-
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
696
|
+
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
505
697
|
{
|
|
506
698
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::sub(this->storage(), static_cast< storage_type >(v), order));
|
|
507
699
|
}
|
|
508
700
|
|
|
509
|
-
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) const
|
|
701
|
+
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) const noexcept
|
|
510
702
|
{
|
|
511
703
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::negate(this->storage(), order));
|
|
512
704
|
}
|
|
513
705
|
|
|
514
|
-
BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
706
|
+
BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
515
707
|
{
|
|
516
708
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_and(this->storage(), static_cast< storage_type >(v), order));
|
|
517
709
|
}
|
|
518
710
|
|
|
519
|
-
BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
711
|
+
BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
520
712
|
{
|
|
521
713
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_or(this->storage(), static_cast< storage_type >(v), order));
|
|
522
714
|
}
|
|
523
715
|
|
|
524
|
-
BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
716
|
+
BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
525
717
|
{
|
|
526
718
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
527
719
|
}
|
|
528
720
|
|
|
529
|
-
BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) const
|
|
721
|
+
BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) const noexcept
|
|
530
722
|
{
|
|
531
723
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_complement(this->storage(), order));
|
|
532
724
|
}
|
|
533
725
|
|
|
534
|
-
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
726
|
+
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
535
727
|
{
|
|
536
728
|
extra_operations::opaque_add(this->storage(), static_cast< storage_type >(v), order);
|
|
537
729
|
}
|
|
538
730
|
|
|
539
|
-
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
731
|
+
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
540
732
|
{
|
|
541
733
|
extra_operations::opaque_sub(this->storage(), static_cast< storage_type >(v), order);
|
|
542
734
|
}
|
|
543
735
|
|
|
544
|
-
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) const
|
|
736
|
+
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) const noexcept
|
|
545
737
|
{
|
|
546
738
|
extra_operations::opaque_negate(this->storage(), order);
|
|
547
739
|
}
|
|
548
740
|
|
|
549
|
-
BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
741
|
+
BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
550
742
|
{
|
|
551
743
|
extra_operations::opaque_and(this->storage(), static_cast< storage_type >(v), order);
|
|
552
744
|
}
|
|
553
745
|
|
|
554
|
-
BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
746
|
+
BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
555
747
|
{
|
|
556
748
|
extra_operations::opaque_or(this->storage(), static_cast< storage_type >(v), order);
|
|
557
749
|
}
|
|
558
750
|
|
|
559
|
-
BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
751
|
+
BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
560
752
|
{
|
|
561
753
|
extra_operations::opaque_xor(this->storage(), static_cast< storage_type >(v), order);
|
|
562
754
|
}
|
|
563
755
|
|
|
564
|
-
BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) const
|
|
756
|
+
BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) const noexcept
|
|
565
757
|
{
|
|
566
758
|
extra_operations::opaque_complement(this->storage(), order);
|
|
567
759
|
}
|
|
568
760
|
|
|
569
|
-
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
761
|
+
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
570
762
|
{
|
|
571
763
|
return extra_operations::add_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
572
764
|
}
|
|
573
765
|
|
|
574
|
-
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
766
|
+
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
575
767
|
{
|
|
576
768
|
return extra_operations::sub_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
577
769
|
}
|
|
578
770
|
|
|
579
|
-
BOOST_FORCEINLINE bool negate_and_test(memory_order order = memory_order_seq_cst) const
|
|
771
|
+
BOOST_FORCEINLINE bool negate_and_test(memory_order order = memory_order_seq_cst) const noexcept
|
|
580
772
|
{
|
|
581
773
|
return extra_operations::negate_and_test(this->storage(), order);
|
|
582
774
|
}
|
|
583
775
|
|
|
584
|
-
BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
776
|
+
BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
585
777
|
{
|
|
586
778
|
return extra_operations::and_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
587
779
|
}
|
|
588
780
|
|
|
589
|
-
BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
781
|
+
BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
590
782
|
{
|
|
591
783
|
return extra_operations::or_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
592
784
|
}
|
|
593
785
|
|
|
594
|
-
BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
786
|
+
BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
595
787
|
{
|
|
596
788
|
return extra_operations::xor_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
597
789
|
}
|
|
598
790
|
|
|
599
|
-
BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) const
|
|
791
|
+
BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) const noexcept
|
|
600
792
|
{
|
|
601
793
|
return extra_operations::complement_and_test(this->storage(), order);
|
|
602
794
|
}
|
|
603
795
|
|
|
604
|
-
BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) const
|
|
796
|
+
BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) const noexcept
|
|
605
797
|
{
|
|
606
798
|
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
607
799
|
return extra_operations::bit_test_and_set(this->storage(), bit_number, order);
|
|
608
800
|
}
|
|
609
801
|
|
|
610
|
-
BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) const
|
|
802
|
+
BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) const noexcept
|
|
611
803
|
{
|
|
612
804
|
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
613
805
|
return extra_operations::bit_test_and_reset(this->storage(), bit_number, order);
|
|
614
806
|
}
|
|
615
807
|
|
|
616
|
-
BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) const
|
|
808
|
+
BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) const noexcept
|
|
617
809
|
{
|
|
618
810
|
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
619
811
|
return extra_operations::bit_test_and_complement(this->storage(), bit_number, order);
|
|
620
812
|
}
|
|
621
813
|
|
|
622
814
|
// Operators
|
|
623
|
-
BOOST_FORCEINLINE value_type operator++(int) const
|
|
815
|
+
BOOST_FORCEINLINE value_type operator++(int) const noexcept
|
|
624
816
|
{
|
|
625
817
|
return fetch_add(1);
|
|
626
818
|
}
|
|
627
819
|
|
|
628
|
-
BOOST_FORCEINLINE value_type operator++() const
|
|
820
|
+
BOOST_FORCEINLINE value_type operator++() const noexcept
|
|
629
821
|
{
|
|
630
822
|
return add(1);
|
|
631
823
|
}
|
|
632
824
|
|
|
633
|
-
BOOST_FORCEINLINE value_type operator--(int) const
|
|
825
|
+
BOOST_FORCEINLINE value_type operator--(int) const noexcept
|
|
634
826
|
{
|
|
635
827
|
return fetch_sub(1);
|
|
636
828
|
}
|
|
637
829
|
|
|
638
|
-
BOOST_FORCEINLINE value_type operator--() const
|
|
830
|
+
BOOST_FORCEINLINE value_type operator--() const noexcept
|
|
639
831
|
{
|
|
640
832
|
return sub(1);
|
|
641
833
|
}
|
|
642
834
|
|
|
643
|
-
BOOST_FORCEINLINE value_type operator+=(difference_type v) const
|
|
835
|
+
BOOST_FORCEINLINE value_type operator+=(difference_type v) const noexcept
|
|
644
836
|
{
|
|
645
837
|
return add(v);
|
|
646
838
|
}
|
|
647
839
|
|
|
648
|
-
BOOST_FORCEINLINE value_type operator-=(difference_type v) const
|
|
840
|
+
BOOST_FORCEINLINE value_type operator-=(difference_type v) const noexcept
|
|
649
841
|
{
|
|
650
842
|
return sub(v);
|
|
651
843
|
}
|
|
652
844
|
|
|
653
|
-
BOOST_FORCEINLINE value_type operator&=(value_type v) const
|
|
845
|
+
BOOST_FORCEINLINE value_type operator&=(value_type v) const noexcept
|
|
654
846
|
{
|
|
655
847
|
return bitwise_and(v);
|
|
656
848
|
}
|
|
657
849
|
|
|
658
|
-
BOOST_FORCEINLINE value_type operator|=(value_type v) const
|
|
850
|
+
BOOST_FORCEINLINE value_type operator|=(value_type v) const noexcept
|
|
659
851
|
{
|
|
660
852
|
return bitwise_or(v);
|
|
661
853
|
}
|
|
662
854
|
|
|
663
|
-
BOOST_FORCEINLINE value_type operator^=(value_type v) const
|
|
855
|
+
BOOST_FORCEINLINE value_type operator^=(value_type v) const noexcept
|
|
664
856
|
{
|
|
665
857
|
return bitwise_xor(v);
|
|
666
858
|
}
|
|
667
859
|
|
|
668
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const
|
|
860
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const noexcept
|
|
669
861
|
{
|
|
670
862
|
BOOST_ASSERT(order != memory_order_release);
|
|
671
863
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -673,15 +865,44 @@ public:
|
|
|
673
865
|
return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order));
|
|
674
866
|
}
|
|
675
867
|
|
|
676
|
-
|
|
868
|
+
template< typename Clock, typename Duration >
|
|
869
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
870
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const
|
|
871
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
872
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
873
|
+
{
|
|
874
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
875
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
876
|
+
|
|
877
|
+
bool timed_out = false;
|
|
878
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
879
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
template< typename Rep, typename Period >
|
|
883
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
884
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const
|
|
885
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
886
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
887
|
+
{
|
|
888
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
889
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
890
|
+
|
|
891
|
+
bool timed_out = false;
|
|
892
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
893
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
894
|
+
}
|
|
677
895
|
|
|
678
896
|
private:
|
|
679
|
-
BOOST_FORCEINLINE bool
|
|
897
|
+
BOOST_FORCEINLINE bool
|
|
898
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
680
899
|
{
|
|
681
|
-
return core_operations::compare_exchange_strong(
|
|
900
|
+
return core_operations::compare_exchange_strong(
|
|
901
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
682
902
|
}
|
|
683
903
|
|
|
684
|
-
BOOST_FORCEINLINE bool
|
|
904
|
+
BOOST_FORCEINLINE bool
|
|
905
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
685
906
|
{
|
|
686
907
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
687
908
|
const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -689,12 +910,15 @@ private:
|
|
|
689
910
|
return res;
|
|
690
911
|
}
|
|
691
912
|
|
|
692
|
-
BOOST_FORCEINLINE bool
|
|
913
|
+
BOOST_FORCEINLINE bool
|
|
914
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
693
915
|
{
|
|
694
|
-
return core_operations::compare_exchange_weak(
|
|
916
|
+
return core_operations::compare_exchange_weak(
|
|
917
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
695
918
|
}
|
|
696
919
|
|
|
697
|
-
BOOST_FORCEINLINE bool
|
|
920
|
+
BOOST_FORCEINLINE bool
|
|
921
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
698
922
|
{
|
|
699
923
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
700
924
|
const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -709,32 +933,35 @@ class base_atomic_ref< bool, int, Interprocess > :
|
|
|
709
933
|
public base_atomic_ref_common< bool, false, Interprocess >
|
|
710
934
|
{
|
|
711
935
|
private:
|
|
712
|
-
|
|
936
|
+
using base_type = base_atomic_ref_common< bool, false, Interprocess >;
|
|
713
937
|
|
|
714
938
|
public:
|
|
715
|
-
|
|
939
|
+
using value_type = bool;
|
|
716
940
|
|
|
717
941
|
protected:
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
942
|
+
using core_operations = typename base_type::core_operations;
|
|
943
|
+
using wait_operations = typename base_type::wait_operations;
|
|
944
|
+
using storage_type = typename base_type::storage_type;
|
|
945
|
+
using value_arg_type = value_type;
|
|
722
946
|
|
|
723
947
|
private:
|
|
948
|
+
using cxchg_use_bitwise_cast =
|
|
724
949
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
725
|
-
|
|
950
|
+
std::true_type;
|
|
726
951
|
#else
|
|
727
|
-
|
|
952
|
+
std::integral_constant< bool, atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment >;
|
|
728
953
|
#endif
|
|
729
954
|
|
|
730
955
|
public:
|
|
731
|
-
|
|
732
|
-
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v)
|
|
956
|
+
base_atomic_ref(base_atomic_ref const&) = default;
|
|
957
|
+
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v) noexcept : base_type(v)
|
|
733
958
|
{
|
|
734
959
|
}
|
|
735
960
|
|
|
961
|
+
base_atomic_ref& operator=(base_atomic_ref const&) = delete;
|
|
962
|
+
|
|
736
963
|
// Standard methods
|
|
737
|
-
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
964
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
738
965
|
{
|
|
739
966
|
BOOST_ASSERT(order != memory_order_consume);
|
|
740
967
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -743,7 +970,7 @@ public:
|
|
|
743
970
|
core_operations::store(this->storage(), static_cast< storage_type >(v), order);
|
|
744
971
|
}
|
|
745
972
|
|
|
746
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const
|
|
973
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const noexcept
|
|
747
974
|
{
|
|
748
975
|
BOOST_ASSERT(order != memory_order_release);
|
|
749
976
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -751,12 +978,12 @@ public:
|
|
|
751
978
|
return !!core_operations::load(this->storage(), order);
|
|
752
979
|
}
|
|
753
980
|
|
|
754
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
981
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
755
982
|
{
|
|
756
983
|
return !!core_operations::exchange(this->storage(), static_cast< storage_type >(v), order);
|
|
757
984
|
}
|
|
758
985
|
|
|
759
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
986
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
760
987
|
{
|
|
761
988
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
762
989
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -765,12 +992,12 @@ public:
|
|
|
765
992
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
766
993
|
}
|
|
767
994
|
|
|
768
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
995
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
769
996
|
{
|
|
770
997
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
771
998
|
}
|
|
772
999
|
|
|
773
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
1000
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
774
1001
|
{
|
|
775
1002
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
776
1003
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -779,12 +1006,12 @@ public:
|
|
|
779
1006
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
780
1007
|
}
|
|
781
1008
|
|
|
782
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
1009
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
783
1010
|
{
|
|
784
1011
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
785
1012
|
}
|
|
786
1013
|
|
|
787
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const
|
|
1014
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const noexcept
|
|
788
1015
|
{
|
|
789
1016
|
BOOST_ASSERT(order != memory_order_release);
|
|
790
1017
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -792,15 +1019,44 @@ public:
|
|
|
792
1019
|
return !!wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order);
|
|
793
1020
|
}
|
|
794
1021
|
|
|
795
|
-
|
|
1022
|
+
template< typename Clock, typename Duration >
|
|
1023
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1024
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const
|
|
1025
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
1026
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1027
|
+
{
|
|
1028
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1029
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1030
|
+
|
|
1031
|
+
bool timed_out = false;
|
|
1032
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1033
|
+
return wait_result< value_type >(!!new_value, timed_out);
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
template< typename Rep, typename Period >
|
|
1037
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1038
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const
|
|
1039
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
1040
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1041
|
+
{
|
|
1042
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1043
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1044
|
+
|
|
1045
|
+
bool timed_out = false;
|
|
1046
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1047
|
+
return wait_result< value_type >(!!new_value, timed_out);
|
|
1048
|
+
}
|
|
796
1049
|
|
|
797
1050
|
private:
|
|
798
|
-
BOOST_FORCEINLINE bool
|
|
1051
|
+
BOOST_FORCEINLINE bool
|
|
1052
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
799
1053
|
{
|
|
800
|
-
return core_operations::compare_exchange_strong(
|
|
1054
|
+
return core_operations::compare_exchange_strong(
|
|
1055
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
801
1056
|
}
|
|
802
1057
|
|
|
803
|
-
BOOST_FORCEINLINE bool
|
|
1058
|
+
BOOST_FORCEINLINE bool
|
|
1059
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
804
1060
|
{
|
|
805
1061
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
806
1062
|
const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -808,12 +1064,15 @@ private:
|
|
|
808
1064
|
return res;
|
|
809
1065
|
}
|
|
810
1066
|
|
|
811
|
-
BOOST_FORCEINLINE bool
|
|
1067
|
+
BOOST_FORCEINLINE bool
|
|
1068
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
812
1069
|
{
|
|
813
|
-
return core_operations::compare_exchange_weak(
|
|
1070
|
+
return core_operations::compare_exchange_weak(
|
|
1071
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
814
1072
|
}
|
|
815
1073
|
|
|
816
|
-
BOOST_FORCEINLINE bool
|
|
1074
|
+
BOOST_FORCEINLINE bool
|
|
1075
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
817
1076
|
{
|
|
818
1077
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
819
1078
|
const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -831,34 +1090,35 @@ class base_atomic_ref< T, float, Interprocess > :
|
|
|
831
1090
|
public base_atomic_ref_common< T, false, Interprocess >
|
|
832
1091
|
{
|
|
833
1092
|
private:
|
|
834
|
-
|
|
1093
|
+
using base_type = base_atomic_ref_common< T, false, Interprocess >;
|
|
835
1094
|
|
|
836
1095
|
public:
|
|
837
|
-
|
|
838
|
-
|
|
1096
|
+
using value_type = typename base_type::value_type;
|
|
1097
|
+
using difference_type = typename base_type::value_type;
|
|
839
1098
|
|
|
840
1099
|
protected:
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
1100
|
+
using core_operations = typename base_type::core_operations;
|
|
1101
|
+
using wait_operations = typename base_type::wait_operations;
|
|
1102
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
1103
|
+
using fp_operations = atomics::detail::fp_operations< extra_operations, value_type >;
|
|
1104
|
+
using extra_fp_operations = atomics::detail::extra_fp_operations< fp_operations >;
|
|
1105
|
+
using storage_type = typename base_type::storage_type;
|
|
1106
|
+
using value_arg_type = value_type;
|
|
848
1107
|
|
|
849
1108
|
private:
|
|
850
1109
|
#if defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
851
|
-
|
|
1110
|
+
using has_padding_bits = std::integral_constant< bool, atomics::detail::value_size_of< value_type >::value != sizeof(storage_type) >;
|
|
852
1111
|
#endif
|
|
1112
|
+
using cxchg_use_bitwise_cast =
|
|
853
1113
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
854
|
-
|
|
1114
|
+
std::true_type;
|
|
855
1115
|
#else
|
|
856
|
-
|
|
1116
|
+
std::integral_constant< bool, has_padding_bits::value || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment >;
|
|
857
1117
|
#endif
|
|
858
1118
|
|
|
859
1119
|
public:
|
|
860
|
-
|
|
861
|
-
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v)
|
|
1120
|
+
base_atomic_ref(base_atomic_ref const&) = default;
|
|
1121
|
+
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v) noexcept : base_type(v)
|
|
862
1122
|
{
|
|
863
1123
|
// We only need to call clear_padding_bits if the compiler does not implement
|
|
864
1124
|
// BOOST_ATOMIC_DETAIL_CLEAR_PADDING, which is called in the base class constructor.
|
|
@@ -867,7 +1127,9 @@ public:
|
|
|
867
1127
|
#endif // defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
868
1128
|
}
|
|
869
1129
|
|
|
870
|
-
|
|
1130
|
+
base_atomic_ref& operator=(base_atomic_ref const&) = delete;
|
|
1131
|
+
|
|
1132
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
871
1133
|
{
|
|
872
1134
|
BOOST_ASSERT(order != memory_order_consume);
|
|
873
1135
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -876,7 +1138,7 @@ public:
|
|
|
876
1138
|
core_operations::store(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(v), order);
|
|
877
1139
|
}
|
|
878
1140
|
|
|
879
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const
|
|
1141
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const noexcept
|
|
880
1142
|
{
|
|
881
1143
|
BOOST_ASSERT(order != memory_order_release);
|
|
882
1144
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -884,22 +1146,22 @@ public:
|
|
|
884
1146
|
return atomics::detail::bitwise_fp_cast< value_type >(core_operations::load(this->storage(), order));
|
|
885
1147
|
}
|
|
886
1148
|
|
|
887
|
-
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1149
|
+
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
888
1150
|
{
|
|
889
1151
|
return fp_operations::fetch_add(this->storage(), v, order);
|
|
890
1152
|
}
|
|
891
1153
|
|
|
892
|
-
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1154
|
+
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
893
1155
|
{
|
|
894
1156
|
return fp_operations::fetch_sub(this->storage(), v, order);
|
|
895
1157
|
}
|
|
896
1158
|
|
|
897
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
1159
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
898
1160
|
{
|
|
899
1161
|
return atomics::detail::bitwise_fp_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(v), order));
|
|
900
1162
|
}
|
|
901
1163
|
|
|
902
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
1164
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
903
1165
|
{
|
|
904
1166
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
905
1167
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -908,12 +1170,12 @@ public:
|
|
|
908
1170
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
909
1171
|
}
|
|
910
1172
|
|
|
911
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
1173
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
912
1174
|
{
|
|
913
1175
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
914
1176
|
}
|
|
915
1177
|
|
|
916
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
1178
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
917
1179
|
{
|
|
918
1180
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
919
1181
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -922,59 +1184,59 @@ public:
|
|
|
922
1184
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
923
1185
|
}
|
|
924
1186
|
|
|
925
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
1187
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
926
1188
|
{
|
|
927
1189
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
928
1190
|
}
|
|
929
1191
|
|
|
930
1192
|
// Boost.Atomic extensions
|
|
931
|
-
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) const
|
|
1193
|
+
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) const noexcept
|
|
932
1194
|
{
|
|
933
1195
|
return extra_fp_operations::fetch_negate(this->storage(), order);
|
|
934
1196
|
}
|
|
935
1197
|
|
|
936
|
-
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1198
|
+
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
937
1199
|
{
|
|
938
1200
|
return extra_fp_operations::add(this->storage(), v, order);
|
|
939
1201
|
}
|
|
940
1202
|
|
|
941
|
-
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1203
|
+
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
942
1204
|
{
|
|
943
1205
|
return extra_fp_operations::sub(this->storage(), v, order);
|
|
944
1206
|
}
|
|
945
1207
|
|
|
946
|
-
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) const
|
|
1208
|
+
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) const noexcept
|
|
947
1209
|
{
|
|
948
1210
|
return extra_fp_operations::negate(this->storage(), order);
|
|
949
1211
|
}
|
|
950
1212
|
|
|
951
|
-
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1213
|
+
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
952
1214
|
{
|
|
953
1215
|
extra_fp_operations::opaque_add(this->storage(), v, order);
|
|
954
1216
|
}
|
|
955
1217
|
|
|
956
|
-
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1218
|
+
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
957
1219
|
{
|
|
958
1220
|
extra_fp_operations::opaque_sub(this->storage(), v, order);
|
|
959
1221
|
}
|
|
960
1222
|
|
|
961
|
-
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) const
|
|
1223
|
+
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) const noexcept
|
|
962
1224
|
{
|
|
963
1225
|
extra_fp_operations::opaque_negate(this->storage(), order);
|
|
964
1226
|
}
|
|
965
1227
|
|
|
966
1228
|
// Operators
|
|
967
|
-
BOOST_FORCEINLINE value_type operator+=(difference_type v) const
|
|
1229
|
+
BOOST_FORCEINLINE value_type operator+=(difference_type v) const noexcept
|
|
968
1230
|
{
|
|
969
1231
|
return add(v);
|
|
970
1232
|
}
|
|
971
1233
|
|
|
972
|
-
BOOST_FORCEINLINE value_type operator-=(difference_type v) const
|
|
1234
|
+
BOOST_FORCEINLINE value_type operator-=(difference_type v) const noexcept
|
|
973
1235
|
{
|
|
974
1236
|
return sub(v);
|
|
975
1237
|
}
|
|
976
1238
|
|
|
977
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const
|
|
1239
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const noexcept
|
|
978
1240
|
{
|
|
979
1241
|
BOOST_ASSERT(order != memory_order_release);
|
|
980
1242
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -982,42 +1244,76 @@ public:
|
|
|
982
1244
|
return atomics::detail::bitwise_fp_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), order));
|
|
983
1245
|
}
|
|
984
1246
|
|
|
985
|
-
|
|
1247
|
+
template< typename Clock, typename Duration >
|
|
1248
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1249
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const
|
|
1250
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
1251
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1252
|
+
{
|
|
1253
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1254
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1255
|
+
|
|
1256
|
+
bool timed_out = false;
|
|
1257
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1258
|
+
return wait_result< value_type >(atomics::detail::bitwise_fp_cast< value_type >(new_value), timed_out);
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
template< typename Rep, typename Period >
|
|
1262
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1263
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const
|
|
1264
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
1265
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1266
|
+
{
|
|
1267
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1268
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1269
|
+
|
|
1270
|
+
bool timed_out = false;
|
|
1271
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1272
|
+
return wait_result< value_type >(atomics::detail::bitwise_fp_cast< value_type >(new_value), timed_out);
|
|
1273
|
+
}
|
|
986
1274
|
|
|
987
1275
|
private:
|
|
988
1276
|
#if defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
989
|
-
BOOST_FORCEINLINE void clear_padding_bits(
|
|
1277
|
+
BOOST_FORCEINLINE void clear_padding_bits(std::false_type) const noexcept
|
|
990
1278
|
{
|
|
991
1279
|
}
|
|
992
1280
|
|
|
993
|
-
BOOST_FORCEINLINE void clear_padding_bits(
|
|
1281
|
+
BOOST_FORCEINLINE void clear_padding_bits(std::true_type) const noexcept
|
|
994
1282
|
{
|
|
995
1283
|
atomics::detail::clear_tail_padding_bits< atomics::detail::value_size_of< value_type >::value >(this->storage());
|
|
996
1284
|
}
|
|
997
1285
|
#endif // defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
998
1286
|
|
|
999
|
-
BOOST_FORCEINLINE bool
|
|
1287
|
+
BOOST_FORCEINLINE bool
|
|
1288
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
1000
1289
|
{
|
|
1001
|
-
return core_operations::compare_exchange_strong(
|
|
1290
|
+
return core_operations::compare_exchange_strong(
|
|
1291
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1002
1292
|
}
|
|
1003
1293
|
|
|
1004
|
-
BOOST_FORCEINLINE bool
|
|
1294
|
+
BOOST_FORCEINLINE bool
|
|
1295
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
1005
1296
|
{
|
|
1006
1297
|
storage_type old_value = atomics::detail::bitwise_fp_cast< storage_type >(expected);
|
|
1007
|
-
const bool res = core_operations::compare_exchange_strong(
|
|
1298
|
+
const bool res = core_operations::compare_exchange_strong(
|
|
1299
|
+
this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1008
1300
|
expected = atomics::detail::bitwise_fp_cast< value_type >(old_value);
|
|
1009
1301
|
return res;
|
|
1010
1302
|
}
|
|
1011
1303
|
|
|
1012
|
-
BOOST_FORCEINLINE bool
|
|
1304
|
+
BOOST_FORCEINLINE bool
|
|
1305
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
1013
1306
|
{
|
|
1014
|
-
return core_operations::compare_exchange_weak(
|
|
1307
|
+
return core_operations::compare_exchange_weak(
|
|
1308
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1015
1309
|
}
|
|
1016
1310
|
|
|
1017
|
-
BOOST_FORCEINLINE bool
|
|
1311
|
+
BOOST_FORCEINLINE bool
|
|
1312
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
1018
1313
|
{
|
|
1019
1314
|
storage_type old_value = atomics::detail::bitwise_fp_cast< storage_type >(expected);
|
|
1020
|
-
const bool res = core_operations::compare_exchange_weak(
|
|
1315
|
+
const bool res = core_operations::compare_exchange_weak(
|
|
1316
|
+
this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1021
1317
|
expected = atomics::detail::bitwise_fp_cast< value_type >(old_value);
|
|
1022
1318
|
return res;
|
|
1023
1319
|
}
|
|
@@ -1032,34 +1328,37 @@ class base_atomic_ref< T*, void*, Interprocess > :
|
|
|
1032
1328
|
public base_atomic_ref_common< T*, false, Interprocess >
|
|
1033
1329
|
{
|
|
1034
1330
|
private:
|
|
1035
|
-
|
|
1331
|
+
using base_type = base_atomic_ref_common< T*, false, Interprocess >;
|
|
1036
1332
|
|
|
1037
1333
|
public:
|
|
1038
|
-
|
|
1039
|
-
|
|
1334
|
+
using value_type = typename base_type::value_type;
|
|
1335
|
+
using difference_type = std::ptrdiff_t;
|
|
1040
1336
|
|
|
1041
1337
|
protected:
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1338
|
+
using core_operations = typename base_type::core_operations;
|
|
1339
|
+
using wait_operations = typename base_type::wait_operations;
|
|
1340
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
1341
|
+
using storage_type = typename base_type::storage_type;
|
|
1342
|
+
using value_arg_type = value_type;
|
|
1047
1343
|
|
|
1048
1344
|
private:
|
|
1345
|
+
using cxchg_use_bitwise_cast =
|
|
1049
1346
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
1050
|
-
|
|
1347
|
+
std::true_type;
|
|
1051
1348
|
#else
|
|
1052
|
-
|
|
1349
|
+
std::integral_constant< bool, atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment >;
|
|
1053
1350
|
#endif
|
|
1054
1351
|
|
|
1055
1352
|
public:
|
|
1056
|
-
|
|
1057
|
-
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v)
|
|
1353
|
+
base_atomic_ref(base_atomic_ref const&) = default;
|
|
1354
|
+
BOOST_FORCEINLINE explicit base_atomic_ref(value_type& v) noexcept : base_type(v)
|
|
1058
1355
|
{
|
|
1059
1356
|
}
|
|
1060
1357
|
|
|
1358
|
+
base_atomic_ref& operator=(base_atomic_ref const&) = delete;
|
|
1359
|
+
|
|
1061
1360
|
// Standard methods
|
|
1062
|
-
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const
|
|
1361
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1063
1362
|
{
|
|
1064
1363
|
BOOST_ASSERT(order != memory_order_consume);
|
|
1065
1364
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -1068,7 +1367,7 @@ public:
|
|
|
1068
1367
|
core_operations::store(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order);
|
|
1069
1368
|
}
|
|
1070
1369
|
|
|
1071
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const
|
|
1370
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const noexcept
|
|
1072
1371
|
{
|
|
1073
1372
|
BOOST_ASSERT(order != memory_order_release);
|
|
1074
1373
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -1076,22 +1375,22 @@ public:
|
|
|
1076
1375
|
return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
|
|
1077
1376
|
}
|
|
1078
1377
|
|
|
1079
|
-
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1378
|
+
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1080
1379
|
{
|
|
1081
1380
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_add(this->storage(), static_cast< storage_type >(v * sizeof(T)), order));
|
|
1082
1381
|
}
|
|
1083
1382
|
|
|
1084
|
-
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1383
|
+
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1085
1384
|
{
|
|
1086
1385
|
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_sub(this->storage(), static_cast< storage_type >(v * sizeof(T)), order));
|
|
1087
1386
|
}
|
|
1088
1387
|
|
|
1089
|
-
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) const
|
|
1388
|
+
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1090
1389
|
{
|
|
1091
1390
|
return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order));
|
|
1092
1391
|
}
|
|
1093
1392
|
|
|
1094
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
1393
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
1095
1394
|
{
|
|
1096
1395
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
1097
1396
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -1100,12 +1399,12 @@ public:
|
|
|
1100
1399
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
1101
1400
|
}
|
|
1102
1401
|
|
|
1103
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
1402
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
1104
1403
|
{
|
|
1105
1404
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
1106
1405
|
}
|
|
1107
1406
|
|
|
1108
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const
|
|
1407
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) const noexcept
|
|
1109
1408
|
{
|
|
1110
1409
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
1111
1410
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -1114,74 +1413,74 @@ public:
|
|
|
1114
1413
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
1115
1414
|
}
|
|
1116
1415
|
|
|
1117
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const
|
|
1416
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) const noexcept
|
|
1118
1417
|
{
|
|
1119
1418
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
1120
1419
|
}
|
|
1121
1420
|
|
|
1122
1421
|
// Boost.Atomic extensions
|
|
1123
|
-
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1422
|
+
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1124
1423
|
{
|
|
1125
1424
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::add(this->storage(), static_cast< storage_type >(v * sizeof(T)), order));
|
|
1126
1425
|
}
|
|
1127
1426
|
|
|
1128
|
-
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1427
|
+
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1129
1428
|
{
|
|
1130
1429
|
return atomics::detail::bitwise_cast< value_type >(extra_operations::sub(this->storage(), static_cast< storage_type >(v * sizeof(T)), order));
|
|
1131
1430
|
}
|
|
1132
1431
|
|
|
1133
|
-
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1432
|
+
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1134
1433
|
{
|
|
1135
1434
|
extra_operations::opaque_add(this->storage(), static_cast< storage_type >(v * sizeof(T)), order);
|
|
1136
1435
|
}
|
|
1137
1436
|
|
|
1138
|
-
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1437
|
+
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1139
1438
|
{
|
|
1140
1439
|
extra_operations::opaque_sub(this->storage(), static_cast< storage_type >(v * sizeof(T)), order);
|
|
1141
1440
|
}
|
|
1142
1441
|
|
|
1143
|
-
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1442
|
+
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1144
1443
|
{
|
|
1145
1444
|
return extra_operations::add_and_test(this->storage(), static_cast< storage_type >(v * sizeof(T)), order);
|
|
1146
1445
|
}
|
|
1147
1446
|
|
|
1148
|
-
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) const
|
|
1447
|
+
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) const noexcept
|
|
1149
1448
|
{
|
|
1150
1449
|
return extra_operations::sub_and_test(this->storage(), static_cast< storage_type >(v * sizeof(T)), order);
|
|
1151
1450
|
}
|
|
1152
1451
|
|
|
1153
1452
|
// Operators
|
|
1154
|
-
BOOST_FORCEINLINE value_type operator++(int) const
|
|
1453
|
+
BOOST_FORCEINLINE value_type operator++(int) const noexcept
|
|
1155
1454
|
{
|
|
1156
1455
|
return fetch_add(1);
|
|
1157
1456
|
}
|
|
1158
1457
|
|
|
1159
|
-
BOOST_FORCEINLINE value_type operator++() const
|
|
1458
|
+
BOOST_FORCEINLINE value_type operator++() const noexcept
|
|
1160
1459
|
{
|
|
1161
1460
|
return add(1);
|
|
1162
1461
|
}
|
|
1163
1462
|
|
|
1164
|
-
BOOST_FORCEINLINE value_type operator--(int) const
|
|
1463
|
+
BOOST_FORCEINLINE value_type operator--(int) const noexcept
|
|
1165
1464
|
{
|
|
1166
1465
|
return fetch_sub(1);
|
|
1167
1466
|
}
|
|
1168
1467
|
|
|
1169
|
-
BOOST_FORCEINLINE value_type operator--() const
|
|
1468
|
+
BOOST_FORCEINLINE value_type operator--() const noexcept
|
|
1170
1469
|
{
|
|
1171
1470
|
return sub(1);
|
|
1172
1471
|
}
|
|
1173
1472
|
|
|
1174
|
-
BOOST_FORCEINLINE value_type operator+=(difference_type v) const
|
|
1473
|
+
BOOST_FORCEINLINE value_type operator+=(difference_type v) const noexcept
|
|
1175
1474
|
{
|
|
1176
1475
|
return add(v);
|
|
1177
1476
|
}
|
|
1178
1477
|
|
|
1179
|
-
BOOST_FORCEINLINE value_type operator-=(difference_type v) const
|
|
1478
|
+
BOOST_FORCEINLINE value_type operator-=(difference_type v) const noexcept
|
|
1180
1479
|
{
|
|
1181
1480
|
return sub(v);
|
|
1182
1481
|
}
|
|
1183
1482
|
|
|
1184
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const
|
|
1483
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const noexcept
|
|
1185
1484
|
{
|
|
1186
1485
|
BOOST_ASSERT(order != memory_order_release);
|
|
1187
1486
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -1189,31 +1488,65 @@ public:
|
|
|
1189
1488
|
return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), order));
|
|
1190
1489
|
}
|
|
1191
1490
|
|
|
1192
|
-
|
|
1491
|
+
template< typename Clock, typename Duration >
|
|
1492
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1493
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const
|
|
1494
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
1495
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1496
|
+
{
|
|
1497
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1498
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1499
|
+
|
|
1500
|
+
bool timed_out = false;
|
|
1501
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1502
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
template< typename Rep, typename Period >
|
|
1506
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1507
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const
|
|
1508
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
1509
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1510
|
+
{
|
|
1511
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1512
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1513
|
+
|
|
1514
|
+
bool timed_out = false;
|
|
1515
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1516
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
1517
|
+
}
|
|
1193
1518
|
|
|
1194
1519
|
private:
|
|
1195
|
-
BOOST_FORCEINLINE bool
|
|
1520
|
+
BOOST_FORCEINLINE bool
|
|
1521
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
1196
1522
|
{
|
|
1197
|
-
return core_operations::compare_exchange_strong(
|
|
1523
|
+
return core_operations::compare_exchange_strong(
|
|
1524
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
1198
1525
|
}
|
|
1199
1526
|
|
|
1200
|
-
BOOST_FORCEINLINE bool
|
|
1527
|
+
BOOST_FORCEINLINE bool
|
|
1528
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
1201
1529
|
{
|
|
1202
1530
|
storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
|
|
1203
|
-
const bool res = core_operations::compare_exchange_strong(
|
|
1531
|
+
const bool res = core_operations::compare_exchange_strong(
|
|
1532
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
1204
1533
|
expected = atomics::detail::bitwise_cast< value_type >(old_value);
|
|
1205
1534
|
return res;
|
|
1206
1535
|
}
|
|
1207
1536
|
|
|
1208
|
-
BOOST_FORCEINLINE bool
|
|
1537
|
+
BOOST_FORCEINLINE bool
|
|
1538
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) const noexcept
|
|
1209
1539
|
{
|
|
1210
|
-
return core_operations::compare_exchange_weak(
|
|
1540
|
+
return core_operations::compare_exchange_weak(
|
|
1541
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
1211
1542
|
}
|
|
1212
1543
|
|
|
1213
|
-
BOOST_FORCEINLINE bool
|
|
1544
|
+
BOOST_FORCEINLINE bool
|
|
1545
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) const noexcept
|
|
1214
1546
|
{
|
|
1215
1547
|
storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
|
|
1216
|
-
const bool res = core_operations::compare_exchange_weak(
|
|
1548
|
+
const bool res = core_operations::compare_exchange_weak(
|
|
1549
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
1217
1550
|
expected = atomics::detail::bitwise_cast< value_type >(old_value);
|
|
1218
1551
|
return res;
|
|
1219
1552
|
}
|