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
@@ -8,7 +8,8 @@
|
|
8
8
|
|
9
9
|
#include <boost/thread/detail/config.hpp>
|
10
10
|
#include <boost/thread/exceptions.hpp>
|
11
|
-
#include <boost/thread/
|
11
|
+
#include <boost/thread/lock_guard.hpp>
|
12
|
+
#include <boost/thread/lock_types.hpp>
|
12
13
|
#include <boost/thread/mutex.hpp>
|
13
14
|
#include <boost/thread/pthread/condition_variable_fwd.hpp>
|
14
15
|
|
@@ -24,6 +25,10 @@
|
|
24
25
|
#include <vector>
|
25
26
|
#include <utility>
|
26
27
|
|
28
|
+
#if defined(__ANDROID__)
|
29
|
+
#include <asm/page.h> // http://code.google.com/p/android/issues/detail?id=39983
|
30
|
+
#endif
|
31
|
+
|
27
32
|
#include <pthread.h>
|
28
33
|
#include <unistd.h>
|
29
34
|
|
@@ -77,6 +82,7 @@ namespace boost
|
|
77
82
|
|
78
83
|
namespace detail
|
79
84
|
{
|
85
|
+
struct future_object_base;
|
80
86
|
struct tss_cleanup_function;
|
81
87
|
struct thread_exit_callback_node;
|
82
88
|
struct tss_data_node
|
@@ -107,8 +113,7 @@ namespace boost
|
|
107
113
|
bool joined;
|
108
114
|
boost::detail::thread_exit_callback_node* thread_exit_callbacks;
|
109
115
|
std::map<void const*,boost::detail::tss_data_node> tss_data;
|
110
|
-
|
111
|
-
bool interrupt_requested;
|
116
|
+
|
112
117
|
pthread_mutex_t* cond_mutex;
|
113
118
|
pthread_cond_t* current_cond;
|
114
119
|
typedef std::vector<std::pair<condition_variable*, mutex*>
|
@@ -116,27 +121,49 @@ namespace boost
|
|
116
121
|
> notify_list_t;
|
117
122
|
notify_list_t notify;
|
118
123
|
|
124
|
+
typedef std::vector<shared_ptr<future_object_base> > async_states_t;
|
125
|
+
async_states_t async_states_;
|
126
|
+
|
127
|
+
//#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
128
|
+
// These data must be at the end so that the access to the other fields doesn't change
|
129
|
+
// when BOOST_THREAD_PROVIDES_INTERRUPTIONS is defined.
|
130
|
+
// Another option is to have them always
|
131
|
+
bool interrupt_enabled;
|
132
|
+
bool interrupt_requested;
|
133
|
+
//#endif
|
119
134
|
thread_data_base():
|
135
|
+
thread_handle(0),
|
120
136
|
done(false),join_started(false),joined(false),
|
121
137
|
thread_exit_callbacks(0),
|
122
|
-
|
123
|
-
interrupt_requested(false),
|
138
|
+
cond_mutex(0),
|
124
139
|
current_cond(0),
|
125
|
-
notify()
|
140
|
+
notify(),
|
141
|
+
async_states_()
|
142
|
+
//#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
143
|
+
, interrupt_enabled(true)
|
144
|
+
, interrupt_requested(false)
|
145
|
+
//#endif
|
126
146
|
{}
|
127
147
|
virtual ~thread_data_base();
|
128
148
|
|
129
149
|
typedef pthread_t native_handle_type;
|
130
150
|
|
131
151
|
virtual void run()=0;
|
132
|
-
void notify_all_at_thread_exit(condition_variable* cv, mutex* m)
|
152
|
+
virtual void notify_all_at_thread_exit(condition_variable* cv, mutex* m)
|
133
153
|
{
|
134
154
|
notify.push_back(std::pair<condition_variable*, mutex*>(cv, m));
|
135
155
|
}
|
156
|
+
|
157
|
+
void make_ready_at_thread_exit(shared_ptr<future_object_base> as)
|
158
|
+
{
|
159
|
+
async_states_.push_back(as);
|
160
|
+
}
|
161
|
+
|
136
162
|
};
|
137
163
|
|
138
164
|
BOOST_THREAD_DECL thread_data_base* get_current_thread_data();
|
139
165
|
|
166
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
140
167
|
class interruption_checker
|
141
168
|
{
|
142
169
|
thread_data_base* const thread_info;
|
@@ -188,71 +215,47 @@ namespace boost
|
|
188
215
|
}
|
189
216
|
}
|
190
217
|
};
|
218
|
+
#endif
|
191
219
|
}
|
192
220
|
|
193
221
|
namespace this_thread
|
194
222
|
{
|
223
|
+
namespace hiden
|
224
|
+
{
|
225
|
+
void BOOST_THREAD_DECL sleep_for(const timespec& ts);
|
226
|
+
void BOOST_THREAD_DECL sleep_until(const timespec& ts);
|
227
|
+
}
|
228
|
+
|
195
229
|
#ifdef BOOST_THREAD_USES_CHRONO
|
230
|
+
#ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY
|
231
|
+
|
196
232
|
inline
|
197
233
|
void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
|
198
234
|
{
|
199
|
-
|
200
|
-
boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
|
201
|
-
|
202
|
-
if(thread_info)
|
203
|
-
{
|
204
|
-
unique_lock<mutex> lk(thread_info->sleep_mutex);
|
205
|
-
while(cv_status::no_timeout==thread_info->sleep_condition.wait_for(lk,ns)) {}
|
206
|
-
}
|
207
|
-
else
|
208
|
-
{
|
209
|
-
if (ns >= nanoseconds::zero())
|
210
|
-
{
|
211
|
-
|
212
|
-
# if defined(BOOST_HAS_PTHREAD_DELAY_NP)
|
213
|
-
timespec ts;
|
214
|
-
ts.tv_sec = static_cast<long>(duration_cast<seconds>(ns).count());
|
215
|
-
ts.tv_nsec = static_cast<long>((ns - seconds(ts.tv_sec)).count());
|
216
|
-
BOOST_VERIFY(!pthread_delay_np(&ts));
|
217
|
-
# elif defined(BOOST_HAS_NANOSLEEP)
|
218
|
-
timespec ts;
|
219
|
-
ts.tv_sec = static_cast<long>(duration_cast<seconds>(ns).count());
|
220
|
-
ts.tv_nsec = static_cast<long>((ns - seconds(ts.tv_sec)).count());
|
221
|
-
// nanosleep takes a timespec that is an offset, not
|
222
|
-
// an absolute time.
|
223
|
-
nanosleep(&ts, 0);
|
224
|
-
# else
|
225
|
-
mutex mx;
|
226
|
-
mutex::scoped_lock lock(mx);
|
227
|
-
condition_variable cond;
|
228
|
-
cond.wait_for(lock, ns);
|
229
|
-
# endif
|
230
|
-
}
|
231
|
-
}
|
235
|
+
return boost::this_thread::hiden::sleep_for(boost::detail::to_timespec(ns));
|
232
236
|
}
|
233
237
|
#endif
|
238
|
+
#endif // BOOST_THREAD_USES_CHRONO
|
239
|
+
|
234
240
|
void BOOST_THREAD_DECL yield() BOOST_NOEXCEPT;
|
235
241
|
|
242
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
236
243
|
#ifdef __DECXXX
|
237
244
|
/// Workaround of DECCXX issue of incorrect template substitution
|
238
|
-
template
|
239
|
-
|
245
|
+
template<>
|
246
|
+
#endif
|
247
|
+
inline void sleep(system_time const& abs_time)
|
240
248
|
{
|
241
|
-
|
249
|
+
return boost::this_thread::hiden::sleep_until(boost::detail::to_timespec(abs_time));
|
242
250
|
}
|
243
251
|
|
244
|
-
template<>
|
245
|
-
void BOOST_THREAD_DECL sleep(system_time const& abs_time);
|
246
|
-
#else
|
247
|
-
void BOOST_THREAD_DECL sleep(system_time const& abs_time);
|
248
|
-
|
249
252
|
template<typename TimeDuration>
|
250
253
|
inline BOOST_SYMBOL_VISIBLE void sleep(TimeDuration const& rel_time)
|
251
254
|
{
|
252
255
|
this_thread::sleep(get_system_time()+rel_time);
|
253
256
|
}
|
254
|
-
#endif
|
255
|
-
}
|
257
|
+
#endif // BOOST_THREAD_USES_DATETIME
|
258
|
+
} // this_thread
|
256
259
|
}
|
257
260
|
|
258
261
|
#include <boost/config/abi_suffix.hpp>
|
@@ -1,34 +1,118 @@
|
|
1
1
|
#ifndef BOOST_THREAD_PTHREAD_TIMESPEC_HPP
|
2
2
|
#define BOOST_THREAD_PTHREAD_TIMESPEC_HPP
|
3
|
-
// (C) Copyright 2007-8 Anthony Williams
|
3
|
+
// (C) Copyright 2007-8 Anthony Williams
|
4
|
+
// (C) Copyright 2012 Vicente J. Botet Escriba
|
4
5
|
//
|
5
6
|
// Distributed under the Boost Software License, Version 1.0. (See
|
6
7
|
// accompanying file LICENSE_1_0.txt or copy at
|
7
8
|
// http://www.boost.org/LICENSE_1_0.txt)
|
8
9
|
|
10
|
+
#include <boost/thread/detail/config.hpp>
|
9
11
|
#include <boost/thread/thread_time.hpp>
|
12
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
10
13
|
#include <boost/date_time/posix_time/conversion.hpp>
|
14
|
+
#endif
|
11
15
|
#include <pthread.h>
|
12
16
|
#ifndef _WIN32
|
13
17
|
#include <unistd.h>
|
14
18
|
#endif
|
19
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
20
|
+
#include <boost/chrono/duration.hpp>
|
21
|
+
#endif
|
22
|
+
|
23
|
+
#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
|
24
|
+
# define BOOST_THREAD_TIMESPEC_MAC_API
|
25
|
+
#include <sys/time.h> //for gettimeofday and timeval
|
26
|
+
#else
|
27
|
+
#include <time.h> // for clock_gettime
|
28
|
+
#endif
|
15
29
|
|
16
30
|
#include <boost/config/abi_prefix.hpp>
|
17
31
|
|
18
32
|
namespace boost
|
19
33
|
{
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
34
|
+
namespace detail
|
35
|
+
{
|
36
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
37
|
+
inline struct timespec to_timespec(boost::system_time const& abs_time)
|
38
|
+
{
|
39
|
+
struct timespec timeout = { 0,0};
|
40
|
+
boost::posix_time::time_duration const time_since_epoch=abs_time-boost::posix_time::from_time_t(0);
|
41
|
+
|
42
|
+
timeout.tv_sec=time_since_epoch.total_seconds();
|
43
|
+
timeout.tv_nsec=(long)(time_since_epoch.fractional_seconds()*(1000000000l/time_since_epoch.ticks_per_second()));
|
44
|
+
return timeout;
|
45
|
+
}
|
46
|
+
#endif
|
47
|
+
#if defined BOOST_THREAD_USES_CHRONO
|
48
|
+
inline timespec to_timespec(chrono::nanoseconds const& ns)
|
49
|
+
{
|
50
|
+
struct timespec ts;
|
51
|
+
ts.tv_sec = static_cast<long>(chrono::duration_cast<chrono::seconds>(ns).count());
|
52
|
+
ts.tv_nsec = static_cast<long>((ns - chrono::duration_cast<chrono::seconds>(ns)).count());
|
53
|
+
return ts;
|
31
54
|
}
|
55
|
+
|
56
|
+
#endif
|
57
|
+
|
58
|
+
inline timespec to_timespec(boost::intmax_t const& ns)
|
59
|
+
{
|
60
|
+
boost::intmax_t s = ns / 1000000000l;
|
61
|
+
struct timespec ts;
|
62
|
+
ts.tv_sec = static_cast<long> (s);
|
63
|
+
ts.tv_nsec = static_cast<long> (ns - s * 1000000000l);
|
64
|
+
return ts;
|
65
|
+
}
|
66
|
+
inline boost::intmax_t to_nanoseconds_int_max(timespec const& ts)
|
67
|
+
{
|
68
|
+
return static_cast<boost::intmax_t>(ts.tv_sec) * 1000000000l + ts.tv_nsec;
|
69
|
+
}
|
70
|
+
inline bool timespec_ge_zero(timespec const& ts)
|
71
|
+
{
|
72
|
+
return (ts.tv_sec >= 0) || (ts.tv_nsec >= 0);
|
73
|
+
}
|
74
|
+
inline timespec timespec_now()
|
75
|
+
{
|
76
|
+
timespec ts;
|
77
|
+
|
78
|
+
#if defined(BOOST_THREAD_TIMESPEC_MAC_API)
|
79
|
+
timeval tv;
|
80
|
+
::gettimeofday(&tv, 0);
|
81
|
+
ts.tv_sec = tv.tv_sec;
|
82
|
+
ts.tv_nsec = tv.tv_usec * 1000;
|
83
|
+
#else
|
84
|
+
if ( ::clock_gettime( CLOCK_REALTIME, &ts ) )
|
85
|
+
{
|
86
|
+
BOOST_ASSERT(0 && "Boost::Thread - Internal Error");
|
87
|
+
}
|
88
|
+
#endif
|
89
|
+
return ts;
|
90
|
+
}
|
91
|
+
inline timespec timespec_zero()
|
92
|
+
{
|
93
|
+
timespec ts;
|
94
|
+
ts.tv_sec = 0;
|
95
|
+
ts.tv_nsec = 0;
|
96
|
+
return ts;
|
97
|
+
}
|
98
|
+
inline timespec timespec_plus(timespec const& lhs, timespec const& rhs)
|
99
|
+
{
|
100
|
+
return to_timespec(to_nanoseconds_int_max(lhs) + to_nanoseconds_int_max(rhs));
|
101
|
+
}
|
102
|
+
inline timespec timespec_minus(timespec const& lhs, timespec const& rhs)
|
103
|
+
{
|
104
|
+
return to_timespec(to_nanoseconds_int_max(lhs) - to_nanoseconds_int_max(rhs));
|
105
|
+
}
|
106
|
+
inline bool timespec_gt(timespec const& lhs, timespec const& rhs)
|
107
|
+
{
|
108
|
+
return to_nanoseconds_int_max(lhs) > to_nanoseconds_int_max(rhs);
|
109
|
+
}
|
110
|
+
inline bool timespec_ge(timespec const& lhs, timespec const& rhs)
|
111
|
+
{
|
112
|
+
return to_nanoseconds_int_max(lhs) >= to_nanoseconds_int_max(rhs);
|
113
|
+
}
|
114
|
+
|
115
|
+
}
|
32
116
|
}
|
33
117
|
|
34
118
|
#include <boost/config/abi_suffix.hpp>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
// recursive_mutex.hpp
|
5
5
|
//
|
6
|
-
// (C) Copyright 2007 Anthony Williams
|
6
|
+
// (C) Copyright 2007 Anthony Williams
|
7
7
|
//
|
8
8
|
// Distributed under the Boost Software License, Version 1.0. (See
|
9
9
|
// accompanying file LICENSE_1_0.txt or copy at
|
@@ -18,4 +18,47 @@
|
|
18
18
|
#error "Boost threads unavailable on this platform"
|
19
19
|
#endif
|
20
20
|
|
21
|
+
#include <boost/thread/lockable_traits.hpp>
|
22
|
+
|
23
|
+
namespace boost
|
24
|
+
{
|
25
|
+
namespace sync
|
26
|
+
{
|
27
|
+
|
28
|
+
#ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
29
|
+
template<>
|
30
|
+
struct is_basic_lockable<recursive_mutex>
|
31
|
+
{
|
32
|
+
BOOST_STATIC_CONSTANT(bool, value = true);
|
33
|
+
};
|
34
|
+
template<>
|
35
|
+
struct is_lockable<recursive_mutex>
|
36
|
+
{
|
37
|
+
BOOST_STATIC_CONSTANT(bool, value = true);
|
38
|
+
};
|
39
|
+
template<>
|
40
|
+
struct is_basic_lockable<recursive_timed_mutex>
|
41
|
+
{
|
42
|
+
BOOST_STATIC_CONSTANT(bool, value = true);
|
43
|
+
};
|
44
|
+
template<>
|
45
|
+
struct is_lockable<recursive_timed_mutex>
|
46
|
+
{
|
47
|
+
BOOST_STATIC_CONSTANT(bool, value = true);
|
48
|
+
};
|
49
|
+
#endif
|
50
|
+
|
51
|
+
template<>
|
52
|
+
struct is_recursive_mutex_sur_parolle<recursive_mutex>
|
53
|
+
{
|
54
|
+
BOOST_STATIC_CONSTANT(bool, value = true);
|
55
|
+
};
|
56
|
+
template<>
|
57
|
+
struct is_recursive_mutex_sur_parolle<recursive_timed_mutex>
|
58
|
+
{
|
59
|
+
BOOST_STATIC_CONSTANT(bool, value = true);
|
60
|
+
};
|
61
|
+
|
62
|
+
}
|
63
|
+
}
|
21
64
|
#endif
|
@@ -6,7 +6,9 @@
|
|
6
6
|
#ifndef BOOST_THREAD_REVERSE_LOCK_HPP
|
7
7
|
#define BOOST_THREAD_REVERSE_LOCK_HPP
|
8
8
|
#include <boost/thread/detail/config.hpp>
|
9
|
-
#include <boost/thread/
|
9
|
+
#include <boost/thread/detail/move.hpp>
|
10
|
+
#include <boost/thread/lockable_traits.hpp>
|
11
|
+
#include <boost/thread/lock_options.hpp>
|
10
12
|
#include <boost/thread/detail/delete.hpp>
|
11
13
|
|
12
14
|
namespace boost
|
@@ -15,7 +17,6 @@ namespace boost
|
|
15
17
|
template<typename Lock>
|
16
18
|
class reverse_lock
|
17
19
|
{
|
18
|
-
|
19
20
|
public:
|
20
21
|
typedef typename Lock::mutex_type mutex_type;
|
21
22
|
BOOST_THREAD_NO_COPYABLE(reverse_lock)
|
@@ -0,0 +1,285 @@
|
|
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 2009-2012 Anthony Williams
|
5
|
+
// (C) Copyright 2012 Vicente J. Botet Escriba
|
6
|
+
|
7
|
+
// Based on the Anthony's idea of scoped_thread in CCiA
|
8
|
+
|
9
|
+
#ifndef BOOST_THREAD_SCOPED_THREAD_HPP
|
10
|
+
#define BOOST_THREAD_SCOPED_THREAD_HPP
|
11
|
+
|
12
|
+
#include <boost/thread/detail/config.hpp>
|
13
|
+
#include <boost/thread/detail/delete.hpp>
|
14
|
+
#include <boost/thread/detail/move.hpp>
|
15
|
+
#include <boost/thread/thread_functors.hpp>
|
16
|
+
#include <boost/thread/thread_only.hpp>
|
17
|
+
|
18
|
+
#include <boost/config/abi_prefix.hpp>
|
19
|
+
|
20
|
+
namespace boost
|
21
|
+
{
|
22
|
+
|
23
|
+
/**
|
24
|
+
* RAI @c thread wrapper adding a specific destroyer allowing to master what can be done at destruction time.
|
25
|
+
*
|
26
|
+
* CallableThread: A callable void(thread&) .
|
27
|
+
* The default is a join_if_joinable.
|
28
|
+
*
|
29
|
+
* thread std/boost::thread destructor terminates the program if the thread is not joinable.
|
30
|
+
* Having a wrapper that can join the thread before destroying it seems a natural need.
|
31
|
+
*
|
32
|
+
* Example:
|
33
|
+
*
|
34
|
+
* boost::strict_scoped_thread<> t((boost::thread(F)));
|
35
|
+
*
|
36
|
+
*/
|
37
|
+
template <class CallableThread = join_if_joinable>
|
38
|
+
class strict_scoped_thread
|
39
|
+
{
|
40
|
+
thread t_;
|
41
|
+
struct dummy;
|
42
|
+
public:
|
43
|
+
|
44
|
+
BOOST_THREAD_NO_COPYABLE( strict_scoped_thread) /// non copyable
|
45
|
+
|
46
|
+
/*
|
47
|
+
*
|
48
|
+
*/
|
49
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
50
|
+
template <class F, class ...Args>
|
51
|
+
explicit strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(Args)... args,
|
52
|
+
typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
|
53
|
+
t_(boost::forward<F>(f), boost::forward<Args>(args)...) {}
|
54
|
+
#else
|
55
|
+
template <class F>
|
56
|
+
explicit strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f,
|
57
|
+
typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
|
58
|
+
t_(boost::forward<F>(f)) {}
|
59
|
+
template <class F, class A1>
|
60
|
+
strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1) :
|
61
|
+
t_(boost::forward<F>(f), boost::forward<A1>(a1)) {}
|
62
|
+
template <class F, class A1, class A2>
|
63
|
+
strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2) :
|
64
|
+
t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2)) {}
|
65
|
+
template <class F, class A1, class A2, class A3>
|
66
|
+
strict_scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2, BOOST_THREAD_FWD_REF(A3) a3) :
|
67
|
+
t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)) {}
|
68
|
+
#endif
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Constructor from the thread to own.
|
72
|
+
*
|
73
|
+
* @param t: the thread to own.
|
74
|
+
*
|
75
|
+
* Effects: move the thread to own @c t.
|
76
|
+
*/
|
77
|
+
explicit strict_scoped_thread(BOOST_THREAD_RV_REF(thread) t) BOOST_NOEXCEPT :
|
78
|
+
t_(boost::move(t))
|
79
|
+
{
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Destructor
|
84
|
+
* Effects: Call the CallableThread functor before destroying the owned thread.
|
85
|
+
* Remark: The CallableThread should not throw when joining the thread as the scoped variable is on a scope outside the thread function.
|
86
|
+
*/
|
87
|
+
~strict_scoped_thread()
|
88
|
+
{
|
89
|
+
CallableThread on_destructor;
|
90
|
+
|
91
|
+
on_destructor(t_);
|
92
|
+
}
|
93
|
+
|
94
|
+
};
|
95
|
+
|
96
|
+
/**
|
97
|
+
* RAI @c thread wrapper adding a specific destroyer allowing to master what can be done at destruction time.
|
98
|
+
*
|
99
|
+
* CallableThread: A callable void(thread&) .
|
100
|
+
* The default is join_if_joinable.
|
101
|
+
*
|
102
|
+
* thread std::thread destructor terminates the program if the thread is not joinable.
|
103
|
+
* Having a wrapper that can join the thread before destroying it seems a natural need.
|
104
|
+
*
|
105
|
+
* Remark: @c scoped_thread is not a @c thread as @c thread is not designed to be derived from as a polymorphic type.
|
106
|
+
* Anyway @c scoped_thread can be used in most of the contexts a @c thread could be used as it has the
|
107
|
+
* same non-deprecated interface with the exception of the construction.
|
108
|
+
*
|
109
|
+
* Example:
|
110
|
+
*
|
111
|
+
* boost::scoped_thread<> t((boost::thread(F)));
|
112
|
+
* t.interrupt();
|
113
|
+
*
|
114
|
+
*/
|
115
|
+
template <class CallableThread = join_if_joinable>
|
116
|
+
class scoped_thread
|
117
|
+
{
|
118
|
+
thread t_;
|
119
|
+
struct dummy;
|
120
|
+
public:
|
121
|
+
|
122
|
+
typedef thread::id id;
|
123
|
+
|
124
|
+
BOOST_THREAD_MOVABLE_ONLY( scoped_thread) /// Movable only
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Default Constructor.
|
128
|
+
*
|
129
|
+
* Effects: wraps a not-a-thread.
|
130
|
+
*/
|
131
|
+
scoped_thread() BOOST_NOEXCEPT:
|
132
|
+
t_()
|
133
|
+
{
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
*
|
138
|
+
*/
|
139
|
+
|
140
|
+
#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
141
|
+
template <class F, class ...Args>
|
142
|
+
explicit scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(Args)... args,
|
143
|
+
typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
|
144
|
+
t_(boost::forward<F>(f), boost::forward<Args>(args)...) {}
|
145
|
+
#else
|
146
|
+
template <class F>
|
147
|
+
explicit scoped_thread(BOOST_THREAD_FWD_REF(F) f,
|
148
|
+
typename disable_if<is_same<typename decay<F>::type, thread>, dummy* >::type=0) :
|
149
|
+
t_(boost::forward<F>(f)) {}
|
150
|
+
template <class F, class A1>
|
151
|
+
scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1) :
|
152
|
+
t_(boost::forward<F>(f), boost::forward<A1>(a1)) {}
|
153
|
+
template <class F, class A1, class A2>
|
154
|
+
scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2) :
|
155
|
+
t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2)) {}
|
156
|
+
template <class F, class A1, class A2, class A3>
|
157
|
+
scoped_thread(BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(A1) a1, BOOST_THREAD_FWD_REF(A2) a2, BOOST_THREAD_FWD_REF(A3) a3) :
|
158
|
+
t_(boost::forward<F>(f), boost::forward<A1>(a1), boost::forward<A2>(a2), boost::forward<A3>(a3)) {}
|
159
|
+
|
160
|
+
#endif
|
161
|
+
/**
|
162
|
+
* Constructor from the thread to own.
|
163
|
+
*
|
164
|
+
* @param t: the thread to own.
|
165
|
+
*
|
166
|
+
* Effects: move the thread to own @c t.
|
167
|
+
*/
|
168
|
+
explicit scoped_thread(BOOST_THREAD_RV_REF(thread) t) BOOST_NOEXCEPT :
|
169
|
+
t_(boost::move(t))
|
170
|
+
{
|
171
|
+
}
|
172
|
+
|
173
|
+
// explicit operator thread()
|
174
|
+
// {
|
175
|
+
// return boost::move(t_);
|
176
|
+
// }
|
177
|
+
|
178
|
+
/**
|
179
|
+
* Move constructor.
|
180
|
+
*/
|
181
|
+
scoped_thread(BOOST_RV_REF(scoped_thread) x) BOOST_NOEXCEPT :
|
182
|
+
t_(boost::move(x.t_))
|
183
|
+
{}
|
184
|
+
|
185
|
+
/**
|
186
|
+
* Destructor
|
187
|
+
*
|
188
|
+
* Effects: Call the CallableThread functor before destroying the owned thread.
|
189
|
+
*/
|
190
|
+
~scoped_thread()
|
191
|
+
{
|
192
|
+
CallableThread on_destructor;
|
193
|
+
|
194
|
+
on_destructor(t_);
|
195
|
+
}
|
196
|
+
|
197
|
+
/**
|
198
|
+
* Move assignment.
|
199
|
+
*/
|
200
|
+
scoped_thread& operator=(BOOST_RV_REF(scoped_thread) x)
|
201
|
+
{
|
202
|
+
t_ = boost::move(x.t_);
|
203
|
+
return *this;
|
204
|
+
}
|
205
|
+
|
206
|
+
/**
|
207
|
+
*
|
208
|
+
*/
|
209
|
+
void swap(scoped_thread& x) BOOST_NOEXCEPT
|
210
|
+
{
|
211
|
+
t_.swap(x.t_);
|
212
|
+
}
|
213
|
+
|
214
|
+
// forwarded thread functions
|
215
|
+
inline thread::id get_id() const BOOST_NOEXCEPT
|
216
|
+
{
|
217
|
+
return t_.get_id();
|
218
|
+
}
|
219
|
+
|
220
|
+
void detach()
|
221
|
+
{
|
222
|
+
t_.detach();
|
223
|
+
}
|
224
|
+
|
225
|
+
void join()
|
226
|
+
{
|
227
|
+
t_.join();
|
228
|
+
}
|
229
|
+
|
230
|
+
#ifdef BOOST_THREAD_USES_CHRONO
|
231
|
+
template <class Rep, class Period>
|
232
|
+
bool try_join_for(const chrono::duration<Rep, Period>& rel_time)
|
233
|
+
{
|
234
|
+
return t_.try_join_for(rel_time);
|
235
|
+
}
|
236
|
+
|
237
|
+
template <class Clock, class Duration>
|
238
|
+
bool try_join_until(const chrono::time_point<Clock, Duration>& abs_time)
|
239
|
+
{
|
240
|
+
return t_.try_join_until(abs_time);
|
241
|
+
}
|
242
|
+
#endif
|
243
|
+
|
244
|
+
thread::native_handle_type native_handle()BOOST_NOEXCEPT
|
245
|
+
{
|
246
|
+
return t_.native_handle();
|
247
|
+
}
|
248
|
+
|
249
|
+
bool joinable() const BOOST_NOEXCEPT
|
250
|
+
{
|
251
|
+
return t_.joinable();
|
252
|
+
}
|
253
|
+
|
254
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
255
|
+
void interrupt()
|
256
|
+
{
|
257
|
+
t_.interrupt();
|
258
|
+
}
|
259
|
+
|
260
|
+
bool interruption_requested() const BOOST_NOEXCEPT
|
261
|
+
{
|
262
|
+
return t_.interruption_requested();
|
263
|
+
}
|
264
|
+
#endif
|
265
|
+
|
266
|
+
static unsigned hardware_concurrency()BOOST_NOEXCEPT
|
267
|
+
{
|
268
|
+
return thread::hardware_concurrency();
|
269
|
+
}
|
270
|
+
|
271
|
+
};
|
272
|
+
|
273
|
+
/**
|
274
|
+
* Effects: swaps the contents of two scoped threads.
|
275
|
+
*/
|
276
|
+
template <class Destroyer>
|
277
|
+
void swap(scoped_thread<Destroyer>& lhs, scoped_thread<Destroyer>& rhs)
|
278
|
+
BOOST_NOEXCEPT {
|
279
|
+
return lhs.swap(rhs);
|
280
|
+
}
|
281
|
+
|
282
|
+
}
|
283
|
+
#include <boost/config/abi_suffix.hpp>
|
284
|
+
|
285
|
+
#endif
|