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,61 @@
|
|
1
|
+
// (C) Copyright 2008-10 Anthony Williams
|
2
|
+
// (C) Copyright 2011-2012 Vicente J. Botet Escriba
|
3
|
+
//
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
5
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
6
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
7
|
+
|
8
|
+
#ifndef BOOST_THREAD_FUTURE_ERROR_CODE_HPP
|
9
|
+
#define BOOST_THREAD_FUTURE_ERROR_CODE_HPP
|
10
|
+
|
11
|
+
#include <boost/thread/detail/config.hpp>
|
12
|
+
#include <boost/detail/scoped_enum_emulation.hpp>
|
13
|
+
#include <boost/system/error_code.hpp>
|
14
|
+
#include <boost/type_traits/integral_constant.hpp>
|
15
|
+
|
16
|
+
namespace boost
|
17
|
+
{
|
18
|
+
|
19
|
+
//enum class future_errc
|
20
|
+
BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
|
21
|
+
{
|
22
|
+
broken_promise = 1,
|
23
|
+
future_already_retrieved,
|
24
|
+
promise_already_satisfied,
|
25
|
+
no_state
|
26
|
+
}
|
27
|
+
BOOST_SCOPED_ENUM_DECLARE_END(future_errc)
|
28
|
+
|
29
|
+
namespace system
|
30
|
+
{
|
31
|
+
template <>
|
32
|
+
struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc> : public true_type {};
|
33
|
+
|
34
|
+
#ifdef BOOST_NO_CXX11_SCOPED_ENUMS
|
35
|
+
template <>
|
36
|
+
struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc::enum_type> : public true_type { };
|
37
|
+
#endif
|
38
|
+
} // system
|
39
|
+
|
40
|
+
BOOST_THREAD_DECL
|
41
|
+
const system::error_category& future_category() BOOST_NOEXCEPT;
|
42
|
+
|
43
|
+
namespace system
|
44
|
+
{
|
45
|
+
inline
|
46
|
+
error_code
|
47
|
+
make_error_code(future_errc e) BOOST_NOEXCEPT
|
48
|
+
{
|
49
|
+
return error_code(underlying_cast<int>(e), boost::future_category());
|
50
|
+
}
|
51
|
+
|
52
|
+
inline
|
53
|
+
error_condition
|
54
|
+
make_error_condition(future_errc e) BOOST_NOEXCEPT
|
55
|
+
{
|
56
|
+
return error_condition(underlying_cast<int>(e), future_category());
|
57
|
+
}
|
58
|
+
} // system
|
59
|
+
} // boost
|
60
|
+
|
61
|
+
#endif // header
|
@@ -0,0 +1,39 @@
|
|
1
|
+
// (C) Copyright 2012 Vicente J. Botet Escriba
|
2
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
3
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
4
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
5
|
+
|
6
|
+
|
7
|
+
#ifndef BOOST_THREAD_IS_LOCKED_BY_THIS_THREAD_HPP
|
8
|
+
#define BOOST_THREAD_IS_LOCKED_BY_THIS_THREAD_HPP
|
9
|
+
|
10
|
+
#include <boost/thread/detail/config.hpp>
|
11
|
+
|
12
|
+
#include <boost/config/abi_prefix.hpp>
|
13
|
+
|
14
|
+
namespace boost
|
15
|
+
{
|
16
|
+
template <typename Lockable>
|
17
|
+
class testable_mutex;
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Overloaded function used to check if the mutex is locked when it is testable and do nothing otherwise.
|
21
|
+
*
|
22
|
+
* This function is used usually to assert the pre-condition when the function can only be called when the mutex
|
23
|
+
* must be locked by the current thread.
|
24
|
+
*/
|
25
|
+
template <typename Lockable>
|
26
|
+
bool is_locked_by_this_thread(testable_mutex<Lockable> const& mtx)
|
27
|
+
{
|
28
|
+
return mtx.is_locked_by_this_thread();
|
29
|
+
}
|
30
|
+
template <typename Lockable>
|
31
|
+
bool is_locked_by_this_thread(Lockable const&)
|
32
|
+
{
|
33
|
+
return true;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
#include <boost/config/abi_suffix.hpp>
|
38
|
+
|
39
|
+
#endif // header
|
@@ -0,0 +1,142 @@
|
|
1
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
2
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
3
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
4
|
+
// (C) Copyright 2013 Vicente J. Botet Escriba
|
5
|
+
|
6
|
+
#ifndef BOOST_THREAD_LATCH_HPP
|
7
|
+
#define BOOST_THREAD_LATCH_HPP
|
8
|
+
|
9
|
+
#include <boost/thread/detail/config.hpp>
|
10
|
+
#include <boost/thread/detail/delete.hpp>
|
11
|
+
#include <boost/thread/detail/counter.hpp>
|
12
|
+
|
13
|
+
#include <boost/thread/mutex.hpp>
|
14
|
+
#include <boost/thread/lock_types.hpp>
|
15
|
+
#include <boost/thread/condition_variable.hpp>
|
16
|
+
#include <boost/chrono/duration.hpp>
|
17
|
+
#include <boost/chrono/time_point.hpp>
|
18
|
+
#include <boost/assert.hpp>
|
19
|
+
|
20
|
+
#include <boost/config/abi_prefix.hpp>
|
21
|
+
|
22
|
+
namespace boost
|
23
|
+
{
|
24
|
+
class latch
|
25
|
+
{
|
26
|
+
/// @Requires: count_.value_ must be greater than 0
|
27
|
+
/// Effect: Decrement the count. Unlocks the lock notify anyone waiting if we reached zero.
|
28
|
+
/// Returns: true if count_.value_ reached the value 0.
|
29
|
+
/// @ThreadSafe ensured by the @c lk parameter
|
30
|
+
bool count_down(unique_lock<mutex> &lk)
|
31
|
+
/// pre_condition (count_.value_ > 0)
|
32
|
+
{
|
33
|
+
BOOST_ASSERT(count_.value_ > 0);
|
34
|
+
if (--count_.value_ == 0)
|
35
|
+
{
|
36
|
+
count_.cond_.notify_all();
|
37
|
+
lk.unlock();
|
38
|
+
return true;
|
39
|
+
}
|
40
|
+
return false;
|
41
|
+
}
|
42
|
+
public:
|
43
|
+
BOOST_THREAD_NO_COPYABLE( latch)
|
44
|
+
|
45
|
+
/// Constructs a latch with a given count.
|
46
|
+
latch(std::size_t count) :
|
47
|
+
count_(count)
|
48
|
+
{
|
49
|
+
}
|
50
|
+
|
51
|
+
/// Destructor
|
52
|
+
/// Precondition: No threads are waiting or invoking count_down on @c *this.
|
53
|
+
|
54
|
+
~latch()
|
55
|
+
{
|
56
|
+
|
57
|
+
}
|
58
|
+
|
59
|
+
/// Blocks until the latch has counted down to zero.
|
60
|
+
void wait()
|
61
|
+
{
|
62
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
63
|
+
count_.cond_.wait(lk, detail::counter_is_zero(count_));
|
64
|
+
}
|
65
|
+
|
66
|
+
/// @return true if the internal counter is already 0, false otherwise
|
67
|
+
bool try_wait()
|
68
|
+
{
|
69
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
70
|
+
return (count_ == 0);
|
71
|
+
}
|
72
|
+
|
73
|
+
/// try to wait for a specified amount of time is elapsed.
|
74
|
+
/// @return whether there is a timeout or not.
|
75
|
+
template <class Rep, class Period>
|
76
|
+
cv_status wait_for(const chrono::duration<Rep, Period>& rel_time)
|
77
|
+
{
|
78
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
79
|
+
return count_.cond_.wait_for(lk, rel_time, detail::counter_is_zero(count_))
|
80
|
+
? cv_status::no_timeout
|
81
|
+
: cv_status::timeout;
|
82
|
+
}
|
83
|
+
|
84
|
+
/// try to wait until the specified time_point is reached
|
85
|
+
/// @return whether there were a timeout or not.
|
86
|
+
template <class Clock, class Duration>
|
87
|
+
cv_status wait_until(const chrono::time_point<Clock, Duration>& abs_time)
|
88
|
+
{
|
89
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
90
|
+
return count_.cond_.wait_until(lk, abs_time, detail::counter_is_zero(count_))
|
91
|
+
? cv_status::no_timeout
|
92
|
+
: cv_status::timeout;
|
93
|
+
}
|
94
|
+
|
95
|
+
/// Decrement the count and notify anyone waiting if we reach zero.
|
96
|
+
/// @Requires count must be greater than 0
|
97
|
+
void count_down()
|
98
|
+
{
|
99
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
100
|
+
count_down(lk);
|
101
|
+
}
|
102
|
+
void signal()
|
103
|
+
{
|
104
|
+
count_down();
|
105
|
+
}
|
106
|
+
|
107
|
+
/// Decrement the count and notify anyone waiting if we reach zero.
|
108
|
+
/// Blocks until the latch has counted down to zero.
|
109
|
+
/// @Requires count must be greater than 0
|
110
|
+
void count_down_and_wait()
|
111
|
+
{
|
112
|
+
boost::unique_lock<boost::mutex> lk(mutex_);
|
113
|
+
if (count_down(lk))
|
114
|
+
{
|
115
|
+
return;
|
116
|
+
}
|
117
|
+
count_.cond_.wait(lk, detail::counter_is_zero(count_));
|
118
|
+
}
|
119
|
+
void sync()
|
120
|
+
{
|
121
|
+
count_down_and_wait();
|
122
|
+
}
|
123
|
+
|
124
|
+
/// Reset the counter
|
125
|
+
/// #Requires This method may only be invoked when there are no other threads currently inside the count_down_and_wait() method.
|
126
|
+
void reset(std::size_t count)
|
127
|
+
{
|
128
|
+
boost::lock_guard<boost::mutex> lk(mutex_);
|
129
|
+
//BOOST_ASSERT(count_ == 0);
|
130
|
+
count_ = count;
|
131
|
+
}
|
132
|
+
|
133
|
+
private:
|
134
|
+
mutex mutex_;
|
135
|
+
detail::counter count_;
|
136
|
+
};
|
137
|
+
|
138
|
+
} // namespace boost
|
139
|
+
|
140
|
+
#include <boost/config/abi_suffix.hpp>
|
141
|
+
|
142
|
+
#endif
|
@@ -0,0 +1,468 @@
|
|
1
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
2
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
3
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
4
|
+
// (C) Copyright 2007 Anthony Williams
|
5
|
+
// (C) Copyright 2011-2012 Vicente J. Botet Escriba
|
6
|
+
|
7
|
+
#ifndef BOOST_THREAD_LOCK_ALGORITHMS_HPP
|
8
|
+
#define BOOST_THREAD_LOCK_ALGORITHMS_HPP
|
9
|
+
|
10
|
+
#include <boost/thread/detail/config.hpp>
|
11
|
+
#include <boost/thread/lock_types.hpp>
|
12
|
+
#include <boost/thread/lockable_traits.hpp>
|
13
|
+
|
14
|
+
#include <algorithm>
|
15
|
+
#include <iterator>
|
16
|
+
|
17
|
+
#include <boost/config/abi_prefix.hpp>
|
18
|
+
|
19
|
+
namespace boost
|
20
|
+
{
|
21
|
+
namespace detail
|
22
|
+
{
|
23
|
+
template <typename MutexType1, typename MutexType2>
|
24
|
+
unsigned try_lock_internal(MutexType1& m1, MutexType2& m2)
|
25
|
+
{
|
26
|
+
boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
|
27
|
+
if (!l1)
|
28
|
+
{
|
29
|
+
return 1;
|
30
|
+
}
|
31
|
+
if (!m2.try_lock())
|
32
|
+
{
|
33
|
+
return 2;
|
34
|
+
}
|
35
|
+
l1.release();
|
36
|
+
return 0;
|
37
|
+
}
|
38
|
+
|
39
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3>
|
40
|
+
unsigned try_lock_internal(MutexType1& m1, MutexType2& m2, MutexType3& m3)
|
41
|
+
{
|
42
|
+
boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
|
43
|
+
if (!l1)
|
44
|
+
{
|
45
|
+
return 1;
|
46
|
+
}
|
47
|
+
if (unsigned const failed_lock=try_lock_internal(m2,m3))
|
48
|
+
{
|
49
|
+
return failed_lock + 1;
|
50
|
+
}
|
51
|
+
l1.release();
|
52
|
+
return 0;
|
53
|
+
}
|
54
|
+
|
55
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
|
56
|
+
unsigned try_lock_internal(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
|
57
|
+
{
|
58
|
+
boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
|
59
|
+
if (!l1)
|
60
|
+
{
|
61
|
+
return 1;
|
62
|
+
}
|
63
|
+
if (unsigned const failed_lock=try_lock_internal(m2,m3,m4))
|
64
|
+
{
|
65
|
+
return failed_lock + 1;
|
66
|
+
}
|
67
|
+
l1.release();
|
68
|
+
return 0;
|
69
|
+
}
|
70
|
+
|
71
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
|
72
|
+
unsigned try_lock_internal(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
|
73
|
+
{
|
74
|
+
boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
|
75
|
+
if (!l1)
|
76
|
+
{
|
77
|
+
return 1;
|
78
|
+
}
|
79
|
+
if (unsigned const failed_lock=try_lock_internal(m2,m3,m4,m5))
|
80
|
+
{
|
81
|
+
return failed_lock + 1;
|
82
|
+
}
|
83
|
+
l1.release();
|
84
|
+
return 0;
|
85
|
+
}
|
86
|
+
|
87
|
+
template <typename MutexType1, typename MutexType2>
|
88
|
+
unsigned lock_helper(MutexType1& m1, MutexType2& m2)
|
89
|
+
{
|
90
|
+
boost::unique_lock<MutexType1> l1(m1);
|
91
|
+
if (!m2.try_lock())
|
92
|
+
{
|
93
|
+
return 1;
|
94
|
+
}
|
95
|
+
l1.release();
|
96
|
+
return 0;
|
97
|
+
}
|
98
|
+
|
99
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3>
|
100
|
+
unsigned lock_helper(MutexType1& m1, MutexType2& m2, MutexType3& m3)
|
101
|
+
{
|
102
|
+
boost::unique_lock<MutexType1> l1(m1);
|
103
|
+
if (unsigned const failed_lock=try_lock_internal(m2,m3))
|
104
|
+
{
|
105
|
+
return failed_lock;
|
106
|
+
}
|
107
|
+
l1.release();
|
108
|
+
return 0;
|
109
|
+
}
|
110
|
+
|
111
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
|
112
|
+
unsigned lock_helper(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
|
113
|
+
{
|
114
|
+
boost::unique_lock<MutexType1> l1(m1);
|
115
|
+
if (unsigned const failed_lock=try_lock_internal(m2,m3,m4))
|
116
|
+
{
|
117
|
+
return failed_lock;
|
118
|
+
}
|
119
|
+
l1.release();
|
120
|
+
return 0;
|
121
|
+
}
|
122
|
+
|
123
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
|
124
|
+
unsigned lock_helper(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
|
125
|
+
{
|
126
|
+
boost::unique_lock<MutexType1> l1(m1);
|
127
|
+
if (unsigned const failed_lock=try_lock_internal(m2,m3,m4,m5))
|
128
|
+
{
|
129
|
+
return failed_lock;
|
130
|
+
}
|
131
|
+
l1.release();
|
132
|
+
return 0;
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
namespace detail
|
137
|
+
{
|
138
|
+
template <bool x>
|
139
|
+
struct is_mutex_type_wrapper
|
140
|
+
{
|
141
|
+
};
|
142
|
+
|
143
|
+
template <typename MutexType1, typename MutexType2>
|
144
|
+
void lock_impl(MutexType1& m1, MutexType2& m2, is_mutex_type_wrapper<true> )
|
145
|
+
{
|
146
|
+
unsigned const lock_count = 2;
|
147
|
+
unsigned lock_first = 0;
|
148
|
+
for (;;)
|
149
|
+
{
|
150
|
+
switch (lock_first)
|
151
|
+
{
|
152
|
+
case 0:
|
153
|
+
lock_first = detail::lock_helper(m1, m2);
|
154
|
+
if (!lock_first) return;
|
155
|
+
break;
|
156
|
+
case 1:
|
157
|
+
lock_first = detail::lock_helper(m2, m1);
|
158
|
+
if (!lock_first) return;
|
159
|
+
lock_first = (lock_first + 1) % lock_count;
|
160
|
+
break;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
template <typename Iterator>
|
166
|
+
void lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> );
|
167
|
+
}
|
168
|
+
|
169
|
+
template <typename MutexType1, typename MutexType2>
|
170
|
+
void lock(MutexType1& m1, MutexType2& m2)
|
171
|
+
{
|
172
|
+
detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
173
|
+
}
|
174
|
+
|
175
|
+
template <typename MutexType1, typename MutexType2>
|
176
|
+
void lock(const MutexType1& m1, MutexType2& m2)
|
177
|
+
{
|
178
|
+
detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
179
|
+
}
|
180
|
+
|
181
|
+
template <typename MutexType1, typename MutexType2>
|
182
|
+
void lock(MutexType1& m1, const MutexType2& m2)
|
183
|
+
{
|
184
|
+
detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
185
|
+
}
|
186
|
+
|
187
|
+
template <typename MutexType1, typename MutexType2>
|
188
|
+
void lock(const MutexType1& m1, const MutexType2& m2)
|
189
|
+
{
|
190
|
+
detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
191
|
+
}
|
192
|
+
|
193
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3>
|
194
|
+
void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3)
|
195
|
+
{
|
196
|
+
unsigned const lock_count = 3;
|
197
|
+
unsigned lock_first = 0;
|
198
|
+
for (;;)
|
199
|
+
{
|
200
|
+
switch (lock_first)
|
201
|
+
{
|
202
|
+
case 0:
|
203
|
+
lock_first = detail::lock_helper(m1, m2, m3);
|
204
|
+
if (!lock_first) return;
|
205
|
+
break;
|
206
|
+
case 1:
|
207
|
+
lock_first = detail::lock_helper(m2, m3, m1);
|
208
|
+
if (!lock_first) return;
|
209
|
+
lock_first = (lock_first + 1) % lock_count;
|
210
|
+
break;
|
211
|
+
case 2:
|
212
|
+
lock_first = detail::lock_helper(m3, m1, m2);
|
213
|
+
if (!lock_first) return;
|
214
|
+
lock_first = (lock_first + 2) % lock_count;
|
215
|
+
break;
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
|
220
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
|
221
|
+
void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
|
222
|
+
{
|
223
|
+
unsigned const lock_count = 4;
|
224
|
+
unsigned lock_first = 0;
|
225
|
+
for (;;)
|
226
|
+
{
|
227
|
+
switch (lock_first)
|
228
|
+
{
|
229
|
+
case 0:
|
230
|
+
lock_first = detail::lock_helper(m1, m2, m3, m4);
|
231
|
+
if (!lock_first) return;
|
232
|
+
break;
|
233
|
+
case 1:
|
234
|
+
lock_first = detail::lock_helper(m2, m3, m4, m1);
|
235
|
+
if (!lock_first) return;
|
236
|
+
lock_first = (lock_first + 1) % lock_count;
|
237
|
+
break;
|
238
|
+
case 2:
|
239
|
+
lock_first = detail::lock_helper(m3, m4, m1, m2);
|
240
|
+
if (!lock_first) return;
|
241
|
+
lock_first = (lock_first + 2) % lock_count;
|
242
|
+
break;
|
243
|
+
case 3:
|
244
|
+
lock_first = detail::lock_helper(m4, m1, m2, m3);
|
245
|
+
if (!lock_first) return;
|
246
|
+
lock_first = (lock_first + 3) % lock_count;
|
247
|
+
break;
|
248
|
+
}
|
249
|
+
}
|
250
|
+
}
|
251
|
+
|
252
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
|
253
|
+
void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
|
254
|
+
{
|
255
|
+
unsigned const lock_count = 5;
|
256
|
+
unsigned lock_first = 0;
|
257
|
+
for (;;)
|
258
|
+
{
|
259
|
+
switch (lock_first)
|
260
|
+
{
|
261
|
+
case 0:
|
262
|
+
lock_first = detail::lock_helper(m1, m2, m3, m4, m5);
|
263
|
+
if (!lock_first) return;
|
264
|
+
break;
|
265
|
+
case 1:
|
266
|
+
lock_first = detail::lock_helper(m2, m3, m4, m5, m1);
|
267
|
+
if (!lock_first) return;
|
268
|
+
lock_first = (lock_first + 1) % lock_count;
|
269
|
+
break;
|
270
|
+
case 2:
|
271
|
+
lock_first = detail::lock_helper(m3, m4, m5, m1, m2);
|
272
|
+
if (!lock_first) return;
|
273
|
+
lock_first = (lock_first + 2) % lock_count;
|
274
|
+
break;
|
275
|
+
case 3:
|
276
|
+
lock_first = detail::lock_helper(m4, m5, m1, m2, m3);
|
277
|
+
if (!lock_first) return;
|
278
|
+
lock_first = (lock_first + 3) % lock_count;
|
279
|
+
break;
|
280
|
+
case 4:
|
281
|
+
lock_first = detail::lock_helper(m5, m1, m2, m3, m4);
|
282
|
+
if (!lock_first) return;
|
283
|
+
lock_first = (lock_first + 4) % lock_count;
|
284
|
+
break;
|
285
|
+
}
|
286
|
+
}
|
287
|
+
}
|
288
|
+
|
289
|
+
namespace detail
|
290
|
+
{
|
291
|
+
template <typename Mutex, bool x = is_mutex_type<Mutex>::value>
|
292
|
+
struct try_lock_impl_return
|
293
|
+
{
|
294
|
+
typedef int type;
|
295
|
+
};
|
296
|
+
|
297
|
+
template <typename Iterator>
|
298
|
+
struct try_lock_impl_return<Iterator, false>
|
299
|
+
{
|
300
|
+
typedef Iterator type;
|
301
|
+
};
|
302
|
+
|
303
|
+
template <typename MutexType1, typename MutexType2>
|
304
|
+
int try_lock_impl(MutexType1& m1, MutexType2& m2, is_mutex_type_wrapper<true> )
|
305
|
+
{
|
306
|
+
return ((int) detail::try_lock_internal(m1, m2)) - 1;
|
307
|
+
}
|
308
|
+
|
309
|
+
template <typename Iterator>
|
310
|
+
Iterator try_lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> );
|
311
|
+
}
|
312
|
+
|
313
|
+
template <typename MutexType1, typename MutexType2>
|
314
|
+
typename detail::try_lock_impl_return<MutexType1>::type try_lock(MutexType1& m1, MutexType2& m2)
|
315
|
+
{
|
316
|
+
return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
317
|
+
}
|
318
|
+
|
319
|
+
template <typename MutexType1, typename MutexType2>
|
320
|
+
typename detail::try_lock_impl_return<MutexType1>::type try_lock(const MutexType1& m1, MutexType2& m2)
|
321
|
+
{
|
322
|
+
return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
323
|
+
}
|
324
|
+
|
325
|
+
template <typename MutexType1, typename MutexType2>
|
326
|
+
typename detail::try_lock_impl_return<MutexType1>::type try_lock(MutexType1& m1, const MutexType2& m2)
|
327
|
+
{
|
328
|
+
return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
329
|
+
}
|
330
|
+
|
331
|
+
template <typename MutexType1, typename MutexType2>
|
332
|
+
typename detail::try_lock_impl_return<MutexType1>::type try_lock(const MutexType1& m1, const MutexType2& m2)
|
333
|
+
{
|
334
|
+
return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
335
|
+
}
|
336
|
+
|
337
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3>
|
338
|
+
int try_lock(MutexType1& m1, MutexType2& m2, MutexType3& m3)
|
339
|
+
{
|
340
|
+
return ((int) detail::try_lock_internal(m1, m2, m3)) - 1;
|
341
|
+
}
|
342
|
+
|
343
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
|
344
|
+
int try_lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
|
345
|
+
{
|
346
|
+
return ((int) detail::try_lock_internal(m1, m2, m3, m4)) - 1;
|
347
|
+
}
|
348
|
+
|
349
|
+
template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
|
350
|
+
int try_lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
|
351
|
+
{
|
352
|
+
return ((int) detail::try_lock_internal(m1, m2, m3, m4, m5)) - 1;
|
353
|
+
}
|
354
|
+
|
355
|
+
namespace detail
|
356
|
+
{
|
357
|
+
template <typename Iterator>
|
358
|
+
struct range_lock_guard
|
359
|
+
{
|
360
|
+
Iterator begin;
|
361
|
+
Iterator end;
|
362
|
+
|
363
|
+
range_lock_guard(Iterator begin_, Iterator end_) :
|
364
|
+
begin(begin_), end(end_)
|
365
|
+
{
|
366
|
+
boost::lock(begin, end);
|
367
|
+
}
|
368
|
+
|
369
|
+
void release()
|
370
|
+
{
|
371
|
+
begin = end;
|
372
|
+
}
|
373
|
+
|
374
|
+
~range_lock_guard()
|
375
|
+
{
|
376
|
+
for (; begin != end; ++begin)
|
377
|
+
{
|
378
|
+
begin->unlock();
|
379
|
+
}
|
380
|
+
}
|
381
|
+
};
|
382
|
+
|
383
|
+
template <typename Iterator>
|
384
|
+
Iterator try_lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> )
|
385
|
+
|
386
|
+
{
|
387
|
+
if (begin == end)
|
388
|
+
{
|
389
|
+
return end;
|
390
|
+
}
|
391
|
+
typedef typename std::iterator_traits<Iterator>::value_type lock_type;
|
392
|
+
unique_lock<lock_type> guard(*begin, try_to_lock);
|
393
|
+
|
394
|
+
if (!guard.owns_lock())
|
395
|
+
{
|
396
|
+
return begin;
|
397
|
+
}
|
398
|
+
Iterator const failed = boost::try_lock(++begin, end);
|
399
|
+
if (failed == end)
|
400
|
+
{
|
401
|
+
guard.release();
|
402
|
+
}
|
403
|
+
|
404
|
+
return failed;
|
405
|
+
}
|
406
|
+
}
|
407
|
+
|
408
|
+
namespace detail
|
409
|
+
{
|
410
|
+
template <typename Iterator>
|
411
|
+
void lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> )
|
412
|
+
{
|
413
|
+
typedef typename std::iterator_traits<Iterator>::value_type lock_type;
|
414
|
+
|
415
|
+
if (begin == end)
|
416
|
+
{
|
417
|
+
return;
|
418
|
+
}
|
419
|
+
bool start_with_begin = true;
|
420
|
+
Iterator second = begin;
|
421
|
+
++second;
|
422
|
+
Iterator next = second;
|
423
|
+
|
424
|
+
for (;;)
|
425
|
+
{
|
426
|
+
unique_lock<lock_type> begin_lock(*begin, defer_lock);
|
427
|
+
if (start_with_begin)
|
428
|
+
{
|
429
|
+
begin_lock.lock();
|
430
|
+
Iterator const failed_lock = boost::try_lock(next, end);
|
431
|
+
if (failed_lock == end)
|
432
|
+
{
|
433
|
+
begin_lock.release();
|
434
|
+
return;
|
435
|
+
}
|
436
|
+
start_with_begin = false;
|
437
|
+
next = failed_lock;
|
438
|
+
}
|
439
|
+
else
|
440
|
+
{
|
441
|
+
detail::range_lock_guard<Iterator> guard(next, end);
|
442
|
+
if (begin_lock.try_lock())
|
443
|
+
{
|
444
|
+
Iterator const failed_lock = boost::try_lock(second, next);
|
445
|
+
if (failed_lock == next)
|
446
|
+
{
|
447
|
+
begin_lock.release();
|
448
|
+
guard.release();
|
449
|
+
return;
|
450
|
+
}
|
451
|
+
start_with_begin = false;
|
452
|
+
next = failed_lock;
|
453
|
+
}
|
454
|
+
else
|
455
|
+
{
|
456
|
+
start_with_begin = true;
|
457
|
+
next = second;
|
458
|
+
}
|
459
|
+
}
|
460
|
+
}
|
461
|
+
}
|
462
|
+
|
463
|
+
}
|
464
|
+
|
465
|
+
}
|
466
|
+
#include <boost/config/abi_suffix.hpp>
|
467
|
+
|
468
|
+
#endif
|