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,135 @@
|
|
1
|
+
//////////////////////////////////////////////////////////////////////////////
|
2
|
+
//
|
3
|
+
// (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
|
4
|
+
// Software License, Version 1.0. (See accompanying file
|
5
|
+
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
//
|
7
|
+
// See http://www.boost.org/libs/thread for documentation.
|
8
|
+
//
|
9
|
+
//////////////////////////////////////////////////////////////////////////////
|
10
|
+
|
11
|
+
#ifndef BOOST_THREAD_POLY_SHARED_LOCKABLE_HPP
|
12
|
+
#define BOOST_THREAD_POLY_SHARED_LOCKABLE_HPP
|
13
|
+
|
14
|
+
#include <boost/thread/poly_lockable.hpp>
|
15
|
+
#include <boost/chrono/chrono.hpp>
|
16
|
+
|
17
|
+
namespace boost
|
18
|
+
{
|
19
|
+
|
20
|
+
|
21
|
+
//[shared_poly_lockable
|
22
|
+
class shared_poly_lockable: public timed_poly_lockable
|
23
|
+
{
|
24
|
+
public:
|
25
|
+
virtual ~shared_poly_lockable() = 0;
|
26
|
+
|
27
|
+
virtual void lock_shared() = 0;
|
28
|
+
virtual bool try_lock_shared() = 0;
|
29
|
+
virtual void unlock_shared() = 0;
|
30
|
+
|
31
|
+
virtual bool try_lock_shared_until(chrono::system_clock::time_point const & abs_time)=0;
|
32
|
+
virtual bool try_lock_shared_until(chrono::steady_clock::time_point const & abs_time)=0;
|
33
|
+
template <typename Clock, typename Duration>
|
34
|
+
bool try_lock_shared_until(chrono::time_point<Clock, Duration> const & abs_time)
|
35
|
+
{
|
36
|
+
return try_lock_shared_until(time_point_cast<Clock::time_point>(abs_time));
|
37
|
+
}
|
38
|
+
|
39
|
+
virtual bool try_lock_shared_for(chrono::nanoseconds const & relative_time)=0;
|
40
|
+
template <typename Rep, typename Period>
|
41
|
+
bool try_lock_shared_for(chrono::duration<Rep, Period> const & rel_time)
|
42
|
+
{
|
43
|
+
return try_lock_shared_for(duration_cast<Clock::duration>(rel_time));
|
44
|
+
}
|
45
|
+
|
46
|
+
};
|
47
|
+
|
48
|
+
//]
|
49
|
+
|
50
|
+
//[upgrade_poly_lockable
|
51
|
+
class upgrade_poly_lockable: public shared_poly_lockable
|
52
|
+
{
|
53
|
+
public:
|
54
|
+
virtual ~upgrade_poly_lockable() = 0;
|
55
|
+
|
56
|
+
virtual void lock_upgrade() = 0;
|
57
|
+
virtual bool try_lock_upgrade() = 0;
|
58
|
+
virtual void unlock_upgrade() = 0;
|
59
|
+
|
60
|
+
virtual bool try_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
|
61
|
+
virtual bool try_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
|
62
|
+
template <typename Clock, typename Duration>
|
63
|
+
bool try_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
|
64
|
+
{
|
65
|
+
return try_lock_upgrade_until(time_point_cast<Clock::time_point>(abs_time));
|
66
|
+
}
|
67
|
+
|
68
|
+
virtual bool try_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
|
69
|
+
template <typename Rep, typename Period>
|
70
|
+
bool try_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
|
71
|
+
{
|
72
|
+
return try_lock_upgrade_for(duration_cast<Clock::duration>(rel_time));
|
73
|
+
}
|
74
|
+
|
75
|
+
virtual bool try_unlock_shared_and_lock() = 0;
|
76
|
+
|
77
|
+
virtual bool try_unlock_shared_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
|
78
|
+
virtual bool try_unlock_shared_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
|
79
|
+
template <typename Clock, typename Duration>
|
80
|
+
bool try_unlock_shared_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
|
81
|
+
{
|
82
|
+
return try_unlock_shared_and_lock_until(time_point_cast<Clock::time_point>(abs_time));
|
83
|
+
}
|
84
|
+
|
85
|
+
virtual bool try_unlock_shared_and_lock_for(chrono::nanoseconds const & relative_time)=0;
|
86
|
+
template <typename Rep, typename Period>
|
87
|
+
bool try_unlock_shared_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
|
88
|
+
{
|
89
|
+
return try_unlock_shared_and_lock_for(duration_cast<Clock::duration>(rel_time));
|
90
|
+
}
|
91
|
+
|
92
|
+
virtual void unlock_and_lock_shared() = 0;
|
93
|
+
virtual bool try_unlock_shared_and_lock_upgrade() = 0;
|
94
|
+
|
95
|
+
virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
|
96
|
+
virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
|
97
|
+
template <typename Clock, typename Duration>
|
98
|
+
bool try_unlock_shared_and_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
|
99
|
+
{
|
100
|
+
return try_unlock_shared_and_lock_upgrade_until(time_point_cast<Clock::time_point>(abs_time));
|
101
|
+
}
|
102
|
+
|
103
|
+
virtual bool try_unlock_shared_and_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
|
104
|
+
template <typename Rep, typename Period>
|
105
|
+
bool try_unlock_shared_and_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
|
106
|
+
{
|
107
|
+
return try_unlock_shared_and_lock_upgrade_for(duration_cast<Clock::duration>(rel_time));
|
108
|
+
}
|
109
|
+
|
110
|
+
virtual void unlock_and_lock_upgrade() = 0;
|
111
|
+
virtual void unlock_upgrade_and_lock() = 0;
|
112
|
+
virtual bool try_unlock_upgrade_and_lock() = 0;
|
113
|
+
|
114
|
+
virtual bool try_unlock_upgrade_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
|
115
|
+
virtual bool try_unlock_upgrade_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
|
116
|
+
template <typename Clock, typename Duration>
|
117
|
+
bool try_unlock_upgrade_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
|
118
|
+
{
|
119
|
+
return try_unlock_upgrade_and_lock_until(time_point_cast<Clock::time_point>(abs_time));
|
120
|
+
}
|
121
|
+
|
122
|
+
virtual bool try_unlock_upgrade_and_lock_for(chrono::nanoseconds const & relative_time)=0;
|
123
|
+
template <typename Rep, typename Period>
|
124
|
+
bool try_unlock_upgrade_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
|
125
|
+
{
|
126
|
+
return try_unlock_upgrade_and_lock_for(duration_cast<Clock::duration>(rel_time));
|
127
|
+
}
|
128
|
+
|
129
|
+
virtual void unlock_upgrade_and_lock_shared() = 0;
|
130
|
+
|
131
|
+
};
|
132
|
+
//]
|
133
|
+
|
134
|
+
}
|
135
|
+
#endif
|
@@ -0,0 +1,170 @@
|
|
1
|
+
//////////////////////////////////////////////////////////////////////////////
|
2
|
+
//
|
3
|
+
// (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
|
4
|
+
// Software License, Version 1.0. (See accompanying file
|
5
|
+
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
//
|
7
|
+
// See http://www.boost.org/libs/thread for documentation.
|
8
|
+
//
|
9
|
+
//////////////////////////////////////////////////////////////////////////////
|
10
|
+
|
11
|
+
#ifndef BOOST_THREAD_POLY_SHARED_LOCKABLE_ADAPTER_HPP
|
12
|
+
#define BOOST_THREAD_POLY_SHARED_LOCKABLE_ADAPTER_HPP
|
13
|
+
|
14
|
+
#include <boost/thread/poly_lockable_adapter.hpp>
|
15
|
+
#include <boost/thread/poly_shared_lockable.hpp>
|
16
|
+
|
17
|
+
namespace boost
|
18
|
+
{
|
19
|
+
|
20
|
+
//[shared_lockable_adapter
|
21
|
+
template <typename Mutex, typename Base=poly_shared_lockable>
|
22
|
+
class poly_shared_lockable_adapter: public poly_timed_lockable_adapter<Mutex, Base>
|
23
|
+
{
|
24
|
+
public:
|
25
|
+
typedef Mutex mutex_type;
|
26
|
+
|
27
|
+
void lock_shared()
|
28
|
+
{
|
29
|
+
this->mtx().lock_shared();
|
30
|
+
}
|
31
|
+
bool try_lock_shared()
|
32
|
+
{
|
33
|
+
return this->mtx().try_lock_shared();
|
34
|
+
}
|
35
|
+
void unlock_shared()
|
36
|
+
{
|
37
|
+
this->mtx().unlock_shared();
|
38
|
+
}
|
39
|
+
|
40
|
+
bool try_lock_shared_until(chrono::system_clock::time_point const & abs_time)
|
41
|
+
{
|
42
|
+
return this->mtx().try_lock_shared_until(abs_time);
|
43
|
+
}
|
44
|
+
bool try_lock_shared_until(chrono::steady_clock::time_point const & abs_time)
|
45
|
+
{
|
46
|
+
return this->mtx().try_lock_shared_until(abs_time);
|
47
|
+
}
|
48
|
+
bool try_lock_shared_for(chrono::nanoseconds const & rel_time)
|
49
|
+
{
|
50
|
+
return this->mtx().try_lock_shared_for(rel_time);
|
51
|
+
}
|
52
|
+
|
53
|
+
};
|
54
|
+
|
55
|
+
//]
|
56
|
+
|
57
|
+
//[upgrade_lockable_adapter
|
58
|
+
template <typename Mutex, typename Base=poly_shared_lockable>
|
59
|
+
class upgrade_lockable_adapter: public shared_lockable_adapter<Mutex, Base>
|
60
|
+
{
|
61
|
+
public:
|
62
|
+
typedef Mutex mutex_type;
|
63
|
+
|
64
|
+
void lock_upgrade()
|
65
|
+
{
|
66
|
+
this->mtx().lock_upgrade();
|
67
|
+
}
|
68
|
+
|
69
|
+
bool try_lock_upgrade()
|
70
|
+
{
|
71
|
+
return this->mtx().try_lock_upgrade();
|
72
|
+
}
|
73
|
+
|
74
|
+
void unlock_upgrade()
|
75
|
+
{
|
76
|
+
this->mtx().unlock_upgrade();
|
77
|
+
}
|
78
|
+
|
79
|
+
bool try_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)
|
80
|
+
{
|
81
|
+
return this->mtx().try_lock_upgrade_until(abs_time);
|
82
|
+
}
|
83
|
+
bool try_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)
|
84
|
+
{
|
85
|
+
return this->mtx().try_lock_upgrade_until(abs_time);
|
86
|
+
}
|
87
|
+
bool try_lock_upgrade_for(chrono::nanoseconds const & rel_time)
|
88
|
+
{
|
89
|
+
return this->mtx().try_lock_upgrade_for(rel_time);
|
90
|
+
}
|
91
|
+
|
92
|
+
bool try_unlock_shared_and_lock()
|
93
|
+
{
|
94
|
+
return this->mtx().try_unlock_shared_and_lock();
|
95
|
+
}
|
96
|
+
|
97
|
+
bool try_unlock_shared_and_lock_until(chrono::system_clock::time_point const & abs_time)
|
98
|
+
{
|
99
|
+
return this->mtx().try_unlock_shared_and_lock_until(abs_time);
|
100
|
+
}
|
101
|
+
bool try_unlock_shared_and_lock_until(chrono::steady_clock::time_point const & abs_time)
|
102
|
+
{
|
103
|
+
return this->mtx().try_unlock_shared_and_lock_until(abs_time);
|
104
|
+
}
|
105
|
+
template <typename Rep, typename Period>
|
106
|
+
bool try_unlock_shared_and_lock_for(chrono::nanoseconds const & rel_time)
|
107
|
+
{
|
108
|
+
return this->mtx().try_unlock_shared_and_lock_for(rel_time);
|
109
|
+
}
|
110
|
+
|
111
|
+
void unlock_and_lock_shared()
|
112
|
+
{
|
113
|
+
this->mtx().unlock_and_lock_shared();
|
114
|
+
}
|
115
|
+
|
116
|
+
bool try_unlock_shared_and_lock_upgrade()
|
117
|
+
{
|
118
|
+
return this->mtx().try_unlock_shared_and_lock_upgrade();
|
119
|
+
}
|
120
|
+
|
121
|
+
bool try_unlock_shared_and_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)
|
122
|
+
{
|
123
|
+
return this->mtx().try_unlock_shared_and_lock_upgrade_until(abs_time);
|
124
|
+
}
|
125
|
+
bool try_unlock_shared_and_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)
|
126
|
+
{
|
127
|
+
return this->mtx().try_unlock_shared_and_lock_upgrade_until(abs_time);
|
128
|
+
}
|
129
|
+
bool try_unlock_shared_and_lock_upgrade_for(chrono::nanoseconds const & rel_time)
|
130
|
+
{
|
131
|
+
return this->mtx().try_unlock_shared_and_lock_upgrade_for(rel_time);
|
132
|
+
}
|
133
|
+
|
134
|
+
void unlock_and_lock_upgrade()
|
135
|
+
{
|
136
|
+
this->mtx().unlock_and_lock_upgrade();
|
137
|
+
}
|
138
|
+
|
139
|
+
void unlock_upgrade_and_lock()
|
140
|
+
{
|
141
|
+
this->mtx().unlock_upgrade_and_lock();
|
142
|
+
}
|
143
|
+
|
144
|
+
bool try_unlock_upgrade_and_lock()
|
145
|
+
{
|
146
|
+
return this->mtx().try_unlock_upgrade_and_lock();
|
147
|
+
}
|
148
|
+
bool try_unlock_upgrade_and_lock_until(chrono::system_clock::time_point const & abs_time)
|
149
|
+
{
|
150
|
+
return this->mtx().try_unlock_upgrade_and_lock_until(abs_time);
|
151
|
+
}
|
152
|
+
bool try_unlock_upgrade_and_lock_until(chrono::steady_clock::time_point const & abs_time)
|
153
|
+
{
|
154
|
+
return this->mtx().try_unlock_upgrade_and_lock_until(abs_time);
|
155
|
+
}
|
156
|
+
bool try_unlock_upgrade_and_lock_for(chrono::nanoseconds const & rel_time)
|
157
|
+
{
|
158
|
+
return this->mtx().try_unlock_upgrade_and_lock_for(rel_time);
|
159
|
+
}
|
160
|
+
|
161
|
+
void unlock_upgrade_and_lock_shared()
|
162
|
+
{
|
163
|
+
this->mtx().unlock_upgrade_and_lock_shared();
|
164
|
+
}
|
165
|
+
|
166
|
+
};
|
167
|
+
//]
|
168
|
+
|
169
|
+
}
|
170
|
+
#endif
|
@@ -4,11 +4,13 @@
|
|
4
4
|
// accompanying file LICENSE_1_0.txt or copy at
|
5
5
|
// http://www.boost.org/LICENSE_1_0.txt)
|
6
6
|
// (C) Copyright 2007-10 Anthony Williams
|
7
|
-
// (C) Copyright 2011 Vicente J. Botet Escriba
|
7
|
+
// (C) Copyright 2011-2012 Vicente J. Botet Escriba
|
8
8
|
|
9
9
|
#include <boost/thread/pthread/timespec.hpp>
|
10
10
|
#include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
|
11
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
11
12
|
#include <boost/thread/pthread/thread_data.hpp>
|
13
|
+
#endif
|
12
14
|
#include <boost/thread/pthread/condition_variable_fwd.hpp>
|
13
15
|
#ifdef BOOST_THREAD_USES_CHRONO
|
14
16
|
#include <boost/chrono/system_clocks.hpp>
|
@@ -20,10 +22,12 @@
|
|
20
22
|
|
21
23
|
namespace boost
|
22
24
|
{
|
25
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
23
26
|
namespace this_thread
|
24
27
|
{
|
25
28
|
void BOOST_THREAD_DECL interruption_point();
|
26
29
|
}
|
30
|
+
#endif
|
27
31
|
|
28
32
|
namespace thread_cv_detail
|
29
33
|
{
|
@@ -53,57 +57,88 @@ namespace boost
|
|
53
57
|
|
54
58
|
inline void condition_variable::wait(unique_lock<mutex>& m)
|
55
59
|
{
|
60
|
+
#if defined BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
|
61
|
+
if(! m.owns_lock())
|
62
|
+
{
|
63
|
+
boost::throw_exception(condition_error(-1, "boost::condition_variable::wait() failed precondition mutex not owned"));
|
64
|
+
}
|
65
|
+
#endif
|
56
66
|
int res=0;
|
57
67
|
{
|
68
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
58
69
|
thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
|
59
70
|
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
|
60
71
|
guard.activate(m);
|
61
72
|
do {
|
62
73
|
res = pthread_cond_wait(&cond,&internal_mutex);
|
63
74
|
} while (res == EINTR);
|
75
|
+
#else
|
76
|
+
//boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
|
77
|
+
pthread_mutex_t* the_mutex = m.mutex()->native_handle();
|
78
|
+
do {
|
79
|
+
res = pthread_cond_wait(&cond,the_mutex);
|
80
|
+
} while (res == EINTR);
|
81
|
+
#endif
|
64
82
|
}
|
83
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
65
84
|
this_thread::interruption_point();
|
85
|
+
#endif
|
66
86
|
if(res)
|
67
87
|
{
|
68
|
-
boost::throw_exception(condition_error(res, "boost::
|
88
|
+
boost::throw_exception(condition_error(res, "boost::condition_variable::wait failed in pthread_cond_wait"));
|
69
89
|
}
|
70
90
|
}
|
71
91
|
|
72
|
-
inline bool condition_variable::
|
92
|
+
inline bool condition_variable::do_wait_until(
|
73
93
|
unique_lock<mutex>& m,
|
74
94
|
struct timespec const &timeout)
|
75
95
|
{
|
96
|
+
#if defined BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
|
76
97
|
if (!m.owns_lock())
|
77
|
-
|
78
|
-
|
98
|
+
{
|
99
|
+
boost::throw_exception(condition_error(EPERM, "boost::condition_variable::do_wait_until() failed precondition mutex not owned"));
|
100
|
+
}
|
101
|
+
#endif
|
79
102
|
thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
|
80
103
|
int cond_res;
|
81
104
|
{
|
105
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
82
106
|
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
|
83
107
|
guard.activate(m);
|
84
108
|
cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
|
109
|
+
#else
|
110
|
+
//boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
|
111
|
+
pthread_mutex_t* the_mutex = m.mutex()->native_handle();
|
112
|
+
cond_res=pthread_cond_timedwait(&cond,the_mutex,&timeout);
|
113
|
+
#endif
|
85
114
|
}
|
115
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
86
116
|
this_thread::interruption_point();
|
117
|
+
#endif
|
87
118
|
if(cond_res==ETIMEDOUT)
|
88
119
|
{
|
89
120
|
return false;
|
90
121
|
}
|
91
122
|
if(cond_res)
|
92
123
|
{
|
93
|
-
boost::throw_exception(condition_error(cond_res, "condition_variable failed in pthread_cond_timedwait"));
|
124
|
+
boost::throw_exception(condition_error(cond_res, "boost::condition_variable::do_wait_until failed in pthread_cond_timedwait"));
|
94
125
|
}
|
95
126
|
return true;
|
96
127
|
}
|
97
128
|
|
98
129
|
inline void condition_variable::notify_one() BOOST_NOEXCEPT
|
99
130
|
{
|
131
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
100
132
|
boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex);
|
133
|
+
#endif
|
101
134
|
BOOST_VERIFY(!pthread_cond_signal(&cond));
|
102
135
|
}
|
103
136
|
|
104
137
|
inline void condition_variable::notify_all() BOOST_NOEXCEPT
|
105
138
|
{
|
139
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
106
140
|
boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex);
|
141
|
+
#endif
|
107
142
|
BOOST_VERIFY(!pthread_cond_broadcast(&cond));
|
108
143
|
}
|
109
144
|
|
@@ -119,13 +154,13 @@ namespace boost
|
|
119
154
|
int const res=pthread_mutex_init(&internal_mutex,NULL);
|
120
155
|
if(res)
|
121
156
|
{
|
122
|
-
boost::throw_exception(thread_resource_error(res, "condition_variable_any failed in pthread_mutex_init"));
|
157
|
+
boost::throw_exception(thread_resource_error(res, "boost::condition_variable_any::condition_variable_any() failed in pthread_mutex_init"));
|
123
158
|
}
|
124
159
|
int const res2=pthread_cond_init(&cond,NULL);
|
125
160
|
if(res2)
|
126
161
|
{
|
127
162
|
BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex));
|
128
|
-
boost::throw_exception(thread_resource_error(res, "condition_variable_any failed in pthread_cond_init"));
|
163
|
+
boost::throw_exception(thread_resource_error(res, "boost::condition_variable_any::condition_variable_any() failed in pthread_cond_init"));
|
129
164
|
}
|
130
165
|
}
|
131
166
|
~condition_variable_any()
|
@@ -140,14 +175,20 @@ namespace boost
|
|
140
175
|
int res=0;
|
141
176
|
{
|
142
177
|
thread_cv_detail::lock_on_exit<lock_type> guard;
|
178
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
143
179
|
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
|
180
|
+
#else
|
181
|
+
boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
|
182
|
+
#endif
|
144
183
|
guard.activate(m);
|
145
184
|
res=pthread_cond_wait(&cond,&internal_mutex);
|
146
185
|
}
|
186
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
147
187
|
this_thread::interruption_point();
|
188
|
+
#endif
|
148
189
|
if(res)
|
149
190
|
{
|
150
|
-
boost::throw_exception(condition_error(res, "condition_variable_any failed in pthread_cond_wait"));
|
191
|
+
boost::throw_exception(condition_error(res, "boost::condition_variable_any::wait() failed in pthread_cond_wait"));
|
151
192
|
}
|
152
193
|
}
|
153
194
|
|
@@ -157,11 +198,12 @@ namespace boost
|
|
157
198
|
while(!pred()) wait(m);
|
158
199
|
}
|
159
200
|
|
201
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
160
202
|
template<typename lock_type>
|
161
203
|
bool timed_wait(lock_type& m,boost::system_time const& wait_until)
|
162
204
|
{
|
163
|
-
struct timespec const timeout=detail::
|
164
|
-
return
|
205
|
+
struct timespec const timeout=detail::to_timespec(wait_until);
|
206
|
+
return do_wait_until(m, timeout);
|
165
207
|
}
|
166
208
|
template<typename lock_type>
|
167
209
|
bool timed_wait(lock_type& m,xtime const& wait_until)
|
@@ -197,7 +239,7 @@ namespace boost
|
|
197
239
|
{
|
198
240
|
return timed_wait(m,get_system_time()+wait_duration,pred);
|
199
241
|
}
|
200
|
-
|
242
|
+
#endif
|
201
243
|
#ifdef BOOST_THREAD_USES_CHRONO
|
202
244
|
template <class lock_type,class Duration>
|
203
245
|
cv_status
|
@@ -265,26 +307,26 @@ namespace boost
|
|
265
307
|
const chrono::duration<Rep, Period>& d,
|
266
308
|
Predicate pred)
|
267
309
|
{
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
310
|
+
return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
|
311
|
+
|
312
|
+
// while (!pred())
|
313
|
+
// {
|
314
|
+
// if (wait_for(lock, d) == cv_status::timeout)
|
315
|
+
// return pred();
|
316
|
+
// }
|
317
|
+
// return true;
|
274
318
|
}
|
275
319
|
|
276
320
|
template <class lock_type>
|
277
|
-
|
321
|
+
cv_status wait_until(
|
278
322
|
lock_type& lk,
|
279
323
|
chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
|
280
324
|
{
|
281
325
|
using namespace chrono;
|
282
326
|
nanoseconds d = tp.time_since_epoch();
|
283
|
-
timespec ts;
|
284
|
-
|
285
|
-
|
286
|
-
ts.tv_nsec = static_cast<long>((d - s).count());
|
287
|
-
do_timed_wait(lk, ts);
|
327
|
+
timespec ts = boost::detail::to_timespec(d);
|
328
|
+
if (do_wait_until(lk, ts)) return cv_status::no_timeout;
|
329
|
+
else return cv_status::timeout;
|
288
330
|
}
|
289
331
|
#endif
|
290
332
|
|
@@ -302,25 +344,31 @@ namespace boost
|
|
302
344
|
private: // used by boost::thread::try_join_until
|
303
345
|
|
304
346
|
template <class lock_type>
|
305
|
-
inline bool
|
347
|
+
inline bool do_wait_until(
|
306
348
|
lock_type& m,
|
307
349
|
struct timespec const &timeout)
|
308
350
|
{
|
309
351
|
int res=0;
|
310
352
|
{
|
311
353
|
thread_cv_detail::lock_on_exit<lock_type> guard;
|
354
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
312
355
|
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
|
356
|
+
#else
|
357
|
+
boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
|
358
|
+
#endif
|
313
359
|
guard.activate(m);
|
314
360
|
res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
|
315
361
|
}
|
362
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
316
363
|
this_thread::interruption_point();
|
364
|
+
#endif
|
317
365
|
if(res==ETIMEDOUT)
|
318
366
|
{
|
319
367
|
return false;
|
320
368
|
}
|
321
369
|
if(res)
|
322
370
|
{
|
323
|
-
boost::throw_exception(condition_error(res, "condition_variable_any failed in pthread_cond_timedwait"));
|
371
|
+
boost::throw_exception(condition_error(res, "boost::condition_variable_any::do_wait_until() failed in pthread_cond_timedwait"));
|
324
372
|
}
|
325
373
|
return true;
|
326
374
|
}
|