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,1259 @@
|
|
1
|
+
#ifndef BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP
|
2
|
+
#define BOOST_ATOMIC_DETAIL_GCC_SPARC_HPP
|
3
|
+
|
4
|
+
// Copyright (c) 2010 Helge Bahmann
|
5
|
+
// Copyright (c) 2013 Tim Blechmann
|
6
|
+
//
|
7
|
+
// Distributed under the Boost Software License, Version 1.0.
|
8
|
+
// See accompanying file LICENSE_1_0.txt or copy at
|
9
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
10
|
+
|
11
|
+
#include <cstddef>
|
12
|
+
#include <boost/cstdint.hpp>
|
13
|
+
#include <boost/atomic/detail/config.hpp>
|
14
|
+
|
15
|
+
#ifdef BOOST_ATOMIC_HAS_PRAGMA_ONCE
|
16
|
+
#pragma once
|
17
|
+
#endif
|
18
|
+
|
19
|
+
namespace boost {
|
20
|
+
namespace atomics {
|
21
|
+
namespace detail {
|
22
|
+
|
23
|
+
inline void
|
24
|
+
platform_fence_before(memory_order order)
|
25
|
+
{
|
26
|
+
switch(order) {
|
27
|
+
case memory_order_relaxed:
|
28
|
+
case memory_order_acquire:
|
29
|
+
case memory_order_consume:
|
30
|
+
break;
|
31
|
+
case memory_order_release:
|
32
|
+
case memory_order_acq_rel:
|
33
|
+
__asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
|
34
|
+
/* release */
|
35
|
+
break;
|
36
|
+
case memory_order_seq_cst:
|
37
|
+
__asm__ __volatile__ ("membar #Sync" ::: "memory");
|
38
|
+
/* seq */
|
39
|
+
break;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
inline void
|
44
|
+
platform_fence_after(memory_order order)
|
45
|
+
{
|
46
|
+
switch(order) {
|
47
|
+
case memory_order_relaxed:
|
48
|
+
case memory_order_release:
|
49
|
+
break;
|
50
|
+
case memory_order_acquire:
|
51
|
+
case memory_order_acq_rel:
|
52
|
+
__asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
|
53
|
+
/* acquire */
|
54
|
+
break;
|
55
|
+
case memory_order_consume:
|
56
|
+
/* consume */
|
57
|
+
break;
|
58
|
+
case memory_order_seq_cst:
|
59
|
+
__asm__ __volatile__ ("membar #Sync" ::: "memory");
|
60
|
+
/* seq */
|
61
|
+
break;
|
62
|
+
default:;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
|
66
|
+
inline void
|
67
|
+
platform_fence_after_store(memory_order order)
|
68
|
+
{
|
69
|
+
switch(order) {
|
70
|
+
case memory_order_seq_cst:
|
71
|
+
__asm__ __volatile__ ("membar #Sync" ::: "memory");
|
72
|
+
default:;
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
|
77
|
+
inline void
|
78
|
+
platform_fence_after_load(memory_order order)
|
79
|
+
{
|
80
|
+
platform_fence_after(order);
|
81
|
+
}
|
82
|
+
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
class atomic_flag
|
87
|
+
{
|
88
|
+
private:
|
89
|
+
atomic_flag(const atomic_flag &) /* = delete */ ;
|
90
|
+
atomic_flag & operator=(const atomic_flag &) /* = delete */ ;
|
91
|
+
uint32_t v_;
|
92
|
+
public:
|
93
|
+
BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(0) {}
|
94
|
+
|
95
|
+
void
|
96
|
+
clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
97
|
+
{
|
98
|
+
atomics::detail::platform_fence_before(order);
|
99
|
+
const_cast<volatile uint32_t &>(v_) = 0;
|
100
|
+
atomics::detail::platform_fence_after_store(order);
|
101
|
+
}
|
102
|
+
|
103
|
+
bool
|
104
|
+
test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
105
|
+
{
|
106
|
+
atomics::detail::platform_fence_before(order);
|
107
|
+
uint32_t tmp = 1;
|
108
|
+
__asm__ (
|
109
|
+
"cas [%1], %2, %0"
|
110
|
+
: "+r" (tmp)
|
111
|
+
: "r" (&v_), "r" (0)
|
112
|
+
: "memory"
|
113
|
+
);
|
114
|
+
atomics::detail::platform_fence_after(order);
|
115
|
+
return tmp;
|
116
|
+
}
|
117
|
+
};
|
118
|
+
|
119
|
+
} /* namespace boost */
|
120
|
+
|
121
|
+
#define BOOST_ATOMIC_FLAG_LOCK_FREE 2
|
122
|
+
|
123
|
+
#include <boost/atomic/detail/base.hpp>
|
124
|
+
|
125
|
+
#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
|
126
|
+
|
127
|
+
#define BOOST_ATOMIC_CHAR_LOCK_FREE 2
|
128
|
+
#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 2
|
129
|
+
#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 2
|
130
|
+
#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2
|
131
|
+
#define BOOST_ATOMIC_SHORT_LOCK_FREE 2
|
132
|
+
#define BOOST_ATOMIC_INT_LOCK_FREE 2
|
133
|
+
#define BOOST_ATOMIC_LONG_LOCK_FREE 2
|
134
|
+
#define BOOST_ATOMIC_LLONG_LOCK_FREE 0
|
135
|
+
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
|
136
|
+
#define BOOST_ATOMIC_BOOL_LOCK_FREE 2
|
137
|
+
|
138
|
+
namespace boost {
|
139
|
+
|
140
|
+
#define BOOST_ATOMIC_THREAD_FENCE 2
|
141
|
+
inline void
|
142
|
+
atomic_thread_fence(memory_order order)
|
143
|
+
{
|
144
|
+
switch(order) {
|
145
|
+
case memory_order_relaxed:
|
146
|
+
break;
|
147
|
+
case memory_order_release:
|
148
|
+
__asm__ __volatile__ ("membar #StoreStore | #LoadStore" ::: "memory");
|
149
|
+
break;
|
150
|
+
case memory_order_acquire:
|
151
|
+
__asm__ __volatile__ ("membar #LoadLoad | #LoadStore" ::: "memory");
|
152
|
+
break;
|
153
|
+
case memory_order_acq_rel:
|
154
|
+
__asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore" ::: "memory");
|
155
|
+
break;
|
156
|
+
case memory_order_consume:
|
157
|
+
break;
|
158
|
+
case memory_order_seq_cst:
|
159
|
+
__asm__ __volatile__ ("membar #Sync" ::: "memory");
|
160
|
+
break;
|
161
|
+
default:;
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
#define BOOST_ATOMIC_SIGNAL_FENCE 2
|
166
|
+
inline void
|
167
|
+
atomic_signal_fence(memory_order)
|
168
|
+
{
|
169
|
+
__asm__ __volatile__ ("" ::: "memory");
|
170
|
+
}
|
171
|
+
|
172
|
+
namespace atomics {
|
173
|
+
namespace detail {
|
174
|
+
|
175
|
+
/* integral types */
|
176
|
+
|
177
|
+
template<typename T>
|
178
|
+
class base_atomic<T, int, 1, true>
|
179
|
+
{
|
180
|
+
typedef base_atomic this_type;
|
181
|
+
typedef T value_type;
|
182
|
+
typedef T difference_type;
|
183
|
+
typedef int32_t storage_type;
|
184
|
+
public:
|
185
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
186
|
+
base_atomic(void) {}
|
187
|
+
|
188
|
+
void
|
189
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
190
|
+
{
|
191
|
+
platform_fence_before(order);
|
192
|
+
const_cast<volatile storage_type &>(v_) = v;
|
193
|
+
platform_fence_after_store(order);
|
194
|
+
}
|
195
|
+
|
196
|
+
value_type
|
197
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
198
|
+
{
|
199
|
+
value_type v = const_cast<const volatile storage_type &>(v_);
|
200
|
+
platform_fence_after_load(order);
|
201
|
+
return v;
|
202
|
+
}
|
203
|
+
|
204
|
+
value_type
|
205
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
206
|
+
{
|
207
|
+
value_type tmp = load(memory_order_relaxed);
|
208
|
+
do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
|
209
|
+
return tmp;
|
210
|
+
}
|
211
|
+
|
212
|
+
value_type
|
213
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
214
|
+
{
|
215
|
+
value_type tmp = load(memory_order_relaxed);
|
216
|
+
do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
|
217
|
+
return tmp;
|
218
|
+
}
|
219
|
+
|
220
|
+
value_type
|
221
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
222
|
+
{
|
223
|
+
value_type tmp = load(memory_order_relaxed);
|
224
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
225
|
+
return tmp;
|
226
|
+
}
|
227
|
+
|
228
|
+
bool
|
229
|
+
compare_exchange_strong(
|
230
|
+
value_type & expected,
|
231
|
+
value_type desired,
|
232
|
+
memory_order success_order,
|
233
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
234
|
+
{
|
235
|
+
platform_fence_before(success_order);
|
236
|
+
storage_type desired_s = desired;
|
237
|
+
__asm__ (
|
238
|
+
"cas [%1], %2, %0"
|
239
|
+
: "+r" (desired_s)
|
240
|
+
: "r" (&v_), "r" ((storage_type)expected)
|
241
|
+
: "memory"
|
242
|
+
);
|
243
|
+
desired = desired_s;
|
244
|
+
bool success = (desired == expected);
|
245
|
+
if (success)
|
246
|
+
platform_fence_after(success_order);
|
247
|
+
else
|
248
|
+
platform_fence_after(failure_order);
|
249
|
+
expected = desired;
|
250
|
+
return success;
|
251
|
+
}
|
252
|
+
|
253
|
+
bool
|
254
|
+
compare_exchange_weak(
|
255
|
+
value_type & expected,
|
256
|
+
value_type desired,
|
257
|
+
memory_order success_order,
|
258
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
259
|
+
{
|
260
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
261
|
+
}
|
262
|
+
|
263
|
+
value_type
|
264
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
265
|
+
{
|
266
|
+
value_type tmp = load(memory_order_relaxed);
|
267
|
+
do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
|
268
|
+
return tmp;
|
269
|
+
}
|
270
|
+
|
271
|
+
value_type
|
272
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
273
|
+
{
|
274
|
+
value_type tmp = load(memory_order_relaxed);
|
275
|
+
do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
|
276
|
+
return tmp;
|
277
|
+
}
|
278
|
+
|
279
|
+
value_type
|
280
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
281
|
+
{
|
282
|
+
value_type tmp = load(memory_order_relaxed);
|
283
|
+
do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
|
284
|
+
return tmp;
|
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>
|
301
|
+
class base_atomic<T, int, 1, false>
|
302
|
+
{
|
303
|
+
typedef base_atomic this_type;
|
304
|
+
typedef T value_type;
|
305
|
+
typedef T difference_type;
|
306
|
+
typedef uint32_t storage_type;
|
307
|
+
public:
|
308
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
309
|
+
base_atomic(void) {}
|
310
|
+
|
311
|
+
void
|
312
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
313
|
+
{
|
314
|
+
platform_fence_before(order);
|
315
|
+
const_cast<volatile storage_type &>(v_) = v;
|
316
|
+
platform_fence_after_store(order);
|
317
|
+
}
|
318
|
+
|
319
|
+
value_type
|
320
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
321
|
+
{
|
322
|
+
value_type v = const_cast<const volatile storage_type &>(v_);
|
323
|
+
platform_fence_after_load(order);
|
324
|
+
return v;
|
325
|
+
}
|
326
|
+
|
327
|
+
value_type
|
328
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
329
|
+
{
|
330
|
+
value_type tmp = load(memory_order_relaxed);
|
331
|
+
do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
|
332
|
+
return tmp;
|
333
|
+
}
|
334
|
+
|
335
|
+
value_type
|
336
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
337
|
+
{
|
338
|
+
value_type tmp = load(memory_order_relaxed);
|
339
|
+
do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
|
340
|
+
return tmp;
|
341
|
+
}
|
342
|
+
|
343
|
+
value_type
|
344
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
345
|
+
{
|
346
|
+
value_type tmp = load(memory_order_relaxed);
|
347
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
348
|
+
return tmp;
|
349
|
+
}
|
350
|
+
|
351
|
+
bool
|
352
|
+
compare_exchange_strong(
|
353
|
+
value_type & expected,
|
354
|
+
value_type desired,
|
355
|
+
memory_order success_order,
|
356
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
357
|
+
{
|
358
|
+
platform_fence_before(success_order);
|
359
|
+
storage_type desired_s = desired;
|
360
|
+
__asm__ (
|
361
|
+
"cas [%1], %2, %0"
|
362
|
+
: "+r" (desired_s)
|
363
|
+
: "r" (&v_), "r" ((storage_type)expected)
|
364
|
+
: "memory"
|
365
|
+
);
|
366
|
+
desired = desired_s;
|
367
|
+
bool success = (desired == expected);
|
368
|
+
if (success)
|
369
|
+
platform_fence_after(success_order);
|
370
|
+
else
|
371
|
+
platform_fence_after(failure_order);
|
372
|
+
expected = desired;
|
373
|
+
return success;
|
374
|
+
}
|
375
|
+
|
376
|
+
bool
|
377
|
+
compare_exchange_weak(
|
378
|
+
value_type & expected,
|
379
|
+
value_type desired,
|
380
|
+
memory_order success_order,
|
381
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
382
|
+
{
|
383
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
384
|
+
}
|
385
|
+
|
386
|
+
value_type
|
387
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
388
|
+
{
|
389
|
+
value_type tmp = load(memory_order_relaxed);
|
390
|
+
do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
|
391
|
+
return tmp;
|
392
|
+
}
|
393
|
+
|
394
|
+
value_type
|
395
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
396
|
+
{
|
397
|
+
value_type tmp = load(memory_order_relaxed);
|
398
|
+
do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
|
399
|
+
return tmp;
|
400
|
+
}
|
401
|
+
|
402
|
+
value_type
|
403
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
404
|
+
{
|
405
|
+
value_type tmp = load(memory_order_relaxed);
|
406
|
+
do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
|
407
|
+
return tmp;
|
408
|
+
}
|
409
|
+
|
410
|
+
bool
|
411
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
412
|
+
{
|
413
|
+
return true;
|
414
|
+
}
|
415
|
+
|
416
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
417
|
+
private:
|
418
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
419
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
420
|
+
storage_type v_;
|
421
|
+
};
|
422
|
+
|
423
|
+
template<typename T>
|
424
|
+
class base_atomic<T, int, 2, true>
|
425
|
+
{
|
426
|
+
typedef base_atomic this_type;
|
427
|
+
typedef T value_type;
|
428
|
+
typedef T difference_type;
|
429
|
+
typedef int32_t storage_type;
|
430
|
+
public:
|
431
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
432
|
+
base_atomic(void) {}
|
433
|
+
|
434
|
+
void
|
435
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
436
|
+
{
|
437
|
+
platform_fence_before(order);
|
438
|
+
const_cast<volatile storage_type &>(v_) = v;
|
439
|
+
platform_fence_after_store(order);
|
440
|
+
}
|
441
|
+
|
442
|
+
value_type
|
443
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
444
|
+
{
|
445
|
+
value_type v = const_cast<const volatile storage_type &>(v_);
|
446
|
+
platform_fence_after_load(order);
|
447
|
+
return v;
|
448
|
+
}
|
449
|
+
|
450
|
+
value_type
|
451
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
452
|
+
{
|
453
|
+
value_type tmp = load(memory_order_relaxed);
|
454
|
+
do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
|
455
|
+
return tmp;
|
456
|
+
}
|
457
|
+
|
458
|
+
value_type
|
459
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
460
|
+
{
|
461
|
+
value_type tmp = load(memory_order_relaxed);
|
462
|
+
do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
|
463
|
+
return tmp;
|
464
|
+
}
|
465
|
+
|
466
|
+
value_type
|
467
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
468
|
+
{
|
469
|
+
value_type tmp = load(memory_order_relaxed);
|
470
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
471
|
+
return tmp;
|
472
|
+
}
|
473
|
+
|
474
|
+
bool
|
475
|
+
compare_exchange_strong(
|
476
|
+
value_type & expected,
|
477
|
+
value_type desired,
|
478
|
+
memory_order success_order,
|
479
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
480
|
+
{
|
481
|
+
platform_fence_before(success_order);
|
482
|
+
storage_type desired_s = desired;
|
483
|
+
__asm__ (
|
484
|
+
"cas [%1], %2, %0"
|
485
|
+
: "+r" (desired_s)
|
486
|
+
: "r" (&v_), "r" ((storage_type)expected)
|
487
|
+
: "memory"
|
488
|
+
);
|
489
|
+
desired = desired_s;
|
490
|
+
bool success = (desired == expected);
|
491
|
+
if (success)
|
492
|
+
platform_fence_after(success_order);
|
493
|
+
else
|
494
|
+
platform_fence_after(failure_order);
|
495
|
+
expected = desired;
|
496
|
+
return success;
|
497
|
+
}
|
498
|
+
|
499
|
+
bool
|
500
|
+
compare_exchange_weak(
|
501
|
+
value_type & expected,
|
502
|
+
value_type desired,
|
503
|
+
memory_order success_order,
|
504
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
505
|
+
{
|
506
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
507
|
+
}
|
508
|
+
|
509
|
+
value_type
|
510
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
511
|
+
{
|
512
|
+
value_type tmp = load(memory_order_relaxed);
|
513
|
+
do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
|
514
|
+
return tmp;
|
515
|
+
}
|
516
|
+
|
517
|
+
value_type
|
518
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
519
|
+
{
|
520
|
+
value_type tmp = load(memory_order_relaxed);
|
521
|
+
do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
|
522
|
+
return tmp;
|
523
|
+
}
|
524
|
+
|
525
|
+
value_type
|
526
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
527
|
+
{
|
528
|
+
value_type tmp = load(memory_order_relaxed);
|
529
|
+
do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
|
530
|
+
return tmp;
|
531
|
+
}
|
532
|
+
|
533
|
+
bool
|
534
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
535
|
+
{
|
536
|
+
return true;
|
537
|
+
}
|
538
|
+
|
539
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
540
|
+
private:
|
541
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
542
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
543
|
+
storage_type v_;
|
544
|
+
};
|
545
|
+
|
546
|
+
template<typename T>
|
547
|
+
class base_atomic<T, int, 2, false>
|
548
|
+
{
|
549
|
+
typedef base_atomic this_type;
|
550
|
+
typedef T value_type;
|
551
|
+
typedef T difference_type;
|
552
|
+
typedef uint32_t storage_type;
|
553
|
+
public:
|
554
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
555
|
+
base_atomic(void) {}
|
556
|
+
|
557
|
+
void
|
558
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
559
|
+
{
|
560
|
+
platform_fence_before(order);
|
561
|
+
const_cast<volatile storage_type &>(v_) = v;
|
562
|
+
platform_fence_after_store(order);
|
563
|
+
}
|
564
|
+
|
565
|
+
value_type
|
566
|
+
load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
567
|
+
{
|
568
|
+
value_type v = const_cast<const volatile storage_type &>(v_);
|
569
|
+
platform_fence_after_load(order);
|
570
|
+
return v;
|
571
|
+
}
|
572
|
+
|
573
|
+
value_type
|
574
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
575
|
+
{
|
576
|
+
value_type tmp = load(memory_order_relaxed);
|
577
|
+
do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
|
578
|
+
return tmp;
|
579
|
+
}
|
580
|
+
|
581
|
+
value_type
|
582
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
583
|
+
{
|
584
|
+
value_type tmp = load(memory_order_relaxed);
|
585
|
+
do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
|
586
|
+
return tmp;
|
587
|
+
}
|
588
|
+
|
589
|
+
value_type
|
590
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
591
|
+
{
|
592
|
+
value_type tmp = load(memory_order_relaxed);
|
593
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
594
|
+
return tmp;
|
595
|
+
}
|
596
|
+
|
597
|
+
bool
|
598
|
+
compare_exchange_strong(
|
599
|
+
value_type & expected,
|
600
|
+
value_type desired,
|
601
|
+
memory_order success_order,
|
602
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
603
|
+
{
|
604
|
+
platform_fence_before(success_order);
|
605
|
+
storage_type desired_s = desired;
|
606
|
+
__asm__ (
|
607
|
+
"cas [%1], %2, %0"
|
608
|
+
: "+r" (desired_s)
|
609
|
+
: "r" (&v_), "r" ((storage_type)expected)
|
610
|
+
: "memory"
|
611
|
+
);
|
612
|
+
desired = desired_s;
|
613
|
+
bool success = (desired == expected);
|
614
|
+
if (success)
|
615
|
+
platform_fence_after(success_order);
|
616
|
+
else
|
617
|
+
platform_fence_after(failure_order);
|
618
|
+
expected = desired;
|
619
|
+
return success;
|
620
|
+
}
|
621
|
+
|
622
|
+
bool
|
623
|
+
compare_exchange_weak(
|
624
|
+
value_type & expected,
|
625
|
+
value_type desired,
|
626
|
+
memory_order success_order,
|
627
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
628
|
+
{
|
629
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
630
|
+
}
|
631
|
+
|
632
|
+
value_type
|
633
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
634
|
+
{
|
635
|
+
value_type tmp = load(memory_order_relaxed);
|
636
|
+
do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
|
637
|
+
return tmp;
|
638
|
+
}
|
639
|
+
|
640
|
+
value_type
|
641
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
642
|
+
{
|
643
|
+
value_type tmp = load(memory_order_relaxed);
|
644
|
+
do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
|
645
|
+
return tmp;
|
646
|
+
}
|
647
|
+
|
648
|
+
value_type
|
649
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
650
|
+
{
|
651
|
+
value_type tmp = load(memory_order_relaxed);
|
652
|
+
do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
|
653
|
+
return tmp;
|
654
|
+
}
|
655
|
+
|
656
|
+
bool
|
657
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
658
|
+
{
|
659
|
+
return true;
|
660
|
+
}
|
661
|
+
|
662
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
663
|
+
private:
|
664
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
665
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
666
|
+
storage_type v_;
|
667
|
+
};
|
668
|
+
|
669
|
+
template<typename T, bool Sign>
|
670
|
+
class base_atomic<T, int, 4, Sign>
|
671
|
+
{
|
672
|
+
typedef base_atomic this_type;
|
673
|
+
typedef T value_type;
|
674
|
+
typedef T difference_type;
|
675
|
+
public:
|
676
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
677
|
+
base_atomic(void) {}
|
678
|
+
|
679
|
+
void
|
680
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
681
|
+
{
|
682
|
+
platform_fence_before(order);
|
683
|
+
const_cast<volatile value_type &>(v_) = v;
|
684
|
+
platform_fence_after_store(order);
|
685
|
+
}
|
686
|
+
|
687
|
+
value_type
|
688
|
+
load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
|
689
|
+
{
|
690
|
+
value_type v = const_cast<const volatile value_type &>(v_);
|
691
|
+
platform_fence_after_load(order);
|
692
|
+
return v;
|
693
|
+
}
|
694
|
+
|
695
|
+
value_type
|
696
|
+
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
697
|
+
{
|
698
|
+
value_type tmp = load(memory_order_relaxed);
|
699
|
+
do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
|
700
|
+
return tmp;
|
701
|
+
}
|
702
|
+
|
703
|
+
value_type
|
704
|
+
fetch_sub(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
705
|
+
{
|
706
|
+
value_type tmp = load(memory_order_relaxed);
|
707
|
+
do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
|
708
|
+
return tmp;
|
709
|
+
}
|
710
|
+
|
711
|
+
value_type
|
712
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
713
|
+
{
|
714
|
+
value_type tmp = load(memory_order_relaxed);
|
715
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
716
|
+
return tmp;
|
717
|
+
}
|
718
|
+
|
719
|
+
bool
|
720
|
+
compare_exchange_strong(
|
721
|
+
value_type & expected,
|
722
|
+
value_type desired,
|
723
|
+
memory_order success_order,
|
724
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
725
|
+
{
|
726
|
+
platform_fence_before(success_order);
|
727
|
+
__asm__ (
|
728
|
+
"cas [%1], %2, %0"
|
729
|
+
: "+r" (desired)
|
730
|
+
: "r" (&v_), "r" (expected)
|
731
|
+
: "memory"
|
732
|
+
);
|
733
|
+
bool success = (desired == expected);
|
734
|
+
if (success)
|
735
|
+
platform_fence_after(success_order);
|
736
|
+
else
|
737
|
+
platform_fence_after(failure_order);
|
738
|
+
expected = desired;
|
739
|
+
return success;
|
740
|
+
}
|
741
|
+
|
742
|
+
bool
|
743
|
+
compare_exchange_weak(
|
744
|
+
value_type & expected,
|
745
|
+
value_type desired,
|
746
|
+
memory_order success_order,
|
747
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
748
|
+
{
|
749
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
750
|
+
}
|
751
|
+
|
752
|
+
value_type
|
753
|
+
fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
754
|
+
{
|
755
|
+
value_type tmp = load(memory_order_relaxed);
|
756
|
+
do {} while(!compare_exchange_weak(tmp, tmp & v, order, memory_order_relaxed));
|
757
|
+
return tmp;
|
758
|
+
}
|
759
|
+
|
760
|
+
value_type
|
761
|
+
fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
762
|
+
{
|
763
|
+
value_type tmp = load(memory_order_relaxed);
|
764
|
+
do {} while(!compare_exchange_weak(tmp, tmp | v, order, memory_order_relaxed));
|
765
|
+
return tmp;
|
766
|
+
}
|
767
|
+
|
768
|
+
value_type
|
769
|
+
fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
770
|
+
{
|
771
|
+
value_type tmp = load(memory_order_relaxed);
|
772
|
+
do {} while(!compare_exchange_weak(tmp, tmp ^ v, order, memory_order_relaxed));
|
773
|
+
return tmp;
|
774
|
+
}
|
775
|
+
|
776
|
+
bool
|
777
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
778
|
+
{
|
779
|
+
return true;
|
780
|
+
}
|
781
|
+
|
782
|
+
BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
|
783
|
+
private:
|
784
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
785
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
786
|
+
value_type v_;
|
787
|
+
};
|
788
|
+
|
789
|
+
/* pointer types */
|
790
|
+
|
791
|
+
template<bool Sign>
|
792
|
+
class base_atomic<void *, void *, 4, Sign>
|
793
|
+
{
|
794
|
+
typedef base_atomic this_type;
|
795
|
+
typedef ptrdiff_t difference_type;
|
796
|
+
typedef void * value_type;
|
797
|
+
public:
|
798
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
799
|
+
base_atomic(void) {}
|
800
|
+
|
801
|
+
void
|
802
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
803
|
+
{
|
804
|
+
platform_fence_before(order);
|
805
|
+
const_cast<volatile value_type &>(v_) = v;
|
806
|
+
platform_fence_after_store(order);
|
807
|
+
}
|
808
|
+
|
809
|
+
value_type load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
|
810
|
+
{
|
811
|
+
value_type v = const_cast<const volatile value_type &>(v_);
|
812
|
+
platform_fence_after_load(order);
|
813
|
+
return v;
|
814
|
+
}
|
815
|
+
|
816
|
+
value_type
|
817
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
818
|
+
{
|
819
|
+
value_type tmp = load(memory_order_relaxed);
|
820
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
821
|
+
return tmp;
|
822
|
+
}
|
823
|
+
|
824
|
+
bool
|
825
|
+
compare_exchange_strong(
|
826
|
+
value_type & expected,
|
827
|
+
value_type desired,
|
828
|
+
memory_order success_order,
|
829
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
830
|
+
{
|
831
|
+
platform_fence_before(success_order);
|
832
|
+
__asm__ (
|
833
|
+
"cas [%1], %2, %0"
|
834
|
+
: "+r" (desired)
|
835
|
+
: "r" (&v_), "r" (expected)
|
836
|
+
: "memory"
|
837
|
+
);
|
838
|
+
bool success = (desired == expected);
|
839
|
+
if (success)
|
840
|
+
platform_fence_after(success_order);
|
841
|
+
else
|
842
|
+
platform_fence_after(failure_order);
|
843
|
+
expected = desired;
|
844
|
+
return success;
|
845
|
+
}
|
846
|
+
|
847
|
+
|
848
|
+
bool compare_exchange_weak(value_type & expected, value_type desired,
|
849
|
+
memory_order success_order,
|
850
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
851
|
+
{
|
852
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
853
|
+
}
|
854
|
+
|
855
|
+
bool
|
856
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
857
|
+
{
|
858
|
+
return true;
|
859
|
+
}
|
860
|
+
|
861
|
+
value_type
|
862
|
+
fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
863
|
+
{
|
864
|
+
value_type tmp = load(memory_order_relaxed);
|
865
|
+
do {} while(!compare_exchange_weak(tmp, (char*)tmp + v, order, memory_order_relaxed));
|
866
|
+
return tmp;
|
867
|
+
}
|
868
|
+
|
869
|
+
value_type
|
870
|
+
fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
871
|
+
{
|
872
|
+
value_type tmp = load(memory_order_relaxed);
|
873
|
+
do {} while(!compare_exchange_weak(tmp, (char*)tmp - v, order, memory_order_relaxed));
|
874
|
+
return tmp;
|
875
|
+
}
|
876
|
+
|
877
|
+
BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
|
878
|
+
|
879
|
+
private:
|
880
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
881
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
882
|
+
value_type v_;
|
883
|
+
};
|
884
|
+
|
885
|
+
template<typename T, bool Sign>
|
886
|
+
class base_atomic<T *, void *, 4, Sign>
|
887
|
+
{
|
888
|
+
typedef base_atomic this_type;
|
889
|
+
typedef T * value_type;
|
890
|
+
typedef ptrdiff_t difference_type;
|
891
|
+
public:
|
892
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
|
893
|
+
base_atomic(void) {}
|
894
|
+
|
895
|
+
void
|
896
|
+
store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
897
|
+
{
|
898
|
+
platform_fence_before(order);
|
899
|
+
const_cast<volatile value_type &>(v_) = v;
|
900
|
+
platform_fence_after_store(order);
|
901
|
+
}
|
902
|
+
|
903
|
+
value_type
|
904
|
+
load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
|
905
|
+
{
|
906
|
+
value_type v = const_cast<const volatile value_type &>(v_);
|
907
|
+
platform_fence_after_load(order);
|
908
|
+
return v;
|
909
|
+
}
|
910
|
+
|
911
|
+
value_type
|
912
|
+
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
913
|
+
{
|
914
|
+
value_type tmp = load(memory_order_relaxed);
|
915
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
916
|
+
return tmp;
|
917
|
+
}
|
918
|
+
|
919
|
+
bool
|
920
|
+
compare_exchange_strong(
|
921
|
+
value_type & expected,
|
922
|
+
value_type desired,
|
923
|
+
memory_order success_order,
|
924
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
925
|
+
{
|
926
|
+
platform_fence_before(success_order);
|
927
|
+
__asm__ (
|
928
|
+
"cas [%1], %2, %0"
|
929
|
+
: "+r" (desired)
|
930
|
+
: "r" (&v_), "r" (expected)
|
931
|
+
: "memory"
|
932
|
+
);
|
933
|
+
bool success = (desired == expected);
|
934
|
+
if (success)
|
935
|
+
platform_fence_after(success_order);
|
936
|
+
else
|
937
|
+
platform_fence_after(failure_order);
|
938
|
+
expected = desired;
|
939
|
+
return success;
|
940
|
+
}
|
941
|
+
|
942
|
+
bool
|
943
|
+
compare_exchange_weak(
|
944
|
+
value_type & expected,
|
945
|
+
value_type desired,
|
946
|
+
memory_order success_order,
|
947
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
948
|
+
{
|
949
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
950
|
+
}
|
951
|
+
|
952
|
+
value_type
|
953
|
+
fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
954
|
+
{
|
955
|
+
value_type tmp = load(memory_order_relaxed);
|
956
|
+
do {} while(!compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed));
|
957
|
+
return tmp;
|
958
|
+
}
|
959
|
+
|
960
|
+
value_type
|
961
|
+
fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
962
|
+
{
|
963
|
+
value_type tmp = load(memory_order_relaxed);
|
964
|
+
do {} while(!compare_exchange_weak(tmp, tmp - v, order, memory_order_relaxed));
|
965
|
+
return tmp;
|
966
|
+
}
|
967
|
+
|
968
|
+
bool
|
969
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
970
|
+
{
|
971
|
+
return true;
|
972
|
+
}
|
973
|
+
|
974
|
+
BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
|
975
|
+
private:
|
976
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
977
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
978
|
+
value_type v_;
|
979
|
+
};
|
980
|
+
|
981
|
+
/* generic types */
|
982
|
+
|
983
|
+
template<typename T, bool Sign>
|
984
|
+
class base_atomic<T, void, 1, Sign>
|
985
|
+
{
|
986
|
+
typedef base_atomic this_type;
|
987
|
+
typedef T value_type;
|
988
|
+
typedef uint32_t storage_type;
|
989
|
+
public:
|
990
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
|
991
|
+
{
|
992
|
+
memcpy(&v_, &v, sizeof(value_type));
|
993
|
+
}
|
994
|
+
base_atomic(void) {}
|
995
|
+
|
996
|
+
void
|
997
|
+
store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
998
|
+
{
|
999
|
+
storage_type tmp = 0;
|
1000
|
+
memcpy(&tmp, &v, sizeof(value_type));
|
1001
|
+
platform_fence_before(order);
|
1002
|
+
const_cast<volatile storage_type &>(v_) = tmp;
|
1003
|
+
platform_fence_after_store(order);
|
1004
|
+
}
|
1005
|
+
|
1006
|
+
value_type
|
1007
|
+
load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
|
1008
|
+
{
|
1009
|
+
storage_type tmp = const_cast<volatile storage_type &>(v_);
|
1010
|
+
platform_fence_after_load(order);
|
1011
|
+
value_type v;
|
1012
|
+
memcpy(&v, &tmp, sizeof(value_type));
|
1013
|
+
return v;
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
value_type
|
1017
|
+
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
1018
|
+
{
|
1019
|
+
value_type tmp = load(memory_order_relaxed);
|
1020
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
1021
|
+
return tmp;
|
1022
|
+
}
|
1023
|
+
|
1024
|
+
bool
|
1025
|
+
compare_exchange_strong(
|
1026
|
+
value_type & expected,
|
1027
|
+
value_type const& desired,
|
1028
|
+
memory_order success_order,
|
1029
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
1030
|
+
{
|
1031
|
+
storage_type expected_s = 0, desired_s = 0;
|
1032
|
+
memcpy(&expected_s, &expected, sizeof(value_type));
|
1033
|
+
memcpy(&desired_s, &desired, sizeof(value_type));
|
1034
|
+
platform_fence_before(success_order);
|
1035
|
+
__asm__ (
|
1036
|
+
"cas [%1], %2, %0"
|
1037
|
+
: "+r" (desired_s)
|
1038
|
+
: "r" (&v_), "r" (expected_s)
|
1039
|
+
: "memory"
|
1040
|
+
);
|
1041
|
+
bool success = (desired_s == expected_s);
|
1042
|
+
if (success)
|
1043
|
+
platform_fence_after(success_order);
|
1044
|
+
else
|
1045
|
+
platform_fence_after(failure_order);
|
1046
|
+
memcpy(&expected, &desired_s, sizeof(value_type));
|
1047
|
+
return success;
|
1048
|
+
}
|
1049
|
+
|
1050
|
+
bool
|
1051
|
+
compare_exchange_weak(
|
1052
|
+
value_type & expected,
|
1053
|
+
value_type const& desired,
|
1054
|
+
memory_order success_order,
|
1055
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
1056
|
+
{
|
1057
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
1058
|
+
}
|
1059
|
+
|
1060
|
+
bool
|
1061
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
1062
|
+
{
|
1063
|
+
return true;
|
1064
|
+
}
|
1065
|
+
|
1066
|
+
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
|
1067
|
+
private:
|
1068
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
1069
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
1070
|
+
storage_type v_;
|
1071
|
+
};
|
1072
|
+
|
1073
|
+
template<typename T, bool Sign>
|
1074
|
+
class base_atomic<T, void, 2, Sign>
|
1075
|
+
{
|
1076
|
+
typedef base_atomic this_type;
|
1077
|
+
typedef T value_type;
|
1078
|
+
typedef uint32_t storage_type;
|
1079
|
+
public:
|
1080
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
|
1081
|
+
{
|
1082
|
+
memcpy(&v_, &v, sizeof(value_type));
|
1083
|
+
}
|
1084
|
+
base_atomic(void) {}
|
1085
|
+
|
1086
|
+
void
|
1087
|
+
store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
1088
|
+
{
|
1089
|
+
storage_type tmp = 0;
|
1090
|
+
memcpy(&tmp, &v, sizeof(value_type));
|
1091
|
+
platform_fence_before(order);
|
1092
|
+
const_cast<volatile storage_type &>(v_) = tmp;
|
1093
|
+
platform_fence_after_store(order);
|
1094
|
+
}
|
1095
|
+
|
1096
|
+
value_type
|
1097
|
+
load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
|
1098
|
+
{
|
1099
|
+
storage_type tmp = const_cast<volatile storage_type &>(v_);
|
1100
|
+
platform_fence_after_load(order);
|
1101
|
+
value_type v;
|
1102
|
+
memcpy(&v, &tmp, sizeof(value_type));
|
1103
|
+
return v;
|
1104
|
+
}
|
1105
|
+
|
1106
|
+
value_type
|
1107
|
+
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
1108
|
+
{
|
1109
|
+
value_type tmp = load(memory_order_relaxed);
|
1110
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
1111
|
+
return tmp;
|
1112
|
+
}
|
1113
|
+
|
1114
|
+
bool
|
1115
|
+
compare_exchange_strong(
|
1116
|
+
value_type & expected,
|
1117
|
+
value_type const& desired,
|
1118
|
+
memory_order success_order,
|
1119
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
1120
|
+
{
|
1121
|
+
storage_type expected_s = 0, desired_s = 0;
|
1122
|
+
memcpy(&expected_s, &expected, sizeof(value_type));
|
1123
|
+
memcpy(&desired_s, &desired, sizeof(value_type));
|
1124
|
+
platform_fence_before(success_order);
|
1125
|
+
__asm__ (
|
1126
|
+
"cas [%1], %2, %0"
|
1127
|
+
: "+r" (desired_s)
|
1128
|
+
: "r" (&v_), "r" (expected_s)
|
1129
|
+
: "memory"
|
1130
|
+
);
|
1131
|
+
bool success = (desired_s == expected_s);
|
1132
|
+
if (success)
|
1133
|
+
platform_fence_after(success_order);
|
1134
|
+
else
|
1135
|
+
platform_fence_after(failure_order);
|
1136
|
+
memcpy(&expected, &desired_s, sizeof(value_type));
|
1137
|
+
return success;
|
1138
|
+
}
|
1139
|
+
|
1140
|
+
bool
|
1141
|
+
compare_exchange_weak(
|
1142
|
+
value_type & expected,
|
1143
|
+
value_type const& desired,
|
1144
|
+
memory_order success_order,
|
1145
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
1146
|
+
{
|
1147
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
1148
|
+
}
|
1149
|
+
|
1150
|
+
bool
|
1151
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
1152
|
+
{
|
1153
|
+
return true;
|
1154
|
+
}
|
1155
|
+
|
1156
|
+
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
|
1157
|
+
private:
|
1158
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
1159
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
1160
|
+
storage_type v_;
|
1161
|
+
};
|
1162
|
+
|
1163
|
+
template<typename T, bool Sign>
|
1164
|
+
class base_atomic<T, void, 4, Sign>
|
1165
|
+
{
|
1166
|
+
typedef base_atomic this_type;
|
1167
|
+
typedef T value_type;
|
1168
|
+
typedef uint32_t storage_type;
|
1169
|
+
public:
|
1170
|
+
BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(0)
|
1171
|
+
{
|
1172
|
+
memcpy(&v_, &v, sizeof(value_type));
|
1173
|
+
}
|
1174
|
+
base_atomic(void) {}
|
1175
|
+
|
1176
|
+
void
|
1177
|
+
store(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
1178
|
+
{
|
1179
|
+
storage_type tmp = 0;
|
1180
|
+
memcpy(&tmp, &v, sizeof(value_type));
|
1181
|
+
platform_fence_before(order);
|
1182
|
+
const_cast<volatile storage_type &>(v_) = tmp;
|
1183
|
+
platform_fence_after_store(order);
|
1184
|
+
}
|
1185
|
+
|
1186
|
+
value_type
|
1187
|
+
load(memory_order order = memory_order_seq_cst)const volatile BOOST_NOEXCEPT
|
1188
|
+
{
|
1189
|
+
storage_type tmp = const_cast<volatile storage_type &>(v_);
|
1190
|
+
platform_fence_after_load(order);
|
1191
|
+
value_type v;
|
1192
|
+
memcpy(&v, &tmp, sizeof(value_type));
|
1193
|
+
return v;
|
1194
|
+
}
|
1195
|
+
|
1196
|
+
value_type
|
1197
|
+
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
1198
|
+
{
|
1199
|
+
value_type tmp = load(memory_order_relaxed);
|
1200
|
+
do {} while(!compare_exchange_weak(tmp, v, order, memory_order_relaxed));
|
1201
|
+
return tmp;
|
1202
|
+
}
|
1203
|
+
|
1204
|
+
bool
|
1205
|
+
compare_exchange_strong(
|
1206
|
+
value_type & expected,
|
1207
|
+
value_type const& desired,
|
1208
|
+
memory_order success_order,
|
1209
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
1210
|
+
{
|
1211
|
+
storage_type expected_s = 0, desired_s = 0;
|
1212
|
+
memcpy(&expected_s, &expected, sizeof(value_type));
|
1213
|
+
memcpy(&desired_s, &desired, sizeof(value_type));
|
1214
|
+
platform_fence_before(success_order);
|
1215
|
+
__asm__ (
|
1216
|
+
"cas [%1], %2, %0"
|
1217
|
+
: "+r" (desired_s)
|
1218
|
+
: "r" (&v_), "r" (expected_s)
|
1219
|
+
: "memory"
|
1220
|
+
);
|
1221
|
+
bool success = (desired_s == expected_s);
|
1222
|
+
if (success)
|
1223
|
+
platform_fence_after(success_order);
|
1224
|
+
else
|
1225
|
+
platform_fence_after(failure_order);
|
1226
|
+
memcpy(&expected, &desired_s, sizeof(value_type));
|
1227
|
+
return success;
|
1228
|
+
}
|
1229
|
+
|
1230
|
+
bool
|
1231
|
+
compare_exchange_weak(
|
1232
|
+
value_type & expected,
|
1233
|
+
value_type const& desired,
|
1234
|
+
memory_order success_order,
|
1235
|
+
memory_order failure_order) volatile BOOST_NOEXCEPT
|
1236
|
+
{
|
1237
|
+
return compare_exchange_strong(expected, desired, success_order, failure_order);
|
1238
|
+
}
|
1239
|
+
|
1240
|
+
bool
|
1241
|
+
is_lock_free(void) const volatile BOOST_NOEXCEPT
|
1242
|
+
{
|
1243
|
+
return true;
|
1244
|
+
}
|
1245
|
+
|
1246
|
+
BOOST_ATOMIC_DECLARE_BASE_OPERATORS
|
1247
|
+
private:
|
1248
|
+
base_atomic(const base_atomic &) /* = delete */ ;
|
1249
|
+
void operator=(const base_atomic &) /* = delete */ ;
|
1250
|
+
storage_type v_;
|
1251
|
+
};
|
1252
|
+
|
1253
|
+
#endif /* !defined(BOOST_ATOMIC_FORCE_FALLBACK) */
|
1254
|
+
|
1255
|
+
}
|
1256
|
+
}
|
1257
|
+
}
|
1258
|
+
|
1259
|
+
#endif
|