passenger 4.0.20 → 4.0.21
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/NEWS +15 -0
- data/README.md +5 -3
- data/Rakefile +1 -0
- data/bin/passenger-config +1 -5
- data/bin/passenger-install-apache2-module +53 -5
- data/bin/passenger-install-nginx-module +19 -6
- data/bin/passenger-memory-stats +3 -3
- data/build/agents.rb +11 -8
- data/build/apache2.rb +9 -5
- data/build/basics.rb +15 -21
- data/build/common_library.rb +16 -6
- data/build/cplusplus_support.rb +5 -5
- data/build/cxx_tests.rb +3 -3
- data/build/documentation.rb +1 -1
- data/build/misc.rb +4 -37
- data/build/node_tests.rb +29 -0
- data/build/oxt_tests.rb +1 -1
- data/build/packaging.rb +29 -10
- data/build/preprocessor.rb +2 -1
- data/build/test_basics.rb +15 -6
- data/debian.template/locations.ini.template +1 -0
- data/debian.template/passenger.install.template +1 -0
- data/dev/copy_boost_headers.rb +7 -3
- data/dev/run_travis.sh +32 -16
- data/doc/Users guide Apache.idmap.txt +22 -34
- data/doc/Users guide Apache.txt +20 -234
- data/doc/Users guide Nginx.idmap.txt +84 -66
- data/doc/Users guide Nginx.txt +50 -1
- data/doc/Users guide Standalone.idmap.txt +74 -0
- data/doc/Users guide Standalone.txt +22 -9
- data/doc/Users guide.txt +51 -0
- data/doc/users_guide_snippets/environment_variables.txt +0 -3
- data/doc/users_guide_snippets/installation.txt +337 -380
- data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
- data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
- data/doc/users_guide_snippets/support_information.txt +2 -9
- data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
- data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
- data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
- data/ext/apache2/Bucket.h +1 -1
- data/ext/apache2/Configuration.hpp +0 -44
- data/ext/apache2/CreateDirConfig.cpp +1 -1
- data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
- data/ext/apache2/Hooks.cpp +28 -21
- data/ext/apache2/MergeDirConfig.cpp +1 -0
- data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
- data/ext/apache2/SetHeaders.cpp +73 -0
- data/ext/apache2/SetHeaders.cpp.erb +88 -0
- data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
- data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
- data/ext/boost/algorithm/string/formatter.hpp +2 -2
- data/ext/boost/assert.hpp +6 -1
- data/ext/boost/atomic.hpp +18 -0
- data/ext/boost/atomic/atomic.hpp +241 -0
- data/ext/boost/atomic/detail/base.hpp +585 -0
- data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
- data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
- data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
- data/ext/boost/atomic/detail/config.hpp +54 -0
- data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
- data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
- data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
- data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
- data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
- data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
- data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
- data/ext/boost/atomic/detail/interlocked.hpp +200 -0
- data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
- data/ext/boost/atomic/detail/lockpool.hpp +97 -0
- data/ext/boost/atomic/detail/platform.hpp +62 -0
- data/ext/boost/atomic/detail/type-classification.hpp +45 -0
- data/ext/boost/chrono/config.hpp +8 -3
- data/ext/boost/chrono/duration.hpp +9 -10
- data/ext/boost/chrono/system_clocks.hpp +1 -1
- data/ext/boost/chrono/time_point.hpp +4 -3
- data/ext/boost/config/auto_link.hpp +53 -52
- data/ext/boost/config/compiler/borland.hpp +1 -0
- data/ext/boost/config/compiler/clang.hpp +24 -1
- data/ext/boost/config/compiler/codegear.hpp +1 -0
- data/ext/boost/config/compiler/common_edg.hpp +1 -0
- data/ext/boost/config/compiler/cray.hpp +1 -0
- data/ext/boost/config/compiler/digitalmars.hpp +1 -0
- data/ext/boost/config/compiler/gcc.hpp +29 -3
- data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
- data/ext/boost/config/compiler/hp_acc.hpp +1 -0
- data/ext/boost/config/compiler/intel.hpp +1 -1
- data/ext/boost/config/compiler/metrowerks.hpp +1 -0
- data/ext/boost/config/compiler/mpw.hpp +1 -0
- data/ext/boost/config/compiler/pathscale.hpp +1 -0
- data/ext/boost/config/compiler/pgi.hpp +1 -0
- data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
- data/ext/boost/config/compiler/vacpp.hpp +3 -2
- data/ext/boost/config/compiler/visualc.hpp +25 -11
- data/ext/boost/config/platform/vxworks.hpp +353 -15
- data/ext/boost/config/select_compiler_config.hpp +4 -4
- data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
- data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
- data/ext/boost/config/suffix.hpp +45 -19
- data/ext/boost/date_time/format_date_parser.hpp +1 -11
- data/ext/boost/date_time/strings_from_facet.hpp +5 -3
- data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
- data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
- data/ext/boost/detail/endian.hpp +52 -4
- data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
- data/ext/boost/detail/select_type.hpp +36 -0
- data/ext/boost/exception/current_exception_cast.hpp +1 -1
- data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
- data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
- data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
- data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
- data/ext/boost/exception/detail/type_info.hpp +1 -1
- data/ext/boost/exception/diagnostic_information.hpp +15 -14
- data/ext/boost/exception/exception.hpp +1 -1
- data/ext/boost/exception/get_error_info.hpp +1 -1
- data/ext/boost/exception/info.hpp +12 -13
- data/ext/boost/exception/to_string.hpp +6 -1
- data/ext/boost/exception/to_string_stub.hpp +9 -1
- data/ext/boost/foreach.hpp +5 -5
- data/ext/boost/function/function_template.hpp +6 -6
- data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
- data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
- data/ext/boost/functional/hash/extensions.hpp +14 -2
- data/ext/boost/functional/hash/hash.hpp +26 -5
- data/ext/boost/get_pointer.hpp +17 -2
- data/ext/boost/integer_traits.hpp +1 -1
- data/ext/boost/lexical_cast.hpp +615 -395
- data/ext/boost/libs/atomic/lockpool.cpp +24 -0
- data/ext/boost/libs/system/src/error_code.cpp +25 -18
- data/ext/boost/libs/thread/src/future.cpp +7 -5
- data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
- data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
- data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
- data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
- data/ext/boost/limits.hpp +1 -1
- data/ext/boost/math/policies/policy.hpp +10 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
- data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
- data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
- data/ext/boost/math/special_functions/sign.hpp +13 -8
- data/ext/boost/math/tools/config.hpp +38 -16
- data/ext/boost/move/algorithm.hpp +275 -0
- data/ext/boost/move/core.hpp +332 -0
- data/ext/boost/move/detail/config_begin.hpp +23 -0
- data/ext/boost/move/detail/config_end.hpp +20 -0
- data/ext/boost/move/detail/meta_utils.hpp +158 -0
- data/ext/boost/move/iterator.hpp +298 -0
- data/ext/boost/move/move.hpp +10 -1256
- data/ext/boost/move/traits.hpp +142 -0
- data/ext/boost/move/utility.hpp +194 -0
- data/ext/boost/mpl/assert.hpp +72 -4
- data/ext/boost/noncopyable.hpp +15 -3
- data/ext/boost/pointer_to_other.hpp +55 -0
- data/ext/boost/range/concepts.hpp +4 -4
- data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
- data/ext/boost/range/empty.hpp +1 -1
- data/ext/boost/range/iterator_range_core.hpp +4 -1
- data/ext/boost/range/iterator_range_io.hpp +2 -2
- data/ext/boost/ratio/config.hpp +6 -0
- data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
- data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
- data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
- data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
- data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
- data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
- data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
- data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
- data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
- data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
- data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
- data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
- data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
- data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
- data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
- data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
- data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
- data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
- data/ext/boost/smart_ptr/shared_array.hpp +135 -20
- data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
- data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
- data/ext/boost/static_assert.hpp +74 -17
- data/ext/boost/system/error_code.hpp +76 -68
- data/ext/boost/system/system_error.hpp +5 -1
- data/ext/boost/thread/barrier.hpp +6 -2
- data/ext/boost/thread/completion_latch.hpp +233 -0
- data/ext/boost/thread/condition.hpp +6 -1
- data/ext/boost/thread/detail/async_func.hpp +571 -0
- data/ext/boost/thread/detail/config.hpp +248 -40
- data/ext/boost/thread/detail/counter.hpp +93 -0
- data/ext/boost/thread/detail/delete.hpp +12 -0
- data/ext/boost/thread/detail/invoke.hpp +1351 -0
- data/ext/boost/thread/detail/is_convertible.hpp +48 -0
- data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
- data/ext/boost/thread/detail/log.hpp +83 -0
- data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
- data/ext/boost/thread/detail/move.hpp +32 -16
- data/ext/boost/thread/detail/thread.hpp +236 -41
- data/ext/boost/thread/detail/thread_group.hpp +55 -9
- data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
- data/ext/boost/thread/exceptions.hpp +2 -0
- data/ext/boost/thread/externally_locked.hpp +351 -0
- data/ext/boost/thread/externally_locked_stream.hpp +170 -0
- data/ext/boost/thread/future.hpp +2517 -455
- data/ext/boost/thread/future_error_code.hpp +61 -0
- data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
- data/ext/boost/thread/latch.hpp +142 -0
- data/ext/boost/thread/lock_algorithms.hpp +468 -0
- data/ext/boost/thread/lock_concepts.hpp +197 -0
- data/ext/boost/thread/lock_factories.hpp +78 -0
- data/ext/boost/thread/lock_guard.hpp +88 -0
- data/ext/boost/thread/lock_options.hpp +31 -0
- data/ext/boost/thread/lock_traits.hpp +45 -0
- data/ext/boost/thread/lock_types.hpp +1226 -0
- data/ext/boost/thread/lockable_adapter.hpp +226 -0
- data/ext/boost/thread/lockable_concepts.hpp +157 -0
- data/ext/boost/thread/lockable_traits.hpp +207 -0
- data/ext/boost/thread/locks.hpp +5 -1816
- data/ext/boost/thread/mutex.hpp +33 -1
- data/ext/boost/thread/null_mutex.hpp +243 -0
- data/ext/boost/thread/once.hpp +10 -1
- data/ext/boost/thread/poly_lockable.hpp +68 -0
- data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
- data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
- data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
- data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
- data/ext/boost/thread/pthread/mutex.hpp +101 -38
- data/ext/boost/thread/pthread/once.hpp +459 -44
- data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
- data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
- data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
- data/ext/boost/thread/pthread/thread_data.hpp +53 -50
- data/ext/boost/thread/pthread/timespec.hpp +96 -12
- data/ext/boost/thread/recursive_mutex.hpp +44 -1
- data/ext/boost/thread/reverse_lock.hpp +3 -2
- data/ext/boost/thread/scoped_thread.hpp +285 -0
- data/ext/boost/thread/shared_lock_guard.hpp +2 -1
- data/ext/boost/thread/shared_mutex.hpp +23 -0
- data/ext/boost/thread/strict_lock.hpp +235 -0
- data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
- data/ext/boost/thread/sync_queue.hpp +516 -0
- data/ext/boost/thread/synchronized_value.hpp +1001 -0
- data/ext/boost/thread/testable_mutex.hpp +148 -0
- data/ext/boost/thread/thread.hpp +1 -13
- data/ext/boost/thread/thread_functors.hpp +57 -0
- data/ext/boost/thread/thread_guard.hpp +46 -0
- data/ext/boost/thread/thread_only.hpp +29 -0
- data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
- data/ext/boost/thread/v2/thread.hpp +37 -10
- data/ext/boost/thread/xtime.hpp +2 -1
- data/ext/boost/token_functions.hpp +16 -16
- data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
- data/ext/boost/type_traits/add_reference.hpp +1 -1
- data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
- data/ext/boost/type_traits/aligned_storage.hpp +13 -0
- data/ext/boost/type_traits/common_type.hpp +11 -12
- data/ext/boost/type_traits/config.hpp +1 -1
- data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
- data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
- data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
- data/ext/boost/type_traits/has_left_shift.hpp +49 -0
- data/ext/boost/type_traits/has_right_shift.hpp +49 -0
- data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
- data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
- data/ext/boost/type_traits/intrinsics.hpp +18 -2
- data/ext/boost/type_traits/is_abstract.hpp +1 -1
- data/ext/boost/type_traits/is_array.hpp +1 -1
- data/ext/boost/type_traits/is_const.hpp +1 -1
- data/ext/boost/type_traits/is_convertible.hpp +78 -17
- data/ext/boost/type_traits/is_function.hpp +6 -1
- data/ext/boost/type_traits/is_integral.hpp +6 -1
- data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
- data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
- data/ext/boost/type_traits/is_pod.hpp +3 -1
- data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
- data/ext/boost/type_traits/is_volatile.hpp +1 -1
- data/ext/boost/type_traits/make_signed.hpp +153 -0
- data/ext/boost/type_traits/make_unsigned.hpp +16 -0
- data/ext/boost/type_traits/remove_const.hpp +1 -1
- data/ext/boost/type_traits/remove_cv.hpp +1 -1
- data/ext/boost/type_traits/remove_reference.hpp +1 -1
- data/ext/boost/type_traits/remove_volatile.hpp +1 -1
- data/ext/boost/unordered/detail/allocate.hpp +1120 -0
- data/ext/boost/unordered/detail/buckets.hpp +876 -0
- data/ext/boost/unordered/detail/equivalent.hpp +680 -0
- data/ext/boost/unordered/detail/extract_key.hpp +183 -0
- data/ext/boost/unordered/detail/fwd.hpp +23 -0
- data/ext/boost/unordered/detail/table.hpp +861 -0
- data/ext/boost/unordered/detail/unique.hpp +622 -0
- data/ext/boost/unordered/detail/util.hpp +260 -0
- data/ext/boost/unordered/unordered_map.hpp +1652 -0
- data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
- data/ext/boost/unordered/unordered_set.hpp +1549 -0
- data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
- data/ext/boost/unordered_map.hpp +18 -0
- data/ext/boost/unordered_set.hpp +18 -0
- data/ext/boost/utility/addressof.hpp +2 -2
- data/ext/boost/utility/result_of.hpp +8 -1
- data/ext/boost/version.hpp +2 -2
- data/ext/common/Account.h +1 -1
- data/ext/common/AccountsDatabase.h +1 -1
- data/ext/common/AgentsStarter.cpp +3 -1
- data/ext/common/AgentsStarter.h +2 -2
- data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
- data/ext/common/ApplicationPool2/AppTypes.h +17 -8
- data/ext/common/ApplicationPool2/Common.h +12 -12
- data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
- data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
- data/ext/common/ApplicationPool2/Group.h +6 -6
- data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
- data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
- data/ext/common/ApplicationPool2/Pool.h +21 -21
- data/ext/common/ApplicationPool2/Process.h +6 -6
- data/ext/common/ApplicationPool2/Session.h +1 -1
- data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
- data/ext/common/ApplicationPool2/Socket.h +2 -2
- data/ext/common/ApplicationPool2/Spawner.h +64 -14
- data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
- data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
- data/ext/common/BackgroundEventLoop.cpp +4 -4
- data/ext/common/BackgroundEventLoop.h +1 -1
- data/ext/common/Constants.h +13 -1
- data/ext/common/EventedBufferedInput.h +8 -8
- data/ext/common/Exceptions.cpp +71 -0
- data/ext/common/Exceptions.h +60 -7
- data/ext/common/FileDescriptor.h +4 -4
- data/ext/common/MessageClient.h +1 -1
- data/ext/common/MessageServer.h +5 -5
- data/ext/common/MultiLibeio.cpp +3 -3
- data/ext/common/MultiLibeio.h +2 -2
- data/ext/common/RandomGenerator.h +11 -11
- data/ext/common/ResourceLocator.h +8 -1
- data/ext/common/SafeLibev.h +12 -12
- data/ext/common/ServerInstanceDir.h +11 -3
- data/ext/common/UnionStation.h +10 -10
- data/ext/common/Utils.cpp +11 -13
- data/ext/common/Utils.h +9 -9
- data/ext/common/Utils/BlockingQueue.h +10 -10
- data/ext/common/Utils/BufferedIO.h +1 -1
- data/ext/common/Utils/CachedFileStat.hpp +2 -2
- data/ext/common/Utils/FileChangeChecker.h +1 -1
- data/ext/common/Utils/HashMap.h +13 -4
- data/ext/common/Utils/IOUtils.cpp +33 -10
- data/ext/common/Utils/IniFile.h +3 -3
- data/ext/common/Utils/Lock.h +2 -2
- data/ext/common/Utils/MessagePassing.h +10 -10
- data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
- data/ext/common/Utils/ScopeGuard.h +5 -5
- data/ext/common/Utils/jsoncpp.cpp +2 -0
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
- data/ext/common/agents/HelperAgent/Main.cpp +18 -18
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
- data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
- data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
- data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
- data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
- data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
- data/ext/common/agents/SpawnPreparer.cpp +1 -0
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
- data/ext/common/agents/Watchdog/Main.cpp +81 -73
- data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
- data/ext/libev/Changes +57 -0
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/Makefile.in +110 -50
- data/ext/libev/README +8 -8
- data/ext/libev/aclocal.m4 +1503 -861
- data/ext/libev/config.guess +290 -304
- data/ext/libev/config.sub +77 -198
- data/ext/libev/configure +1735 -890
- data/ext/libev/configure.ac +3 -2
- data/ext/libev/ev++.h +6 -6
- data/ext/libev/ev.c +541 -214
- data/ext/libev/ev.h +106 -100
- data/ext/libev/ev_epoll.c +1 -1
- data/ext/libev/ev_kqueue.c +20 -4
- data/ext/libev/ev_vars.h +15 -16
- data/ext/libev/ev_win32.c +12 -2
- data/ext/libev/ev_wrap.h +162 -160
- data/ext/libev/event.c +29 -6
- data/ext/libev/event.h +9 -2
- data/ext/libev/ltmain.sh +2632 -1384
- data/ext/nginx/ConfigurationCommands.c +1 -1
- data/ext/nginx/ConfigurationCommands.c.erb +3 -1
- data/ext/nginx/ContentHandler.c +25 -2
- data/ext/nginx/CreateLocationConfig.c +1 -0
- data/ext/nginx/CreateLocationConfig.c.erb +1 -1
- data/ext/nginx/MergeLocationConfig.c +1 -0
- data/ext/nginx/MergeLocationConfig.c.erb +1 -1
- data/ext/nginx/config +12 -0
- data/ext/oxt/dynamic_thread_group.hpp +7 -4
- data/ext/oxt/system_calls.cpp +5 -1
- data/ext/oxt/system_calls.hpp +3 -0
- data/helper-scripts/node-loader.js +117 -249
- data/lib/phusion_passenger.rb +27 -5
- data/lib/phusion_passenger/abstract_installer.rb +104 -9
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
- data/lib/phusion_passenger/apache2/config_options.rb +6 -3
- data/lib/phusion_passenger/common_library.rb +7 -1
- data/lib/phusion_passenger/constants.rb +6 -0
- data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
- data/lib/phusion_passenger/nginx/config_options.rb +2 -1
- data/lib/phusion_passenger/packaging.rb +3 -0
- data/lib/phusion_passenger/platform_info/apache.rb +43 -6
- data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
- data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
- data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
- data/lib/phusion_passenger/platform_info/linux.rb +2 -1
- data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
- data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
- data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
- data/lib/phusion_passenger/standalone/start_command.rb +8 -2
- data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
- data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
- data/node_lib/phusion_passenger/line_reader.js +154 -0
- data/node_lib/phusion_passenger/request_handler.js +65 -0
- data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
- data/resources/templates/apache2/deployment_example.txt.erb +2 -1
- data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
- data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
- data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/general_error_with_html.html.template +1 -1
- data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
- data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
- data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
- data/resources/templates/nginx/deployment_example.txt.erb +2 -1
- data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/standalone/config.erb +1 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
- data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
- data/test/cxx/EventedBufferedInputTest.cpp +6 -6
- data/test/cxx/FileBackedPipeTest.cpp +1 -1
- data/test/cxx/MessagePassingTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +4 -4
- data/test/cxx/RequestHandlerTest.cpp +7 -7
- data/test/cxx/UnionStationTest.cpp +2 -2
- data/test/node/line_reader_spec.js +338 -0
- data/test/node/spec_helper.js +27 -0
- data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
- metadata +131 -22
- metadata.gz.asc +7 -7
- data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
- data/ext/boost/lambda/core.hpp +0 -79
- data/ext/boost/lambda/detail/actions.hpp +0 -174
- data/ext/boost/lambda/detail/arity_code.hpp +0 -110
- data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
- data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
- data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
- data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
- data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
- data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
- data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
- data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
- data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
- data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
- data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
- data/ext/boost/lambda/detail/operators.hpp +0 -370
- data/ext/boost/lambda/detail/ret.hpp +0 -325
- data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
- data/ext/boost/lambda/detail/select_functions.hpp +0 -74
- data/ext/boost/lambda/lambda.hpp +0 -34
@@ -0,0 +1,947 @@
|
|
1
|
+
#ifndef BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP
|
2
|
+
#define BOOST_ATOMIC_DETAIL_CAS32WEAK_HPP
|
3
|
+
|
4
|
+
// Distributed under the Boost Software License, Version 1.0.
|
5
|
+
// See accompanying file LICENSE_1_0.txt or copy at
|
6
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
7
|
+
//
|
8
|
+
// Copyright (c) 2011 Helge Bahmann
|
9
|
+
// Copyright (c) 2013 Tim Blechmann
|
10
|
+
|
11
|
+
|
12
|
+
#include <cstddef>
|
13
|
+
#include <boost/cstdint.hpp>
|
14
|
+
#include <boost/memory_order.hpp>
|
15
|
+
#include <boost/atomic/detail/config.hpp>
|
16
|
+
#include <boost/atomic/detail/base.hpp>
|
17
|
+
|
18
|
+
#ifdef BOOST_ATOMIC_HAS_PRAGMA_ONCE
|
19
|
+
#pragma once
|
20
|
+
#endif
|
21
|
+
|
22
|
+
namespace boost {
|
23
|
+
namespace atomics {
|
24
|
+
namespace detail {
|
25
|
+
|
26
|
+
/* integral types */
|
27
|
+
|
28
|
+
template<typename T, bool Sign>
|
29
|
+
class base_atomic<T, int, 1, Sign>
|
30
|
+
{
|
31
|
+
typedef base_atomic this_type;
|
32
|
+
typedef T value_type;
|
33
|
+
typedef T difference_type;
|
34
|
+
typedef uint32_t storage_type;
|
35
|
+
public:
|
36
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
37
|
+
base_atomic(void) {}
|
38
|
+
|
39
|
+
void
|
40
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
41
|
+
{
|
42
|
+
platform_fence_before_store(order);
|
43
|
+
const_cast<volatile storage_type &>(v_) = v;
|
44
|
+
platform_fence_after_store(order);
|
45
|
+
}
|
46
|
+
|
47
|
+
value_type
|
48
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
49
|
+
{
|
50
|
+
value_type v = const_cast<const volatile storage_type &>(v_);
|
51
|
+
platform_fence_after_load(order);
|
52
|
+
return v;
|
53
|
+
}
|
54
|
+
|
55
|
+
value_type
|
56
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
57
|
+
{
|
58
|
+
value_type original = load(memory_order_relaxed);
|
59
|
+
do {
|
60
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
61
|
+
return original;
|
62
|
+
}
|
63
|
+
|
64
|
+
bool
|
65
|
+
compare_exchange_weak(
|
66
|
+
value_type & expected,
|
67
|
+
value_type desired,
|
68
|
+
memory_order success_order,
|
69
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
70
|
+
{
|
71
|
+
platform_fence_before(success_order);
|
72
|
+
|
73
|
+
storage_type expected_s = (storage_type) expected;
|
74
|
+
storage_type desired_s = (storage_type) desired;
|
75
|
+
|
76
|
+
bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
|
77
|
+
|
78
|
+
if (success) {
|
79
|
+
platform_fence_after(success_order);
|
80
|
+
} else {
|
81
|
+
platform_fence_after(failure_order);
|
82
|
+
expected = (value_type) expected_s;
|
83
|
+
}
|
84
|
+
|
85
|
+
return success;
|
86
|
+
}
|
87
|
+
|
88
|
+
bool
|
89
|
+
compare_exchange_strong(
|
90
|
+
value_type & expected,
|
91
|
+
value_type desired,
|
92
|
+
memory_order success_order,
|
93
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
94
|
+
{
|
95
|
+
for(;;) {
|
96
|
+
value_type tmp = expected;
|
97
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
98
|
+
return true;
|
99
|
+
if (tmp != expected) {
|
100
|
+
expected = tmp;
|
101
|
+
return false;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
value_type
|
107
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
108
|
+
{
|
109
|
+
value_type original = load(memory_order_relaxed);
|
110
|
+
do {
|
111
|
+
} while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
|
112
|
+
return original;
|
113
|
+
}
|
114
|
+
|
115
|
+
value_type
|
116
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
117
|
+
{
|
118
|
+
value_type original = load(memory_order_relaxed);
|
119
|
+
do {
|
120
|
+
} while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
|
121
|
+
return original;
|
122
|
+
}
|
123
|
+
|
124
|
+
value_type
|
125
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
126
|
+
{
|
127
|
+
value_type original = load(memory_order_relaxed);
|
128
|
+
do {
|
129
|
+
} while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
|
130
|
+
return original;
|
131
|
+
}
|
132
|
+
|
133
|
+
value_type
|
134
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
135
|
+
{
|
136
|
+
value_type original = load(memory_order_relaxed);
|
137
|
+
do {
|
138
|
+
} while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
|
139
|
+
return original;
|
140
|
+
}
|
141
|
+
|
142
|
+
value_type
|
143
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
144
|
+
{
|
145
|
+
value_type original = load(memory_order_relaxed);
|
146
|
+
do {
|
147
|
+
} while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
|
148
|
+
return original;
|
149
|
+
}
|
150
|
+
|
151
|
+
bool
|
152
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
153
|
+
{
|
154
|
+
return true;
|
155
|
+
}
|
156
|
+
|
157
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
158
|
+
private:
|
159
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
160
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
161
|
+
storage_type v_;
|
162
|
+
};
|
163
|
+
|
164
|
+
template<typename T, bool Sign>
|
165
|
+
class base_atomic<T, int, 2, Sign>
|
166
|
+
{
|
167
|
+
typedef base_atomic this_type;
|
168
|
+
typedef T value_type;
|
169
|
+
typedef T difference_type;
|
170
|
+
typedef uint32_t storage_type;
|
171
|
+
public:
|
172
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
173
|
+
base_atomic(void) {}
|
174
|
+
|
175
|
+
void
|
176
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
177
|
+
{
|
178
|
+
platform_fence_before_store(order);
|
179
|
+
const_cast<volatile storage_type &>(v_) = v;
|
180
|
+
platform_fence_after_store(order);
|
181
|
+
}
|
182
|
+
|
183
|
+
value_type
|
184
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
185
|
+
{
|
186
|
+
value_type v = const_cast<const volatile storage_type &>(v_);
|
187
|
+
platform_fence_after_load(order);
|
188
|
+
return v;
|
189
|
+
}
|
190
|
+
|
191
|
+
value_type
|
192
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
193
|
+
{
|
194
|
+
value_type original = load(memory_order_relaxed);
|
195
|
+
do {
|
196
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
197
|
+
return original;
|
198
|
+
}
|
199
|
+
|
200
|
+
bool
|
201
|
+
compare_exchange_weak(
|
202
|
+
value_type & expected,
|
203
|
+
value_type desired,
|
204
|
+
memory_order success_order,
|
205
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
206
|
+
{
|
207
|
+
platform_fence_before(success_order);
|
208
|
+
|
209
|
+
storage_type expected_s = (storage_type) expected;
|
210
|
+
storage_type desired_s = (storage_type) desired;
|
211
|
+
|
212
|
+
bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
|
213
|
+
|
214
|
+
if (success) {
|
215
|
+
platform_fence_after(success_order);
|
216
|
+
} else {
|
217
|
+
platform_fence_after(failure_order);
|
218
|
+
expected = (value_type) expected_s;
|
219
|
+
}
|
220
|
+
|
221
|
+
return success;
|
222
|
+
}
|
223
|
+
|
224
|
+
bool
|
225
|
+
compare_exchange_strong(
|
226
|
+
value_type & expected,
|
227
|
+
value_type desired,
|
228
|
+
memory_order success_order,
|
229
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
230
|
+
{
|
231
|
+
for(;;) {
|
232
|
+
value_type tmp = expected;
|
233
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
234
|
+
return true;
|
235
|
+
if (tmp != expected) {
|
236
|
+
expected = tmp;
|
237
|
+
return false;
|
238
|
+
}
|
239
|
+
}
|
240
|
+
}
|
241
|
+
|
242
|
+
value_type
|
243
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
244
|
+
{
|
245
|
+
value_type original = load(memory_order_relaxed);
|
246
|
+
do {
|
247
|
+
} while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
|
248
|
+
return original;
|
249
|
+
}
|
250
|
+
|
251
|
+
value_type
|
252
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
253
|
+
{
|
254
|
+
value_type original = load(memory_order_relaxed);
|
255
|
+
do {
|
256
|
+
} while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
|
257
|
+
return original;
|
258
|
+
}
|
259
|
+
|
260
|
+
value_type
|
261
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
262
|
+
{
|
263
|
+
value_type original = load(memory_order_relaxed);
|
264
|
+
do {
|
265
|
+
} while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
|
266
|
+
return original;
|
267
|
+
}
|
268
|
+
|
269
|
+
value_type
|
270
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
271
|
+
{
|
272
|
+
value_type original = load(memory_order_relaxed);
|
273
|
+
do {
|
274
|
+
} while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
|
275
|
+
return original;
|
276
|
+
}
|
277
|
+
|
278
|
+
value_type
|
279
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
280
|
+
{
|
281
|
+
value_type original = load(memory_order_relaxed);
|
282
|
+
do {
|
283
|
+
} while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
|
284
|
+
return original;
|
285
|
+
}
|
286
|
+
|
287
|
+
bool
|
288
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
289
|
+
{
|
290
|
+
return true;
|
291
|
+
}
|
292
|
+
|
293
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
294
|
+
private:
|
295
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
296
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
297
|
+
storage_type v_;
|
298
|
+
};
|
299
|
+
|
300
|
+
template<typename T, bool Sign>
|
301
|
+
class base_atomic<T, int, 4, Sign>
|
302
|
+
{
|
303
|
+
typedef base_atomic this_type;
|
304
|
+
typedef T value_type;
|
305
|
+
typedef T difference_type;
|
306
|
+
public:
|
307
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
308
|
+
base_atomic(void) {}
|
309
|
+
|
310
|
+
void
|
311
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
312
|
+
{
|
313
|
+
platform_fence_before_store(order);
|
314
|
+
const_cast<volatile value_type &>(v_) = v;
|
315
|
+
platform_fence_after_store(order);
|
316
|
+
}
|
317
|
+
|
318
|
+
value_type
|
319
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
320
|
+
{
|
321
|
+
value_type v = const_cast<const volatile value_type &>(v_);
|
322
|
+
platform_fence_after_load(order);
|
323
|
+
return v;
|
324
|
+
}
|
325
|
+
|
326
|
+
value_type
|
327
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
328
|
+
{
|
329
|
+
value_type original = load(memory_order_relaxed);
|
330
|
+
do {
|
331
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
332
|
+
return original;
|
333
|
+
}
|
334
|
+
|
335
|
+
bool
|
336
|
+
compare_exchange_weak(
|
337
|
+
value_type & expected,
|
338
|
+
value_type desired,
|
339
|
+
memory_order success_order,
|
340
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
341
|
+
{
|
342
|
+
platform_fence_before(success_order);
|
343
|
+
|
344
|
+
bool success = platform_cmpxchg32(expected, desired, &v_);
|
345
|
+
|
346
|
+
if (success) {
|
347
|
+
platform_fence_after(success_order);
|
348
|
+
} else {
|
349
|
+
platform_fence_after(failure_order);
|
350
|
+
}
|
351
|
+
|
352
|
+
return success;
|
353
|
+
}
|
354
|
+
|
355
|
+
bool
|
356
|
+
compare_exchange_strong(
|
357
|
+
value_type & expected,
|
358
|
+
value_type desired,
|
359
|
+
memory_order success_order,
|
360
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
361
|
+
{
|
362
|
+
for(;;) {
|
363
|
+
value_type tmp = expected;
|
364
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
365
|
+
return true;
|
366
|
+
if (tmp != expected) {
|
367
|
+
expected = tmp;
|
368
|
+
return false;
|
369
|
+
}
|
370
|
+
}
|
371
|
+
}
|
372
|
+
|
373
|
+
value_type
|
374
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
375
|
+
{
|
376
|
+
value_type original = load(memory_order_relaxed);
|
377
|
+
do {
|
378
|
+
} while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
|
379
|
+
return original;
|
380
|
+
}
|
381
|
+
|
382
|
+
value_type
|
383
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
384
|
+
{
|
385
|
+
value_type original = load(memory_order_relaxed);
|
386
|
+
do {
|
387
|
+
} while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
|
388
|
+
return original;
|
389
|
+
}
|
390
|
+
|
391
|
+
value_type
|
392
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
393
|
+
{
|
394
|
+
value_type original = load(memory_order_relaxed);
|
395
|
+
do {
|
396
|
+
} while (!compare_exchange_weak(original, original & v, order, memory_order_relaxed));
|
397
|
+
return original;
|
398
|
+
}
|
399
|
+
|
400
|
+
value_type
|
401
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
402
|
+
{
|
403
|
+
value_type original = load(memory_order_relaxed);
|
404
|
+
do {
|
405
|
+
} while (!compare_exchange_weak(original, original | v, order, memory_order_relaxed));
|
406
|
+
return original;
|
407
|
+
}
|
408
|
+
|
409
|
+
value_type
|
410
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
411
|
+
{
|
412
|
+
value_type original = load(memory_order_relaxed);
|
413
|
+
do {
|
414
|
+
} while (!compare_exchange_weak(original, original ^ v, order, memory_order_relaxed));
|
415
|
+
return original;
|
416
|
+
}
|
417
|
+
|
418
|
+
bool
|
419
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
420
|
+
{
|
421
|
+
return true;
|
422
|
+
}
|
423
|
+
|
424
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
425
|
+
private:
|
426
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
427
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
428
|
+
value_type v_;
|
429
|
+
};
|
430
|
+
|
431
|
+
/* pointer types */
|
432
|
+
|
433
|
+
template<bool Sign>
|
434
|
+
class base_atomic<void *, void *, 4, Sign>
|
435
|
+
{
|
436
|
+
typedef base_atomic this_type;
|
437
|
+
typedef void * value_type;
|
438
|
+
typedef ptrdiff_t difference_type;
|
439
|
+
public:
|
440
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
441
|
+
base_atomic(void) {}
|
442
|
+
|
443
|
+
void
|
444
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
445
|
+
{
|
446
|
+
platform_fence_before_store(order);
|
447
|
+
const_cast<volatile value_type &>(v_) = v;
|
448
|
+
platform_fence_after_store(order);
|
449
|
+
}
|
450
|
+
|
451
|
+
value_type
|
452
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
453
|
+
{
|
454
|
+
value_type v = const_cast<const volatile value_type &>(v_);
|
455
|
+
platform_fence_after_load(order);
|
456
|
+
return v;
|
457
|
+
}
|
458
|
+
|
459
|
+
value_type
|
460
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
461
|
+
{
|
462
|
+
value_type original = load(memory_order_relaxed);
|
463
|
+
do {
|
464
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
465
|
+
return original;
|
466
|
+
}
|
467
|
+
|
468
|
+
bool
|
469
|
+
compare_exchange_weak(
|
470
|
+
value_type & expected,
|
471
|
+
value_type desired,
|
472
|
+
memory_order success_order,
|
473
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
474
|
+
{
|
475
|
+
platform_fence_before(success_order);
|
476
|
+
|
477
|
+
bool success = platform_cmpxchg32(expected, desired, &v_);
|
478
|
+
|
479
|
+
if (success) {
|
480
|
+
platform_fence_after(success_order);
|
481
|
+
} else {
|
482
|
+
platform_fence_after(failure_order);
|
483
|
+
}
|
484
|
+
|
485
|
+
return success;
|
486
|
+
}
|
487
|
+
|
488
|
+
bool
|
489
|
+
compare_exchange_strong(
|
490
|
+
value_type & expected,
|
491
|
+
value_type desired,
|
492
|
+
memory_order success_order,
|
493
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
494
|
+
{
|
495
|
+
for(;;) {
|
496
|
+
value_type tmp = expected;
|
497
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
498
|
+
return true;
|
499
|
+
if (tmp != expected) {
|
500
|
+
expected = tmp;
|
501
|
+
return false;
|
502
|
+
}
|
503
|
+
}
|
504
|
+
}
|
505
|
+
|
506
|
+
bool
|
507
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
508
|
+
{
|
509
|
+
return true;
|
510
|
+
}
|
511
|
+
|
512
|
+
value_type
|
513
|
+
fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
514
|
+
{
|
515
|
+
value_type original = load(memory_order_relaxed);
|
516
|
+
do {
|
517
|
+
} while (!compare_exchange_weak(original, (char*)original + v, order, memory_order_relaxed));
|
518
|
+
return original;
|
519
|
+
}
|
520
|
+
|
521
|
+
value_type
|
522
|
+
fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
523
|
+
{
|
524
|
+
value_type original = load(memory_order_relaxed);
|
525
|
+
do {
|
526
|
+
} while (!compare_exchange_weak(original, (char*)original - v, order, memory_order_relaxed));
|
527
|
+
return original;
|
528
|
+
}
|
529
|
+
|
530
|
+
BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
|
531
|
+
private:
|
532
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
533
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
534
|
+
value_type v_;
|
535
|
+
};
|
536
|
+
|
537
|
+
template<typename T, bool Sign>
|
538
|
+
class base_atomic<T *, void *, 4, Sign>
|
539
|
+
{
|
540
|
+
typedef base_atomic this_type;
|
541
|
+
typedef T * value_type;
|
542
|
+
typedef ptrdiff_t difference_type;
|
543
|
+
public:
|
544
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
545
|
+
base_atomic(void) {}
|
546
|
+
|
547
|
+
void
|
548
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
549
|
+
{
|
550
|
+
platform_fence_before_store(order);
|
551
|
+
const_cast<volatile value_type &>(v_) = v;
|
552
|
+
platform_fence_after_store(order);
|
553
|
+
}
|
554
|
+
|
555
|
+
value_type
|
556
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
557
|
+
{
|
558
|
+
value_type v = const_cast<const volatile value_type &>(v_);
|
559
|
+
platform_fence_after_load(order);
|
560
|
+
return v;
|
561
|
+
}
|
562
|
+
|
563
|
+
value_type
|
564
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
565
|
+
{
|
566
|
+
value_type original = load(memory_order_relaxed);
|
567
|
+
do {
|
568
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
569
|
+
return original;
|
570
|
+
}
|
571
|
+
|
572
|
+
bool
|
573
|
+
compare_exchange_weak(
|
574
|
+
value_type & expected,
|
575
|
+
value_type desired,
|
576
|
+
memory_order success_order,
|
577
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
578
|
+
{
|
579
|
+
platform_fence_before(success_order);
|
580
|
+
|
581
|
+
bool success = platform_cmpxchg32(expected, desired, &v_);
|
582
|
+
|
583
|
+
if (success) {
|
584
|
+
platform_fence_after(success_order);
|
585
|
+
} else {
|
586
|
+
platform_fence_after(failure_order);
|
587
|
+
}
|
588
|
+
|
589
|
+
return success;
|
590
|
+
}
|
591
|
+
|
592
|
+
bool
|
593
|
+
compare_exchange_strong(
|
594
|
+
value_type & expected,
|
595
|
+
value_type desired,
|
596
|
+
memory_order success_order,
|
597
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
598
|
+
{
|
599
|
+
for(;;) {
|
600
|
+
value_type tmp = expected;
|
601
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
602
|
+
return true;
|
603
|
+
if (tmp != expected) {
|
604
|
+
expected = tmp;
|
605
|
+
return false;
|
606
|
+
}
|
607
|
+
}
|
608
|
+
}
|
609
|
+
|
610
|
+
value_type
|
611
|
+
fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
612
|
+
{
|
613
|
+
value_type original = load(memory_order_relaxed);
|
614
|
+
do {
|
615
|
+
} while (!compare_exchange_weak(original, original + v, order, memory_order_relaxed));
|
616
|
+
return original;
|
617
|
+
}
|
618
|
+
|
619
|
+
value_type
|
620
|
+
fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
621
|
+
{
|
622
|
+
value_type original = load(memory_order_relaxed);
|
623
|
+
do {
|
624
|
+
} while (!compare_exchange_weak(original, original - v, order, memory_order_relaxed));
|
625
|
+
return original;
|
626
|
+
}
|
627
|
+
|
628
|
+
bool
|
629
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
630
|
+
{
|
631
|
+
return true;
|
632
|
+
}
|
633
|
+
|
634
|
+
BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
|
635
|
+
private:
|
636
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
637
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
638
|
+
value_type v_;
|
639
|
+
};
|
640
|
+
|
641
|
+
/* generic types */
|
642
|
+
|
643
|
+
template<typename T, bool Sign>
|
644
|
+
class base_atomic<T, void, 1, Sign>
|
645
|
+
{
|
646
|
+
typedef base_atomic this_type;
|
647
|
+
typedef T value_type;
|
648
|
+
typedef uint32_t storage_type;
|
649
|
+
public:
|
650
|
+
explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
|
651
|
+
{
|
652
|
+
memcpy(&v_, &v, sizeof(value_type));
|
653
|
+
}
|
654
|
+
|
655
|
+
base_atomic(void) {}
|
656
|
+
|
657
|
+
void
|
658
|
+
store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
659
|
+
{
|
660
|
+
storage_type tmp = 0;
|
661
|
+
memcpy(&tmp, &v, sizeof(value_type));
|
662
|
+
platform_fence_before_store(order);
|
663
|
+
const_cast<volatile storage_type &>(v_) = tmp;
|
664
|
+
platform_fence_after_store(order);
|
665
|
+
}
|
666
|
+
|
667
|
+
value_type
|
668
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
669
|
+
{
|
670
|
+
storage_type tmp = const_cast<const volatile storage_type &>(v_);
|
671
|
+
platform_fence_after_load(order);
|
672
|
+
|
673
|
+
value_type v;
|
674
|
+
memcpy(&v, &tmp, sizeof(value_type));
|
675
|
+
return v;
|
676
|
+
}
|
677
|
+
|
678
|
+
value_type
|
679
|
+
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
680
|
+
{
|
681
|
+
value_type original = load(memory_order_relaxed);
|
682
|
+
do {
|
683
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
684
|
+
return original;
|
685
|
+
}
|
686
|
+
|
687
|
+
bool
|
688
|
+
compare_exchange_weak(
|
689
|
+
value_type & expected,
|
690
|
+
value_type const& desired,
|
691
|
+
memory_order success_order,
|
692
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
693
|
+
{
|
694
|
+
storage_type expected_s = 0, desired_s = 0;
|
695
|
+
memcpy(&expected_s, &expected, sizeof(value_type));
|
696
|
+
memcpy(&desired_s, &desired, sizeof(value_type));
|
697
|
+
|
698
|
+
platform_fence_before(success_order);
|
699
|
+
|
700
|
+
bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
|
701
|
+
|
702
|
+
if (success) {
|
703
|
+
platform_fence_after(success_order);
|
704
|
+
} else {
|
705
|
+
platform_fence_after(failure_order);
|
706
|
+
memcpy(&expected, &expected_s, sizeof(value_type));
|
707
|
+
}
|
708
|
+
|
709
|
+
return success;
|
710
|
+
}
|
711
|
+
|
712
|
+
bool
|
713
|
+
compare_exchange_strong(
|
714
|
+
value_type & expected,
|
715
|
+
value_type const& desired,
|
716
|
+
memory_order success_order,
|
717
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
718
|
+
{
|
719
|
+
for(;;) {
|
720
|
+
value_type tmp = expected;
|
721
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
722
|
+
return true;
|
723
|
+
if (tmp != expected) {
|
724
|
+
expected = tmp;
|
725
|
+
return false;
|
726
|
+
}
|
727
|
+
}
|
728
|
+
}
|
729
|
+
|
730
|
+
bool
|
731
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
732
|
+
{
|
733
|
+
return true;
|
734
|
+
}
|
735
|
+
|
736
|
+
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
|
737
|
+
private:
|
738
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
739
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
740
|
+
storage_type v_;
|
741
|
+
};
|
742
|
+
|
743
|
+
template<typename T, bool Sign>
|
744
|
+
class base_atomic<T, void, 2, Sign>
|
745
|
+
{
|
746
|
+
typedef base_atomic this_type;
|
747
|
+
typedef T value_type;
|
748
|
+
typedef uint32_t storage_type;
|
749
|
+
public:
|
750
|
+
explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
|
751
|
+
{
|
752
|
+
memcpy(&v_, &v, sizeof(value_type));
|
753
|
+
}
|
754
|
+
|
755
|
+
base_atomic(void) {}
|
756
|
+
|
757
|
+
void
|
758
|
+
store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
759
|
+
{
|
760
|
+
storage_type tmp = 0;
|
761
|
+
memcpy(&tmp, &v, sizeof(value_type));
|
762
|
+
platform_fence_before_store(order);
|
763
|
+
const_cast<volatile storage_type &>(v_) = tmp;
|
764
|
+
platform_fence_after_store(order);
|
765
|
+
}
|
766
|
+
|
767
|
+
value_type
|
768
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
769
|
+
{
|
770
|
+
storage_type tmp = const_cast<const volatile storage_type &>(v_);
|
771
|
+
platform_fence_after_load(order);
|
772
|
+
|
773
|
+
value_type v;
|
774
|
+
memcpy(&v, &tmp, sizeof(value_type));
|
775
|
+
return v;
|
776
|
+
}
|
777
|
+
|
778
|
+
value_type
|
779
|
+
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
780
|
+
{
|
781
|
+
value_type original = load(memory_order_relaxed);
|
782
|
+
do {
|
783
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
784
|
+
return original;
|
785
|
+
}
|
786
|
+
|
787
|
+
bool
|
788
|
+
compare_exchange_weak(
|
789
|
+
value_type & expected,
|
790
|
+
value_type const& desired,
|
791
|
+
memory_order success_order,
|
792
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
793
|
+
{
|
794
|
+
storage_type expected_s = 0, desired_s = 0;
|
795
|
+
memcpy(&expected_s, &expected, sizeof(value_type));
|
796
|
+
memcpy(&desired_s, &desired, sizeof(value_type));
|
797
|
+
|
798
|
+
platform_fence_before(success_order);
|
799
|
+
|
800
|
+
bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
|
801
|
+
|
802
|
+
if (success) {
|
803
|
+
platform_fence_after(success_order);
|
804
|
+
} else {
|
805
|
+
platform_fence_after(failure_order);
|
806
|
+
memcpy(&expected, &expected_s, sizeof(value_type));
|
807
|
+
}
|
808
|
+
|
809
|
+
return success;
|
810
|
+
}
|
811
|
+
|
812
|
+
bool
|
813
|
+
compare_exchange_strong(
|
814
|
+
value_type & expected,
|
815
|
+
value_type const& desired,
|
816
|
+
memory_order success_order,
|
817
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
818
|
+
{
|
819
|
+
for(;;) {
|
820
|
+
value_type tmp = expected;
|
821
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
822
|
+
return true;
|
823
|
+
if (tmp != expected) {
|
824
|
+
expected = tmp;
|
825
|
+
return false;
|
826
|
+
}
|
827
|
+
}
|
828
|
+
}
|
829
|
+
|
830
|
+
bool
|
831
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
832
|
+
{
|
833
|
+
return true;
|
834
|
+
}
|
835
|
+
|
836
|
+
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
|
837
|
+
private:
|
838
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
839
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
840
|
+
storage_type v_;
|
841
|
+
};
|
842
|
+
|
843
|
+
template<typename T, bool Sign>
|
844
|
+
class base_atomic<T, void, 4, Sign>
|
845
|
+
{
|
846
|
+
typedef base_atomic this_type;
|
847
|
+
typedef T value_type;
|
848
|
+
typedef uint32_t storage_type;
|
849
|
+
public:
|
850
|
+
explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
|
851
|
+
{
|
852
|
+
memcpy(&v_, &v, sizeof(value_type));
|
853
|
+
}
|
854
|
+
|
855
|
+
base_atomic(void) {}
|
856
|
+
|
857
|
+
void
|
858
|
+
store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
859
|
+
{
|
860
|
+
storage_type tmp = 0;
|
861
|
+
memcpy(&tmp, &v, sizeof(value_type));
|
862
|
+
platform_fence_before_store(order);
|
863
|
+
const_cast<volatile storage_type &>(v_) = tmp;
|
864
|
+
platform_fence_after_store(order);
|
865
|
+
}
|
866
|
+
|
867
|
+
value_type
|
868
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
869
|
+
{
|
870
|
+
storage_type tmp = const_cast<const volatile storage_type &>(v_);
|
871
|
+
platform_fence_after_load(order);
|
872
|
+
|
873
|
+
value_type v;
|
874
|
+
memcpy(&v, &tmp, sizeof(value_type));
|
875
|
+
return v;
|
876
|
+
}
|
877
|
+
|
878
|
+
value_type
|
879
|
+
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
880
|
+
{
|
881
|
+
value_type original = load(memory_order_relaxed);
|
882
|
+
do {
|
883
|
+
} while (!compare_exchange_weak(original, v, order, memory_order_relaxed));
|
884
|
+
return original;
|
885
|
+
}
|
886
|
+
|
887
|
+
bool
|
888
|
+
compare_exchange_weak(
|
889
|
+
value_type & expected,
|
890
|
+
value_type const& desired,
|
891
|
+
memory_order success_order,
|
892
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
893
|
+
{
|
894
|
+
storage_type expected_s = 0, desired_s = 0;
|
895
|
+
memcpy(&expected_s, &expected, sizeof(value_type));
|
896
|
+
memcpy(&desired_s, &desired, sizeof(value_type));
|
897
|
+
|
898
|
+
platform_fence_before(success_order);
|
899
|
+
|
900
|
+
bool success = platform_cmpxchg32(expected_s, desired_s, &v_);
|
901
|
+
|
902
|
+
if (success) {
|
903
|
+
platform_fence_after(success_order);
|
904
|
+
} else {
|
905
|
+
platform_fence_after(failure_order);
|
906
|
+
memcpy(&expected, &expected_s, sizeof(value_type));
|
907
|
+
}
|
908
|
+
|
909
|
+
return success;
|
910
|
+
}
|
911
|
+
|
912
|
+
bool
|
913
|
+
compare_exchange_strong(
|
914
|
+
value_type & expected,
|
915
|
+
value_type const& desired,
|
916
|
+
memory_order success_order,
|
917
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
918
|
+
{
|
919
|
+
for(;;) {
|
920
|
+
value_type tmp = expected;
|
921
|
+
if (compare_exchange_weak(tmp, desired, success_order, failure_order))
|
922
|
+
return true;
|
923
|
+
if (tmp != expected) {
|
924
|
+
expected = tmp;
|
925
|
+
return false;
|
926
|
+
}
|
927
|
+
}
|
928
|
+
}
|
929
|
+
|
930
|
+
bool
|
931
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
932
|
+
{
|
933
|
+
return true;
|
934
|
+
}
|
935
|
+
|
936
|
+
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
|
937
|
+
private:
|
938
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
939
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
940
|
+
storage_type v_;
|
941
|
+
};
|
942
|
+
|
943
|
+
}
|
944
|
+
}
|
945
|
+
}
|
946
|
+
|
947
|
+
#endif
|