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,313 @@
|
|
1
|
+
#ifndef BOOST_THREAD_PTHREAD_ONCE_ATOMIC_HPP
|
2
|
+
#define BOOST_THREAD_PTHREAD_ONCE_ATOMIC_HPP
|
3
|
+
|
4
|
+
// once.hpp
|
5
|
+
//
|
6
|
+
// (C) Copyright 2013 Andrey Semashev
|
7
|
+
// (C) Copyright 2013 Vicente J. Botet Escriba
|
8
|
+
//
|
9
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
10
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
11
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
12
|
+
|
13
|
+
#include <boost/thread/detail/config.hpp>
|
14
|
+
|
15
|
+
#include <boost/cstdint.hpp>
|
16
|
+
#include <boost/thread/detail/move.hpp>
|
17
|
+
#include <boost/thread/detail/invoke.hpp>
|
18
|
+
#include <boost/detail/no_exceptions_support.hpp>
|
19
|
+
#include <boost/bind.hpp>
|
20
|
+
#include <boost/atomic.hpp>
|
21
|
+
|
22
|
+
#include <boost/config/abi_prefix.hpp>
|
23
|
+
|
24
|
+
namespace boost
|
25
|
+
{
|
26
|
+
|
27
|
+
struct once_flag;
|
28
|
+
|
29
|
+
namespace thread_detail
|
30
|
+
{
|
31
|
+
|
32
|
+
#if BOOST_ATOMIC_INT_LOCK_FREE == 2
|
33
|
+
typedef unsigned int atomic_int_type;
|
34
|
+
#elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2
|
35
|
+
typedef unsigned short atomic_int_type;
|
36
|
+
#elif BOOST_ATOMIC_CHAR_LOCK_FREE == 2
|
37
|
+
typedef unsigned char atomic_int_type;
|
38
|
+
#elif BOOST_ATOMIC_LONG_LOCK_FREE == 2
|
39
|
+
typedef unsigned long atomic_int_type;
|
40
|
+
#elif defined(BOOST_HAS_LONG_LONG) && BOOST_ATOMIC_LLONG_LOCK_FREE == 2
|
41
|
+
typedef ulong_long_type atomic_int_type;
|
42
|
+
#else
|
43
|
+
// All tested integer types are not atomic, the spinlock pool will be used
|
44
|
+
typedef unsigned int atomic_int_type;
|
45
|
+
#endif
|
46
|
+
|
47
|
+
typedef boost::atomic<atomic_int_type> atomic_type;
|
48
|
+
|
49
|
+
BOOST_THREAD_DECL bool enter_once_region(once_flag& flag) BOOST_NOEXCEPT;
|
50
|
+
BOOST_THREAD_DECL void commit_once_region(once_flag& flag) BOOST_NOEXCEPT;
|
51
|
+
BOOST_THREAD_DECL void rollback_once_region(once_flag& flag) BOOST_NOEXCEPT;
|
52
|
+
inline atomic_type& get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT;
|
53
|
+
}
|
54
|
+
|
55
|
+
#ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
|
56
|
+
|
57
|
+
struct once_flag
|
58
|
+
{
|
59
|
+
BOOST_THREAD_NO_COPYABLE(once_flag)
|
60
|
+
BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT : storage(0)
|
61
|
+
{
|
62
|
+
}
|
63
|
+
|
64
|
+
private:
|
65
|
+
thread_detail::atomic_type storage;
|
66
|
+
|
67
|
+
friend BOOST_THREAD_DECL bool thread_detail::enter_once_region(once_flag& flag) BOOST_NOEXCEPT;
|
68
|
+
friend BOOST_THREAD_DECL void thread_detail::commit_once_region(once_flag& flag) BOOST_NOEXCEPT;
|
69
|
+
friend BOOST_THREAD_DECL void thread_detail::rollback_once_region(once_flag& flag) BOOST_NOEXCEPT;
|
70
|
+
friend thread_detail::atomic_type& thread_detail::get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT;
|
71
|
+
};
|
72
|
+
|
73
|
+
#define BOOST_ONCE_INIT boost::once_flag()
|
74
|
+
|
75
|
+
namespace thread_detail
|
76
|
+
{
|
77
|
+
inline atomic_type& get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT
|
78
|
+
{
|
79
|
+
//return reinterpret_cast< atomic_type& >(flag.storage);
|
80
|
+
return flag.storage;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
#else // BOOST_THREAD_PROVIDES_ONCE_CXX11
|
85
|
+
struct once_flag
|
86
|
+
{
|
87
|
+
// The thread_detail::atomic_int_type storage is marked
|
88
|
+
// with this attribute in order to let the compiler know that it will alias this member
|
89
|
+
// and silence compilation warnings.
|
90
|
+
BOOST_THREAD_ATTRIBUTE_MAY_ALIAS thread_detail::atomic_int_type storage;
|
91
|
+
};
|
92
|
+
|
93
|
+
#define BOOST_ONCE_INIT {0}
|
94
|
+
|
95
|
+
namespace thread_detail
|
96
|
+
{
|
97
|
+
inline atomic_type& get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT
|
98
|
+
{
|
99
|
+
return reinterpret_cast< atomic_type& >(flag.storage);
|
100
|
+
}
|
101
|
+
|
102
|
+
}
|
103
|
+
|
104
|
+
#endif // BOOST_THREAD_PROVIDES_ONCE_CXX11
|
105
|
+
|
106
|
+
#if defined BOOST_THREAD_PROVIDES_INVOKE
|
107
|
+
#define BOOST_THREAD_INVOKE_RET_VOID detail::invoke
|
108
|
+
#define BOOST_THREAD_INVOKE_RET_VOID_CALL
|
109
|
+
#elif defined BOOST_THREAD_PROVIDES_INVOKE_RET
|
110
|
+
#define BOOST_THREAD_INVOKE_RET_VOID detail::invoke<void>
|
111
|
+
#define BOOST_THREAD_INVOKE_RET_VOID_CALL
|
112
|
+
#else
|
113
|
+
#define BOOST_THREAD_INVOKE_RET_VOID boost::bind
|
114
|
+
#define BOOST_THREAD_INVOKE_RET_VOID_CALL ()
|
115
|
+
#endif
|
116
|
+
|
117
|
+
|
118
|
+
#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
|
119
|
+
|
120
|
+
template<typename Function, class ...ArgTypes>
|
121
|
+
inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(ArgTypes)... args)
|
122
|
+
{
|
123
|
+
if (thread_detail::enter_once_region(flag))
|
124
|
+
{
|
125
|
+
BOOST_TRY
|
126
|
+
{
|
127
|
+
BOOST_THREAD_INVOKE_RET_VOID(
|
128
|
+
thread_detail::decay_copy(boost::forward<Function>(f)),
|
129
|
+
thread_detail::decay_copy(boost::forward<ArgTypes>(args))...
|
130
|
+
) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
131
|
+
}
|
132
|
+
BOOST_CATCH (...)
|
133
|
+
{
|
134
|
+
thread_detail::rollback_once_region(flag);
|
135
|
+
BOOST_RETHROW
|
136
|
+
}
|
137
|
+
BOOST_CATCH_END
|
138
|
+
thread_detail::commit_once_region(flag);
|
139
|
+
}
|
140
|
+
}
|
141
|
+
#else
|
142
|
+
template<typename Function>
|
143
|
+
inline void call_once(once_flag& flag, Function f)
|
144
|
+
{
|
145
|
+
if (thread_detail::enter_once_region(flag))
|
146
|
+
{
|
147
|
+
BOOST_TRY
|
148
|
+
{
|
149
|
+
f();
|
150
|
+
}
|
151
|
+
BOOST_CATCH (...)
|
152
|
+
{
|
153
|
+
thread_detail::rollback_once_region(flag);
|
154
|
+
BOOST_RETHROW
|
155
|
+
}
|
156
|
+
BOOST_CATCH_END
|
157
|
+
thread_detail::commit_once_region(flag);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
template<typename Function, typename T1>
|
162
|
+
inline void call_once(once_flag& flag, Function f, T1 p1)
|
163
|
+
{
|
164
|
+
if (thread_detail::enter_once_region(flag))
|
165
|
+
{
|
166
|
+
BOOST_TRY
|
167
|
+
{
|
168
|
+
BOOST_THREAD_INVOKE_RET_VOID(f, p1) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
169
|
+
}
|
170
|
+
BOOST_CATCH (...)
|
171
|
+
{
|
172
|
+
thread_detail::rollback_once_region(flag);
|
173
|
+
BOOST_RETHROW
|
174
|
+
}
|
175
|
+
BOOST_CATCH_END
|
176
|
+
thread_detail::commit_once_region(flag);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
|
180
|
+
template<typename Function, typename T1, typename T2>
|
181
|
+
inline void call_once(once_flag& flag, Function f, T1 p1, T2 p2)
|
182
|
+
{
|
183
|
+
if (thread_detail::enter_once_region(flag))
|
184
|
+
{
|
185
|
+
BOOST_TRY
|
186
|
+
{
|
187
|
+
BOOST_THREAD_INVOKE_RET_VOID(f, p1, p2) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
188
|
+
}
|
189
|
+
BOOST_CATCH (...)
|
190
|
+
{
|
191
|
+
thread_detail::rollback_once_region(flag);
|
192
|
+
BOOST_RETHROW
|
193
|
+
}
|
194
|
+
BOOST_CATCH_END
|
195
|
+
thread_detail::commit_once_region(flag);
|
196
|
+
}
|
197
|
+
}
|
198
|
+
|
199
|
+
template<typename Function, typename T1, typename T2, typename T3>
|
200
|
+
inline void call_once(once_flag& flag, Function f, T1 p1, T2 p2, T3 p3)
|
201
|
+
{
|
202
|
+
if (thread_detail::enter_once_region(flag))
|
203
|
+
{
|
204
|
+
BOOST_TRY
|
205
|
+
{
|
206
|
+
BOOST_THREAD_INVOKE_RET_VOID(f, p1, p2, p3) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
207
|
+
}
|
208
|
+
BOOST_CATCH (...)
|
209
|
+
{
|
210
|
+
thread_detail::rollback_once_region(flag);
|
211
|
+
BOOST_RETHROW
|
212
|
+
}
|
213
|
+
BOOST_CATCH_END
|
214
|
+
thread_detail::commit_once_region(flag);
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
template<typename Function>
|
219
|
+
inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f)
|
220
|
+
{
|
221
|
+
if (thread_detail::enter_once_region(flag))
|
222
|
+
{
|
223
|
+
BOOST_TRY
|
224
|
+
{
|
225
|
+
f();
|
226
|
+
}
|
227
|
+
BOOST_CATCH (...)
|
228
|
+
{
|
229
|
+
thread_detail::rollback_once_region(flag);
|
230
|
+
BOOST_RETHROW
|
231
|
+
}
|
232
|
+
BOOST_CATCH_END
|
233
|
+
thread_detail::commit_once_region(flag);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
|
237
|
+
template<typename Function, typename T1>
|
238
|
+
inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(T1) p1)
|
239
|
+
{
|
240
|
+
if (thread_detail::enter_once_region(flag))
|
241
|
+
{
|
242
|
+
BOOST_TRY
|
243
|
+
{
|
244
|
+
BOOST_THREAD_INVOKE_RET_VOID(
|
245
|
+
thread_detail::decay_copy(boost::forward<Function>(f)),
|
246
|
+
thread_detail::decay_copy(boost::forward<T1>(p1))
|
247
|
+
) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
248
|
+
}
|
249
|
+
BOOST_CATCH (...)
|
250
|
+
{
|
251
|
+
thread_detail::rollback_once_region(flag);
|
252
|
+
BOOST_RETHROW
|
253
|
+
}
|
254
|
+
BOOST_CATCH_END
|
255
|
+
thread_detail::commit_once_region(flag);
|
256
|
+
}
|
257
|
+
}
|
258
|
+
template<typename Function, typename T1, typename T2>
|
259
|
+
inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(T1) p1, BOOST_THREAD_RV_REF(T2) p2)
|
260
|
+
{
|
261
|
+
if (thread_detail::enter_once_region(flag))
|
262
|
+
{
|
263
|
+
BOOST_TRY
|
264
|
+
{
|
265
|
+
BOOST_THREAD_INVOKE_RET_VOID(
|
266
|
+
thread_detail::decay_copy(boost::forward<Function>(f)),
|
267
|
+
thread_detail::decay_copy(boost::forward<T1>(p1)),
|
268
|
+
thread_detail::decay_copy(boost::forward<T1>(p2))
|
269
|
+
) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
270
|
+
}
|
271
|
+
BOOST_CATCH (...)
|
272
|
+
{
|
273
|
+
thread_detail::rollback_once_region(flag);
|
274
|
+
BOOST_RETHROW
|
275
|
+
}
|
276
|
+
BOOST_CATCH_END
|
277
|
+
thread_detail::commit_once_region(flag);
|
278
|
+
}
|
279
|
+
}
|
280
|
+
template<typename Function, typename T1, typename T2, typename T3>
|
281
|
+
inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(T1) p1, BOOST_THREAD_RV_REF(T2) p2, BOOST_THREAD_RV_REF(T3) p3)
|
282
|
+
{
|
283
|
+
if (thread_detail::enter_once_region(flag))
|
284
|
+
{
|
285
|
+
BOOST_TRY
|
286
|
+
{
|
287
|
+
BOOST_THREAD_INVOKE_RET_VOID(
|
288
|
+
thread_detail::decay_copy(boost::forward<Function>(f)),
|
289
|
+
thread_detail::decay_copy(boost::forward<T1>(p1)),
|
290
|
+
thread_detail::decay_copy(boost::forward<T1>(p2)),
|
291
|
+
thread_detail::decay_copy(boost::forward<T1>(p3))
|
292
|
+
) BOOST_THREAD_INVOKE_RET_VOID_CALL;
|
293
|
+
|
294
|
+
}
|
295
|
+
BOOST_CATCH (...)
|
296
|
+
{
|
297
|
+
thread_detail::rollback_once_region(flag);
|
298
|
+
BOOST_RETHROW
|
299
|
+
}
|
300
|
+
BOOST_CATCH_END
|
301
|
+
thread_detail::commit_once_region(flag);
|
302
|
+
}
|
303
|
+
}
|
304
|
+
|
305
|
+
|
306
|
+
|
307
|
+
#endif
|
308
|
+
}
|
309
|
+
|
310
|
+
#include <boost/config/abi_suffix.hpp>
|
311
|
+
|
312
|
+
#endif
|
313
|
+
|
@@ -9,7 +9,9 @@
|
|
9
9
|
#include <pthread.h>
|
10
10
|
#include <boost/throw_exception.hpp>
|
11
11
|
#include <boost/thread/exceptions.hpp>
|
12
|
-
#
|
12
|
+
#if defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
|
13
|
+
#include <boost/thread/lock_types.hpp>
|
14
|
+
#endif
|
13
15
|
#include <boost/thread/thread_time.hpp>
|
14
16
|
#include <boost/assert.hpp>
|
15
17
|
#ifndef _WIN32
|
@@ -26,10 +28,13 @@
|
|
26
28
|
#include <boost/thread/detail/delete.hpp>
|
27
29
|
|
28
30
|
#ifdef _POSIX_TIMEOUTS
|
29
|
-
#if _POSIX_TIMEOUTS >= 0
|
31
|
+
#if _POSIX_TIMEOUTS >= 0 && _POSIX_TIMEOUTS>=200112L
|
32
|
+
#ifndef BOOST_PTHREAD_HAS_TIMEDLOCK
|
30
33
|
#define BOOST_PTHREAD_HAS_TIMEDLOCK
|
31
34
|
#endif
|
32
35
|
#endif
|
36
|
+
#endif
|
37
|
+
|
33
38
|
|
34
39
|
#if defined(BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE) && defined(BOOST_PTHREAD_HAS_TIMEDLOCK)
|
35
40
|
#define BOOST_USE_PTHREAD_RECURSIVE_TIMEDLOCK
|
@@ -167,8 +172,10 @@ namespace boost
|
|
167
172
|
|
168
173
|
#endif
|
169
174
|
|
175
|
+
#if defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
|
170
176
|
typedef unique_lock<recursive_mutex> scoped_lock;
|
171
177
|
typedef detail::try_lock_wrapper<recursive_mutex> scoped_try_lock;
|
178
|
+
#endif
|
172
179
|
};
|
173
180
|
|
174
181
|
typedef recursive_mutex recursive_try_mutex;
|
@@ -232,11 +239,13 @@ namespace boost
|
|
232
239
|
#endif
|
233
240
|
}
|
234
241
|
|
242
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
235
243
|
template<typename TimeDuration>
|
236
244
|
bool timed_lock(TimeDuration const & relative_time)
|
237
245
|
{
|
238
246
|
return timed_lock(get_system_time()+relative_time);
|
239
247
|
}
|
248
|
+
#endif
|
240
249
|
|
241
250
|
#ifdef BOOST_USE_PTHREAD_RECURSIVE_TIMEDLOCK
|
242
251
|
void lock()
|
@@ -334,12 +343,13 @@ namespace boost
|
|
334
343
|
|
335
344
|
#endif
|
336
345
|
|
346
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
337
347
|
bool timed_lock(system_time const & abs_time)
|
338
348
|
{
|
339
|
-
struct timespec const ts=detail::
|
349
|
+
struct timespec const ts=detail::to_timespec(abs_time);
|
340
350
|
return do_try_lock_until(ts);
|
341
351
|
}
|
342
|
-
|
352
|
+
#endif
|
343
353
|
#ifdef BOOST_THREAD_USES_CHRONO
|
344
354
|
template <class Rep, class Period>
|
345
355
|
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
@@ -363,12 +373,9 @@ namespace boost
|
|
363
373
|
}
|
364
374
|
bool try_lock_until(const chrono::time_point<chrono::system_clock, chrono::nanoseconds>& tp)
|
365
375
|
{
|
366
|
-
using namespace chrono;
|
367
|
-
nanoseconds d = tp.time_since_epoch();
|
368
|
-
timespec ts;
|
369
|
-
seconds s = duration_cast<seconds>(d);
|
370
|
-
ts.tv_sec = static_cast<long>(s.count());
|
371
|
-
ts.tv_nsec = static_cast<long>((d - s).count());
|
376
|
+
//using namespace chrono;
|
377
|
+
chrono::nanoseconds d = tp.time_since_epoch();
|
378
|
+
timespec ts = boost::detail::to_timespec(d);
|
372
379
|
return do_try_lock_until(ts);
|
373
380
|
}
|
374
381
|
#endif
|
@@ -380,9 +387,11 @@ namespace boost
|
|
380
387
|
return &m;
|
381
388
|
}
|
382
389
|
|
390
|
+
#if defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
|
383
391
|
typedef unique_lock<recursive_timed_mutex> scoped_timed_lock;
|
384
392
|
typedef detail::try_lock_wrapper<recursive_timed_mutex> scoped_try_lock;
|
385
393
|
typedef scoped_timed_lock scoped_lock;
|
394
|
+
#endif
|
386
395
|
};
|
387
396
|
|
388
397
|
}
|
@@ -12,12 +12,15 @@
|
|
12
12
|
#include <boost/static_assert.hpp>
|
13
13
|
#include <boost/thread/mutex.hpp>
|
14
14
|
#include <boost/thread/condition_variable.hpp>
|
15
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
15
16
|
#include <boost/thread/detail/thread_interruption.hpp>
|
17
|
+
#endif
|
16
18
|
#ifdef BOOST_THREAD_USES_CHRONO
|
17
19
|
#include <boost/chrono/system_clocks.hpp>
|
18
20
|
#include <boost/chrono/ceil.hpp>
|
19
21
|
#endif
|
20
22
|
#include <boost/thread/detail/delete.hpp>
|
23
|
+
#include <boost/assert.hpp>
|
21
24
|
|
22
25
|
#include <boost/config/abi_prefix.hpp>
|
23
26
|
|
@@ -26,8 +29,125 @@ namespace boost
|
|
26
29
|
class shared_mutex
|
27
30
|
{
|
28
31
|
private:
|
29
|
-
|
32
|
+
class state_data
|
30
33
|
{
|
34
|
+
public:
|
35
|
+
state_data () :
|
36
|
+
shared_count(0),
|
37
|
+
exclusive(false),
|
38
|
+
upgrade(false),
|
39
|
+
exclusive_waiting_blocked(false)
|
40
|
+
{}
|
41
|
+
|
42
|
+
void assert_free() const
|
43
|
+
{
|
44
|
+
BOOST_ASSERT( ! exclusive );
|
45
|
+
BOOST_ASSERT( ! upgrade );
|
46
|
+
BOOST_ASSERT( shared_count==0 );
|
47
|
+
}
|
48
|
+
|
49
|
+
void assert_locked() const
|
50
|
+
{
|
51
|
+
BOOST_ASSERT( exclusive );
|
52
|
+
BOOST_ASSERT( shared_count==0 );
|
53
|
+
BOOST_ASSERT( ! upgrade );
|
54
|
+
}
|
55
|
+
|
56
|
+
void assert_lock_shared () const
|
57
|
+
{
|
58
|
+
BOOST_ASSERT( ! exclusive );
|
59
|
+
BOOST_ASSERT( shared_count>0 );
|
60
|
+
//BOOST_ASSERT( (! upgrade) || (shared_count>1));
|
61
|
+
// if upgraded there are at least 2 threads sharing the mutex,
|
62
|
+
// except when unlock_upgrade_and_lock has decreased the number of readers but has not taken yet exclusive ownership.
|
63
|
+
}
|
64
|
+
|
65
|
+
void assert_lock_upgraded () const
|
66
|
+
{
|
67
|
+
BOOST_ASSERT( ! exclusive );
|
68
|
+
BOOST_ASSERT( upgrade );
|
69
|
+
BOOST_ASSERT( shared_count>0 );
|
70
|
+
}
|
71
|
+
|
72
|
+
void assert_lock_not_upgraded () const
|
73
|
+
{
|
74
|
+
BOOST_ASSERT( ! upgrade );
|
75
|
+
}
|
76
|
+
|
77
|
+
bool can_lock () const
|
78
|
+
{
|
79
|
+
return ! (shared_count || exclusive);
|
80
|
+
}
|
81
|
+
|
82
|
+
void exclusive_blocked (bool blocked)
|
83
|
+
{
|
84
|
+
exclusive_waiting_blocked = blocked;
|
85
|
+
}
|
86
|
+
|
87
|
+
void lock ()
|
88
|
+
{
|
89
|
+
exclusive = true;
|
90
|
+
}
|
91
|
+
|
92
|
+
void unlock ()
|
93
|
+
{
|
94
|
+
exclusive = false;
|
95
|
+
exclusive_waiting_blocked = false;
|
96
|
+
}
|
97
|
+
|
98
|
+
bool can_lock_shared () const
|
99
|
+
{
|
100
|
+
return ! (exclusive || exclusive_waiting_blocked);
|
101
|
+
}
|
102
|
+
|
103
|
+
bool more_shared () const
|
104
|
+
{
|
105
|
+
return shared_count > 0 ;
|
106
|
+
}
|
107
|
+
unsigned get_shared_count () const
|
108
|
+
{
|
109
|
+
return shared_count ;
|
110
|
+
}
|
111
|
+
unsigned lock_shared ()
|
112
|
+
{
|
113
|
+
return ++shared_count;
|
114
|
+
}
|
115
|
+
|
116
|
+
|
117
|
+
void unlock_shared ()
|
118
|
+
{
|
119
|
+
--shared_count;
|
120
|
+
}
|
121
|
+
|
122
|
+
bool unlock_shared_downgrades()
|
123
|
+
{
|
124
|
+
if (upgrade) {
|
125
|
+
upgrade=false;
|
126
|
+
exclusive=true;
|
127
|
+
return true;
|
128
|
+
} else {
|
129
|
+
exclusive_waiting_blocked=false;
|
130
|
+
return false;
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
void lock_upgrade ()
|
135
|
+
{
|
136
|
+
++shared_count;
|
137
|
+
upgrade=true;
|
138
|
+
}
|
139
|
+
bool can_lock_upgrade () const
|
140
|
+
{
|
141
|
+
return ! (exclusive || exclusive_waiting_blocked || upgrade);
|
142
|
+
}
|
143
|
+
|
144
|
+
void unlock_upgrade ()
|
145
|
+
{
|
146
|
+
upgrade=false;
|
147
|
+
--shared_count;
|
148
|
+
}
|
149
|
+
|
150
|
+
//private:
|
31
151
|
unsigned shared_count;
|
32
152
|
bool exclusive;
|
33
153
|
bool upgrade;
|
@@ -49,12 +169,11 @@ namespace boost
|
|
49
169
|
}
|
50
170
|
|
51
171
|
public:
|
172
|
+
|
52
173
|
BOOST_THREAD_NO_COPYABLE(shared_mutex)
|
53
174
|
|
54
175
|
shared_mutex()
|
55
176
|
{
|
56
|
-
state_data state_={0,0,0,0};
|
57
|
-
state=state_;
|
58
177
|
}
|
59
178
|
|
60
179
|
~shared_mutex()
|
@@ -63,44 +182,45 @@ namespace boost
|
|
63
182
|
|
64
183
|
void lock_shared()
|
65
184
|
{
|
185
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
66
186
|
boost::this_thread::disable_interruption do_not_disturb;
|
67
|
-
|
68
|
-
|
69
|
-
while(state.
|
187
|
+
#endif
|
188
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
189
|
+
while(!state.can_lock_shared())
|
70
190
|
{
|
71
191
|
shared_cond.wait(lk);
|
72
192
|
}
|
73
|
-
|
193
|
+
state.lock_shared();
|
74
194
|
}
|
75
195
|
|
76
196
|
bool try_lock_shared()
|
77
197
|
{
|
78
|
-
boost::mutex
|
198
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
79
199
|
|
80
|
-
if(state.
|
200
|
+
if(!state.can_lock_shared())
|
81
201
|
{
|
82
202
|
return false;
|
83
203
|
}
|
84
|
-
|
85
|
-
|
86
|
-
++state.shared_count;
|
87
|
-
return true;
|
88
|
-
}
|
204
|
+
state.lock_shared();
|
205
|
+
return true;
|
89
206
|
}
|
90
207
|
|
208
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
91
209
|
bool timed_lock_shared(system_time const& timeout)
|
92
210
|
{
|
211
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
93
212
|
boost::this_thread::disable_interruption do_not_disturb;
|
94
|
-
|
213
|
+
#endif
|
214
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
95
215
|
|
96
|
-
while(state.
|
216
|
+
while(!state.can_lock_shared())
|
97
217
|
{
|
98
218
|
if(!shared_cond.timed_wait(lk,timeout))
|
99
219
|
{
|
100
220
|
return false;
|
101
221
|
}
|
102
222
|
}
|
103
|
-
|
223
|
+
state.lock_shared();
|
104
224
|
return true;
|
105
225
|
}
|
106
226
|
|
@@ -109,6 +229,7 @@ namespace boost
|
|
109
229
|
{
|
110
230
|
return timed_lock_shared(get_system_time()+relative_time);
|
111
231
|
}
|
232
|
+
#endif
|
112
233
|
#ifdef BOOST_THREAD_USES_CHRONO
|
113
234
|
template <class Rep, class Period>
|
114
235
|
bool try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time)
|
@@ -118,36 +239,43 @@ namespace boost
|
|
118
239
|
template <class Clock, class Duration>
|
119
240
|
bool try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time)
|
120
241
|
{
|
242
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
121
243
|
boost::this_thread::disable_interruption do_not_disturb;
|
122
|
-
|
244
|
+
#endif
|
245
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
123
246
|
|
124
|
-
while(state.
|
247
|
+
while(!state.can_lock_shared())
|
248
|
+
//while(state.exclusive || state.exclusive_waiting_blocked)
|
125
249
|
{
|
126
250
|
if(cv_status::timeout==shared_cond.wait_until(lk,abs_time))
|
127
251
|
{
|
128
252
|
return false;
|
129
253
|
}
|
130
254
|
}
|
131
|
-
|
255
|
+
state.lock_shared();
|
132
256
|
return true;
|
133
257
|
}
|
134
258
|
#endif
|
135
259
|
void unlock_shared()
|
136
260
|
{
|
137
|
-
boost::mutex
|
138
|
-
|
139
|
-
|
140
|
-
if(
|
261
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
262
|
+
state.assert_lock_shared();
|
263
|
+
state.unlock_shared();
|
264
|
+
if (! state.more_shared())
|
141
265
|
{
|
142
|
-
if(state.upgrade)
|
266
|
+
if (state.upgrade)
|
143
267
|
{
|
268
|
+
// As there is a thread doing a unlock_upgrade_and_lock that is waiting for ! state.more_shared()
|
269
|
+
// avoid other threads to lock, lock_upgrade or lock_shared, so only this thread is notified.
|
144
270
|
state.upgrade=false;
|
145
271
|
state.exclusive=true;
|
272
|
+
lk.unlock();
|
146
273
|
upgrade_cond.notify_one();
|
147
274
|
}
|
148
275
|
else
|
149
276
|
{
|
150
277
|
state.exclusive_waiting_blocked=false;
|
278
|
+
lk.unlock();
|
151
279
|
}
|
152
280
|
release_waiters();
|
153
281
|
}
|
@@ -155,10 +283,12 @@ namespace boost
|
|
155
283
|
|
156
284
|
void lock()
|
157
285
|
{
|
286
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
158
287
|
boost::this_thread::disable_interruption do_not_disturb;
|
159
|
-
|
288
|
+
#endif
|
289
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
160
290
|
|
161
|
-
while(state.shared_count || state.exclusive)
|
291
|
+
while (state.shared_count || state.exclusive)
|
162
292
|
{
|
163
293
|
state.exclusive_waiting_blocked=true;
|
164
294
|
exclusive_cond.wait(lk);
|
@@ -166,10 +296,13 @@ namespace boost
|
|
166
296
|
state.exclusive=true;
|
167
297
|
}
|
168
298
|
|
299
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
169
300
|
bool timed_lock(system_time const& timeout)
|
170
301
|
{
|
302
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
171
303
|
boost::this_thread::disable_interruption do_not_disturb;
|
172
|
-
|
304
|
+
#endif
|
305
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
173
306
|
|
174
307
|
while(state.shared_count || state.exclusive)
|
175
308
|
{
|
@@ -194,7 +327,7 @@ namespace boost
|
|
194
327
|
{
|
195
328
|
return timed_lock(get_system_time()+relative_time);
|
196
329
|
}
|
197
|
-
|
330
|
+
#endif
|
198
331
|
#ifdef BOOST_THREAD_USES_CHRONO
|
199
332
|
template <class Rep, class Period>
|
200
333
|
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
@@ -204,8 +337,10 @@ namespace boost
|
|
204
337
|
template <class Clock, class Duration>
|
205
338
|
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
|
206
339
|
{
|
340
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
207
341
|
boost::this_thread::disable_interruption do_not_disturb;
|
208
|
-
|
342
|
+
#endif
|
343
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
209
344
|
|
210
345
|
while(state.shared_count || state.exclusive)
|
211
346
|
{
|
@@ -228,7 +363,7 @@ namespace boost
|
|
228
363
|
|
229
364
|
bool try_lock()
|
230
365
|
{
|
231
|
-
boost::mutex
|
366
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
232
367
|
|
233
368
|
if(state.shared_count || state.exclusive)
|
234
369
|
{
|
@@ -244,28 +379,35 @@ namespace boost
|
|
244
379
|
|
245
380
|
void unlock()
|
246
381
|
{
|
247
|
-
boost::mutex
|
382
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
383
|
+
state.assert_locked();
|
248
384
|
state.exclusive=false;
|
249
385
|
state.exclusive_waiting_blocked=false;
|
386
|
+
state.assert_free();
|
250
387
|
release_waiters();
|
251
388
|
}
|
252
389
|
|
253
390
|
void lock_upgrade()
|
254
391
|
{
|
392
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
255
393
|
boost::this_thread::disable_interruption do_not_disturb;
|
256
|
-
|
394
|
+
#endif
|
395
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
257
396
|
while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
|
258
397
|
{
|
259
398
|
shared_cond.wait(lk);
|
260
399
|
}
|
261
|
-
|
400
|
+
state.lock_shared();
|
262
401
|
state.upgrade=true;
|
263
402
|
}
|
264
403
|
|
404
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
265
405
|
bool timed_lock_upgrade(system_time const& timeout)
|
266
406
|
{
|
407
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
267
408
|
boost::this_thread::disable_interruption do_not_disturb;
|
268
|
-
|
409
|
+
#endif
|
410
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
269
411
|
while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
|
270
412
|
{
|
271
413
|
if(!shared_cond.timed_wait(lk,timeout))
|
@@ -277,7 +419,7 @@ namespace boost
|
|
277
419
|
break;
|
278
420
|
}
|
279
421
|
}
|
280
|
-
|
422
|
+
state.lock_shared();
|
281
423
|
state.upgrade=true;
|
282
424
|
return true;
|
283
425
|
}
|
@@ -287,7 +429,7 @@ namespace boost
|
|
287
429
|
{
|
288
430
|
return timed_lock_upgrade(get_system_time()+relative_time);
|
289
431
|
}
|
290
|
-
|
432
|
+
#endif
|
291
433
|
#ifdef BOOST_THREAD_USES_CHRONO
|
292
434
|
template <class Rep, class Period>
|
293
435
|
bool try_lock_upgrade_for(const chrono::duration<Rep, Period>& rel_time)
|
@@ -297,8 +439,10 @@ namespace boost
|
|
297
439
|
template <class Clock, class Duration>
|
298
440
|
bool try_lock_upgrade_until(const chrono::time_point<Clock, Duration>& abs_time)
|
299
441
|
{
|
442
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
300
443
|
boost::this_thread::disable_interruption do_not_disturb;
|
301
|
-
|
444
|
+
#endif
|
445
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
302
446
|
while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
|
303
447
|
{
|
304
448
|
if(cv_status::timeout == shared_cond.wait_until(lk,abs_time))
|
@@ -310,68 +454,75 @@ namespace boost
|
|
310
454
|
break;
|
311
455
|
}
|
312
456
|
}
|
313
|
-
|
457
|
+
state.lock_shared();
|
314
458
|
state.upgrade=true;
|
315
459
|
return true;
|
316
460
|
}
|
317
461
|
#endif
|
318
462
|
bool try_lock_upgrade()
|
319
463
|
{
|
320
|
-
boost::mutex
|
464
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
321
465
|
if(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
|
322
466
|
{
|
323
467
|
return false;
|
324
468
|
}
|
325
469
|
else
|
326
470
|
{
|
327
|
-
|
471
|
+
state.lock_shared();
|
328
472
|
state.upgrade=true;
|
473
|
+
state.assert_lock_upgraded();
|
329
474
|
return true;
|
330
475
|
}
|
331
476
|
}
|
332
477
|
|
333
478
|
void unlock_upgrade()
|
334
479
|
{
|
335
|
-
boost::mutex
|
336
|
-
state.upgrade=false;
|
337
|
-
|
338
|
-
|
339
|
-
if(last_reader)
|
480
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
481
|
+
//state.upgrade=false;
|
482
|
+
state.unlock_upgrade();
|
483
|
+
if(! state.more_shared() )
|
340
484
|
{
|
341
485
|
state.exclusive_waiting_blocked=false;
|
342
486
|
release_waiters();
|
343
487
|
} else {
|
344
|
-
|
488
|
+
shared_cond.notify_all();
|
345
489
|
}
|
346
490
|
}
|
347
491
|
|
348
492
|
// Upgrade <-> Exclusive
|
349
493
|
void unlock_upgrade_and_lock()
|
350
494
|
{
|
495
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
351
496
|
boost::this_thread::disable_interruption do_not_disturb;
|
352
|
-
|
353
|
-
|
354
|
-
|
497
|
+
#endif
|
498
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
499
|
+
state.assert_lock_upgraded();
|
500
|
+
state.unlock_shared();
|
501
|
+
while (state.more_shared())
|
355
502
|
{
|
356
503
|
upgrade_cond.wait(lk);
|
357
504
|
}
|
358
505
|
state.upgrade=false;
|
359
506
|
state.exclusive=true;
|
507
|
+
state.assert_locked();
|
360
508
|
}
|
361
509
|
|
362
510
|
void unlock_and_lock_upgrade()
|
363
511
|
{
|
364
|
-
boost::mutex
|
512
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
513
|
+
state.assert_locked();
|
365
514
|
state.exclusive=false;
|
366
515
|
state.upgrade=true;
|
367
|
-
|
516
|
+
state.lock_shared();
|
368
517
|
state.exclusive_waiting_blocked=false;
|
518
|
+
state.assert_lock_upgraded();
|
369
519
|
release_waiters();
|
370
520
|
}
|
371
521
|
|
372
522
|
bool try_unlock_upgrade_and_lock()
|
373
523
|
{
|
374
|
-
boost::mutex
|
524
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
525
|
+
state.assert_lock_upgraded();
|
375
526
|
if( !state.exclusive
|
376
527
|
&& !state.exclusive_waiting_blocked
|
377
528
|
&& state.upgrade
|
@@ -380,6 +531,7 @@ namespace boost
|
|
380
531
|
state.shared_count=0;
|
381
532
|
state.exclusive=true;
|
382
533
|
state.upgrade=false;
|
534
|
+
state.assert_locked();
|
383
535
|
return true;
|
384
536
|
}
|
385
537
|
return false;
|
@@ -398,8 +550,11 @@ namespace boost
|
|
398
550
|
try_unlock_upgrade_and_lock_until(
|
399
551
|
const chrono::time_point<Clock, Duration>& abs_time)
|
400
552
|
{
|
553
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
401
554
|
boost::this_thread::disable_interruption do_not_disturb;
|
402
|
-
|
555
|
+
#endif
|
556
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
557
|
+
state.assert_lock_upgraded();
|
403
558
|
if (state.shared_count != 1)
|
404
559
|
{
|
405
560
|
for (;;)
|
@@ -422,9 +577,10 @@ namespace boost
|
|
422
577
|
// Shared <-> Exclusive
|
423
578
|
void unlock_and_lock_shared()
|
424
579
|
{
|
425
|
-
boost::mutex
|
580
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
581
|
+
state.assert_locked();
|
426
582
|
state.exclusive=false;
|
427
|
-
|
583
|
+
state.lock_shared();
|
428
584
|
state.exclusive_waiting_blocked=false;
|
429
585
|
release_waiters();
|
430
586
|
}
|
@@ -432,7 +588,8 @@ namespace boost
|
|
432
588
|
#ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
433
589
|
bool try_unlock_shared_and_lock()
|
434
590
|
{
|
435
|
-
boost::mutex
|
591
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
592
|
+
state.assert_lock_shared();
|
436
593
|
if( !state.exclusive
|
437
594
|
&& !state.exclusive_waiting_blocked
|
438
595
|
&& !state.upgrade
|
@@ -458,8 +615,11 @@ namespace boost
|
|
458
615
|
try_unlock_shared_and_lock_until(
|
459
616
|
const chrono::time_point<Clock, Duration>& abs_time)
|
460
617
|
{
|
618
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
461
619
|
boost::this_thread::disable_interruption do_not_disturb;
|
462
|
-
|
620
|
+
#endif
|
621
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
622
|
+
state.assert_lock_shared();
|
463
623
|
if (state.shared_count != 1)
|
464
624
|
{
|
465
625
|
for (;;)
|
@@ -483,7 +643,8 @@ namespace boost
|
|
483
643
|
// Shared <-> Upgrade
|
484
644
|
void unlock_upgrade_and_lock_shared()
|
485
645
|
{
|
486
|
-
boost::mutex
|
646
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
647
|
+
state.assert_lock_upgraded();
|
487
648
|
state.upgrade=false;
|
488
649
|
state.exclusive_waiting_blocked=false;
|
489
650
|
release_waiters();
|
@@ -492,7 +653,8 @@ namespace boost
|
|
492
653
|
#ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
493
654
|
bool try_unlock_shared_and_lock_upgrade()
|
494
655
|
{
|
495
|
-
boost::mutex
|
656
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
657
|
+
state.assert_lock_shared();
|
496
658
|
if( !state.exclusive
|
497
659
|
&& !state.exclusive_waiting_blocked
|
498
660
|
&& !state.upgrade
|
@@ -517,8 +679,11 @@ namespace boost
|
|
517
679
|
try_unlock_shared_and_lock_upgrade_until(
|
518
680
|
const chrono::time_point<Clock, Duration>& abs_time)
|
519
681
|
{
|
682
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
520
683
|
boost::this_thread::disable_interruption do_not_disturb;
|
521
|
-
|
684
|
+
#endif
|
685
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
686
|
+
state.assert_lock_shared();
|
522
687
|
if( state.exclusive
|
523
688
|
|| state.exclusive_waiting_blocked
|
524
689
|
|| state.upgrade
|