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,724 @@
|
|
1
|
+
#ifndef BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP
|
2
|
+
#define BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP
|
3
|
+
|
4
|
+
// (C) Copyright 2006-8 Anthony Williams
|
5
|
+
// (C) Copyright 2012 Vicente J. Botet Escriba
|
6
|
+
//
|
7
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
8
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
9
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
10
|
+
|
11
|
+
#include <boost/assert.hpp>
|
12
|
+
#include <boost/static_assert.hpp>
|
13
|
+
#include <boost/thread/mutex.hpp>
|
14
|
+
#include <boost/thread/condition_variable.hpp>
|
15
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
16
|
+
#include <boost/thread/detail/thread_interruption.hpp>
|
17
|
+
#endif
|
18
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
19
|
+
#include <boost/chrono/system_clocks.hpp>
|
20
|
+
#include <boost/chrono/ceil.hpp>
|
21
|
+
#endif
|
22
|
+
#include <boost/thread/detail/delete.hpp>
|
23
|
+
#include <boost/assert.hpp>
|
24
|
+
|
25
|
+
#include <boost/config/abi_prefix.hpp>
|
26
|
+
|
27
|
+
namespace boost
|
28
|
+
{
|
29
|
+
class shared_mutex
|
30
|
+
{
|
31
|
+
private:
|
32
|
+
class state_data
|
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 is_last_shared () const
|
104
|
+
{
|
105
|
+
return !shared_count ;
|
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
|
+
lock_shared ();
|
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
|
+
unlock_shared();
|
148
|
+
}
|
149
|
+
|
150
|
+
//private:
|
151
|
+
unsigned shared_count;
|
152
|
+
bool exclusive;
|
153
|
+
bool upgrade;
|
154
|
+
bool exclusive_waiting_blocked;
|
155
|
+
};
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
state_data state;
|
160
|
+
boost::mutex state_change;
|
161
|
+
boost::condition_variable shared_cond;
|
162
|
+
boost::condition_variable exclusive_cond;
|
163
|
+
boost::condition_variable upgrade_cond;
|
164
|
+
|
165
|
+
void release_waiters()
|
166
|
+
{
|
167
|
+
exclusive_cond.notify_one();
|
168
|
+
shared_cond.notify_all();
|
169
|
+
}
|
170
|
+
|
171
|
+
public:
|
172
|
+
BOOST_THREAD_NO_COPYABLE(shared_mutex)
|
173
|
+
|
174
|
+
shared_mutex()
|
175
|
+
{
|
176
|
+
}
|
177
|
+
|
178
|
+
~shared_mutex()
|
179
|
+
{
|
180
|
+
}
|
181
|
+
|
182
|
+
void lock_shared()
|
183
|
+
{
|
184
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
185
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
186
|
+
#endif
|
187
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
188
|
+
|
189
|
+
while(!state.can_lock_shared())
|
190
|
+
{
|
191
|
+
shared_cond.wait(lk);
|
192
|
+
}
|
193
|
+
state.lock_shared();
|
194
|
+
}
|
195
|
+
|
196
|
+
bool try_lock_shared()
|
197
|
+
{
|
198
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
199
|
+
if(!state.can_lock_shared())
|
200
|
+
{
|
201
|
+
return false;
|
202
|
+
}
|
203
|
+
else
|
204
|
+
{
|
205
|
+
state.lock_shared();
|
206
|
+
return true;
|
207
|
+
}
|
208
|
+
}
|
209
|
+
|
210
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
211
|
+
bool timed_lock_shared(system_time const& timeout)
|
212
|
+
{
|
213
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
214
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
215
|
+
#endif
|
216
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
217
|
+
|
218
|
+
while(!state.can_lock_shared())
|
219
|
+
{
|
220
|
+
if(!shared_cond.timed_wait(lk,timeout))
|
221
|
+
{
|
222
|
+
return false;
|
223
|
+
}
|
224
|
+
}
|
225
|
+
state.lock_shared();
|
226
|
+
return true;
|
227
|
+
}
|
228
|
+
|
229
|
+
template<typename TimeDuration>
|
230
|
+
bool timed_lock_shared(TimeDuration const & relative_time)
|
231
|
+
{
|
232
|
+
return timed_lock_shared(get_system_time()+relative_time);
|
233
|
+
}
|
234
|
+
#endif
|
235
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
236
|
+
template <class Rep, class Period>
|
237
|
+
bool try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time)
|
238
|
+
{
|
239
|
+
return try_lock_shared_until(chrono::steady_clock::now() + rel_time);
|
240
|
+
}
|
241
|
+
template <class Clock, class Duration>
|
242
|
+
bool try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time)
|
243
|
+
{
|
244
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
245
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
246
|
+
#endif
|
247
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
248
|
+
|
249
|
+
while(!state.can_lock_shared())
|
250
|
+
{
|
251
|
+
if(cv_status::timeout==shared_cond.wait_until(lk,abs_time))
|
252
|
+
{
|
253
|
+
return false;
|
254
|
+
}
|
255
|
+
}
|
256
|
+
state.lock_shared();
|
257
|
+
return true;
|
258
|
+
}
|
259
|
+
#endif
|
260
|
+
void unlock_shared()
|
261
|
+
{
|
262
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
263
|
+
state.assert_lock_shared();
|
264
|
+
state.unlock_shared();
|
265
|
+
if (state.get_shared_count () == 0)
|
266
|
+
{
|
267
|
+
if (state.unlock_shared_downgrades())
|
268
|
+
{
|
269
|
+
lk.unlock();
|
270
|
+
upgrade_cond.notify_one();
|
271
|
+
} else {
|
272
|
+
lk.unlock();
|
273
|
+
}
|
274
|
+
release_waiters();
|
275
|
+
}
|
276
|
+
}
|
277
|
+
|
278
|
+
void lock()
|
279
|
+
{
|
280
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
281
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
282
|
+
#endif
|
283
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
284
|
+
|
285
|
+
while(!state.can_lock())
|
286
|
+
{
|
287
|
+
state.exclusive_blocked(true);
|
288
|
+
exclusive_cond.wait(lk);
|
289
|
+
}
|
290
|
+
state.lock();
|
291
|
+
}
|
292
|
+
|
293
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
294
|
+
bool timed_lock(system_time const& timeout)
|
295
|
+
{
|
296
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
297
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
298
|
+
#endif
|
299
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
300
|
+
|
301
|
+
while(!state.can_lock())
|
302
|
+
{
|
303
|
+
state.exclusive_blocked(true);
|
304
|
+
if(!exclusive_cond.timed_wait(lk,timeout))
|
305
|
+
{
|
306
|
+
if(!state.can_lock())
|
307
|
+
{
|
308
|
+
state.exclusive_blocked(false);
|
309
|
+
release_waiters();
|
310
|
+
return false;
|
311
|
+
}
|
312
|
+
break;
|
313
|
+
}
|
314
|
+
}
|
315
|
+
state.exclusive=true;
|
316
|
+
//state.lock();
|
317
|
+
return true;
|
318
|
+
}
|
319
|
+
|
320
|
+
template<typename TimeDuration>
|
321
|
+
bool timed_lock(TimeDuration const & relative_time)
|
322
|
+
{
|
323
|
+
return timed_lock(get_system_time()+relative_time);
|
324
|
+
}
|
325
|
+
#endif
|
326
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
327
|
+
template <class Rep, class Period>
|
328
|
+
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
329
|
+
{
|
330
|
+
return try_lock_until(chrono::steady_clock::now() + rel_time);
|
331
|
+
}
|
332
|
+
template <class Clock, class Duration>
|
333
|
+
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
|
334
|
+
{
|
335
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
336
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
337
|
+
#endif
|
338
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
339
|
+
|
340
|
+
while(!state.can_lock())
|
341
|
+
{
|
342
|
+
state.exclusive_blocked(true);
|
343
|
+
if(cv_status::timeout == exclusive_cond.wait_until(lk,abs_time))
|
344
|
+
{
|
345
|
+
if(!state.can_lock())
|
346
|
+
{
|
347
|
+
state.exclusive_blocked(false);
|
348
|
+
release_waiters();
|
349
|
+
return false;
|
350
|
+
}
|
351
|
+
break;
|
352
|
+
}
|
353
|
+
}
|
354
|
+
state.exclusive=true;
|
355
|
+
//state.lock();
|
356
|
+
return true;
|
357
|
+
}
|
358
|
+
#endif
|
359
|
+
|
360
|
+
bool try_lock()
|
361
|
+
{
|
362
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
363
|
+
|
364
|
+
if(!state.can_lock())
|
365
|
+
{
|
366
|
+
return false;
|
367
|
+
}
|
368
|
+
else
|
369
|
+
{
|
370
|
+
state.lock();
|
371
|
+
return true;
|
372
|
+
}
|
373
|
+
|
374
|
+
}
|
375
|
+
|
376
|
+
void unlock()
|
377
|
+
{
|
378
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
379
|
+
state.assert_locked();
|
380
|
+
state.unlock();
|
381
|
+
state.assert_free();
|
382
|
+
release_waiters();
|
383
|
+
}
|
384
|
+
|
385
|
+
void lock_upgrade()
|
386
|
+
{
|
387
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
388
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
389
|
+
#endif
|
390
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
391
|
+
while(!state.can_lock_upgrade())
|
392
|
+
{
|
393
|
+
shared_cond.wait(lk);
|
394
|
+
}
|
395
|
+
state.lock_upgrade();
|
396
|
+
}
|
397
|
+
|
398
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
399
|
+
bool timed_lock_upgrade(system_time const& timeout)
|
400
|
+
{
|
401
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
402
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
403
|
+
#endif
|
404
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
405
|
+
while(!state.can_lock_upgrade())
|
406
|
+
{
|
407
|
+
if(!shared_cond.timed_wait(lk,timeout))
|
408
|
+
{
|
409
|
+
if(!state.can_lock_upgrade())
|
410
|
+
{
|
411
|
+
return false;
|
412
|
+
}
|
413
|
+
break;
|
414
|
+
}
|
415
|
+
}
|
416
|
+
state.lock_upgrade();
|
417
|
+
return true;
|
418
|
+
}
|
419
|
+
|
420
|
+
template<typename TimeDuration>
|
421
|
+
bool timed_lock_upgrade(TimeDuration const & relative_time)
|
422
|
+
{
|
423
|
+
return timed_lock_upgrade(get_system_time()+relative_time);
|
424
|
+
}
|
425
|
+
#endif
|
426
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
427
|
+
template <class Rep, class Period>
|
428
|
+
bool try_lock_upgrade_for(const chrono::duration<Rep, Period>& rel_time)
|
429
|
+
{
|
430
|
+
return try_lock_upgrade_until(chrono::steady_clock::now() + rel_time);
|
431
|
+
}
|
432
|
+
template <class Clock, class Duration>
|
433
|
+
bool try_lock_upgrade_until(const chrono::time_point<Clock, Duration>& abs_time)
|
434
|
+
{
|
435
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
436
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
437
|
+
#endif
|
438
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
439
|
+
while(!state.can_lock_upgrade())
|
440
|
+
{
|
441
|
+
if(cv_status::timeout == shared_cond.wait_until(lk,abs_time))
|
442
|
+
{
|
443
|
+
if(!state.can_lock_upgrade())
|
444
|
+
{
|
445
|
+
return false;
|
446
|
+
}
|
447
|
+
break;
|
448
|
+
}
|
449
|
+
}
|
450
|
+
state.lock_upgrade();
|
451
|
+
return true;
|
452
|
+
}
|
453
|
+
#endif
|
454
|
+
bool try_lock_upgrade()
|
455
|
+
{
|
456
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
457
|
+
if(!state.can_lock_upgrade())
|
458
|
+
{
|
459
|
+
return false;
|
460
|
+
}
|
461
|
+
else
|
462
|
+
{
|
463
|
+
state.lock_upgrade();
|
464
|
+
state.assert_lock_upgraded();
|
465
|
+
return true;
|
466
|
+
}
|
467
|
+
}
|
468
|
+
|
469
|
+
void unlock_upgrade()
|
470
|
+
{
|
471
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
472
|
+
state.assert_lock_upgraded();
|
473
|
+
state.unlock_upgrade();
|
474
|
+
state.assert_lock_not_upgraded ();
|
475
|
+
if(state.get_shared_count () == 0)
|
476
|
+
{
|
477
|
+
state.exclusive_blocked(false);
|
478
|
+
lk.unlock();
|
479
|
+
release_waiters();
|
480
|
+
} else {
|
481
|
+
lk.unlock();
|
482
|
+
shared_cond.notify_all();
|
483
|
+
}
|
484
|
+
}
|
485
|
+
|
486
|
+
// Upgrade <-> Exclusive
|
487
|
+
void unlock_upgrade_and_lock()
|
488
|
+
{
|
489
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
490
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
491
|
+
#endif
|
492
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
493
|
+
state.assert_lock_upgraded();
|
494
|
+
// assert state.get_shared_count() >=1
|
495
|
+
while(
|
496
|
+
//! state.exclusive_waiting_blocked // Fixme: is this needed?
|
497
|
+
//&&
|
498
|
+
state.get_shared_count()!=1)
|
499
|
+
{
|
500
|
+
upgrade_cond.wait(lk);
|
501
|
+
}
|
502
|
+
state.unlock_upgrade();
|
503
|
+
state.lock();
|
504
|
+
state.assert_locked();
|
505
|
+
}
|
506
|
+
|
507
|
+
void unlock_and_lock_upgrade()
|
508
|
+
{
|
509
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
510
|
+
state.assert_locked();
|
511
|
+
state.unlock();
|
512
|
+
state.lock_upgrade();
|
513
|
+
state.assert_lock_upgraded();
|
514
|
+
release_waiters();
|
515
|
+
}
|
516
|
+
|
517
|
+
bool try_unlock_upgrade_and_lock()
|
518
|
+
{
|
519
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
520
|
+
state.assert_lock_upgraded();
|
521
|
+
if( //!state.exclusive // this should be removed once the assertion work
|
522
|
+
! state.exclusive_waiting_blocked // Fixme: why this is needed?
|
523
|
+
//&& state.upgrade // this should be removed once the assertion work
|
524
|
+
&& state.get_shared_count()==1)
|
525
|
+
{
|
526
|
+
state.unlock_upgrade();
|
527
|
+
state.lock();
|
528
|
+
state.assert_locked();
|
529
|
+
return true;
|
530
|
+
}
|
531
|
+
return false;
|
532
|
+
}
|
533
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
534
|
+
template <class Rep, class Period>
|
535
|
+
bool
|
536
|
+
try_unlock_upgrade_and_lock_for(
|
537
|
+
const chrono::duration<Rep, Period>& rel_time)
|
538
|
+
{
|
539
|
+
return try_unlock_upgrade_and_lock_until(
|
540
|
+
chrono::steady_clock::now() + rel_time);
|
541
|
+
}
|
542
|
+
template <class Clock, class Duration>
|
543
|
+
bool
|
544
|
+
try_unlock_upgrade_and_lock_until(
|
545
|
+
const chrono::time_point<Clock, Duration>& abs_time)
|
546
|
+
{
|
547
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
548
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
549
|
+
#endif
|
550
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
551
|
+
state.assert_lock_upgraded();
|
552
|
+
if (//state.exclusive // this should be removed once the assertion work
|
553
|
+
state.exclusive_waiting_blocked // Fixme: is this needed?
|
554
|
+
//|| ! state.upgrade // this should be removed once the assertion work
|
555
|
+
|| state.get_shared_count() != 1)
|
556
|
+
{
|
557
|
+
for (;;)
|
558
|
+
{
|
559
|
+
//cv_status status = shared_cond.wait_until(lk,abs_time);
|
560
|
+
cv_status status = upgrade_cond.wait_until(lk,abs_time);
|
561
|
+
if (//!state.exclusive // this should be removed once the assertion work
|
562
|
+
! state.exclusive_waiting_blocked // Fixme: is this needed?
|
563
|
+
//&& ! state.upgrade // this should be removed once the assertion work
|
564
|
+
&& state.get_shared_count() == 1)
|
565
|
+
break;
|
566
|
+
if(status == cv_status::timeout)
|
567
|
+
return false;
|
568
|
+
}
|
569
|
+
}
|
570
|
+
state.unlock_upgrade();
|
571
|
+
state.lock();
|
572
|
+
return true;
|
573
|
+
}
|
574
|
+
#endif
|
575
|
+
|
576
|
+
// Shared <-> Exclusive
|
577
|
+
void unlock_and_lock_shared()
|
578
|
+
{
|
579
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
580
|
+
state.assert_locked();
|
581
|
+
state.unlock();
|
582
|
+
state.lock_shared();
|
583
|
+
release_waiters();
|
584
|
+
}
|
585
|
+
|
586
|
+
#ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
587
|
+
bool try_unlock_shared_and_lock()
|
588
|
+
{
|
589
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
590
|
+
state.assert_lock_shared();
|
591
|
+
if( //!state.exclusive // this should be removed once the assertion work
|
592
|
+
! state.exclusive_waiting_blocked // Fixme: why this is needed?
|
593
|
+
//&& ! state.upgrade // Fixme: why this is needed if state.get_shared_count()==1?
|
594
|
+
&& state.get_shared_count()==1)
|
595
|
+
{
|
596
|
+
state.unlock_shared();
|
597
|
+
state.lock();
|
598
|
+
return true;
|
599
|
+
}
|
600
|
+
return false;
|
601
|
+
}
|
602
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
603
|
+
template <class Rep, class Period>
|
604
|
+
bool
|
605
|
+
try_unlock_shared_and_lock_for(
|
606
|
+
const chrono::duration<Rep, Period>& rel_time)
|
607
|
+
{
|
608
|
+
return try_unlock_shared_and_lock_until(
|
609
|
+
chrono::steady_clock::now() + rel_time);
|
610
|
+
}
|
611
|
+
template <class Clock, class Duration>
|
612
|
+
bool
|
613
|
+
try_unlock_shared_and_lock_until(
|
614
|
+
const chrono::time_point<Clock, Duration>& abs_time)
|
615
|
+
{
|
616
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
617
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
618
|
+
#endif
|
619
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
620
|
+
state.assert_lock_shared();
|
621
|
+
if ( // !state.exclusive // this should be removed once the assertion work
|
622
|
+
state.exclusive_waiting_blocked // Fixme: is this needed?
|
623
|
+
//|| state.upgrade // Fixme: why this is needed if state.get_shared_count()==1?
|
624
|
+
|| state.get_shared_count() != 1)
|
625
|
+
{
|
626
|
+
for (;;)
|
627
|
+
{
|
628
|
+
cv_status status = shared_cond.wait_until(lk,abs_time);
|
629
|
+
if ( //! state.exclusive // this should be removed once the assertion work
|
630
|
+
! state.exclusive_waiting_blocked // Fixme: is this needed?
|
631
|
+
//&& ! state.upgrade
|
632
|
+
&& state.get_shared_count() == 1)
|
633
|
+
break;
|
634
|
+
if(status == cv_status::timeout)
|
635
|
+
return false;
|
636
|
+
}
|
637
|
+
}
|
638
|
+
state.unlock_shared();
|
639
|
+
state.lock();
|
640
|
+
state.upgrade=false; // Is this absolutely needed?
|
641
|
+
state.exclusive_waiting_blocked=false; // Is this absolutely needed?
|
642
|
+
return true;
|
643
|
+
}
|
644
|
+
#endif
|
645
|
+
#endif
|
646
|
+
|
647
|
+
// Shared <-> Upgrade
|
648
|
+
void unlock_upgrade_and_lock_shared()
|
649
|
+
{
|
650
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
651
|
+
state.assert_lock_upgraded();
|
652
|
+
//state.unlock_upgrade();
|
653
|
+
//state.lock_shared(); // less efficient
|
654
|
+
state.upgrade=false;
|
655
|
+
state.exclusive_waiting_blocked=false; // Is this absolutely needed?
|
656
|
+
release_waiters();
|
657
|
+
}
|
658
|
+
|
659
|
+
#ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
660
|
+
bool try_unlock_shared_and_lock_upgrade()
|
661
|
+
{
|
662
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
663
|
+
state.assert_lock_shared();
|
664
|
+
if( //! state.exclusive // this should be removed once the assertion work
|
665
|
+
! state.exclusive_waiting_blocked // Fixme: is this needed?
|
666
|
+
&& ! state.upgrade
|
667
|
+
)
|
668
|
+
{
|
669
|
+
state.upgrade=true;
|
670
|
+
return true;
|
671
|
+
}
|
672
|
+
return false;
|
673
|
+
}
|
674
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
675
|
+
template <class Rep, class Period>
|
676
|
+
bool
|
677
|
+
try_unlock_shared_and_lock_upgrade_for(
|
678
|
+
const chrono::duration<Rep, Period>& rel_time)
|
679
|
+
{
|
680
|
+
return try_unlock_shared_and_lock_upgrade_until(
|
681
|
+
chrono::steady_clock::now() + rel_time);
|
682
|
+
}
|
683
|
+
template <class Clock, class Duration>
|
684
|
+
bool
|
685
|
+
try_unlock_shared_and_lock_upgrade_until(
|
686
|
+
const chrono::time_point<Clock, Duration>& abs_time)
|
687
|
+
{
|
688
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
689
|
+
boost::this_thread::disable_interruption do_not_disturb;
|
690
|
+
#endif
|
691
|
+
boost::unique_lock<boost::mutex> lk(state_change);
|
692
|
+
state.assert_lock_shared();
|
693
|
+
if( //state.exclusive // this should be removed once the assertion work
|
694
|
+
state.exclusive_waiting_blocked // Fixme: is this needed?
|
695
|
+
|| state.upgrade
|
696
|
+
)
|
697
|
+
{
|
698
|
+
for (;;)
|
699
|
+
{
|
700
|
+
cv_status status = exclusive_cond.wait_until(lk,abs_time);
|
701
|
+
if( //! state.exclusive // this should be removed once the assertion work
|
702
|
+
! state.exclusive_waiting_blocked // Fixme: is this needed?
|
703
|
+
&& ! state.upgrade
|
704
|
+
)
|
705
|
+
break;
|
706
|
+
if(status == cv_status::timeout)
|
707
|
+
return false;
|
708
|
+
}
|
709
|
+
}
|
710
|
+
//state.unlock_shared();
|
711
|
+
//state.lock_upgrade(); // less efficient
|
712
|
+
state.upgrade=true;
|
713
|
+
return true;
|
714
|
+
}
|
715
|
+
#endif
|
716
|
+
#endif
|
717
|
+
};
|
718
|
+
|
719
|
+
typedef shared_mutex upgrade_mutex;
|
720
|
+
}
|
721
|
+
|
722
|
+
#include <boost/config/abi_suffix.hpp>
|
723
|
+
|
724
|
+
#endif
|