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) 2009 Helge Bahmann
|
|
7
7
|
* Copyright (c) 2012 Tim Blechmann
|
|
8
|
-
* Copyright (c) 2014 Andrey Semashev
|
|
8
|
+
* Copyright (c) 2014-2025 Andrey Semashev
|
|
9
9
|
*/
|
|
10
10
|
/*!
|
|
11
11
|
* \file atomic/detail/core_arch_ops_gcc_x86.hpp
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
#include <boost/atomic/detail/core_arch_operations_fwd.hpp>
|
|
24
24
|
#include <boost/atomic/detail/capabilities.hpp>
|
|
25
25
|
#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)
|
|
26
|
-
#include <
|
|
26
|
+
#include <cstdint>
|
|
27
27
|
#include <boost/atomic/detail/intptr.hpp>
|
|
28
28
|
#include <boost/atomic/detail/string_ops.hpp>
|
|
29
29
|
#include <boost/atomic/detail/core_ops_cas_based.hpp>
|
|
@@ -40,16 +40,16 @@ namespace detail {
|
|
|
40
40
|
|
|
41
41
|
struct core_arch_operations_gcc_x86_base
|
|
42
42
|
{
|
|
43
|
-
static
|
|
44
|
-
static
|
|
43
|
+
static constexpr bool full_cas_based = false;
|
|
44
|
+
static constexpr bool is_always_lock_free = true;
|
|
45
45
|
|
|
46
|
-
static BOOST_FORCEINLINE void fence_before(memory_order order)
|
|
46
|
+
static BOOST_FORCEINLINE void fence_before(memory_order order) noexcept
|
|
47
47
|
{
|
|
48
48
|
if ((static_cast< unsigned int >(order) & static_cast< unsigned int >(memory_order_release)) != 0u)
|
|
49
49
|
__asm__ __volatile__ ("" ::: "memory");
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
static BOOST_FORCEINLINE void fence_after(memory_order order)
|
|
52
|
+
static BOOST_FORCEINLINE void fence_after(memory_order order) noexcept
|
|
53
53
|
{
|
|
54
54
|
if ((static_cast< unsigned int >(order) & (static_cast< unsigned int >(memory_order_consume) | static_cast< unsigned int >(memory_order_acquire))) != 0u)
|
|
55
55
|
__asm__ __volatile__ ("" ::: "memory");
|
|
@@ -60,15 +60,16 @@ template< std::size_t Size, bool Signed, bool Interprocess, typename Derived >
|
|
|
60
60
|
struct core_arch_operations_gcc_x86 :
|
|
61
61
|
public core_arch_operations_gcc_x86_base
|
|
62
62
|
{
|
|
63
|
-
|
|
63
|
+
using storage_type = typename storage_traits< Size >::type;
|
|
64
64
|
|
|
65
|
-
static
|
|
66
|
-
static
|
|
67
|
-
static
|
|
68
|
-
static
|
|
65
|
+
static constexpr std::size_t storage_size = Size;
|
|
66
|
+
static constexpr std::size_t storage_alignment = Size;
|
|
67
|
+
static constexpr bool is_signed = Signed;
|
|
68
|
+
static constexpr bool is_interprocess = Interprocess;
|
|
69
69
|
|
|
70
|
-
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order)
|
|
70
|
+
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
71
71
|
{
|
|
72
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
72
73
|
if (order != memory_order_seq_cst)
|
|
73
74
|
{
|
|
74
75
|
fence_before(order);
|
|
@@ -81,30 +82,31 @@ struct core_arch_operations_gcc_x86 :
|
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
|
|
84
|
-
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order)
|
|
85
|
+
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) noexcept
|
|
85
86
|
{
|
|
86
87
|
storage_type v = storage;
|
|
87
88
|
fence_after(order);
|
|
89
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
88
90
|
return v;
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order)
|
|
93
|
+
static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
92
94
|
{
|
|
93
95
|
return Derived::fetch_add(storage, -v, order);
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
static BOOST_FORCEINLINE bool compare_exchange_weak(
|
|
97
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order)
|
|
99
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
98
100
|
{
|
|
99
101
|
return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);
|
|
100
102
|
}
|
|
101
103
|
|
|
102
|
-
static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order)
|
|
104
|
+
static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) noexcept
|
|
103
105
|
{
|
|
104
106
|
return !!Derived::exchange(storage, (storage_type)1, order);
|
|
105
107
|
}
|
|
106
108
|
|
|
107
|
-
static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order)
|
|
109
|
+
static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) noexcept
|
|
108
110
|
{
|
|
109
111
|
store(storage, (storage_type)0, order);
|
|
110
112
|
}
|
|
@@ -114,12 +116,13 @@ template< bool Signed, bool Interprocess >
|
|
|
114
116
|
struct core_arch_operations< 1u, Signed, Interprocess > :
|
|
115
117
|
public core_arch_operations_gcc_x86< 1u, Signed, Interprocess, core_arch_operations< 1u, Signed, Interprocess > >
|
|
116
118
|
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
using base_type = core_arch_operations_gcc_x86< 1u, Signed, Interprocess, core_arch_operations< 1u, Signed, Interprocess > >;
|
|
120
|
+
using storage_type = typename base_type::storage_type;
|
|
121
|
+
using temp_storage_type = typename storage_traits< 4u >::type;
|
|
120
122
|
|
|
121
|
-
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order)
|
|
123
|
+
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
122
124
|
{
|
|
125
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
123
126
|
__asm__ __volatile__
|
|
124
127
|
(
|
|
125
128
|
"lock; xaddb %0, %1"
|
|
@@ -127,11 +130,13 @@ struct core_arch_operations< 1u, Signed, Interprocess > :
|
|
|
127
130
|
:
|
|
128
131
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
129
132
|
);
|
|
133
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
130
134
|
return v;
|
|
131
135
|
}
|
|
132
136
|
|
|
133
|
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order)
|
|
137
|
+
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
134
138
|
{
|
|
139
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
135
140
|
__asm__ __volatile__
|
|
136
141
|
(
|
|
137
142
|
"xchgb %0, %1"
|
|
@@ -139,12 +144,14 @@ struct core_arch_operations< 1u, Signed, Interprocess > :
|
|
|
139
144
|
:
|
|
140
145
|
: "memory"
|
|
141
146
|
);
|
|
147
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
142
148
|
return v;
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|
146
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order)
|
|
152
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
147
153
|
{
|
|
154
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, success_order);
|
|
148
155
|
storage_type previous = expected;
|
|
149
156
|
bool success;
|
|
150
157
|
#if defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -166,6 +173,7 @@ struct core_arch_operations< 1u, Signed, Interprocess > :
|
|
|
166
173
|
);
|
|
167
174
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
168
175
|
expected = previous;
|
|
176
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, (success ? success_order : failure_order));
|
|
169
177
|
return success;
|
|
170
178
|
}
|
|
171
179
|
|
|
@@ -183,24 +191,30 @@ struct core_arch_operations< 1u, Signed, Interprocess > :
|
|
|
183
191
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"\
|
|
184
192
|
)
|
|
185
193
|
|
|
186
|
-
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order)
|
|
194
|
+
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
187
195
|
{
|
|
196
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
188
197
|
storage_type res = storage;
|
|
189
198
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("andb", v, res);
|
|
199
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
190
200
|
return res;
|
|
191
201
|
}
|
|
192
202
|
|
|
193
|
-
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order)
|
|
203
|
+
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
194
204
|
{
|
|
205
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
195
206
|
storage_type res = storage;
|
|
196
207
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("orb", v, res);
|
|
208
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
197
209
|
return res;
|
|
198
210
|
}
|
|
199
211
|
|
|
200
|
-
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order)
|
|
212
|
+
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
201
213
|
{
|
|
214
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
202
215
|
storage_type res = storage;
|
|
203
216
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("xorb", v, res);
|
|
217
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
204
218
|
return res;
|
|
205
219
|
}
|
|
206
220
|
|
|
@@ -211,12 +225,13 @@ template< bool Signed, bool Interprocess >
|
|
|
211
225
|
struct core_arch_operations< 2u, Signed, Interprocess > :
|
|
212
226
|
public core_arch_operations_gcc_x86< 2u, Signed, Interprocess, core_arch_operations< 2u, Signed, Interprocess > >
|
|
213
227
|
{
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
228
|
+
using base_type = core_arch_operations_gcc_x86< 2u, Signed, Interprocess, core_arch_operations< 2u, Signed, Interprocess > >;
|
|
229
|
+
using storage_type = typename base_type::storage_type;
|
|
230
|
+
using temp_storage_type = typename storage_traits< 4u >::type;
|
|
217
231
|
|
|
218
|
-
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order)
|
|
232
|
+
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
219
233
|
{
|
|
234
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
220
235
|
__asm__ __volatile__
|
|
221
236
|
(
|
|
222
237
|
"lock; xaddw %0, %1"
|
|
@@ -224,11 +239,13 @@ struct core_arch_operations< 2u, Signed, Interprocess > :
|
|
|
224
239
|
:
|
|
225
240
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
226
241
|
);
|
|
242
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
227
243
|
return v;
|
|
228
244
|
}
|
|
229
245
|
|
|
230
|
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order)
|
|
246
|
+
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
231
247
|
{
|
|
248
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
232
249
|
__asm__ __volatile__
|
|
233
250
|
(
|
|
234
251
|
"xchgw %0, %1"
|
|
@@ -236,12 +253,14 @@ struct core_arch_operations< 2u, Signed, Interprocess > :
|
|
|
236
253
|
:
|
|
237
254
|
: "memory"
|
|
238
255
|
);
|
|
256
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
239
257
|
return v;
|
|
240
258
|
}
|
|
241
259
|
|
|
242
260
|
static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|
243
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order)
|
|
261
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
244
262
|
{
|
|
263
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, success_order);
|
|
245
264
|
storage_type previous = expected;
|
|
246
265
|
bool success;
|
|
247
266
|
#if defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -263,6 +282,7 @@ struct core_arch_operations< 2u, Signed, Interprocess > :
|
|
|
263
282
|
);
|
|
264
283
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
265
284
|
expected = previous;
|
|
285
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, (success ? success_order : failure_order));
|
|
266
286
|
return success;
|
|
267
287
|
}
|
|
268
288
|
|
|
@@ -280,24 +300,30 @@ struct core_arch_operations< 2u, Signed, Interprocess > :
|
|
|
280
300
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"\
|
|
281
301
|
)
|
|
282
302
|
|
|
283
|
-
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order)
|
|
303
|
+
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
284
304
|
{
|
|
305
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
285
306
|
storage_type res = storage;
|
|
286
307
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("andw", v, res);
|
|
308
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
287
309
|
return res;
|
|
288
310
|
}
|
|
289
311
|
|
|
290
|
-
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order)
|
|
312
|
+
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
291
313
|
{
|
|
314
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
292
315
|
storage_type res = storage;
|
|
293
316
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("orw", v, res);
|
|
317
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
294
318
|
return res;
|
|
295
319
|
}
|
|
296
320
|
|
|
297
|
-
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order)
|
|
321
|
+
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
298
322
|
{
|
|
323
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
299
324
|
storage_type res = storage;
|
|
300
325
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("xorw", v, res);
|
|
326
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
301
327
|
return res;
|
|
302
328
|
}
|
|
303
329
|
|
|
@@ -308,11 +334,12 @@ template< bool Signed, bool Interprocess >
|
|
|
308
334
|
struct core_arch_operations< 4u, Signed, Interprocess > :
|
|
309
335
|
public core_arch_operations_gcc_x86< 4u, Signed, Interprocess, core_arch_operations< 4u, Signed, Interprocess > >
|
|
310
336
|
{
|
|
311
|
-
|
|
312
|
-
|
|
337
|
+
using base_type = core_arch_operations_gcc_x86< 4u, Signed, Interprocess, core_arch_operations< 4u, Signed, Interprocess > >;
|
|
338
|
+
using storage_type = typename base_type::storage_type;
|
|
313
339
|
|
|
314
|
-
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order)
|
|
340
|
+
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
315
341
|
{
|
|
342
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
316
343
|
__asm__ __volatile__
|
|
317
344
|
(
|
|
318
345
|
"lock; xaddl %0, %1"
|
|
@@ -320,11 +347,13 @@ struct core_arch_operations< 4u, Signed, Interprocess > :
|
|
|
320
347
|
:
|
|
321
348
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
322
349
|
);
|
|
350
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
323
351
|
return v;
|
|
324
352
|
}
|
|
325
353
|
|
|
326
|
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order)
|
|
354
|
+
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
327
355
|
{
|
|
356
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
328
357
|
__asm__ __volatile__
|
|
329
358
|
(
|
|
330
359
|
"xchgl %0, %1"
|
|
@@ -332,12 +361,14 @@ struct core_arch_operations< 4u, Signed, Interprocess > :
|
|
|
332
361
|
:
|
|
333
362
|
: "memory"
|
|
334
363
|
);
|
|
364
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
335
365
|
return v;
|
|
336
366
|
}
|
|
337
367
|
|
|
338
368
|
static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|
339
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order)
|
|
369
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
340
370
|
{
|
|
371
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, success_order);
|
|
341
372
|
storage_type previous = expected;
|
|
342
373
|
bool success;
|
|
343
374
|
#if defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -359,6 +390,7 @@ struct core_arch_operations< 4u, Signed, Interprocess > :
|
|
|
359
390
|
);
|
|
360
391
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
361
392
|
expected = previous;
|
|
393
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, (success ? success_order : failure_order));
|
|
362
394
|
return success;
|
|
363
395
|
}
|
|
364
396
|
|
|
@@ -376,24 +408,30 @@ struct core_arch_operations< 4u, Signed, Interprocess > :
|
|
|
376
408
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"\
|
|
377
409
|
)
|
|
378
410
|
|
|
379
|
-
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order)
|
|
411
|
+
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
380
412
|
{
|
|
413
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
381
414
|
storage_type res = storage;
|
|
382
415
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("andl", v, res);
|
|
416
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
383
417
|
return res;
|
|
384
418
|
}
|
|
385
419
|
|
|
386
|
-
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order)
|
|
420
|
+
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
387
421
|
{
|
|
422
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
388
423
|
storage_type res = storage;
|
|
389
424
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("orl", v, res);
|
|
425
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
390
426
|
return res;
|
|
391
427
|
}
|
|
392
428
|
|
|
393
|
-
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order)
|
|
429
|
+
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
394
430
|
{
|
|
431
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
395
432
|
storage_type res = storage;
|
|
396
433
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("xorl", v, res);
|
|
434
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
397
435
|
return res;
|
|
398
436
|
}
|
|
399
437
|
|
|
@@ -413,28 +451,30 @@ struct core_arch_operations< 4u, Signed, Interprocess > :
|
|
|
413
451
|
template< bool Signed, bool Interprocess >
|
|
414
452
|
struct gcc_dcas_x86
|
|
415
453
|
{
|
|
416
|
-
|
|
417
|
-
|
|
454
|
+
using storage_type = typename storage_traits< 8u >::type;
|
|
455
|
+
using aliasing_uint32_t = std::uint32_t BOOST_ATOMIC_DETAIL_MAY_ALIAS;
|
|
418
456
|
#if defined(__SSE2__)
|
|
419
|
-
|
|
457
|
+
using xmm_t = std::uint32_t __attribute__((__vector_size__(16)));
|
|
420
458
|
#elif defined(__SSE__)
|
|
421
|
-
|
|
459
|
+
using xmm_t = float __attribute__((__vector_size__(16)));
|
|
422
460
|
#endif
|
|
423
461
|
|
|
424
|
-
static
|
|
425
|
-
static
|
|
426
|
-
static
|
|
427
|
-
static
|
|
428
|
-
static
|
|
429
|
-
static
|
|
462
|
+
static constexpr std::size_t storage_size = 8u;
|
|
463
|
+
static constexpr std::size_t storage_alignment = 8u;
|
|
464
|
+
static constexpr bool is_signed = Signed;
|
|
465
|
+
static constexpr bool is_interprocess = Interprocess;
|
|
466
|
+
static constexpr bool full_cas_based = true;
|
|
467
|
+
static constexpr bool is_always_lock_free = true;
|
|
430
468
|
|
|
431
|
-
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order)
|
|
469
|
+
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
432
470
|
{
|
|
471
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
472
|
+
|
|
433
473
|
if (BOOST_LIKELY(order != memory_order_seq_cst && (((uintptr_t)&storage) & 7u) == 0u))
|
|
434
474
|
{
|
|
435
475
|
#if defined(__SSE__)
|
|
436
476
|
#if defined(__SSE2__)
|
|
437
|
-
xmm_t value = { static_cast< uint32_t >(v), static_cast< uint32_t >(v >> 32u), 0u, 0u };
|
|
477
|
+
xmm_t value = { static_cast< std::uint32_t >(v), static_cast< std::uint32_t >(v >> 32u), 0u, 0u };
|
|
438
478
|
#else
|
|
439
479
|
xmm_t value;
|
|
440
480
|
BOOST_ATOMIC_DETAIL_MEMSET(&value, 0, sizeof(value));
|
|
@@ -478,7 +518,7 @@ struct gcc_dcas_x86
|
|
|
478
518
|
"jne 1b\n\t"
|
|
479
519
|
"xchgl %%ebx, %%esi\n\t"
|
|
480
520
|
:
|
|
481
|
-
: "a" ((uint32_t)v), "c" ((uint32_t)(v >> 32u)), [dest] "D" (&storage)
|
|
521
|
+
: "a" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u)), [dest] "D" (&storage)
|
|
482
522
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "edx", "memory"
|
|
483
523
|
);
|
|
484
524
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_ASM_PRESERVE_EBX)
|
|
@@ -490,14 +530,14 @@ struct gcc_dcas_x86
|
|
|
490
530
|
"1: lock; cmpxchg8b %[dest_lo]\n\t"
|
|
491
531
|
"jne 1b\n\t"
|
|
492
532
|
: [dest_lo] "=m" (storage), [dest_hi] "=m" (reinterpret_cast< volatile aliasing_uint32_t* >(&storage)[1])
|
|
493
|
-
: [value_lo] "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32u))
|
|
533
|
+
: [value_lo] "b" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u))
|
|
494
534
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "eax", "edx", "memory"
|
|
495
535
|
);
|
|
496
536
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_ASM_PRESERVE_EBX)
|
|
497
537
|
}
|
|
498
538
|
}
|
|
499
539
|
|
|
500
|
-
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order)
|
|
540
|
+
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) noexcept
|
|
501
541
|
{
|
|
502
542
|
storage_type value;
|
|
503
543
|
|
|
@@ -543,7 +583,7 @@ struct gcc_dcas_x86
|
|
|
543
583
|
|
|
544
584
|
#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
545
585
|
|
|
546
|
-
uint32_t value_bits[2];
|
|
586
|
+
std::uint32_t value_bits[2];
|
|
547
587
|
|
|
548
588
|
// We don't care for comparison result here; the previous value will be stored into value anyway.
|
|
549
589
|
// Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.
|
|
@@ -575,12 +615,16 @@ struct gcc_dcas_x86
|
|
|
575
615
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
576
616
|
}
|
|
577
617
|
|
|
618
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
619
|
+
|
|
578
620
|
return value;
|
|
579
621
|
}
|
|
580
622
|
|
|
581
623
|
static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|
582
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order)
|
|
624
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
583
625
|
{
|
|
626
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, success_order);
|
|
627
|
+
|
|
584
628
|
#if defined(__clang__)
|
|
585
629
|
|
|
586
630
|
// Clang cannot allocate eax:edx register pairs but it has sync intrinsics
|
|
@@ -599,7 +643,7 @@ struct gcc_dcas_x86
|
|
|
599
643
|
"lock; cmpxchg8b (%[dest])\n\t"
|
|
600
644
|
"xchgl %%ebx, %%esi\n\t"
|
|
601
645
|
: "+A" (expected), [success] "=@ccz" (success)
|
|
602
|
-
: "S" ((uint32_t)desired), "c" ((uint32_t)(desired >> 32u)), [dest] "D" (&storage)
|
|
646
|
+
: "S" ((std::uint32_t)desired), "c" ((std::uint32_t)(desired >> 32u)), [dest] "D" (&storage)
|
|
603
647
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
604
648
|
);
|
|
605
649
|
#else // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -610,7 +654,7 @@ struct gcc_dcas_x86
|
|
|
610
654
|
"xchgl %%ebx, %%esi\n\t"
|
|
611
655
|
"sete %[success]\n\t"
|
|
612
656
|
: "+A" (expected), [success] "=qm" (success)
|
|
613
|
-
: "S" ((uint32_t)desired), "c" ((uint32_t)(desired >> 32u)), [dest] "D" (&storage)
|
|
657
|
+
: "S" ((std::uint32_t)desired), "c" ((std::uint32_t)(desired >> 32u)), [dest] "D" (&storage)
|
|
614
658
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
615
659
|
);
|
|
616
660
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -626,7 +670,7 @@ struct gcc_dcas_x86
|
|
|
626
670
|
(
|
|
627
671
|
"lock; cmpxchg8b %[dest]\n\t"
|
|
628
672
|
: "+A" (expected), [dest] "+m" (storage), [success] "=@ccz" (success)
|
|
629
|
-
: "b" ((uint32_t)desired), "c" ((uint32_t)(desired >> 32u))
|
|
673
|
+
: "b" ((std::uint32_t)desired), "c" ((std::uint32_t)(desired >> 32u))
|
|
630
674
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
631
675
|
);
|
|
632
676
|
#else // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -635,28 +679,34 @@ struct gcc_dcas_x86
|
|
|
635
679
|
"lock; cmpxchg8b %[dest]\n\t"
|
|
636
680
|
"sete %[success]\n\t"
|
|
637
681
|
: "+A" (expected), [dest] "+m" (storage), [success] "=qm" (success)
|
|
638
|
-
: "b" ((uint32_t)desired), "c" ((uint32_t)(desired >> 32u))
|
|
682
|
+
: "b" ((std::uint32_t)desired), "c" ((std::uint32_t)(desired >> 32u))
|
|
639
683
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
640
684
|
);
|
|
641
685
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
642
686
|
|
|
687
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, (success ? success_order : failure_order));
|
|
688
|
+
|
|
643
689
|
return success;
|
|
644
690
|
|
|
645
691
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_ASM_PRESERVE_EBX)
|
|
646
692
|
}
|
|
647
693
|
|
|
648
694
|
static BOOST_FORCEINLINE bool compare_exchange_weak(
|
|
649
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order)
|
|
695
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
650
696
|
{
|
|
651
697
|
return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
|
|
652
698
|
}
|
|
653
699
|
|
|
654
|
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order)
|
|
700
|
+
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
655
701
|
{
|
|
702
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
703
|
+
|
|
704
|
+
storage_type old_value;
|
|
705
|
+
|
|
656
706
|
#if defined(BOOST_ATOMIC_DETAIL_X86_ASM_PRESERVE_EBX)
|
|
657
707
|
#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
658
708
|
|
|
659
|
-
uint32_t old_bits[2];
|
|
709
|
+
std::uint32_t old_bits[2];
|
|
660
710
|
__asm__ __volatile__
|
|
661
711
|
(
|
|
662
712
|
"xchgl %%ebx, %%esi\n\t"
|
|
@@ -667,17 +717,14 @@ struct gcc_dcas_x86
|
|
|
667
717
|
"jne 1b\n\t"
|
|
668
718
|
"xchgl %%ebx, %%esi\n\t"
|
|
669
719
|
: "=a" (old_bits[0]), "=d" (old_bits[1])
|
|
670
|
-
: "S" ((uint32_t)v), "c" ((uint32_t)(v >> 32u)), [dest] "D" (&storage)
|
|
720
|
+
: "S" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u)), [dest] "D" (&storage)
|
|
671
721
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
672
722
|
);
|
|
673
723
|
|
|
674
|
-
storage_type old_value;
|
|
675
724
|
BOOST_ATOMIC_DETAIL_MEMCPY(&old_value, old_bits, sizeof(old_value));
|
|
676
|
-
return old_value;
|
|
677
725
|
|
|
678
726
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
679
727
|
|
|
680
|
-
storage_type old_value;
|
|
681
728
|
__asm__ __volatile__
|
|
682
729
|
(
|
|
683
730
|
"xchgl %%ebx, %%esi\n\t"
|
|
@@ -688,17 +735,16 @@ struct gcc_dcas_x86
|
|
|
688
735
|
"jne 1b\n\t"
|
|
689
736
|
"xchgl %%ebx, %%esi\n\t"
|
|
690
737
|
: "=A" (old_value)
|
|
691
|
-
: "S" ((uint32_t)v), "c" ((uint32_t)(v >> 32u)), [dest] "D" (&storage)
|
|
738
|
+
: "S" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u)), [dest] "D" (&storage)
|
|
692
739
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
693
740
|
);
|
|
694
|
-
return old_value;
|
|
695
741
|
|
|
696
742
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
697
743
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_ASM_PRESERVE_EBX)
|
|
698
744
|
#if defined(__MINGW32__) && ((__GNUC__+0) * 100 + (__GNUC_MINOR__+0)) < 407
|
|
699
745
|
|
|
700
746
|
// MinGW gcc up to 4.6 has problems with allocating registers in the asm blocks below
|
|
701
|
-
uint32_t old_bits[2];
|
|
747
|
+
std::uint32_t old_bits[2];
|
|
702
748
|
__asm__ __volatile__
|
|
703
749
|
(
|
|
704
750
|
"movl (%[dest]), %%eax\n\t"
|
|
@@ -707,17 +753,15 @@ struct gcc_dcas_x86
|
|
|
707
753
|
"1: lock; cmpxchg8b (%[dest])\n\t"
|
|
708
754
|
"jne 1b\n\t"
|
|
709
755
|
: "=&a" (old_bits[0]), "=&d" (old_bits[1])
|
|
710
|
-
: "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32u)), [dest] "DS" (&storage)
|
|
756
|
+
: "b" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u)), [dest] "DS" (&storage)
|
|
711
757
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
712
758
|
);
|
|
713
759
|
|
|
714
|
-
storage_type old_value;
|
|
715
760
|
BOOST_ATOMIC_DETAIL_MEMCPY(&old_value, old_bits, sizeof(old_value));
|
|
716
|
-
return old_value;
|
|
717
761
|
|
|
718
762
|
#elif defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
719
763
|
|
|
720
|
-
uint32_t old_bits[2];
|
|
764
|
+
std::uint32_t old_bits[2];
|
|
721
765
|
__asm__ __volatile__
|
|
722
766
|
(
|
|
723
767
|
"movl %[dest_lo], %%eax\n\t"
|
|
@@ -726,17 +770,14 @@ struct gcc_dcas_x86
|
|
|
726
770
|
"1: lock; cmpxchg8b %[dest_lo]\n\t"
|
|
727
771
|
"jne 1b\n\t"
|
|
728
772
|
: "=&a" (old_bits[0]), "=&d" (old_bits[1]), [dest_lo] "+m" (storage), [dest_hi] "+m" (reinterpret_cast< volatile aliasing_uint32_t* >(&storage)[1])
|
|
729
|
-
: "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32u))
|
|
773
|
+
: "b" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u))
|
|
730
774
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
731
775
|
);
|
|
732
776
|
|
|
733
|
-
storage_type old_value;
|
|
734
777
|
BOOST_ATOMIC_DETAIL_MEMCPY(&old_value, old_bits, sizeof(old_value));
|
|
735
|
-
return old_value;
|
|
736
778
|
|
|
737
779
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
738
780
|
|
|
739
|
-
storage_type old_value;
|
|
740
781
|
__asm__ __volatile__
|
|
741
782
|
(
|
|
742
783
|
"movl %[dest_lo], %%eax\n\t"
|
|
@@ -745,13 +786,16 @@ struct gcc_dcas_x86
|
|
|
745
786
|
"1: lock; cmpxchg8b %[dest_lo]\n\t"
|
|
746
787
|
"jne 1b\n\t"
|
|
747
788
|
: "=&A" (old_value), [dest_lo] "+m" (storage), [dest_hi] "+m" (reinterpret_cast< volatile aliasing_uint32_t* >(&storage)[1])
|
|
748
|
-
: "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32u))
|
|
789
|
+
: "b" ((std::uint32_t)v), "c" ((std::uint32_t)(v >> 32u))
|
|
749
790
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
750
791
|
);
|
|
751
|
-
return old_value;
|
|
752
792
|
|
|
753
793
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
754
794
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_ASM_PRESERVE_EBX)
|
|
795
|
+
|
|
796
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
797
|
+
|
|
798
|
+
return old_value;
|
|
755
799
|
}
|
|
756
800
|
};
|
|
757
801
|
|
|
@@ -767,11 +811,12 @@ template< bool Signed, bool Interprocess >
|
|
|
767
811
|
struct core_arch_operations< 8u, Signed, Interprocess > :
|
|
768
812
|
public core_arch_operations_gcc_x86< 8u, Signed, Interprocess, core_arch_operations< 8u, Signed, Interprocess > >
|
|
769
813
|
{
|
|
770
|
-
|
|
771
|
-
|
|
814
|
+
using base_type = core_arch_operations_gcc_x86< 8u, Signed, Interprocess, core_arch_operations< 8u, Signed, Interprocess > >;
|
|
815
|
+
using storage_type = typename base_type::storage_type;
|
|
772
816
|
|
|
773
|
-
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order)
|
|
817
|
+
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
774
818
|
{
|
|
819
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
775
820
|
__asm__ __volatile__
|
|
776
821
|
(
|
|
777
822
|
"lock; xaddq %0, %1"
|
|
@@ -779,11 +824,13 @@ struct core_arch_operations< 8u, Signed, Interprocess > :
|
|
|
779
824
|
:
|
|
780
825
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
781
826
|
);
|
|
827
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
782
828
|
return v;
|
|
783
829
|
}
|
|
784
830
|
|
|
785
|
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order)
|
|
831
|
+
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
786
832
|
{
|
|
833
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
787
834
|
__asm__ __volatile__
|
|
788
835
|
(
|
|
789
836
|
"xchgq %0, %1"
|
|
@@ -791,12 +838,14 @@ struct core_arch_operations< 8u, Signed, Interprocess > :
|
|
|
791
838
|
:
|
|
792
839
|
: "memory"
|
|
793
840
|
);
|
|
841
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
794
842
|
return v;
|
|
795
843
|
}
|
|
796
844
|
|
|
797
845
|
static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|
798
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order)
|
|
846
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
799
847
|
{
|
|
848
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, success_order);
|
|
800
849
|
storage_type previous = expected;
|
|
801
850
|
bool success;
|
|
802
851
|
#if defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
@@ -818,6 +867,7 @@ struct core_arch_operations< 8u, Signed, Interprocess > :
|
|
|
818
867
|
);
|
|
819
868
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
820
869
|
expected = previous;
|
|
870
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, (success ? success_order : failure_order));
|
|
821
871
|
return success;
|
|
822
872
|
}
|
|
823
873
|
|
|
@@ -835,24 +885,30 @@ struct core_arch_operations< 8u, Signed, Interprocess > :
|
|
|
835
885
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"\
|
|
836
886
|
)
|
|
837
887
|
|
|
838
|
-
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order)
|
|
888
|
+
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
839
889
|
{
|
|
890
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
840
891
|
storage_type res = storage;
|
|
841
892
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("andq", v, res);
|
|
893
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
842
894
|
return res;
|
|
843
895
|
}
|
|
844
896
|
|
|
845
|
-
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order)
|
|
897
|
+
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
846
898
|
{
|
|
899
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
847
900
|
storage_type res = storage;
|
|
848
901
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("orq", v, res);
|
|
902
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
849
903
|
return res;
|
|
850
904
|
}
|
|
851
905
|
|
|
852
|
-
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order)
|
|
906
|
+
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
853
907
|
{
|
|
908
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
854
909
|
storage_type res = storage;
|
|
855
910
|
BOOST_ATOMIC_DETAIL_CAS_LOOP("xorq", v, res);
|
|
911
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
856
912
|
return res;
|
|
857
913
|
}
|
|
858
914
|
|
|
@@ -866,28 +922,30 @@ struct core_arch_operations< 8u, Signed, Interprocess > :
|
|
|
866
922
|
template< bool Signed, bool Interprocess >
|
|
867
923
|
struct gcc_dcas_x86_64
|
|
868
924
|
{
|
|
869
|
-
|
|
870
|
-
|
|
925
|
+
using storage_type = typename storage_traits< 16u >::type;
|
|
926
|
+
using aliasing_uint64_t = std::uint64_t BOOST_ATOMIC_DETAIL_MAY_ALIAS;
|
|
871
927
|
#if defined(__AVX__)
|
|
872
|
-
|
|
928
|
+
using xmm_t = std::uint64_t __attribute__((__vector_size__(16)));
|
|
873
929
|
#endif
|
|
874
930
|
|
|
875
|
-
static
|
|
876
|
-
static
|
|
877
|
-
static
|
|
878
|
-
static
|
|
879
|
-
static
|
|
880
|
-
static
|
|
931
|
+
static constexpr std::size_t storage_size = 16u;
|
|
932
|
+
static constexpr std::size_t storage_alignment = 16u;
|
|
933
|
+
static constexpr bool is_signed = Signed;
|
|
934
|
+
static constexpr bool is_interprocess = Interprocess;
|
|
935
|
+
static constexpr bool full_cas_based = true;
|
|
936
|
+
static constexpr bool is_always_lock_free = true;
|
|
881
937
|
|
|
882
|
-
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order)
|
|
938
|
+
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
883
939
|
{
|
|
940
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
941
|
+
|
|
884
942
|
#if defined(__AVX__)
|
|
885
943
|
if (BOOST_LIKELY(order != memory_order_seq_cst && (((uintptr_t)&storage) & 15u) == 0u))
|
|
886
944
|
{
|
|
887
945
|
// According to SDM Volume 3, 8.1.1 Guaranteed Atomic Operations, processors supporting AVX guarantee
|
|
888
946
|
// aligned vector moves to be atomic.
|
|
889
947
|
#if defined(BOOST_HAS_INT128)
|
|
890
|
-
xmm_t value = { static_cast< uint64_t >(v), static_cast< uint64_t >(v >> 64u) };
|
|
948
|
+
xmm_t value = { static_cast< std::uint64_t >(v), static_cast< std::uint64_t >(v >> 64u) };
|
|
891
949
|
#else
|
|
892
950
|
xmm_t value;
|
|
893
951
|
BOOST_ATOMIC_DETAIL_MEMCPY(&value, &v, sizeof(v));
|
|
@@ -917,7 +975,7 @@ struct gcc_dcas_x86_64
|
|
|
917
975
|
);
|
|
918
976
|
}
|
|
919
977
|
|
|
920
|
-
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order)
|
|
978
|
+
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) noexcept
|
|
921
979
|
{
|
|
922
980
|
#if defined(__AVX__)
|
|
923
981
|
if (BOOST_LIKELY((((uintptr_t)&storage) & 15u) == 0u))
|
|
@@ -940,6 +998,7 @@ struct gcc_dcas_x86_64
|
|
|
940
998
|
storage_type value;
|
|
941
999
|
BOOST_ATOMIC_DETAIL_MEMCPY(&value, &v, sizeof(v));
|
|
942
1000
|
#endif
|
|
1001
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
943
1002
|
return value;
|
|
944
1003
|
}
|
|
945
1004
|
#endif // defined(__AVX__)
|
|
@@ -947,9 +1006,11 @@ struct gcc_dcas_x86_64
|
|
|
947
1006
|
// Note that despite const qualification cmpxchg16b below may issue a store to the storage. The storage value
|
|
948
1007
|
// will not change, but this prevents the storage to reside in read-only memory.
|
|
949
1008
|
|
|
1009
|
+
storage_type value;
|
|
1010
|
+
|
|
950
1011
|
#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
951
1012
|
|
|
952
|
-
uint64_t value_bits[2];
|
|
1013
|
+
std::uint64_t value_bits[2];
|
|
953
1014
|
|
|
954
1015
|
// We don't care for comparison result here; the previous value will be stored into value anyway.
|
|
955
1016
|
// Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.
|
|
@@ -964,17 +1025,13 @@ struct gcc_dcas_x86_64
|
|
|
964
1025
|
);
|
|
965
1026
|
|
|
966
1027
|
#if defined(BOOST_HAS_INT128)
|
|
967
|
-
|
|
1028
|
+
value = static_cast< storage_type >(value_bits[0]) | (static_cast< storage_type >(value_bits[1]) << 64u);
|
|
968
1029
|
#else
|
|
969
|
-
storage_type value;
|
|
970
1030
|
BOOST_ATOMIC_DETAIL_MEMCPY(&value, value_bits, sizeof(value));
|
|
971
1031
|
#endif
|
|
972
|
-
return value;
|
|
973
1032
|
|
|
974
1033
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
975
1034
|
|
|
976
|
-
storage_type value;
|
|
977
|
-
|
|
978
1035
|
// We don't care for comparison result here; the previous value will be stored into value anyway.
|
|
979
1036
|
// Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.
|
|
980
1037
|
__asm__ __volatile__
|
|
@@ -987,20 +1044,24 @@ struct gcc_dcas_x86_64
|
|
|
987
1044
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
988
1045
|
);
|
|
989
1046
|
|
|
990
|
-
return value;
|
|
991
|
-
|
|
992
1047
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1048
|
+
|
|
1049
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
1050
|
+
|
|
1051
|
+
return value;
|
|
993
1052
|
}
|
|
994
1053
|
|
|
995
1054
|
static BOOST_FORCEINLINE bool compare_exchange_strong(
|
|
996
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order)
|
|
1055
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
997
1056
|
{
|
|
1057
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, success_order);
|
|
1058
|
+
|
|
998
1059
|
#if defined(__clang__)
|
|
999
1060
|
|
|
1000
1061
|
// Clang cannot allocate rax:rdx register pairs but it has sync intrinsics
|
|
1001
1062
|
storage_type old_expected = expected;
|
|
1002
1063
|
expected = __sync_val_compare_and_swap(&storage, old_expected, desired);
|
|
1003
|
-
|
|
1064
|
+
const bool success = expected == old_expected;
|
|
1004
1065
|
|
|
1005
1066
|
#elif defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1006
1067
|
|
|
@@ -1015,8 +1076,6 @@ struct gcc_dcas_x86_64
|
|
|
1015
1076
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
1016
1077
|
);
|
|
1017
1078
|
|
|
1018
|
-
return success;
|
|
1019
|
-
|
|
1020
1079
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1021
1080
|
|
|
1022
1081
|
bool success;
|
|
@@ -1040,21 +1099,27 @@ struct gcc_dcas_x86_64
|
|
|
1040
1099
|
);
|
|
1041
1100
|
#endif // defined(BOOST_ATOMIC_DETAIL_ASM_HAS_FLAG_OUTPUTS)
|
|
1042
1101
|
|
|
1043
|
-
return success;
|
|
1044
|
-
|
|
1045
1102
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1103
|
+
|
|
1104
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, (success ? success_order : failure_order));
|
|
1105
|
+
|
|
1106
|
+
return success;
|
|
1046
1107
|
}
|
|
1047
1108
|
|
|
1048
1109
|
static BOOST_FORCEINLINE bool compare_exchange_weak(
|
|
1049
|
-
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order)
|
|
1110
|
+
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) noexcept
|
|
1050
1111
|
{
|
|
1051
1112
|
return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
|
|
1052
1113
|
}
|
|
1053
1114
|
|
|
1054
|
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order)
|
|
1115
|
+
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) noexcept
|
|
1055
1116
|
{
|
|
1117
|
+
BOOST_ATOMIC_DETAIL_TSAN_RELEASE(&storage, order);
|
|
1118
|
+
|
|
1119
|
+
storage_type old_value;
|
|
1120
|
+
|
|
1056
1121
|
#if defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1057
|
-
uint64_t old_bits[2];
|
|
1122
|
+
std::uint64_t old_bits[2];
|
|
1058
1123
|
__asm__ __volatile__
|
|
1059
1124
|
(
|
|
1060
1125
|
"movq %[dest_lo], %%rax\n\t"
|
|
@@ -1068,14 +1133,13 @@ struct gcc_dcas_x86_64
|
|
|
1068
1133
|
);
|
|
1069
1134
|
|
|
1070
1135
|
#if defined(BOOST_HAS_INT128)
|
|
1071
|
-
|
|
1136
|
+
old_value = static_cast< storage_type >(old_bits[0]) | (static_cast< storage_type >(old_bits[1]) << 64u);
|
|
1072
1137
|
#else
|
|
1073
|
-
storage_type old_value;
|
|
1074
1138
|
BOOST_ATOMIC_DETAIL_MEMCPY(&old_value, old_bits, sizeof(old_value));
|
|
1075
1139
|
#endif
|
|
1076
|
-
|
|
1140
|
+
|
|
1077
1141
|
#else // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1078
|
-
|
|
1142
|
+
|
|
1079
1143
|
__asm__ __volatile__
|
|
1080
1144
|
(
|
|
1081
1145
|
"movq %[dest_lo], %%rax\n\t"
|
|
@@ -1088,8 +1152,11 @@ struct gcc_dcas_x86_64
|
|
|
1088
1152
|
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
|
|
1089
1153
|
);
|
|
1090
1154
|
|
|
1091
|
-
return old_value;
|
|
1092
1155
|
#endif // defined(BOOST_ATOMIC_DETAIL_X86_NO_ASM_AX_DX_PAIRS)
|
|
1156
|
+
|
|
1157
|
+
BOOST_ATOMIC_DETAIL_TSAN_ACQUIRE(&storage, order);
|
|
1158
|
+
|
|
1159
|
+
return old_value;
|
|
1093
1160
|
}
|
|
1094
1161
|
};
|
|
1095
1162
|
|