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
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Copyright (c) 2011 Helge Bahmann
|
|
7
7
|
* Copyright (c) 2013 Tim Blechmann
|
|
8
|
-
* Copyright (c) 2014-
|
|
8
|
+
* Copyright (c) 2014-2025 Andrey Semashev
|
|
9
9
|
*/
|
|
10
10
|
/*!
|
|
11
11
|
* \file atomic/detail/atomic_impl.hpp
|
|
@@ -17,8 +17,12 @@
|
|
|
17
17
|
#define BOOST_ATOMIC_DETAIL_ATOMIC_IMPL_HPP_INCLUDED_
|
|
18
18
|
|
|
19
19
|
#include <cstddef>
|
|
20
|
+
#include <chrono>
|
|
21
|
+
#include <utility>
|
|
22
|
+
#include <type_traits>
|
|
20
23
|
#include <boost/assert.hpp>
|
|
21
24
|
#include <boost/memory_order.hpp>
|
|
25
|
+
#include <boost/atomic/wait_result.hpp>
|
|
22
26
|
#include <boost/atomic/detail/config.hpp>
|
|
23
27
|
#include <boost/atomic/detail/intptr.hpp>
|
|
24
28
|
#include <boost/atomic/detail/storage_traits.hpp>
|
|
@@ -30,11 +34,8 @@
|
|
|
30
34
|
#include <boost/atomic/detail/memory_order_utils.hpp>
|
|
31
35
|
#include <boost/atomic/detail/aligned_variable.hpp>
|
|
32
36
|
#include <boost/atomic/detail/type_traits/is_signed.hpp>
|
|
33
|
-
#include <boost/atomic/detail/type_traits/is_nothrow_default_constructible.hpp>
|
|
34
|
-
#include <boost/atomic/detail/type_traits/is_trivially_default_constructible.hpp>
|
|
35
37
|
#include <boost/atomic/detail/type_traits/alignment_of.hpp>
|
|
36
|
-
#include <boost/atomic/detail/type_traits/
|
|
37
|
-
#include <boost/atomic/detail/type_traits/integral_constant.hpp>
|
|
38
|
+
#include <boost/atomic/detail/type_traits/is_trivially_default_constructible.hpp>
|
|
38
39
|
#if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
|
|
39
40
|
#include <boost/atomic/detail/bitwise_fp_cast.hpp>
|
|
40
41
|
#include <boost/atomic/detail/fp_operations.hpp>
|
|
@@ -46,8 +47,8 @@
|
|
|
46
47
|
#pragma once
|
|
47
48
|
#endif
|
|
48
49
|
|
|
49
|
-
#if !defined(
|
|
50
|
-
#define BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR
|
|
50
|
+
#if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_CONSTEXPR_BITWISE_CAST)
|
|
51
|
+
#define BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR constexpr
|
|
51
52
|
#else
|
|
52
53
|
#define BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR
|
|
53
54
|
#endif
|
|
@@ -65,63 +66,65 @@ template< typename T, bool Signed, bool Interprocess >
|
|
|
65
66
|
class base_atomic_common
|
|
66
67
|
{
|
|
67
68
|
public:
|
|
68
|
-
|
|
69
|
+
using value_type = T;
|
|
69
70
|
|
|
70
71
|
protected:
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
using core_operations = atomics::detail::core_operations< storage_size_of< value_type >::value, Signed, Interprocess >;
|
|
73
|
+
using wait_operations = atomics::detail::wait_operations< core_operations >;
|
|
74
|
+
using value_arg_type = typename std::conditional< sizeof(value_type) <= sizeof(void*), value_type, value_type const& >::type;
|
|
75
|
+
using storage_type = typename core_operations::storage_type;
|
|
75
76
|
|
|
76
77
|
protected:
|
|
77
|
-
static
|
|
78
|
+
static constexpr std::size_t storage_alignment =
|
|
79
|
+
atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment ?
|
|
80
|
+
core_operations::storage_alignment : atomics::detail::alignment_of< value_type >::value;
|
|
78
81
|
|
|
79
82
|
public:
|
|
80
|
-
static
|
|
81
|
-
static
|
|
83
|
+
static constexpr bool is_always_lock_free = core_operations::is_always_lock_free;
|
|
84
|
+
static constexpr bool always_has_native_wait_notify = wait_operations::always_has_native_wait_notify;
|
|
82
85
|
|
|
83
86
|
protected:
|
|
84
87
|
BOOST_ATOMIC_DETAIL_ALIGNED_VAR_TPL(storage_alignment, storage_type, m_storage);
|
|
85
88
|
|
|
86
89
|
public:
|
|
87
|
-
BOOST_FORCEINLINE
|
|
90
|
+
BOOST_FORCEINLINE constexpr base_atomic_common() noexcept : m_storage()
|
|
88
91
|
{
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
BOOST_FORCEINLINE
|
|
94
|
+
BOOST_FORCEINLINE constexpr explicit base_atomic_common(storage_type v) noexcept : m_storage(v)
|
|
92
95
|
{
|
|
93
96
|
}
|
|
94
97
|
|
|
95
|
-
BOOST_FORCEINLINE value_type& value()
|
|
96
|
-
BOOST_FORCEINLINE value_type volatile& value() volatile
|
|
97
|
-
BOOST_FORCEINLINE value_type const& value() const
|
|
98
|
-
BOOST_FORCEINLINE value_type const volatile& value() const volatile
|
|
98
|
+
BOOST_FORCEINLINE value_type& value() noexcept { return *reinterpret_cast< value_type* >(&m_storage); }
|
|
99
|
+
BOOST_FORCEINLINE value_type volatile& value() volatile noexcept { return *reinterpret_cast< volatile value_type* >(&m_storage); }
|
|
100
|
+
BOOST_FORCEINLINE value_type const& value() const noexcept { return *reinterpret_cast< const value_type* >(&m_storage); }
|
|
101
|
+
BOOST_FORCEINLINE value_type const volatile& value() const volatile noexcept { return *reinterpret_cast< const volatile value_type* >(&m_storage); }
|
|
99
102
|
|
|
100
103
|
protected:
|
|
101
|
-
BOOST_FORCEINLINE storage_type& storage()
|
|
102
|
-
BOOST_FORCEINLINE storage_type volatile& storage() volatile
|
|
103
|
-
BOOST_FORCEINLINE storage_type const& storage() const
|
|
104
|
-
BOOST_FORCEINLINE storage_type const volatile& storage() const volatile
|
|
104
|
+
BOOST_FORCEINLINE storage_type& storage() noexcept { return m_storage; }
|
|
105
|
+
BOOST_FORCEINLINE storage_type volatile& storage() volatile noexcept { return m_storage; }
|
|
106
|
+
BOOST_FORCEINLINE storage_type const& storage() const noexcept { return m_storage; }
|
|
107
|
+
BOOST_FORCEINLINE storage_type const volatile& storage() const volatile noexcept { return m_storage; }
|
|
105
108
|
|
|
106
109
|
public:
|
|
107
|
-
BOOST_FORCEINLINE bool is_lock_free() const volatile
|
|
110
|
+
BOOST_FORCEINLINE bool is_lock_free() const volatile noexcept
|
|
108
111
|
{
|
|
109
112
|
// C++17 requires all instances of atomic<> return a value consistent with is_always_lock_free here.
|
|
110
113
|
// Boost.Atomic also enforces the required alignment of the atomic storage, so we can always return is_always_lock_free.
|
|
111
114
|
return is_always_lock_free;
|
|
112
115
|
}
|
|
113
116
|
|
|
114
|
-
BOOST_FORCEINLINE bool has_native_wait_notify() const volatile
|
|
117
|
+
BOOST_FORCEINLINE bool has_native_wait_notify() const volatile noexcept
|
|
115
118
|
{
|
|
116
119
|
return wait_operations::has_native_wait_notify(this->storage());
|
|
117
120
|
}
|
|
118
121
|
|
|
119
|
-
BOOST_FORCEINLINE void notify_one() volatile
|
|
122
|
+
BOOST_FORCEINLINE void notify_one() volatile noexcept
|
|
120
123
|
{
|
|
121
124
|
wait_operations::notify_one(this->storage());
|
|
122
125
|
}
|
|
123
126
|
|
|
124
|
-
BOOST_FORCEINLINE void notify_all() volatile
|
|
127
|
+
BOOST_FORCEINLINE void notify_all() volatile noexcept
|
|
125
128
|
{
|
|
126
129
|
wait_operations::notify_all(this->storage());
|
|
127
130
|
}
|
|
@@ -129,9 +132,9 @@ public:
|
|
|
129
132
|
|
|
130
133
|
#if defined(BOOST_NO_CXX17_INLINE_VARIABLES)
|
|
131
134
|
template< typename T, bool Signed, bool Interprocess >
|
|
132
|
-
|
|
135
|
+
constexpr bool base_atomic_common< T, Signed, Interprocess >::is_always_lock_free;
|
|
133
136
|
template< typename T, bool Signed, bool Interprocess >
|
|
134
|
-
|
|
137
|
+
constexpr bool base_atomic_common< T, Signed, Interprocess >::always_has_native_wait_notify;
|
|
135
138
|
#endif
|
|
136
139
|
|
|
137
140
|
|
|
@@ -143,15 +146,15 @@ class base_atomic_generic< T, Interprocess, true > :
|
|
|
143
146
|
public base_atomic_common< T, false, Interprocess >
|
|
144
147
|
{
|
|
145
148
|
private:
|
|
146
|
-
|
|
149
|
+
using base_type = base_atomic_common< T, false, Interprocess >;
|
|
147
150
|
|
|
148
151
|
protected:
|
|
149
|
-
|
|
150
|
-
|
|
152
|
+
using storage_type = typename base_type::storage_type;
|
|
153
|
+
using value_arg_type = typename base_type::value_arg_type;
|
|
151
154
|
|
|
152
155
|
public:
|
|
153
|
-
|
|
154
|
-
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v)
|
|
156
|
+
base_atomic_generic() = default;
|
|
157
|
+
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v) noexcept :
|
|
155
158
|
base_type(atomics::detail::bitwise_cast< storage_type >(v))
|
|
156
159
|
{
|
|
157
160
|
}
|
|
@@ -162,17 +165,17 @@ class base_atomic_generic< T, Interprocess, false > :
|
|
|
162
165
|
public base_atomic_common< T, false, Interprocess >
|
|
163
166
|
{
|
|
164
167
|
private:
|
|
165
|
-
|
|
168
|
+
using base_type = base_atomic_common< T, false, Interprocess >;
|
|
166
169
|
|
|
167
170
|
public:
|
|
168
|
-
|
|
171
|
+
using value_type = typename base_type::value_type;
|
|
169
172
|
|
|
170
173
|
protected:
|
|
171
|
-
|
|
172
|
-
|
|
174
|
+
using storage_type = typename base_type::storage_type;
|
|
175
|
+
using value_arg_type = typename base_type::value_arg_type;
|
|
173
176
|
|
|
174
177
|
public:
|
|
175
|
-
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v = value_type())
|
|
178
|
+
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v = value_type()) noexcept :
|
|
176
179
|
base_type(atomics::detail::bitwise_cast< storage_type >(v))
|
|
177
180
|
{
|
|
178
181
|
}
|
|
@@ -188,34 +191,41 @@ class base_atomic< T, void, Interprocess > :
|
|
|
188
191
|
public base_atomic_generic< T, Interprocess >
|
|
189
192
|
{
|
|
190
193
|
private:
|
|
191
|
-
|
|
194
|
+
using base_type = base_atomic_generic< T, Interprocess >;
|
|
192
195
|
|
|
193
196
|
public:
|
|
194
|
-
|
|
197
|
+
using value_type = typename base_type::value_type;
|
|
195
198
|
|
|
196
199
|
protected:
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
200
|
+
using core_operations = typename base_type::core_operations;
|
|
201
|
+
using wait_operations = typename base_type::wait_operations;
|
|
202
|
+
using storage_type = typename base_type::storage_type;
|
|
203
|
+
using value_arg_type = typename base_type::value_arg_type;
|
|
201
204
|
|
|
202
205
|
private:
|
|
206
|
+
using cxchg_use_bitwise_cast =
|
|
203
207
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
204
|
-
|
|
208
|
+
std::true_type;
|
|
205
209
|
#else
|
|
206
|
-
|
|
210
|
+
std::integral_constant<
|
|
211
|
+
bool,
|
|
212
|
+
sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
|
|
213
|
+
>;
|
|
207
214
|
#endif
|
|
208
215
|
|
|
209
216
|
public:
|
|
210
|
-
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR base_atomic()
|
|
217
|
+
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR base_atomic() noexcept(std::is_nothrow_default_constructible< value_type >::value) : base_type()
|
|
211
218
|
{
|
|
212
219
|
}
|
|
213
220
|
|
|
214
|
-
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v)
|
|
221
|
+
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) noexcept : base_type(v)
|
|
215
222
|
{
|
|
216
223
|
}
|
|
217
224
|
|
|
218
|
-
|
|
225
|
+
base_atomic(base_atomic const&) = delete;
|
|
226
|
+
base_atomic& operator=(base_atomic const&) = delete;
|
|
227
|
+
|
|
228
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
219
229
|
{
|
|
220
230
|
BOOST_ASSERT(order != memory_order_consume);
|
|
221
231
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -224,7 +234,7 @@ public:
|
|
|
224
234
|
core_operations::store(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order);
|
|
225
235
|
}
|
|
226
236
|
|
|
227
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile
|
|
237
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
228
238
|
{
|
|
229
239
|
BOOST_ASSERT(order != memory_order_release);
|
|
230
240
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -232,12 +242,12 @@ public:
|
|
|
232
242
|
return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
|
|
233
243
|
}
|
|
234
244
|
|
|
235
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
245
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
236
246
|
{
|
|
237
247
|
return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order));
|
|
238
248
|
}
|
|
239
249
|
|
|
240
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
250
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
241
251
|
{
|
|
242
252
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
243
253
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -246,12 +256,12 @@ public:
|
|
|
246
256
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
247
257
|
}
|
|
248
258
|
|
|
249
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
259
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
250
260
|
{
|
|
251
261
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
252
262
|
}
|
|
253
263
|
|
|
254
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
264
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
255
265
|
{
|
|
256
266
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
257
267
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -260,12 +270,12 @@ public:
|
|
|
260
270
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
261
271
|
}
|
|
262
272
|
|
|
263
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
273
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
264
274
|
{
|
|
265
275
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
266
276
|
}
|
|
267
277
|
|
|
268
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile
|
|
278
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
269
279
|
{
|
|
270
280
|
BOOST_ASSERT(order != memory_order_release);
|
|
271
281
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -273,32 +283,65 @@ public:
|
|
|
273
283
|
return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), order));
|
|
274
284
|
}
|
|
275
285
|
|
|
276
|
-
|
|
277
|
-
|
|
286
|
+
template< typename Clock, typename Duration >
|
|
287
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
288
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
289
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
290
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
291
|
+
{
|
|
292
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
293
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
294
|
+
|
|
295
|
+
bool timed_out = false;
|
|
296
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
297
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
template< typename Rep, typename Period >
|
|
301
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
302
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
303
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
304
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
305
|
+
{
|
|
306
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
307
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
308
|
+
|
|
309
|
+
bool timed_out = false;
|
|
310
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
311
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
312
|
+
}
|
|
278
313
|
|
|
279
314
|
private:
|
|
280
|
-
BOOST_FORCEINLINE bool
|
|
315
|
+
BOOST_FORCEINLINE bool
|
|
316
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
281
317
|
{
|
|
282
|
-
return core_operations::compare_exchange_strong(
|
|
318
|
+
return core_operations::compare_exchange_strong(
|
|
319
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
283
320
|
}
|
|
284
321
|
|
|
285
|
-
BOOST_FORCEINLINE bool
|
|
322
|
+
BOOST_FORCEINLINE bool
|
|
323
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
286
324
|
{
|
|
287
325
|
storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
|
|
288
|
-
const bool res = core_operations::compare_exchange_strong(
|
|
326
|
+
const bool res = core_operations::compare_exchange_strong(
|
|
327
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
289
328
|
expected = atomics::detail::bitwise_cast< value_type >(old_value);
|
|
290
329
|
return res;
|
|
291
330
|
}
|
|
292
331
|
|
|
293
|
-
BOOST_FORCEINLINE bool
|
|
332
|
+
BOOST_FORCEINLINE bool
|
|
333
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
294
334
|
{
|
|
295
|
-
return core_operations::compare_exchange_weak(
|
|
335
|
+
return core_operations::compare_exchange_weak(
|
|
336
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
296
337
|
}
|
|
297
338
|
|
|
298
|
-
BOOST_FORCEINLINE bool
|
|
339
|
+
BOOST_FORCEINLINE bool
|
|
340
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
299
341
|
{
|
|
300
342
|
storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
|
|
301
|
-
const bool res = core_operations::compare_exchange_weak(
|
|
343
|
+
const bool res = core_operations::compare_exchange_weak(
|
|
344
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
|
|
302
345
|
expected = atomics::detail::bitwise_cast< value_type >(old_value);
|
|
303
346
|
return res;
|
|
304
347
|
}
|
|
@@ -311,31 +354,39 @@ class base_atomic< T, const int, Interprocess > :
|
|
|
311
354
|
public base_atomic_common< T, false, Interprocess >
|
|
312
355
|
{
|
|
313
356
|
private:
|
|
314
|
-
|
|
357
|
+
using base_type = base_atomic_common< T, false, Interprocess >;
|
|
315
358
|
|
|
316
359
|
public:
|
|
317
|
-
|
|
360
|
+
using value_type = typename base_type::value_type;
|
|
318
361
|
|
|
319
362
|
protected:
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
363
|
+
using core_operations = typename base_type::core_operations;
|
|
364
|
+
using wait_operations = typename base_type::wait_operations;
|
|
365
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
366
|
+
using storage_type = typename base_type::storage_type;
|
|
367
|
+
using value_arg_type = typename base_type::value_arg_type;
|
|
324
368
|
|
|
325
369
|
private:
|
|
370
|
+
using cxchg_use_bitwise_cast =
|
|
326
371
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
327
|
-
|
|
372
|
+
std::true_type;
|
|
328
373
|
#else
|
|
329
|
-
|
|
374
|
+
std::integral_constant<
|
|
375
|
+
bool,
|
|
376
|
+
sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
|
|
377
|
+
>;
|
|
330
378
|
#endif
|
|
331
379
|
|
|
332
380
|
public:
|
|
333
|
-
|
|
334
|
-
BOOST_FORCEINLINE
|
|
381
|
+
base_atomic() = default;
|
|
382
|
+
BOOST_FORCEINLINE constexpr explicit base_atomic(value_arg_type v) noexcept : base_type(static_cast< storage_type >(v))
|
|
335
383
|
{
|
|
336
384
|
}
|
|
337
385
|
|
|
338
|
-
|
|
386
|
+
base_atomic(base_atomic const&) = delete;
|
|
387
|
+
base_atomic& operator=(base_atomic const&) = delete;
|
|
388
|
+
|
|
389
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
339
390
|
{
|
|
340
391
|
BOOST_ASSERT(order != memory_order_consume);
|
|
341
392
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -344,7 +395,7 @@ public:
|
|
|
344
395
|
core_operations::store(this->storage(), static_cast< storage_type >(v), order);
|
|
345
396
|
}
|
|
346
397
|
|
|
347
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile
|
|
398
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
348
399
|
{
|
|
349
400
|
BOOST_ASSERT(order != memory_order_release);
|
|
350
401
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -352,12 +403,12 @@ public:
|
|
|
352
403
|
return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
|
|
353
404
|
}
|
|
354
405
|
|
|
355
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
406
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
356
407
|
{
|
|
357
408
|
return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), static_cast< storage_type >(v), order));
|
|
358
409
|
}
|
|
359
410
|
|
|
360
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
411
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
361
412
|
{
|
|
362
413
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
363
414
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -366,12 +417,12 @@ public:
|
|
|
366
417
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
367
418
|
}
|
|
368
419
|
|
|
369
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
420
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
370
421
|
{
|
|
371
422
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
372
423
|
}
|
|
373
424
|
|
|
374
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
425
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
375
426
|
{
|
|
376
427
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
377
428
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -380,12 +431,125 @@ public:
|
|
|
380
431
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
381
432
|
}
|
|
382
433
|
|
|
383
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
434
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
384
435
|
{
|
|
385
436
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
386
437
|
}
|
|
387
438
|
|
|
388
|
-
BOOST_FORCEINLINE value_type
|
|
439
|
+
BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
440
|
+
{
|
|
441
|
+
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_and(this->storage(), static_cast< storage_type >(v), order));
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
445
|
+
{
|
|
446
|
+
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_or(this->storage(), static_cast< storage_type >(v), order));
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
450
|
+
{
|
|
451
|
+
return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
455
|
+
{
|
|
456
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::fetch_complement(this->storage(), order));
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
460
|
+
{
|
|
461
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_and(this->storage(), static_cast< storage_type >(v), order));
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
465
|
+
{
|
|
466
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_or(this->storage(), static_cast< storage_type >(v), order));
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
470
|
+
{
|
|
471
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
475
|
+
{
|
|
476
|
+
return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_complement(this->storage(), order));
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
480
|
+
{
|
|
481
|
+
extra_operations::opaque_and(this->storage(), static_cast< storage_type >(v), order);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
485
|
+
{
|
|
486
|
+
extra_operations::opaque_or(this->storage(), static_cast< storage_type >(v), order);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
490
|
+
{
|
|
491
|
+
extra_operations::opaque_xor(this->storage(), static_cast< storage_type >(v), order);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
495
|
+
{
|
|
496
|
+
extra_operations::opaque_complement(this->storage(), order);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
500
|
+
{
|
|
501
|
+
return extra_operations::and_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
505
|
+
{
|
|
506
|
+
return extra_operations::or_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
510
|
+
{
|
|
511
|
+
return extra_operations::xor_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
515
|
+
{
|
|
516
|
+
return extra_operations::complement_and_test(this->storage(), order);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
520
|
+
{
|
|
521
|
+
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
522
|
+
return extra_operations::bit_test_and_set(this->storage(), bit_number, order);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
526
|
+
{
|
|
527
|
+
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
528
|
+
return extra_operations::bit_test_and_reset(this->storage(), bit_number, order);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
532
|
+
{
|
|
533
|
+
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
534
|
+
return extra_operations::bit_test_and_complement(this->storage(), bit_number, order);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
BOOST_FORCEINLINE value_type operator&=(value_type v) volatile noexcept
|
|
538
|
+
{
|
|
539
|
+
return bitwise_and(v);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
BOOST_FORCEINLINE value_type operator|=(value_type v) volatile noexcept
|
|
543
|
+
{
|
|
544
|
+
return bitwise_or(v);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
BOOST_FORCEINLINE value_type operator^=(value_type v) volatile noexcept
|
|
548
|
+
{
|
|
549
|
+
return bitwise_xor(v);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
389
553
|
{
|
|
390
554
|
BOOST_ASSERT(order != memory_order_release);
|
|
391
555
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -393,16 +557,44 @@ public:
|
|
|
393
557
|
return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order));
|
|
394
558
|
}
|
|
395
559
|
|
|
396
|
-
|
|
397
|
-
|
|
560
|
+
template< typename Clock, typename Duration >
|
|
561
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
562
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
563
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
564
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
565
|
+
{
|
|
566
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
567
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
568
|
+
|
|
569
|
+
bool timed_out = false;
|
|
570
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
571
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
template< typename Rep, typename Period >
|
|
575
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
576
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
577
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
578
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
579
|
+
{
|
|
580
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
581
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
582
|
+
|
|
583
|
+
bool timed_out = false;
|
|
584
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
585
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
586
|
+
}
|
|
398
587
|
|
|
399
588
|
private:
|
|
400
|
-
BOOST_FORCEINLINE bool
|
|
589
|
+
BOOST_FORCEINLINE bool
|
|
590
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
401
591
|
{
|
|
402
|
-
return core_operations::compare_exchange_strong(
|
|
592
|
+
return core_operations::compare_exchange_strong(
|
|
593
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
403
594
|
}
|
|
404
595
|
|
|
405
|
-
BOOST_FORCEINLINE bool
|
|
596
|
+
BOOST_FORCEINLINE bool
|
|
597
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
406
598
|
{
|
|
407
599
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
408
600
|
const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -410,12 +602,15 @@ private:
|
|
|
410
602
|
return res;
|
|
411
603
|
}
|
|
412
604
|
|
|
413
|
-
BOOST_FORCEINLINE bool
|
|
605
|
+
BOOST_FORCEINLINE bool
|
|
606
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
414
607
|
{
|
|
415
|
-
return core_operations::compare_exchange_weak(
|
|
608
|
+
return core_operations::compare_exchange_weak(
|
|
609
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
416
610
|
}
|
|
417
611
|
|
|
418
|
-
BOOST_FORCEINLINE bool
|
|
612
|
+
BOOST_FORCEINLINE bool
|
|
613
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
419
614
|
{
|
|
420
615
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
421
616
|
const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -431,32 +626,39 @@ class base_atomic< T, int, Interprocess > :
|
|
|
431
626
|
public base_atomic_common< T, atomics::detail::is_signed< T >::value, Interprocess >
|
|
432
627
|
{
|
|
433
628
|
private:
|
|
434
|
-
|
|
629
|
+
using base_type = base_atomic_common< T, atomics::detail::is_signed< T >::value, Interprocess >;
|
|
435
630
|
|
|
436
631
|
public:
|
|
437
|
-
|
|
438
|
-
|
|
632
|
+
using value_type = typename base_type::value_type;
|
|
633
|
+
using difference_type = value_type;
|
|
439
634
|
|
|
440
635
|
protected:
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
636
|
+
using core_operations = typename base_type::core_operations;
|
|
637
|
+
using wait_operations = typename base_type::wait_operations;
|
|
638
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
639
|
+
using storage_type = typename base_type::storage_type;
|
|
640
|
+
using value_arg_type = value_type;
|
|
446
641
|
|
|
447
642
|
private:
|
|
643
|
+
using cxchg_use_bitwise_cast =
|
|
448
644
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
449
|
-
|
|
645
|
+
std::true_type;
|
|
450
646
|
#else
|
|
451
|
-
|
|
647
|
+
std::integral_constant<
|
|
648
|
+
bool,
|
|
649
|
+
sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
|
|
650
|
+
>;
|
|
452
651
|
#endif
|
|
453
652
|
|
|
454
653
|
public:
|
|
455
|
-
|
|
456
|
-
BOOST_FORCEINLINE
|
|
654
|
+
base_atomic() = default;
|
|
655
|
+
BOOST_FORCEINLINE constexpr explicit base_atomic(value_arg_type v) noexcept : base_type(static_cast< storage_type >(v)) {}
|
|
656
|
+
|
|
657
|
+
base_atomic(base_atomic const&) = delete;
|
|
658
|
+
base_atomic& operator=(base_atomic const&) = delete;
|
|
457
659
|
|
|
458
660
|
// Standard methods
|
|
459
|
-
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
661
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
460
662
|
{
|
|
461
663
|
BOOST_ASSERT(order != memory_order_consume);
|
|
462
664
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -465,7 +667,7 @@ public:
|
|
|
465
667
|
core_operations::store(this->storage(), static_cast< storage_type >(v), order);
|
|
466
668
|
}
|
|
467
669
|
|
|
468
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile
|
|
670
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
469
671
|
{
|
|
470
672
|
BOOST_ASSERT(order != memory_order_release);
|
|
471
673
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -473,22 +675,22 @@ public:
|
|
|
473
675
|
return atomics::detail::integral_truncate< value_type >(core_operations::load(this->storage(), order));
|
|
474
676
|
}
|
|
475
677
|
|
|
476
|
-
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
678
|
+
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
477
679
|
{
|
|
478
680
|
return atomics::detail::integral_truncate< value_type >(core_operations::fetch_add(this->storage(), static_cast< storage_type >(v), order));
|
|
479
681
|
}
|
|
480
682
|
|
|
481
|
-
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
683
|
+
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
482
684
|
{
|
|
483
685
|
return atomics::detail::integral_truncate< value_type >(core_operations::fetch_sub(this->storage(), static_cast< storage_type >(v), order));
|
|
484
686
|
}
|
|
485
687
|
|
|
486
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
688
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
487
689
|
{
|
|
488
690
|
return atomics::detail::integral_truncate< value_type >(core_operations::exchange(this->storage(), static_cast< storage_type >(v), order));
|
|
489
691
|
}
|
|
490
692
|
|
|
491
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
693
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
492
694
|
{
|
|
493
695
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
494
696
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -497,12 +699,12 @@ public:
|
|
|
497
699
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
498
700
|
}
|
|
499
701
|
|
|
500
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
702
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
501
703
|
{
|
|
502
704
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
503
705
|
}
|
|
504
706
|
|
|
505
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
707
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
506
708
|
{
|
|
507
709
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
508
710
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -511,207 +713,207 @@ public:
|
|
|
511
713
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
512
714
|
}
|
|
513
715
|
|
|
514
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
716
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
515
717
|
{
|
|
516
718
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
517
719
|
}
|
|
518
720
|
|
|
519
|
-
BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
721
|
+
BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
520
722
|
{
|
|
521
723
|
return atomics::detail::integral_truncate< value_type >(core_operations::fetch_and(this->storage(), static_cast< storage_type >(v), order));
|
|
522
724
|
}
|
|
523
725
|
|
|
524
|
-
BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
726
|
+
BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
525
727
|
{
|
|
526
728
|
return atomics::detail::integral_truncate< value_type >(core_operations::fetch_or(this->storage(), static_cast< storage_type >(v), order));
|
|
527
729
|
}
|
|
528
730
|
|
|
529
|
-
BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
731
|
+
BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
530
732
|
{
|
|
531
733
|
return atomics::detail::integral_truncate< value_type >(core_operations::fetch_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
532
734
|
}
|
|
533
735
|
|
|
534
736
|
// Boost.Atomic extensions
|
|
535
|
-
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile
|
|
737
|
+
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
536
738
|
{
|
|
537
739
|
return atomics::detail::integral_truncate< value_type >(extra_operations::fetch_negate(this->storage(), order));
|
|
538
740
|
}
|
|
539
741
|
|
|
540
|
-
BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) volatile
|
|
742
|
+
BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
541
743
|
{
|
|
542
744
|
return atomics::detail::integral_truncate< value_type >(extra_operations::fetch_complement(this->storage(), order));
|
|
543
745
|
}
|
|
544
746
|
|
|
545
|
-
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
747
|
+
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
546
748
|
{
|
|
547
749
|
return atomics::detail::integral_truncate< value_type >(extra_operations::add(this->storage(), static_cast< storage_type >(v), order));
|
|
548
750
|
}
|
|
549
751
|
|
|
550
|
-
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
752
|
+
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
551
753
|
{
|
|
552
754
|
return atomics::detail::integral_truncate< value_type >(extra_operations::sub(this->storage(), static_cast< storage_type >(v), order));
|
|
553
755
|
}
|
|
554
756
|
|
|
555
|
-
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile
|
|
757
|
+
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
556
758
|
{
|
|
557
759
|
return atomics::detail::integral_truncate< value_type >(extra_operations::negate(this->storage(), order));
|
|
558
760
|
}
|
|
559
761
|
|
|
560
|
-
BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
762
|
+
BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
561
763
|
{
|
|
562
764
|
return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_and(this->storage(), static_cast< storage_type >(v), order));
|
|
563
765
|
}
|
|
564
766
|
|
|
565
|
-
BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
767
|
+
BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
566
768
|
{
|
|
567
769
|
return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_or(this->storage(), static_cast< storage_type >(v), order));
|
|
568
770
|
}
|
|
569
771
|
|
|
570
|
-
BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
772
|
+
BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
571
773
|
{
|
|
572
774
|
return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_xor(this->storage(), static_cast< storage_type >(v), order));
|
|
573
775
|
}
|
|
574
776
|
|
|
575
|
-
BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) volatile
|
|
777
|
+
BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
576
778
|
{
|
|
577
779
|
return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_complement(this->storage(), order));
|
|
578
780
|
}
|
|
579
781
|
|
|
580
|
-
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
782
|
+
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
581
783
|
{
|
|
582
784
|
extra_operations::opaque_add(this->storage(), static_cast< storage_type >(v), order);
|
|
583
785
|
}
|
|
584
786
|
|
|
585
|
-
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
787
|
+
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
586
788
|
{
|
|
587
789
|
extra_operations::opaque_sub(this->storage(), static_cast< storage_type >(v), order);
|
|
588
790
|
}
|
|
589
791
|
|
|
590
|
-
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile
|
|
792
|
+
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
591
793
|
{
|
|
592
794
|
extra_operations::opaque_negate(this->storage(), order);
|
|
593
795
|
}
|
|
594
796
|
|
|
595
|
-
BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
797
|
+
BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
596
798
|
{
|
|
597
799
|
extra_operations::opaque_and(this->storage(), static_cast< storage_type >(v), order);
|
|
598
800
|
}
|
|
599
801
|
|
|
600
|
-
BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
802
|
+
BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
601
803
|
{
|
|
602
804
|
extra_operations::opaque_or(this->storage(), static_cast< storage_type >(v), order);
|
|
603
805
|
}
|
|
604
806
|
|
|
605
|
-
BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
807
|
+
BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
606
808
|
{
|
|
607
809
|
extra_operations::opaque_xor(this->storage(), static_cast< storage_type >(v), order);
|
|
608
810
|
}
|
|
609
811
|
|
|
610
|
-
BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) volatile
|
|
812
|
+
BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
611
813
|
{
|
|
612
814
|
extra_operations::opaque_complement(this->storage(), order);
|
|
613
815
|
}
|
|
614
816
|
|
|
615
|
-
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
817
|
+
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
616
818
|
{
|
|
617
819
|
return extra_operations::add_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
618
820
|
}
|
|
619
821
|
|
|
620
|
-
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
822
|
+
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
621
823
|
{
|
|
622
824
|
return extra_operations::sub_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
623
825
|
}
|
|
624
826
|
|
|
625
|
-
BOOST_FORCEINLINE bool negate_and_test(memory_order order = memory_order_seq_cst) volatile
|
|
827
|
+
BOOST_FORCEINLINE bool negate_and_test(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
626
828
|
{
|
|
627
829
|
return extra_operations::negate_and_test(this->storage(), order);
|
|
628
830
|
}
|
|
629
831
|
|
|
630
|
-
BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
832
|
+
BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
631
833
|
{
|
|
632
834
|
return extra_operations::and_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
633
835
|
}
|
|
634
836
|
|
|
635
|
-
BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
837
|
+
BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
636
838
|
{
|
|
637
839
|
return extra_operations::or_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
638
840
|
}
|
|
639
841
|
|
|
640
|
-
BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
842
|
+
BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
641
843
|
{
|
|
642
844
|
return extra_operations::xor_and_test(this->storage(), static_cast< storage_type >(v), order);
|
|
643
845
|
}
|
|
644
846
|
|
|
645
|
-
BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) volatile
|
|
847
|
+
BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
646
848
|
{
|
|
647
849
|
return extra_operations::complement_and_test(this->storage(), order);
|
|
648
850
|
}
|
|
649
851
|
|
|
650
|
-
BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile
|
|
852
|
+
BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
651
853
|
{
|
|
652
854
|
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
653
855
|
return extra_operations::bit_test_and_set(this->storage(), bit_number, order);
|
|
654
856
|
}
|
|
655
857
|
|
|
656
|
-
BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile
|
|
858
|
+
BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
657
859
|
{
|
|
658
860
|
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
659
861
|
return extra_operations::bit_test_and_reset(this->storage(), bit_number, order);
|
|
660
862
|
}
|
|
661
863
|
|
|
662
|
-
BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile
|
|
864
|
+
BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
663
865
|
{
|
|
664
866
|
BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
|
|
665
867
|
return extra_operations::bit_test_and_complement(this->storage(), bit_number, order);
|
|
666
868
|
}
|
|
667
869
|
|
|
668
870
|
// Operators
|
|
669
|
-
BOOST_FORCEINLINE value_type operator++(int) volatile
|
|
871
|
+
BOOST_FORCEINLINE value_type operator++(int) volatile noexcept
|
|
670
872
|
{
|
|
671
873
|
return fetch_add(1);
|
|
672
874
|
}
|
|
673
875
|
|
|
674
|
-
BOOST_FORCEINLINE value_type operator++() volatile
|
|
876
|
+
BOOST_FORCEINLINE value_type operator++() volatile noexcept
|
|
675
877
|
{
|
|
676
878
|
return add(1);
|
|
677
879
|
}
|
|
678
880
|
|
|
679
|
-
BOOST_FORCEINLINE value_type operator--(int) volatile
|
|
881
|
+
BOOST_FORCEINLINE value_type operator--(int) volatile noexcept
|
|
680
882
|
{
|
|
681
883
|
return fetch_sub(1);
|
|
682
884
|
}
|
|
683
885
|
|
|
684
|
-
BOOST_FORCEINLINE value_type operator--() volatile
|
|
886
|
+
BOOST_FORCEINLINE value_type operator--() volatile noexcept
|
|
685
887
|
{
|
|
686
888
|
return sub(1);
|
|
687
889
|
}
|
|
688
890
|
|
|
689
|
-
BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile
|
|
891
|
+
BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile noexcept
|
|
690
892
|
{
|
|
691
893
|
return add(v);
|
|
692
894
|
}
|
|
693
895
|
|
|
694
|
-
BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile
|
|
896
|
+
BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile noexcept
|
|
695
897
|
{
|
|
696
898
|
return sub(v);
|
|
697
899
|
}
|
|
698
900
|
|
|
699
|
-
BOOST_FORCEINLINE value_type operator&=(value_type v) volatile
|
|
901
|
+
BOOST_FORCEINLINE value_type operator&=(value_type v) volatile noexcept
|
|
700
902
|
{
|
|
701
903
|
return bitwise_and(v);
|
|
702
904
|
}
|
|
703
905
|
|
|
704
|
-
BOOST_FORCEINLINE value_type operator|=(value_type v) volatile
|
|
906
|
+
BOOST_FORCEINLINE value_type operator|=(value_type v) volatile noexcept
|
|
705
907
|
{
|
|
706
908
|
return bitwise_or(v);
|
|
707
909
|
}
|
|
708
910
|
|
|
709
|
-
BOOST_FORCEINLINE value_type operator^=(value_type v) volatile
|
|
911
|
+
BOOST_FORCEINLINE value_type operator^=(value_type v) volatile noexcept
|
|
710
912
|
{
|
|
711
913
|
return bitwise_xor(v);
|
|
712
914
|
}
|
|
713
915
|
|
|
714
|
-
BOOST_FORCEINLINE value_type wait(
|
|
916
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
715
917
|
{
|
|
716
918
|
BOOST_ASSERT(order != memory_order_release);
|
|
717
919
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -719,16 +921,44 @@ public:
|
|
|
719
921
|
return atomics::detail::integral_truncate< value_type >(wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order));
|
|
720
922
|
}
|
|
721
923
|
|
|
722
|
-
|
|
723
|
-
|
|
924
|
+
template< typename Clock, typename Duration >
|
|
925
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
926
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
927
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
928
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
929
|
+
{
|
|
930
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
931
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
932
|
+
|
|
933
|
+
bool timed_out = false;
|
|
934
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
935
|
+
return wait_result< value_type >(atomics::detail::integral_truncate< value_type >(new_value), timed_out);
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
template< typename Rep, typename Period >
|
|
939
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
940
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
941
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
942
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
943
|
+
{
|
|
944
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
945
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
946
|
+
|
|
947
|
+
bool timed_out = false;
|
|
948
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
949
|
+
return wait_result< value_type >(atomics::detail::integral_truncate< value_type >(new_value), timed_out);
|
|
950
|
+
}
|
|
724
951
|
|
|
725
952
|
private:
|
|
726
|
-
BOOST_FORCEINLINE bool
|
|
953
|
+
BOOST_FORCEINLINE bool
|
|
954
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
727
955
|
{
|
|
728
|
-
return core_operations::compare_exchange_strong(
|
|
956
|
+
return core_operations::compare_exchange_strong(
|
|
957
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
729
958
|
}
|
|
730
959
|
|
|
731
|
-
BOOST_FORCEINLINE bool
|
|
960
|
+
BOOST_FORCEINLINE bool
|
|
961
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
732
962
|
{
|
|
733
963
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
734
964
|
const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -736,12 +966,15 @@ private:
|
|
|
736
966
|
return res;
|
|
737
967
|
}
|
|
738
968
|
|
|
739
|
-
BOOST_FORCEINLINE bool
|
|
969
|
+
BOOST_FORCEINLINE bool
|
|
970
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
740
971
|
{
|
|
741
|
-
return core_operations::compare_exchange_weak(
|
|
972
|
+
return core_operations::compare_exchange_weak(
|
|
973
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
742
974
|
}
|
|
743
975
|
|
|
744
|
-
BOOST_FORCEINLINE bool
|
|
976
|
+
BOOST_FORCEINLINE bool
|
|
977
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
745
978
|
{
|
|
746
979
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
747
980
|
const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -756,30 +989,37 @@ class base_atomic< bool, int, Interprocess > :
|
|
|
756
989
|
public base_atomic_common< bool, false, Interprocess >
|
|
757
990
|
{
|
|
758
991
|
private:
|
|
759
|
-
|
|
992
|
+
using base_type = base_atomic_common< bool, false, Interprocess >;
|
|
760
993
|
|
|
761
994
|
public:
|
|
762
|
-
|
|
995
|
+
using value_type = typename base_type::value_type;
|
|
763
996
|
|
|
764
997
|
protected:
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
998
|
+
using core_operations = typename base_type::core_operations;
|
|
999
|
+
using wait_operations = typename base_type::wait_operations;
|
|
1000
|
+
using storage_type = typename base_type::storage_type;
|
|
1001
|
+
using value_arg_type = value_type;
|
|
769
1002
|
|
|
770
1003
|
private:
|
|
1004
|
+
using cxchg_use_bitwise_cast =
|
|
771
1005
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
772
|
-
|
|
1006
|
+
std::true_type;
|
|
773
1007
|
#else
|
|
774
|
-
|
|
1008
|
+
std::integral_constant<
|
|
1009
|
+
bool,
|
|
1010
|
+
sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
|
|
1011
|
+
>;
|
|
775
1012
|
#endif
|
|
776
1013
|
|
|
777
1014
|
public:
|
|
778
|
-
|
|
779
|
-
BOOST_FORCEINLINE
|
|
1015
|
+
base_atomic() = default;
|
|
1016
|
+
BOOST_FORCEINLINE constexpr explicit base_atomic(value_arg_type v) noexcept : base_type(static_cast< storage_type >(v)) {}
|
|
1017
|
+
|
|
1018
|
+
base_atomic(base_atomic const&) = delete;
|
|
1019
|
+
base_atomic& operator=(base_atomic const&) = delete;
|
|
780
1020
|
|
|
781
1021
|
// Standard methods
|
|
782
|
-
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1022
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
783
1023
|
{
|
|
784
1024
|
BOOST_ASSERT(order != memory_order_consume);
|
|
785
1025
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -788,7 +1028,7 @@ public:
|
|
|
788
1028
|
core_operations::store(this->storage(), static_cast< storage_type >(v), order);
|
|
789
1029
|
}
|
|
790
1030
|
|
|
791
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile
|
|
1031
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
792
1032
|
{
|
|
793
1033
|
BOOST_ASSERT(order != memory_order_release);
|
|
794
1034
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -796,12 +1036,12 @@ public:
|
|
|
796
1036
|
return !!core_operations::load(this->storage(), order);
|
|
797
1037
|
}
|
|
798
1038
|
|
|
799
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1039
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
800
1040
|
{
|
|
801
1041
|
return !!core_operations::exchange(this->storage(), static_cast< storage_type >(v), order);
|
|
802
1042
|
}
|
|
803
1043
|
|
|
804
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
1044
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
805
1045
|
{
|
|
806
1046
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
807
1047
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -810,12 +1050,12 @@ public:
|
|
|
810
1050
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
811
1051
|
}
|
|
812
1052
|
|
|
813
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
1053
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
814
1054
|
{
|
|
815
1055
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
816
1056
|
}
|
|
817
1057
|
|
|
818
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
1058
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
819
1059
|
{
|
|
820
1060
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
821
1061
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -824,12 +1064,12 @@ public:
|
|
|
824
1064
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
825
1065
|
}
|
|
826
1066
|
|
|
827
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
1067
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
828
1068
|
{
|
|
829
1069
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
830
1070
|
}
|
|
831
1071
|
|
|
832
|
-
BOOST_FORCEINLINE value_type wait(
|
|
1072
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
833
1073
|
{
|
|
834
1074
|
BOOST_ASSERT(order != memory_order_release);
|
|
835
1075
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -837,16 +1077,44 @@ public:
|
|
|
837
1077
|
return !!wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order);
|
|
838
1078
|
}
|
|
839
1079
|
|
|
840
|
-
|
|
841
|
-
|
|
1080
|
+
template< typename Clock, typename Duration >
|
|
1081
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1082
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
1083
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
1084
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1085
|
+
{
|
|
1086
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1087
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1088
|
+
|
|
1089
|
+
bool timed_out = false;
|
|
1090
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1091
|
+
return wait_result< value_type >(!!new_value, timed_out);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
template< typename Rep, typename Period >
|
|
1095
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1096
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
1097
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
1098
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1099
|
+
{
|
|
1100
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1101
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1102
|
+
|
|
1103
|
+
bool timed_out = false;
|
|
1104
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1105
|
+
return wait_result< value_type >(!!new_value, timed_out);
|
|
1106
|
+
}
|
|
842
1107
|
|
|
843
1108
|
private:
|
|
844
|
-
BOOST_FORCEINLINE bool
|
|
1109
|
+
BOOST_FORCEINLINE bool
|
|
1110
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
845
1111
|
{
|
|
846
|
-
return core_operations::compare_exchange_strong(
|
|
1112
|
+
return core_operations::compare_exchange_strong(
|
|
1113
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
847
1114
|
}
|
|
848
1115
|
|
|
849
|
-
BOOST_FORCEINLINE bool
|
|
1116
|
+
BOOST_FORCEINLINE bool
|
|
1117
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
850
1118
|
{
|
|
851
1119
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
852
1120
|
const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -854,12 +1122,15 @@ private:
|
|
|
854
1122
|
return res;
|
|
855
1123
|
}
|
|
856
1124
|
|
|
857
|
-
BOOST_FORCEINLINE bool
|
|
1125
|
+
BOOST_FORCEINLINE bool
|
|
1126
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
858
1127
|
{
|
|
859
|
-
return core_operations::compare_exchange_weak(
|
|
1128
|
+
return core_operations::compare_exchange_weak(
|
|
1129
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
|
|
860
1130
|
}
|
|
861
1131
|
|
|
862
|
-
BOOST_FORCEINLINE bool
|
|
1132
|
+
BOOST_FORCEINLINE bool
|
|
1133
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
863
1134
|
{
|
|
864
1135
|
storage_type old_value = static_cast< storage_type >(expected);
|
|
865
1136
|
const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
|
@@ -877,38 +1148,44 @@ class base_atomic< T, float, Interprocess > :
|
|
|
877
1148
|
public base_atomic_common< T, false, Interprocess >
|
|
878
1149
|
{
|
|
879
1150
|
private:
|
|
880
|
-
|
|
1151
|
+
using base_type = base_atomic_common< T, false, Interprocess >;
|
|
881
1152
|
|
|
882
1153
|
public:
|
|
883
|
-
|
|
884
|
-
|
|
1154
|
+
using value_type = typename base_type::value_type;
|
|
1155
|
+
using difference_type = value_type;
|
|
885
1156
|
|
|
886
1157
|
protected:
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
1158
|
+
using core_operations = typename base_type::core_operations;
|
|
1159
|
+
using wait_operations = typename base_type::wait_operations;
|
|
1160
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
1161
|
+
using fp_operations = atomics::detail::fp_operations< extra_operations, value_type >;
|
|
1162
|
+
using extra_fp_operations = atomics::detail::extra_fp_operations< fp_operations >;
|
|
1163
|
+
using storage_type = typename base_type::storage_type;
|
|
1164
|
+
using value_arg_type = value_type;
|
|
894
1165
|
|
|
895
1166
|
private:
|
|
1167
|
+
using cxchg_use_bitwise_cast =
|
|
896
1168
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
897
|
-
|
|
1169
|
+
std::true_type;
|
|
898
1170
|
#else
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
1171
|
+
std::integral_constant<
|
|
1172
|
+
bool,
|
|
1173
|
+
atomics::detail::value_size_of< value_type >::value != sizeof(storage_type) ||
|
|
1174
|
+
atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
|
|
1175
|
+
>;
|
|
902
1176
|
#endif
|
|
903
1177
|
|
|
904
1178
|
public:
|
|
905
|
-
|
|
906
|
-
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v)
|
|
1179
|
+
base_atomic() = default;
|
|
1180
|
+
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) noexcept :
|
|
907
1181
|
base_type(atomics::detail::bitwise_fp_cast< storage_type >(v))
|
|
908
1182
|
{
|
|
909
1183
|
}
|
|
910
1184
|
|
|
911
|
-
|
|
1185
|
+
base_atomic(base_atomic const&) = delete;
|
|
1186
|
+
base_atomic& operator=(base_atomic const&) = delete;
|
|
1187
|
+
|
|
1188
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
912
1189
|
{
|
|
913
1190
|
BOOST_ASSERT(order != memory_order_consume);
|
|
914
1191
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -917,7 +1194,7 @@ public:
|
|
|
917
1194
|
core_operations::store(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(v), order);
|
|
918
1195
|
}
|
|
919
1196
|
|
|
920
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile
|
|
1197
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
921
1198
|
{
|
|
922
1199
|
BOOST_ASSERT(order != memory_order_release);
|
|
923
1200
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -925,22 +1202,22 @@ public:
|
|
|
925
1202
|
return atomics::detail::bitwise_fp_cast< value_type >(core_operations::load(this->storage(), order));
|
|
926
1203
|
}
|
|
927
1204
|
|
|
928
|
-
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1205
|
+
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
929
1206
|
{
|
|
930
1207
|
return fp_operations::fetch_add(this->storage(), v, order);
|
|
931
1208
|
}
|
|
932
1209
|
|
|
933
|
-
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1210
|
+
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
934
1211
|
{
|
|
935
1212
|
return fp_operations::fetch_sub(this->storage(), v, order);
|
|
936
1213
|
}
|
|
937
1214
|
|
|
938
|
-
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1215
|
+
BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
939
1216
|
{
|
|
940
1217
|
return atomics::detail::bitwise_fp_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(v), order));
|
|
941
1218
|
}
|
|
942
1219
|
|
|
943
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
1220
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
944
1221
|
{
|
|
945
1222
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
946
1223
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -949,12 +1226,12 @@ public:
|
|
|
949
1226
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
950
1227
|
}
|
|
951
1228
|
|
|
952
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
1229
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
953
1230
|
{
|
|
954
1231
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
955
1232
|
}
|
|
956
1233
|
|
|
957
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
1234
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
958
1235
|
{
|
|
959
1236
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
960
1237
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -963,59 +1240,59 @@ public:
|
|
|
963
1240
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
964
1241
|
}
|
|
965
1242
|
|
|
966
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
1243
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
967
1244
|
{
|
|
968
1245
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
969
1246
|
}
|
|
970
1247
|
|
|
971
1248
|
// Boost.Atomic extensions
|
|
972
|
-
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile
|
|
1249
|
+
BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
973
1250
|
{
|
|
974
1251
|
return extra_fp_operations::fetch_negate(this->storage(), order);
|
|
975
1252
|
}
|
|
976
1253
|
|
|
977
|
-
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1254
|
+
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
978
1255
|
{
|
|
979
1256
|
return extra_fp_operations::add(this->storage(), v, order);
|
|
980
1257
|
}
|
|
981
1258
|
|
|
982
|
-
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1259
|
+
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
983
1260
|
{
|
|
984
1261
|
return extra_fp_operations::sub(this->storage(), v, order);
|
|
985
1262
|
}
|
|
986
1263
|
|
|
987
|
-
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile
|
|
1264
|
+
BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
988
1265
|
{
|
|
989
1266
|
return extra_fp_operations::negate(this->storage(), order);
|
|
990
1267
|
}
|
|
991
1268
|
|
|
992
|
-
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1269
|
+
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
993
1270
|
{
|
|
994
1271
|
extra_fp_operations::opaque_add(this->storage(), v, order);
|
|
995
1272
|
}
|
|
996
1273
|
|
|
997
|
-
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1274
|
+
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
998
1275
|
{
|
|
999
1276
|
extra_fp_operations::opaque_sub(this->storage(), v, order);
|
|
1000
1277
|
}
|
|
1001
1278
|
|
|
1002
|
-
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile
|
|
1279
|
+
BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1003
1280
|
{
|
|
1004
1281
|
extra_fp_operations::opaque_negate(this->storage(), order);
|
|
1005
1282
|
}
|
|
1006
1283
|
|
|
1007
1284
|
// Operators
|
|
1008
|
-
BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile
|
|
1285
|
+
BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile noexcept
|
|
1009
1286
|
{
|
|
1010
1287
|
return add(v);
|
|
1011
1288
|
}
|
|
1012
1289
|
|
|
1013
|
-
BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile
|
|
1290
|
+
BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile noexcept
|
|
1014
1291
|
{
|
|
1015
1292
|
return sub(v);
|
|
1016
1293
|
}
|
|
1017
1294
|
|
|
1018
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile
|
|
1295
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
1019
1296
|
{
|
|
1020
1297
|
BOOST_ASSERT(order != memory_order_release);
|
|
1021
1298
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -1023,32 +1300,65 @@ public:
|
|
|
1023
1300
|
return atomics::detail::bitwise_fp_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), order));
|
|
1024
1301
|
}
|
|
1025
1302
|
|
|
1026
|
-
|
|
1027
|
-
|
|
1303
|
+
template< typename Clock, typename Duration >
|
|
1304
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1305
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
1306
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
1307
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1308
|
+
{
|
|
1309
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1310
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1311
|
+
|
|
1312
|
+
bool timed_out = false;
|
|
1313
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1314
|
+
return wait_result< value_type >(atomics::detail::bitwise_fp_cast< value_type >(new_value), timed_out);
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
template< typename Rep, typename Period >
|
|
1318
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1319
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
1320
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
1321
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1322
|
+
{
|
|
1323
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1324
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1325
|
+
|
|
1326
|
+
bool timed_out = false;
|
|
1327
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), timeout, order, timed_out);
|
|
1328
|
+
return wait_result< value_type >(atomics::detail::bitwise_fp_cast< value_type >(new_value), timed_out);
|
|
1329
|
+
}
|
|
1028
1330
|
|
|
1029
1331
|
private:
|
|
1030
|
-
BOOST_FORCEINLINE bool
|
|
1332
|
+
BOOST_FORCEINLINE bool
|
|
1333
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
1031
1334
|
{
|
|
1032
|
-
return core_operations::compare_exchange_strong(
|
|
1335
|
+
return core_operations::compare_exchange_strong(
|
|
1336
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1033
1337
|
}
|
|
1034
1338
|
|
|
1035
|
-
BOOST_FORCEINLINE bool
|
|
1339
|
+
BOOST_FORCEINLINE bool
|
|
1340
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
1036
1341
|
{
|
|
1037
1342
|
storage_type old_value = atomics::detail::bitwise_fp_cast< storage_type >(expected);
|
|
1038
|
-
const bool res = core_operations::compare_exchange_strong(
|
|
1343
|
+
const bool res = core_operations::compare_exchange_strong(
|
|
1344
|
+
this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1039
1345
|
expected = atomics::detail::bitwise_fp_cast< value_type >(old_value);
|
|
1040
1346
|
return res;
|
|
1041
1347
|
}
|
|
1042
1348
|
|
|
1043
|
-
BOOST_FORCEINLINE bool
|
|
1349
|
+
BOOST_FORCEINLINE bool
|
|
1350
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
1044
1351
|
{
|
|
1045
|
-
return core_operations::compare_exchange_weak(
|
|
1352
|
+
return core_operations::compare_exchange_weak(
|
|
1353
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1046
1354
|
}
|
|
1047
1355
|
|
|
1048
|
-
BOOST_FORCEINLINE bool
|
|
1356
|
+
BOOST_FORCEINLINE bool
|
|
1357
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
1049
1358
|
{
|
|
1050
1359
|
storage_type old_value = atomics::detail::bitwise_fp_cast< storage_type >(expected);
|
|
1051
|
-
const bool res = core_operations::compare_exchange_weak(
|
|
1360
|
+
const bool res = core_operations::compare_exchange_weak(
|
|
1361
|
+
this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
|
|
1052
1362
|
expected = atomics::detail::bitwise_fp_cast< value_type >(old_value);
|
|
1053
1363
|
return res;
|
|
1054
1364
|
}
|
|
@@ -1063,39 +1373,46 @@ class base_atomic< T*, void*, Interprocess > :
|
|
|
1063
1373
|
public base_atomic_common< T*, false, Interprocess >
|
|
1064
1374
|
{
|
|
1065
1375
|
private:
|
|
1066
|
-
|
|
1376
|
+
using base_type = base_atomic_common< T*, false, Interprocess >;
|
|
1067
1377
|
|
|
1068
1378
|
public:
|
|
1069
|
-
|
|
1070
|
-
|
|
1379
|
+
using value_type = typename base_type::value_type;
|
|
1380
|
+
using difference_type = std::ptrdiff_t;
|
|
1071
1381
|
|
|
1072
1382
|
protected:
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1383
|
+
using core_operations = typename base_type::core_operations;
|
|
1384
|
+
using wait_operations = typename base_type::wait_operations;
|
|
1385
|
+
using extra_operations = atomics::detail::extra_operations< core_operations >;
|
|
1386
|
+
using storage_type = typename base_type::storage_type;
|
|
1387
|
+
using value_arg_type = value_type;
|
|
1078
1388
|
|
|
1079
1389
|
private:
|
|
1390
|
+
using cxchg_use_bitwise_cast =
|
|
1080
1391
|
#if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
|
|
1081
|
-
|
|
1392
|
+
std::true_type;
|
|
1082
1393
|
#else
|
|
1083
|
-
|
|
1394
|
+
std::integral_constant<
|
|
1395
|
+
bool,
|
|
1396
|
+
sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
|
|
1397
|
+
>;
|
|
1084
1398
|
#endif
|
|
1085
1399
|
|
|
1086
1400
|
// uintptr_storage_type is the minimal storage type that is enough to store pointers. The actual storage_type theoretically may be larger,
|
|
1087
1401
|
// if the target architecture only supports atomic ops on larger data. Typically, though, they are the same type.
|
|
1088
|
-
|
|
1402
|
+
using uintptr_storage_type = atomics::detail::uintptr_t;
|
|
1089
1403
|
|
|
1090
1404
|
public:
|
|
1091
|
-
|
|
1092
|
-
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v)
|
|
1405
|
+
base_atomic() = default;
|
|
1406
|
+
BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) noexcept :
|
|
1093
1407
|
base_type(atomics::detail::bitwise_cast< uintptr_storage_type >(v))
|
|
1094
1408
|
{
|
|
1095
1409
|
}
|
|
1096
1410
|
|
|
1411
|
+
base_atomic(base_atomic const&) = delete;
|
|
1412
|
+
base_atomic& operator=(base_atomic const&) = delete;
|
|
1413
|
+
|
|
1097
1414
|
// Standard methods
|
|
1098
|
-
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1415
|
+
BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1099
1416
|
{
|
|
1100
1417
|
BOOST_ASSERT(order != memory_order_consume);
|
|
1101
1418
|
BOOST_ASSERT(order != memory_order_acquire);
|
|
@@ -1104,7 +1421,7 @@ public:
|
|
|
1104
1421
|
core_operations::store(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(v), order);
|
|
1105
1422
|
}
|
|
1106
1423
|
|
|
1107
|
-
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile
|
|
1424
|
+
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
1108
1425
|
{
|
|
1109
1426
|
BOOST_ASSERT(order != memory_order_release);
|
|
1110
1427
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
@@ -1112,22 +1429,25 @@ public:
|
|
|
1112
1429
|
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(core_operations::load(this->storage(), order)));
|
|
1113
1430
|
}
|
|
1114
1431
|
|
|
1115
|
-
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1432
|
+
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1116
1433
|
{
|
|
1117
|
-
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1434
|
+
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1435
|
+
core_operations::fetch_add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
|
|
1118
1436
|
}
|
|
1119
1437
|
|
|
1120
|
-
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1438
|
+
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1121
1439
|
{
|
|
1122
|
-
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1440
|
+
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1441
|
+
core_operations::fetch_sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
|
|
1123
1442
|
}
|
|
1124
1443
|
|
|
1125
|
-
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1444
|
+
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1126
1445
|
{
|
|
1127
|
-
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1446
|
+
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1447
|
+
core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(v), order)));
|
|
1128
1448
|
}
|
|
1129
1449
|
|
|
1130
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
1450
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
1131
1451
|
{
|
|
1132
1452
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
1133
1453
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -1136,12 +1456,12 @@ public:
|
|
|
1136
1456
|
return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
1137
1457
|
}
|
|
1138
1458
|
|
|
1139
|
-
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
1459
|
+
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1140
1460
|
{
|
|
1141
1461
|
return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
1142
1462
|
}
|
|
1143
1463
|
|
|
1144
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile
|
|
1464
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
|
|
1145
1465
|
{
|
|
1146
1466
|
BOOST_ASSERT(failure_order != memory_order_release);
|
|
1147
1467
|
BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
|
@@ -1150,107 +1470,143 @@ public:
|
|
|
1150
1470
|
return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
|
|
1151
1471
|
}
|
|
1152
1472
|
|
|
1153
|
-
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile
|
|
1473
|
+
BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1154
1474
|
{
|
|
1155
1475
|
return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
|
1156
1476
|
}
|
|
1157
1477
|
|
|
1158
1478
|
// Boost.Atomic extensions
|
|
1159
|
-
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1479
|
+
BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1160
1480
|
{
|
|
1161
|
-
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1481
|
+
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1482
|
+
extra_operations::add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
|
|
1162
1483
|
}
|
|
1163
1484
|
|
|
1164
|
-
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1485
|
+
BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1165
1486
|
{
|
|
1166
|
-
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1487
|
+
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1488
|
+
extra_operations::sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
|
|
1167
1489
|
}
|
|
1168
1490
|
|
|
1169
|
-
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1491
|
+
BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1170
1492
|
{
|
|
1171
1493
|
extra_operations::opaque_add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
|
|
1172
1494
|
}
|
|
1173
1495
|
|
|
1174
|
-
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1496
|
+
BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1175
1497
|
{
|
|
1176
1498
|
extra_operations::opaque_sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
|
|
1177
1499
|
}
|
|
1178
1500
|
|
|
1179
|
-
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1501
|
+
BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1180
1502
|
{
|
|
1181
1503
|
return extra_operations::add_and_test(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
|
|
1182
1504
|
}
|
|
1183
1505
|
|
|
1184
|
-
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile
|
|
1506
|
+
BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
|
|
1185
1507
|
{
|
|
1186
1508
|
return extra_operations::sub_and_test(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
|
|
1187
1509
|
}
|
|
1188
1510
|
|
|
1189
1511
|
// Operators
|
|
1190
|
-
BOOST_FORCEINLINE value_type operator++(int) volatile
|
|
1512
|
+
BOOST_FORCEINLINE value_type operator++(int) volatile noexcept
|
|
1191
1513
|
{
|
|
1192
1514
|
return fetch_add(1);
|
|
1193
1515
|
}
|
|
1194
1516
|
|
|
1195
|
-
BOOST_FORCEINLINE value_type operator++() volatile
|
|
1517
|
+
BOOST_FORCEINLINE value_type operator++() volatile noexcept
|
|
1196
1518
|
{
|
|
1197
1519
|
return add(1);
|
|
1198
1520
|
}
|
|
1199
1521
|
|
|
1200
|
-
BOOST_FORCEINLINE value_type operator--(int) volatile
|
|
1522
|
+
BOOST_FORCEINLINE value_type operator--(int) volatile noexcept
|
|
1201
1523
|
{
|
|
1202
1524
|
return fetch_sub(1);
|
|
1203
1525
|
}
|
|
1204
1526
|
|
|
1205
|
-
BOOST_FORCEINLINE value_type operator--() volatile
|
|
1527
|
+
BOOST_FORCEINLINE value_type operator--() volatile noexcept
|
|
1206
1528
|
{
|
|
1207
1529
|
return sub(1);
|
|
1208
1530
|
}
|
|
1209
1531
|
|
|
1210
|
-
BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile
|
|
1532
|
+
BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile noexcept
|
|
1211
1533
|
{
|
|
1212
1534
|
return add(v);
|
|
1213
1535
|
}
|
|
1214
1536
|
|
|
1215
|
-
BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile
|
|
1537
|
+
BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile noexcept
|
|
1216
1538
|
{
|
|
1217
1539
|
return sub(v);
|
|
1218
1540
|
}
|
|
1219
1541
|
|
|
1220
|
-
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile
|
|
1542
|
+
BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
|
|
1221
1543
|
{
|
|
1222
1544
|
BOOST_ASSERT(order != memory_order_release);
|
|
1223
1545
|
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1224
1546
|
|
|
1225
|
-
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1547
|
+
return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
|
|
1548
|
+
wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), order)));
|
|
1226
1549
|
}
|
|
1227
1550
|
|
|
1228
|
-
|
|
1229
|
-
|
|
1551
|
+
template< typename Clock, typename Duration >
|
|
1552
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1553
|
+
wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
1554
|
+
noexcept(noexcept(wait_operations::wait_until(
|
|
1555
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1556
|
+
{
|
|
1557
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1558
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1559
|
+
|
|
1560
|
+
bool timed_out = false;
|
|
1561
|
+
storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), timeout, order, timed_out);
|
|
1562
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
template< typename Rep, typename Period >
|
|
1566
|
+
BOOST_FORCEINLINE wait_result< value_type >
|
|
1567
|
+
wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
|
|
1568
|
+
noexcept(noexcept(wait_operations::wait_for(
|
|
1569
|
+
std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
|
|
1570
|
+
{
|
|
1571
|
+
BOOST_ASSERT(order != memory_order_release);
|
|
1572
|
+
BOOST_ASSERT(order != memory_order_acq_rel);
|
|
1573
|
+
|
|
1574
|
+
bool timed_out = false;
|
|
1575
|
+
storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), timeout, order, timed_out);
|
|
1576
|
+
return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
|
|
1577
|
+
}
|
|
1230
1578
|
|
|
1231
1579
|
private:
|
|
1232
|
-
BOOST_FORCEINLINE bool
|
|
1580
|
+
BOOST_FORCEINLINE bool
|
|
1581
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
1233
1582
|
{
|
|
1234
|
-
return core_operations::compare_exchange_strong(
|
|
1583
|
+
return core_operations::compare_exchange_strong(
|
|
1584
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
|
|
1235
1585
|
}
|
|
1236
1586
|
|
|
1237
|
-
BOOST_FORCEINLINE bool
|
|
1587
|
+
BOOST_FORCEINLINE bool
|
|
1588
|
+
compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
1238
1589
|
{
|
|
1239
1590
|
storage_type old_value = atomics::detail::bitwise_cast< uintptr_storage_type >(expected);
|
|
1240
|
-
const bool res = core_operations::compare_exchange_strong(
|
|
1591
|
+
const bool res = core_operations::compare_exchange_strong(
|
|
1592
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
|
|
1241
1593
|
expected = atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(old_value));
|
|
1242
1594
|
return res;
|
|
1243
1595
|
}
|
|
1244
1596
|
|
|
1245
|
-
BOOST_FORCEINLINE bool
|
|
1597
|
+
BOOST_FORCEINLINE bool
|
|
1598
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
|
|
1246
1599
|
{
|
|
1247
|
-
return core_operations::compare_exchange_weak(
|
|
1600
|
+
return core_operations::compare_exchange_weak(
|
|
1601
|
+
this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
|
|
1248
1602
|
}
|
|
1249
1603
|
|
|
1250
|
-
BOOST_FORCEINLINE bool
|
|
1604
|
+
BOOST_FORCEINLINE bool
|
|
1605
|
+
compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
|
|
1251
1606
|
{
|
|
1252
1607
|
storage_type old_value = atomics::detail::bitwise_cast< uintptr_storage_type >(expected);
|
|
1253
|
-
const bool res = core_operations::compare_exchange_weak(
|
|
1608
|
+
const bool res = core_operations::compare_exchange_weak(
|
|
1609
|
+
this->storage(), old_value, atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
|
|
1254
1610
|
expected = atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(old_value));
|
|
1255
1611
|
return res;
|
|
1256
1612
|
}
|