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,24 @@
|
|
1
|
+
#include <boost/atomic.hpp>
|
2
|
+
|
3
|
+
// Copyright (c) 2011 Helge Bahmann
|
4
|
+
//
|
5
|
+
// Distributed under the Boost Software License, Version 1.0.
|
6
|
+
// See accompanying file LICENSE_1_0.txt or copy at
|
7
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
8
|
+
|
9
|
+
namespace boost {
|
10
|
+
namespace atomics {
|
11
|
+
namespace detail {
|
12
|
+
|
13
|
+
static lockpool::lock_type lock_pool_[41];
|
14
|
+
|
15
|
+
// NOTE: This function must NOT be inline. Otherwise MSVC 9 will sometimes generate broken code for modulus operation which result in crashes.
|
16
|
+
BOOST_ATOMIC_DECL lockpool::lock_type& lockpool::get_lock_for(const volatile void* addr)
|
17
|
+
{
|
18
|
+
std::size_t index = reinterpret_cast<std::size_t>(addr) % (sizeof(lock_pool_) / sizeof(*lock_pool_));
|
19
|
+
return lock_pool_[index];
|
20
|
+
}
|
21
|
+
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
@@ -22,9 +22,6 @@
|
|
22
22
|
#include <cstdlib>
|
23
23
|
#include <cassert>
|
24
24
|
|
25
|
-
using namespace boost::system;
|
26
|
-
using namespace boost::system::errc;
|
27
|
-
|
28
25
|
#include <cstring> // for strerror/strerror_r
|
29
26
|
|
30
27
|
# if defined( BOOST_WINDOWS_API )
|
@@ -36,19 +33,21 @@ using namespace boost::system::errc;
|
|
36
33
|
# endif
|
37
34
|
|
38
35
|
//----------------------------------------------------------------------------//
|
36
|
+
namespace boost
|
37
|
+
{
|
38
|
+
namespace system
|
39
|
+
{
|
39
40
|
|
40
41
|
namespace
|
41
42
|
{
|
42
|
-
|
43
|
-
using boost::system::errc::invalid_argument;
|
44
|
-
#endif
|
43
|
+
|
45
44
|
// standard error categories ---------------------------------------------//
|
46
45
|
|
47
46
|
class generic_error_category : public error_category
|
48
47
|
{
|
49
48
|
public:
|
50
49
|
generic_error_category(){}
|
51
|
-
const char * name() const;
|
50
|
+
const char * name() const BOOST_SYSTEM_NOEXCEPT;
|
52
51
|
std::string message( int ev ) const;
|
53
52
|
};
|
54
53
|
|
@@ -56,20 +55,25 @@ namespace
|
|
56
55
|
{
|
57
56
|
public:
|
58
57
|
system_error_category(){}
|
59
|
-
const char * name() const;
|
58
|
+
const char * name() const BOOST_SYSTEM_NOEXCEPT;
|
60
59
|
std::string message( int ev ) const;
|
61
|
-
error_condition default_error_condition( int ev ) const;
|
60
|
+
error_condition default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT;
|
62
61
|
};
|
63
62
|
|
64
63
|
// generic_error_category implementation ---------------------------------//
|
65
64
|
|
66
|
-
const char * generic_error_category::name() const
|
65
|
+
const char * generic_error_category::name() const BOOST_SYSTEM_NOEXCEPT
|
67
66
|
{
|
68
67
|
return "generic";
|
69
68
|
}
|
70
69
|
|
71
70
|
std::string generic_error_category::message( int ev ) const
|
72
71
|
{
|
72
|
+
using namespace boost::system::errc;
|
73
|
+
#if defined(__PGI)
|
74
|
+
using boost::system::errc::invalid_argument;
|
75
|
+
#endif
|
76
|
+
|
73
77
|
static std::string unknown_err( "Unknown error" );
|
74
78
|
// strerror_r is preferred because it is always thread safe,
|
75
79
|
// however, we fallback to strerror in certain cases because:
|
@@ -133,7 +137,9 @@ namespace
|
|
133
137
|
}
|
134
138
|
}
|
135
139
|
std::string msg;
|
140
|
+
# ifndef BOOST_NO_EXCEPTIONS
|
136
141
|
try
|
142
|
+
# endif
|
137
143
|
{
|
138
144
|
msg = ( ( result == invalid_argument ) ? "Unknown error" : bp );
|
139
145
|
}
|
@@ -154,13 +160,18 @@ namespace
|
|
154
160
|
}
|
155
161
|
// system_error_category implementation --------------------------------//
|
156
162
|
|
157
|
-
const char * system_error_category::name() const
|
163
|
+
const char * system_error_category::name() const BOOST_SYSTEM_NOEXCEPT
|
158
164
|
{
|
159
165
|
return "system";
|
160
166
|
}
|
161
167
|
|
162
|
-
error_condition system_error_category::default_error_condition( int ev ) const
|
168
|
+
error_condition system_error_category::default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT
|
163
169
|
{
|
170
|
+
using namespace boost::system::errc;
|
171
|
+
#if defined(__PGI)
|
172
|
+
using boost::system::errc::invalid_argument;
|
173
|
+
#endif
|
174
|
+
|
164
175
|
switch ( ev )
|
165
176
|
{
|
166
177
|
case 0: return make_error_condition( success );
|
@@ -401,10 +412,6 @@ namespace
|
|
401
412
|
|
402
413
|
} // unnamed namespace
|
403
414
|
|
404
|
-
namespace boost
|
405
|
-
{
|
406
|
-
namespace system
|
407
|
-
{
|
408
415
|
|
409
416
|
# ifndef BOOST_SYSTEM_NO_DEPRECATED
|
410
417
|
BOOST_SYSTEM_DECL error_code throws; // "throw on error" special error_code;
|
@@ -414,13 +421,13 @@ namespace boost
|
|
414
421
|
// address for comparison purposes
|
415
422
|
# endif
|
416
423
|
|
417
|
-
BOOST_SYSTEM_DECL const error_category & system_category()
|
424
|
+
BOOST_SYSTEM_DECL const error_category & system_category() BOOST_SYSTEM_NOEXCEPT
|
418
425
|
{
|
419
426
|
static const system_error_category system_category_const;
|
420
427
|
return system_category_const;
|
421
428
|
}
|
422
429
|
|
423
|
-
BOOST_SYSTEM_DECL const error_category & generic_category()
|
430
|
+
BOOST_SYSTEM_DECL const error_category & generic_category() BOOST_SYSTEM_NOEXCEPT
|
424
431
|
{
|
425
432
|
static const generic_error_category generic_category_const;
|
426
433
|
return generic_category_const;
|
@@ -7,7 +7,7 @@
|
|
7
7
|
#ifndef BOOST_NO_EXCEPTIONS
|
8
8
|
|
9
9
|
|
10
|
-
#include <boost/thread/
|
10
|
+
#include <boost/thread/future_error_code.hpp>
|
11
11
|
|
12
12
|
namespace boost
|
13
13
|
{
|
@@ -19,12 +19,12 @@ namespace boost
|
|
19
19
|
public boost::system::error_category
|
20
20
|
{
|
21
21
|
public:
|
22
|
-
virtual const char* name() const
|
22
|
+
virtual const char* name() const BOOST_NOEXCEPT;
|
23
23
|
virtual std::string message(int ev) const;
|
24
24
|
};
|
25
25
|
|
26
26
|
const char*
|
27
|
-
future_error_category::name() const
|
27
|
+
future_error_category::name() const BOOST_NOEXCEPT
|
28
28
|
{
|
29
29
|
return "future";
|
30
30
|
}
|
@@ -48,14 +48,16 @@ namespace boost
|
|
48
48
|
}
|
49
49
|
return std::string("unspecified future_errc value\n");
|
50
50
|
}
|
51
|
+
future_error_category future_error_category_var;
|
51
52
|
}
|
52
53
|
|
54
|
+
BOOST_THREAD_DECL
|
53
55
|
const system::error_category&
|
54
56
|
future_category() BOOST_NOEXCEPT
|
55
57
|
{
|
56
|
-
|
57
|
-
return f;
|
58
|
+
return thread_detail::future_error_category_var;
|
58
59
|
}
|
59
60
|
|
60
61
|
}
|
61
62
|
#endif
|
63
|
+
|
@@ -3,7 +3,12 @@
|
|
3
3
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
4
4
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
5
5
|
|
6
|
+
#include <boost/thread/detail/config.hpp>
|
7
|
+
#ifdef BOOST_THREAD_ONCE_ATOMIC
|
8
|
+
#include "./once_atomic.cpp"
|
9
|
+
#else
|
6
10
|
#define __STDC_CONSTANT_MACROS
|
11
|
+
#include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
|
7
12
|
#include <boost/thread/once.hpp>
|
8
13
|
#include <boost/assert.hpp>
|
9
14
|
#include <pthread.h>
|
@@ -12,9 +17,9 @@
|
|
12
17
|
|
13
18
|
namespace boost
|
14
19
|
{
|
15
|
-
namespace
|
20
|
+
namespace thread_detail
|
16
21
|
{
|
17
|
-
BOOST_THREAD_DECL
|
22
|
+
BOOST_THREAD_DECL uintmax_atomic_t once_global_epoch=BOOST_THREAD_DETAIL_UINTMAX_ATOMIC_MAX_C;
|
18
23
|
BOOST_THREAD_DECL pthread_mutex_t once_epoch_mutex=PTHREAD_MUTEX_INITIALIZER;
|
19
24
|
BOOST_THREAD_DECL pthread_cond_t once_epoch_cv = PTHREAD_COND_INITIALIZER;
|
20
25
|
|
@@ -55,7 +60,7 @@ namespace boost
|
|
55
60
|
#endif
|
56
61
|
}
|
57
62
|
|
58
|
-
|
63
|
+
uintmax_atomic_t& get_once_per_thread_epoch()
|
59
64
|
{
|
60
65
|
BOOST_VERIFY(!pthread_once(&epoch_tss_key_flag,create_epoch_tss_key));
|
61
66
|
void* data=pthread_getspecific(epoch_tss_key);
|
@@ -70,3 +75,4 @@ namespace boost
|
|
70
75
|
}
|
71
76
|
|
72
77
|
}
|
78
|
+
#endif //
|
@@ -0,0 +1,90 @@
|
|
1
|
+
// (C) Copyright 2013 Andrey Semashev
|
2
|
+
// (C) Copyright 2013 Vicente J. Botet Escriba
|
3
|
+
//
|
4
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
5
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
|
7
|
+
//#define __STDC_CONSTANT_MACROS
|
8
|
+
#include <boost/thread/detail/config.hpp>
|
9
|
+
#include <boost/thread/once.hpp>
|
10
|
+
#include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
|
11
|
+
#include <boost/assert.hpp>
|
12
|
+
#include <boost/static_assert.hpp>
|
13
|
+
#include <boost/atomic.hpp>
|
14
|
+
#include <boost/memory_order.hpp>
|
15
|
+
#include <pthread.h>
|
16
|
+
|
17
|
+
namespace boost
|
18
|
+
{
|
19
|
+
namespace thread_detail
|
20
|
+
{
|
21
|
+
|
22
|
+
enum flag_states
|
23
|
+
{
|
24
|
+
uninitialized, in_progress, initialized
|
25
|
+
};
|
26
|
+
|
27
|
+
|
28
|
+
#ifndef BOOST_THREAD_PROVIDES_ONCE_CXX11
|
29
|
+
BOOST_STATIC_ASSERT_MSG(sizeof(atomic_int_type) == sizeof(atomic_type), "Boost.Thread: unsupported platform");
|
30
|
+
#endif
|
31
|
+
|
32
|
+
static pthread_mutex_t once_mutex = PTHREAD_MUTEX_INITIALIZER;
|
33
|
+
static pthread_cond_t once_cv = PTHREAD_COND_INITIALIZER;
|
34
|
+
|
35
|
+
BOOST_THREAD_DECL bool enter_once_region(once_flag& flag) BOOST_NOEXCEPT
|
36
|
+
{
|
37
|
+
atomic_type& f = get_atomic_storage(flag);
|
38
|
+
if (f.load(memory_order_acquire) != initialized)
|
39
|
+
{
|
40
|
+
pthread::pthread_mutex_scoped_lock lk(&once_mutex);
|
41
|
+
if (f.load(memory_order_acquire) != initialized)
|
42
|
+
{
|
43
|
+
while (true)
|
44
|
+
{
|
45
|
+
atomic_int_type expected = uninitialized;
|
46
|
+
if (f.compare_exchange_strong(expected, in_progress, memory_order_acq_rel, memory_order_acquire))
|
47
|
+
{
|
48
|
+
// We have set the flag to in_progress
|
49
|
+
return true;
|
50
|
+
}
|
51
|
+
else if (expected == initialized)
|
52
|
+
{
|
53
|
+
// Another thread managed to complete the initialization
|
54
|
+
return false;
|
55
|
+
}
|
56
|
+
else
|
57
|
+
{
|
58
|
+
// Wait until the initialization is complete
|
59
|
+
//pthread::pthread_mutex_scoped_lock lk(&once_mutex);
|
60
|
+
BOOST_VERIFY(!pthread_cond_wait(&once_cv, &once_mutex));
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
return false;
|
66
|
+
}
|
67
|
+
|
68
|
+
BOOST_THREAD_DECL void commit_once_region(once_flag& flag) BOOST_NOEXCEPT
|
69
|
+
{
|
70
|
+
atomic_type& f = get_atomic_storage(flag);
|
71
|
+
{
|
72
|
+
pthread::pthread_mutex_scoped_lock lk(&once_mutex);
|
73
|
+
f.store(initialized, memory_order_release);
|
74
|
+
}
|
75
|
+
BOOST_VERIFY(!pthread_cond_broadcast(&once_cv));
|
76
|
+
}
|
77
|
+
|
78
|
+
BOOST_THREAD_DECL void rollback_once_region(once_flag& flag) BOOST_NOEXCEPT
|
79
|
+
{
|
80
|
+
atomic_type& f = get_atomic_storage(flag);
|
81
|
+
{
|
82
|
+
pthread::pthread_mutex_scoped_lock lk(&once_mutex);
|
83
|
+
f.store(uninitialized, memory_order_release);
|
84
|
+
}
|
85
|
+
BOOST_VERIFY(!pthread_cond_broadcast(&once_cv));
|
86
|
+
}
|
87
|
+
|
88
|
+
} // namespace thread_detail
|
89
|
+
|
90
|
+
} // namespace boost
|
@@ -1,20 +1,22 @@
|
|
1
1
|
// Copyright (C) 2001-2003
|
2
2
|
// William E. Kempf
|
3
3
|
// Copyright (C) 2007-8 Anthony Williams
|
4
|
-
// (C) Copyright 2011 Vicente J. Botet Escriba
|
4
|
+
// (C) Copyright 2011-2012 Vicente J. Botet Escriba
|
5
5
|
//
|
6
6
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
7
7
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
8
8
|
|
9
9
|
#include <boost/thread/detail/config.hpp>
|
10
10
|
|
11
|
-
#include <boost/thread/
|
11
|
+
#include <boost/thread/thread_only.hpp>
|
12
|
+
#if defined BOOST_THREAD_USES_DATETIME
|
12
13
|
#include <boost/thread/xtime.hpp>
|
14
|
+
#endif
|
13
15
|
#include <boost/thread/condition_variable.hpp>
|
14
16
|
#include <boost/thread/locks.hpp>
|
15
17
|
#include <boost/thread/once.hpp>
|
16
18
|
#include <boost/thread/tss.hpp>
|
17
|
-
#include <boost/
|
19
|
+
#include <boost/thread/future.hpp>
|
18
20
|
|
19
21
|
#ifdef __GLIBC__
|
20
22
|
#include <sys/sysinfo.h>
|
@@ -33,14 +35,17 @@ namespace boost
|
|
33
35
|
{
|
34
36
|
thread_data_base::~thread_data_base()
|
35
37
|
{
|
36
|
-
{
|
37
38
|
for (notify_list_t::iterator i = notify.begin(), e = notify.end();
|
38
39
|
i != e; ++i)
|
39
40
|
{
|
40
41
|
i->second->unlock();
|
41
42
|
i->first->notify_all();
|
42
43
|
}
|
43
|
-
|
44
|
+
for (async_states_t::iterator i = async_states_.begin(), e = async_states_.end();
|
45
|
+
i != e; ++i)
|
46
|
+
{
|
47
|
+
(*i)->make_ready();
|
48
|
+
}
|
44
49
|
}
|
45
50
|
|
46
51
|
struct thread_exit_callback_node
|
@@ -72,6 +77,7 @@ namespace boost
|
|
72
77
|
{
|
73
78
|
while(!thread_info->tss_data.empty() || thread_info->thread_exit_callbacks)
|
74
79
|
{
|
80
|
+
|
75
81
|
while(thread_info->thread_exit_callbacks)
|
76
82
|
{
|
77
83
|
detail::thread_exit_callback_node* const current_node=thread_info->thread_exit_callbacks;
|
@@ -97,7 +103,10 @@ namespace boost
|
|
97
103
|
thread_info->tss_data.erase(current);
|
98
104
|
}
|
99
105
|
}
|
100
|
-
thread_info
|
106
|
+
if (thread_info) // fixme: should we test this?
|
107
|
+
{
|
108
|
+
thread_info->self.reset();
|
109
|
+
}
|
101
110
|
}
|
102
111
|
}
|
103
112
|
}
|
@@ -148,26 +157,33 @@ namespace boost
|
|
148
157
|
boost::detail::thread_data_ptr thread_info = static_cast<boost::detail::thread_data_base*>(param)->self;
|
149
158
|
thread_info->self.reset();
|
150
159
|
detail::set_current_thread_data(thread_info.get());
|
160
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
151
161
|
BOOST_TRY
|
152
162
|
{
|
163
|
+
#endif
|
153
164
|
thread_info->run();
|
165
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
166
|
+
|
154
167
|
}
|
155
168
|
BOOST_CATCH (thread_interrupted const&)
|
156
169
|
{
|
157
170
|
}
|
158
|
-
BOOST_CATCH_END
|
159
171
|
// Removed as it stops the debugger identifying the cause of the exception
|
160
172
|
// Unhandled exceptions still cause the application to terminate
|
161
173
|
// BOOST_CATCH(...)
|
162
174
|
// {
|
175
|
+
// throw;
|
176
|
+
//
|
163
177
|
// std::terminate();
|
164
178
|
// }
|
165
|
-
|
179
|
+
BOOST_CATCH_END
|
180
|
+
#endif
|
166
181
|
detail::tls_destructor(thread_info.get());
|
167
182
|
detail::set_current_thread_data(0);
|
168
183
|
boost::lock_guard<boost::mutex> lock(thread_info->data_mutex);
|
169
184
|
thread_info->done=true;
|
170
185
|
thread_info->done_condition.notify_all();
|
186
|
+
|
171
187
|
return 0;
|
172
188
|
}
|
173
189
|
}
|
@@ -177,7 +193,9 @@ namespace boost
|
|
177
193
|
{
|
178
194
|
externally_launched_thread()
|
179
195
|
{
|
196
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
180
197
|
interrupt_enabled=false;
|
198
|
+
#endif
|
181
199
|
}
|
182
200
|
|
183
201
|
void run()
|
@@ -215,18 +233,20 @@ namespace boost
|
|
215
233
|
thread::thread() BOOST_NOEXCEPT
|
216
234
|
{}
|
217
235
|
|
218
|
-
|
236
|
+
bool thread::start_thread_noexcept()
|
219
237
|
{
|
220
238
|
thread_info->self=thread_info;
|
221
239
|
int const res = pthread_create(&thread_info->thread_handle, 0, &thread_proxy, thread_info.get());
|
222
240
|
if (res != 0)
|
223
241
|
{
|
224
242
|
thread_info->self.reset();
|
225
|
-
|
243
|
+
return false;
|
244
|
+
// boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
|
226
245
|
}
|
246
|
+
return true;
|
227
247
|
}
|
228
248
|
|
229
|
-
|
249
|
+
bool thread::start_thread_noexcept(const attributes& attr)
|
230
250
|
{
|
231
251
|
thread_info->self=thread_info;
|
232
252
|
const attributes::native_handle_type* h = attr.native_handle();
|
@@ -234,14 +254,16 @@ namespace boost
|
|
234
254
|
if (res != 0)
|
235
255
|
{
|
236
256
|
thread_info->self.reset();
|
237
|
-
|
257
|
+
return false;
|
258
|
+
// boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_create"));
|
238
259
|
}
|
239
260
|
int detached_state;
|
240
261
|
res = pthread_attr_getdetachstate(h, &detached_state);
|
241
262
|
if (res != 0)
|
242
263
|
{
|
243
264
|
thread_info->self.reset();
|
244
|
-
|
265
|
+
return false;
|
266
|
+
// boost::throw_exception(thread_resource_error(res, "boost thread: failed in pthread_attr_getdetachstate"));
|
245
267
|
}
|
246
268
|
if (PTHREAD_CREATE_DETACHED==detached_state)
|
247
269
|
{
|
@@ -259,6 +281,7 @@ namespace boost
|
|
259
281
|
}
|
260
282
|
}
|
261
283
|
}
|
284
|
+
return true;
|
262
285
|
}
|
263
286
|
|
264
287
|
|
@@ -268,12 +291,8 @@ namespace boost
|
|
268
291
|
return thread_info;
|
269
292
|
}
|
270
293
|
|
271
|
-
|
294
|
+
bool thread::join_noexcept()
|
272
295
|
{
|
273
|
-
if (this_thread::get_id() == get_id())
|
274
|
-
{
|
275
|
-
boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
|
276
|
-
}
|
277
296
|
detail::thread_data_ptr const local_thread_info=(get_thread_info)();
|
278
297
|
if(local_thread_info)
|
279
298
|
{
|
@@ -312,21 +331,16 @@ namespace boost
|
|
312
331
|
{
|
313
332
|
thread_info.reset();
|
314
333
|
}
|
334
|
+
return true;
|
315
335
|
}
|
316
336
|
else
|
317
337
|
{
|
318
|
-
|
319
|
-
boost::throw_exception(thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable"));
|
320
|
-
#endif
|
338
|
+
return false;
|
321
339
|
}
|
322
340
|
}
|
323
341
|
|
324
|
-
bool thread::
|
342
|
+
bool thread::do_try_join_until_noexcept(struct timespec const &timeout, bool& res)
|
325
343
|
{
|
326
|
-
if (this_thread::get_id() == get_id())
|
327
|
-
{
|
328
|
-
boost::throw_exception(thread_resource_error(system::errc::resource_deadlock_would_occur, "boost thread: trying joining itself"));
|
329
|
-
}
|
330
344
|
detail::thread_data_ptr const local_thread_info=(get_thread_info)();
|
331
345
|
if(local_thread_info)
|
332
346
|
{
|
@@ -336,9 +350,10 @@ namespace boost
|
|
336
350
|
unique_lock<mutex> lock(local_thread_info->data_mutex);
|
337
351
|
while(!local_thread_info->done)
|
338
352
|
{
|
339
|
-
if(!local_thread_info->done_condition.
|
353
|
+
if(!local_thread_info->done_condition.do_wait_until(lock,timeout))
|
340
354
|
{
|
341
|
-
|
355
|
+
res=false;
|
356
|
+
return true;
|
342
357
|
}
|
343
358
|
}
|
344
359
|
do_join=!local_thread_info->join_started;
|
@@ -368,19 +383,18 @@ namespace boost
|
|
368
383
|
{
|
369
384
|
thread_info.reset();
|
370
385
|
}
|
386
|
+
res=true;
|
371
387
|
return true;
|
372
388
|
}
|
373
389
|
else
|
374
390
|
{
|
375
|
-
|
376
|
-
boost::throw_exception(thread_resource_error(system::errc::invalid_argument, "boost thread: thread not joinable"));
|
377
|
-
#endif
|
391
|
+
return false;
|
378
392
|
}
|
379
393
|
}
|
380
394
|
|
381
395
|
bool thread::joinable() const BOOST_NOEXCEPT
|
382
396
|
{
|
383
|
-
return (get_thread_info)();
|
397
|
+
return (get_thread_info)()?true:false;
|
384
398
|
}
|
385
399
|
|
386
400
|
|
@@ -403,61 +417,104 @@ namespace boost
|
|
403
417
|
|
404
418
|
namespace this_thread
|
405
419
|
{
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
template<>
|
410
|
-
#endif
|
411
|
-
void sleep(const system_time& st)
|
420
|
+
namespace hiden
|
421
|
+
{
|
422
|
+
void BOOST_THREAD_DECL sleep_for(const timespec& ts)
|
412
423
|
{
|
413
|
-
detail::thread_data_base* const thread_info=detail::get_current_thread_data();
|
424
|
+
boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
|
414
425
|
|
415
426
|
if(thread_info)
|
416
427
|
{
|
417
|
-
|
418
|
-
|
428
|
+
unique_lock<mutex> lk(thread_info->sleep_mutex);
|
429
|
+
while( thread_info->sleep_condition.do_wait_for(lk,ts)) {}
|
419
430
|
}
|
420
431
|
else
|
421
432
|
{
|
422
|
-
xtime const xt=get_xtime(st);
|
423
433
|
|
434
|
+
if (boost::detail::timespec_ge(ts, boost::detail::timespec_zero()))
|
435
|
+
{
|
436
|
+
|
437
|
+
# if defined(BOOST_HAS_PTHREAD_DELAY_NP)
|
438
|
+
# if defined(__IBMCPP__)
|
439
|
+
BOOST_VERIFY(!pthread_delay_np(const_cast<timespec*>(&ts)));
|
440
|
+
# else
|
441
|
+
BOOST_VERIFY(!pthread_delay_np(&ts));
|
442
|
+
# endif
|
443
|
+
# elif defined(BOOST_HAS_NANOSLEEP)
|
444
|
+
// nanosleep takes a timespec that is an offset, not
|
445
|
+
// an absolute time.
|
446
|
+
nanosleep(&ts, 0);
|
447
|
+
# else
|
448
|
+
mutex mx;
|
449
|
+
unique_lock<mutex> lock(mx);
|
450
|
+
condition_variable cond;
|
451
|
+
cond.do_wait_for(lock, ts);
|
452
|
+
# endif
|
453
|
+
}
|
454
|
+
}
|
455
|
+
}
|
456
|
+
|
457
|
+
void BOOST_THREAD_DECL sleep_until(const timespec& ts)
|
458
|
+
{
|
459
|
+
boost::detail::thread_data_base* const thread_info=boost::detail::get_current_thread_data();
|
460
|
+
|
461
|
+
if(thread_info)
|
462
|
+
{
|
463
|
+
unique_lock<mutex> lk(thread_info->sleep_mutex);
|
464
|
+
while(thread_info->sleep_condition.do_wait_until(lk,ts)) {}
|
465
|
+
}
|
466
|
+
else
|
467
|
+
{
|
468
|
+
timespec now = boost::detail::timespec_now();
|
469
|
+
if (boost::detail::timespec_gt(ts, now))
|
470
|
+
{
|
424
471
|
for (int foo=0; foo < 5; ++foo)
|
425
472
|
{
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
# elif defined(BOOST_HAS_NANOSLEEP)
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
return;
|
473
|
+
|
474
|
+
# if defined(BOOST_HAS_PTHREAD_DELAY_NP)
|
475
|
+
timespec d = boost::detail::timespec_minus(ts, now);
|
476
|
+
BOOST_VERIFY(!pthread_delay_np(&d));
|
477
|
+
# elif defined(BOOST_HAS_NANOSLEEP)
|
478
|
+
// nanosleep takes a timespec that is an offset, not
|
479
|
+
// an absolute time.
|
480
|
+
timespec d = boost::detail::timespec_minus(ts, now);
|
481
|
+
nanosleep(&d, 0);
|
482
|
+
# else
|
483
|
+
mutex mx;
|
484
|
+
unique_lock<mutex> lock(mx);
|
485
|
+
condition_variable cond;
|
486
|
+
cond.do_wait_until(lock, ts);
|
487
|
+
# endif
|
488
|
+
timespec now2 = boost::detail::timespec_now();
|
489
|
+
if (boost::detail::timespec_ge(now2, ts))
|
490
|
+
{
|
491
|
+
return;
|
492
|
+
}
|
447
493
|
}
|
494
|
+
}
|
448
495
|
}
|
449
496
|
}
|
450
|
-
|
497
|
+
} // hiden
|
498
|
+
} // this_thread
|
499
|
+
namespace this_thread
|
500
|
+
{
|
451
501
|
void yield() BOOST_NOEXCEPT
|
452
502
|
{
|
453
503
|
# if defined(BOOST_HAS_SCHED_YIELD)
|
454
504
|
BOOST_VERIFY(!sched_yield());
|
455
505
|
# elif defined(BOOST_HAS_PTHREAD_YIELD)
|
456
506
|
BOOST_VERIFY(!pthread_yield());
|
507
|
+
//# elif defined BOOST_THREAD_USES_DATETIME
|
508
|
+
// xtime xt;
|
509
|
+
// xtime_get(&xt, TIME_UTC_);
|
510
|
+
// sleep(xt);
|
511
|
+
// sleep_for(chrono::milliseconds(0));
|
457
512
|
# else
|
458
|
-
|
459
|
-
|
460
|
-
|
513
|
+
#error
|
514
|
+
timespec ts;
|
515
|
+
ts.tv_sec= 0;
|
516
|
+
ts.tv_nsec= 0;
|
517
|
+
hiden::sleep_for(ts);
|
461
518
|
# endif
|
462
519
|
}
|
463
520
|
}
|
@@ -479,24 +536,7 @@ namespace boost
|
|
479
536
|
#endif
|
480
537
|
}
|
481
538
|
|
482
|
-
|
483
|
-
{
|
484
|
-
#if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
|
485
|
-
//return local_thread_info->thread_handle;
|
486
|
-
return const_cast<thread*>(this)->native_handle();
|
487
|
-
#else
|
488
|
-
detail::thread_data_ptr const local_thread_info=(get_thread_info)();
|
489
|
-
if(local_thread_info)
|
490
|
-
{
|
491
|
-
return id(local_thread_info);
|
492
|
-
}
|
493
|
-
else
|
494
|
-
{
|
495
|
-
return id();
|
496
|
-
}
|
497
|
-
#endif
|
498
|
-
}
|
499
|
-
|
539
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
500
540
|
void thread::interrupt()
|
501
541
|
{
|
502
542
|
detail::thread_data_ptr const local_thread_info=(get_thread_info)();
|
@@ -525,6 +565,7 @@ namespace boost
|
|
525
565
|
return false;
|
526
566
|
}
|
527
567
|
}
|
568
|
+
#endif
|
528
569
|
|
529
570
|
thread::native_handle_type thread::native_handle()
|
530
571
|
{
|
@@ -542,18 +583,9 @@ namespace boost
|
|
542
583
|
|
543
584
|
|
544
585
|
|
586
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
545
587
|
namespace this_thread
|
546
588
|
{
|
547
|
-
thread::id get_id() BOOST_NOEXCEPT
|
548
|
-
{
|
549
|
-
#if defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
|
550
|
-
return pthread_self();
|
551
|
-
#else
|
552
|
-
boost::detail::thread_data_base* const thread_info=get_or_make_current_thread_data();
|
553
|
-
return thread::id(thread_info?thread_info->shared_from_this():detail::thread_data_ptr());
|
554
|
-
#endif
|
555
|
-
}
|
556
|
-
|
557
589
|
void interruption_point()
|
558
590
|
{
|
559
591
|
#ifndef BOOST_NO_EXCEPTIONS
|
@@ -623,6 +655,7 @@ namespace boost
|
|
623
655
|
}
|
624
656
|
}
|
625
657
|
}
|
658
|
+
#endif
|
626
659
|
|
627
660
|
namespace detail
|
628
661
|
{
|
@@ -698,6 +731,7 @@ namespace boost
|
|
698
731
|
}
|
699
732
|
}
|
700
733
|
}
|
734
|
+
|
701
735
|
BOOST_THREAD_DECL void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk)
|
702
736
|
{
|
703
737
|
detail::thread_data_base* const current_thread_data(detail::get_current_thread_data());
|