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,226 @@
|
|
1
|
+
//////////////////////////////////////////////////////////////////////////////
|
2
|
+
//
|
3
|
+
// (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
|
4
|
+
// Software License, Version 1.0. (See accompanying file
|
5
|
+
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
6
|
+
//
|
7
|
+
// See http://www.boost.org/libs/thread for documentation.
|
8
|
+
//
|
9
|
+
//////////////////////////////////////////////////////////////////////////////
|
10
|
+
|
11
|
+
#ifndef BOOST_THREAD_LOCKABLE_ADAPTER_HPP
|
12
|
+
#define BOOST_THREAD_LOCKABLE_ADAPTER_HPP
|
13
|
+
|
14
|
+
#include <boost/thread/detail/delete.hpp>
|
15
|
+
#include <boost/chrono/chrono.hpp>
|
16
|
+
|
17
|
+
namespace boost
|
18
|
+
{
|
19
|
+
|
20
|
+
//[basic_lockable_adapter
|
21
|
+
template <typename BasicLockable>
|
22
|
+
class basic_lockable_adapter
|
23
|
+
{
|
24
|
+
public:
|
25
|
+
typedef BasicLockable mutex_type;
|
26
|
+
|
27
|
+
protected:
|
28
|
+
mutex_type& lockable() const
|
29
|
+
{
|
30
|
+
return lockable_;
|
31
|
+
}
|
32
|
+
mutable mutex_type lockable_; /*< mutable so that it can be modified by const functions >*/
|
33
|
+
public:
|
34
|
+
|
35
|
+
BOOST_THREAD_NO_COPYABLE( basic_lockable_adapter) /*< no copyable >*/
|
36
|
+
|
37
|
+
basic_lockable_adapter()
|
38
|
+
{}
|
39
|
+
|
40
|
+
void lock()
|
41
|
+
{
|
42
|
+
lockable().lock();
|
43
|
+
}
|
44
|
+
void unlock()
|
45
|
+
{
|
46
|
+
lockable().unlock();
|
47
|
+
}
|
48
|
+
|
49
|
+
};
|
50
|
+
//]
|
51
|
+
|
52
|
+
//[lockable_adapter
|
53
|
+
template <typename Lockable>
|
54
|
+
class lockable_adapter : public basic_lockable_adapter<Lockable>
|
55
|
+
{
|
56
|
+
public:
|
57
|
+
typedef Lockable mutex_type;
|
58
|
+
|
59
|
+
bool try_lock()
|
60
|
+
{
|
61
|
+
return this->lockable().try_lock();
|
62
|
+
}
|
63
|
+
};
|
64
|
+
//]
|
65
|
+
|
66
|
+
//[timed_lockable_adapter
|
67
|
+
template <typename TimedLock>
|
68
|
+
class timed_lockable_adapter: public lockable_adapter<TimedLock>
|
69
|
+
{
|
70
|
+
public:
|
71
|
+
typedef TimedLock mutex_type;
|
72
|
+
|
73
|
+
template <typename Clock, typename Duration>
|
74
|
+
bool try_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
|
75
|
+
{
|
76
|
+
return this->lockable().try_lock_until(abs_time);
|
77
|
+
}
|
78
|
+
template <typename Rep, typename Period>
|
79
|
+
bool try_lock_for(chrono::duration<Rep, Period> const & rel_time)
|
80
|
+
{
|
81
|
+
return this->lockable().try_lock_for(rel_time);
|
82
|
+
}
|
83
|
+
|
84
|
+
};
|
85
|
+
//]
|
86
|
+
|
87
|
+
//[shared_lockable_adapter
|
88
|
+
template <typename SharableLock>
|
89
|
+
class shared_lockable_adapter: public timed_lockable_adapter<SharableLock>
|
90
|
+
{
|
91
|
+
public:
|
92
|
+
typedef SharableLock mutex_type;
|
93
|
+
|
94
|
+
void lock_shared()
|
95
|
+
{
|
96
|
+
this->lockable().lock_shared();
|
97
|
+
}
|
98
|
+
bool try_lock_shared()
|
99
|
+
{
|
100
|
+
return this->lockable().try_lock_shared();
|
101
|
+
}
|
102
|
+
void unlock_shared()
|
103
|
+
{
|
104
|
+
this->lockable().unlock_shared();
|
105
|
+
}
|
106
|
+
|
107
|
+
template <typename Clock, typename Duration>
|
108
|
+
bool try_lock_shared_until(chrono::time_point<Clock, Duration> const & abs_time)
|
109
|
+
{
|
110
|
+
return this->lockable().try_lock_shared_until(abs_time);
|
111
|
+
}
|
112
|
+
template <typename Rep, typename Period>
|
113
|
+
bool try_lock_shared_for(chrono::duration<Rep, Period> const & rel_time)
|
114
|
+
{
|
115
|
+
return this->lockable().try_lock_shared_for(rel_time);
|
116
|
+
}
|
117
|
+
|
118
|
+
};
|
119
|
+
|
120
|
+
//]
|
121
|
+
|
122
|
+
//[upgrade_lockable_adapter
|
123
|
+
template <typename UpgradableLock>
|
124
|
+
class upgrade_lockable_adapter: public shared_lockable_adapter<UpgradableLock>
|
125
|
+
{
|
126
|
+
public:
|
127
|
+
typedef UpgradableLock mutex_type;
|
128
|
+
|
129
|
+
void lock_upgrade()
|
130
|
+
{
|
131
|
+
this->lockable().lock_upgrade();
|
132
|
+
}
|
133
|
+
|
134
|
+
bool try_lock_upgrade()
|
135
|
+
{
|
136
|
+
return this->lockable().try_lock_upgrade();
|
137
|
+
}
|
138
|
+
|
139
|
+
void unlock_upgrade()
|
140
|
+
{
|
141
|
+
this->lockable().unlock_upgrade();
|
142
|
+
}
|
143
|
+
|
144
|
+
template <typename Clock, typename Duration>
|
145
|
+
bool try_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
|
146
|
+
{
|
147
|
+
return this->lockable().try_lock_upgrade_until(abs_time);
|
148
|
+
}
|
149
|
+
template <typename Rep, typename Period>
|
150
|
+
bool try_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
|
151
|
+
{
|
152
|
+
return this->lockable().try_lock_upgrade_for(rel_time);
|
153
|
+
}
|
154
|
+
|
155
|
+
bool try_unlock_shared_and_lock()
|
156
|
+
{
|
157
|
+
return this->lockable().try_unlock_shared_and_lock();
|
158
|
+
}
|
159
|
+
|
160
|
+
template <typename Clock, typename Duration>
|
161
|
+
bool try_unlock_shared_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
|
162
|
+
{
|
163
|
+
return this->lockable().try_unlock_shared_and_lock_until(abs_time);
|
164
|
+
}
|
165
|
+
template <typename Rep, typename Period>
|
166
|
+
bool try_unlock_shared_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
|
167
|
+
{
|
168
|
+
return this->lockable().try_unlock_shared_and_lock_for(rel_time);
|
169
|
+
}
|
170
|
+
|
171
|
+
void unlock_and_lock_shared()
|
172
|
+
{
|
173
|
+
this->lockable().unlock_and_lock_shared();
|
174
|
+
}
|
175
|
+
|
176
|
+
bool try_unlock_shared_and_lock_upgrade()
|
177
|
+
{
|
178
|
+
return this->lockable().try_unlock_shared_and_lock_upgrade();
|
179
|
+
}
|
180
|
+
|
181
|
+
template <typename Clock, typename Duration>
|
182
|
+
bool try_unlock_shared_and_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
|
183
|
+
{
|
184
|
+
return this->lockable().try_unlock_shared_and_lock_upgrade_until(abs_time);
|
185
|
+
}
|
186
|
+
template <typename Rep, typename Period>
|
187
|
+
bool try_unlock_shared_and_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
|
188
|
+
{
|
189
|
+
return this->lockable().try_unlock_shared_and_lock_upgrade_for(rel_time);
|
190
|
+
}
|
191
|
+
|
192
|
+
void unlock_and_lock_upgrade()
|
193
|
+
{
|
194
|
+
this->lockable().unlock_and_lock_upgrade();
|
195
|
+
}
|
196
|
+
|
197
|
+
void unlock_upgrade_and_lock()
|
198
|
+
{
|
199
|
+
this->lockable().unlock_upgrade_and_lock();
|
200
|
+
}
|
201
|
+
|
202
|
+
bool try_unlock_upgrade_and_lock()
|
203
|
+
{
|
204
|
+
return this->lockable().try_unlock_upgrade_and_lock();
|
205
|
+
}
|
206
|
+
template <typename Clock, typename Duration>
|
207
|
+
bool try_unlock_upgrade_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
|
208
|
+
{
|
209
|
+
return this->lockable().try_unlock_upgrade_and_lock_until(abs_time);
|
210
|
+
}
|
211
|
+
template <typename Rep, typename Period>
|
212
|
+
bool try_unlock_upgrade_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
|
213
|
+
{
|
214
|
+
return this->lockable().try_unlock_upgrade_and_lock_for(rel_time);
|
215
|
+
}
|
216
|
+
|
217
|
+
void unlock_upgrade_and_lock_shared()
|
218
|
+
{
|
219
|
+
this->lockable().unlock_upgrade_and_lock_shared();
|
220
|
+
}
|
221
|
+
|
222
|
+
};
|
223
|
+
//]
|
224
|
+
|
225
|
+
}
|
226
|
+
#endif
|
@@ -0,0 +1,157 @@
|
|
1
|
+
// (C) Copyright 2012 Vicente Botet
|
2
|
+
//
|
3
|
+
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
4
|
+
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
5
|
+
|
6
|
+
#ifndef BOOST_THREAD_LOCKABLE_CONCEPTS_HPP
|
7
|
+
#define BOOST_THREAD_LOCKABLE_CONCEPTS_HPP
|
8
|
+
|
9
|
+
#include <boost/chrono/chrono.hpp>
|
10
|
+
#include <boost/concept_check.hpp>
|
11
|
+
|
12
|
+
namespace boost
|
13
|
+
{
|
14
|
+
|
15
|
+
/**
|
16
|
+
* BasicLockable object supports the basic features
|
17
|
+
* required to delimit a critical region
|
18
|
+
* Supports the basic lock and unlock functions.
|
19
|
+
*/
|
20
|
+
|
21
|
+
//[BasicLockable
|
22
|
+
template <typename Mutex>
|
23
|
+
struct BasicLockable
|
24
|
+
{
|
25
|
+
|
26
|
+
BOOST_CONCEPT_USAGE(BasicLockable)
|
27
|
+
{
|
28
|
+
l.lock();
|
29
|
+
l.unlock();
|
30
|
+
}
|
31
|
+
BasicLockable() : l(*static_cast<Mutex*>(0)) {}
|
32
|
+
private:
|
33
|
+
BasicLockable operator=(BasicLockable const&);
|
34
|
+
|
35
|
+
Mutex& l;
|
36
|
+
}
|
37
|
+
;
|
38
|
+
//]
|
39
|
+
/**
|
40
|
+
* Lockable extends BasicLockable
|
41
|
+
* with try_lock functions.
|
42
|
+
*/
|
43
|
+
|
44
|
+
//[Lockable
|
45
|
+
template <typename Mutex>
|
46
|
+
struct Lockable
|
47
|
+
{
|
48
|
+
BOOST_CONCEPT_ASSERT(( BasicLockable<Mutex> ));
|
49
|
+
|
50
|
+
BOOST_CONCEPT_USAGE(Lockable)
|
51
|
+
{
|
52
|
+
if (l.try_lock()) return;
|
53
|
+
}
|
54
|
+
Lockable() : l(*static_cast<Mutex*>(0)) {}
|
55
|
+
private:
|
56
|
+
Lockable operator=(Lockable const&);
|
57
|
+
Mutex& l;
|
58
|
+
};
|
59
|
+
//]
|
60
|
+
|
61
|
+
/**
|
62
|
+
* TimedLockable object extends Lockable
|
63
|
+
* with timed lock functions: try_lock_until and try_lock_for and the exception based lock_until and lock_for
|
64
|
+
*/
|
65
|
+
|
66
|
+
//[TimedLockable
|
67
|
+
template <typename Mutex>
|
68
|
+
struct TimedLockable
|
69
|
+
{
|
70
|
+
BOOST_CONCEPT_ASSERT(( Lockable<Mutex> ));
|
71
|
+
|
72
|
+
BOOST_CONCEPT_USAGE(TimedLockable)
|
73
|
+
{
|
74
|
+
if (l.try_lock_until(t)) return;
|
75
|
+
if (l.try_lock_for(d)) return;
|
76
|
+
}
|
77
|
+
TimedLockable() : l(*static_cast<Mutex*>(0)) {}
|
78
|
+
private:
|
79
|
+
TimedLockable operator=(TimedLockable const&);
|
80
|
+
Mutex& l;
|
81
|
+
chrono::system_clock::time_point t;
|
82
|
+
chrono::system_clock::duration d;
|
83
|
+
};
|
84
|
+
//]
|
85
|
+
|
86
|
+
/**
|
87
|
+
* SharedLockable object extends TimedLockable
|
88
|
+
* with the lock_shared, lock_shared_until, lock_shared_for, try_lock_shared_until, try_lock_shared
|
89
|
+
* and unlock_shared functions
|
90
|
+
*/
|
91
|
+
//[SharedLockable
|
92
|
+
template <typename Mutex>
|
93
|
+
struct SharedLockable
|
94
|
+
{
|
95
|
+
BOOST_CONCEPT_ASSERT(( TimedLockable<Mutex> ));
|
96
|
+
|
97
|
+
BOOST_CONCEPT_USAGE(SharedLockable)
|
98
|
+
{
|
99
|
+
l.lock_shared();
|
100
|
+
l.unlock_shared();
|
101
|
+
if (l.try_lock_shared()) return;
|
102
|
+
if (l.try_lock_shared_until(t)) return;
|
103
|
+
if (l.try_lock_shared_for(d)) return;
|
104
|
+
}
|
105
|
+
SharedLockable() : l(*static_cast<Mutex*>(0)) {}
|
106
|
+
private:
|
107
|
+
SharedLockable operator=(SharedLockable const&);
|
108
|
+
Mutex& l;
|
109
|
+
chrono::system_clock::time_point t;
|
110
|
+
chrono::system_clock::duration d;
|
111
|
+
};
|
112
|
+
//]
|
113
|
+
|
114
|
+
/**
|
115
|
+
* UpgradeLockable object extends SharedLockable
|
116
|
+
* with the lock_upgrade, lock_upgrade_until, unlock_upgrade_and_lock,
|
117
|
+
* unlock_and_lock_shared and unlock_upgrade_and_lock_shared functions
|
118
|
+
*/
|
119
|
+
|
120
|
+
//[UpgradeLockable
|
121
|
+
template <typename Mutex>
|
122
|
+
struct UpgradeLockable
|
123
|
+
{
|
124
|
+
BOOST_CONCEPT_ASSERT(( SharedLockable<Mutex> ));
|
125
|
+
|
126
|
+
BOOST_CONCEPT_USAGE(UpgradeLockable)
|
127
|
+
{
|
128
|
+
l.lock_upgrade();
|
129
|
+
l.unlock_upgrade();
|
130
|
+
if (l.try_lock_upgrade()) return;
|
131
|
+
if (l.try_lock_upgrade_until(t)) return;
|
132
|
+
if (l.try_lock_upgrade_for(d)) return;
|
133
|
+
if (l.try_unlock_shared_and_lock()) return;
|
134
|
+
if (l.try_unlock_shared_and_lock_until(t)) return;
|
135
|
+
if (l.try_unlock_shared_and_lock_for(d)) return;
|
136
|
+
l.unlock_and_lock_shared();
|
137
|
+
if (l.try_unlock_shared_and_lock_upgrade()) return;
|
138
|
+
if (l.try_unlock_shared_and_lock_upgrade_until(t)) return;
|
139
|
+
if (l.try_unlock_shared_and_lock_upgrade_for(d)) return;
|
140
|
+
l.unlock_and_lock_upgrade();
|
141
|
+
l.unlock_upgrade_and_lock();
|
142
|
+
if (l.try_unlock_upgrade_and_lock()) return;
|
143
|
+
if (l.try_unlock_upgrade_and_lock_until(t)) return;
|
144
|
+
if (l.try_unlock_upgrade_and_lock_for(d)) return;
|
145
|
+
l.unlock_upgrade_and_lock_shared();
|
146
|
+
}
|
147
|
+
UpgradeLockable() : l(*static_cast<Mutex*>(0)) {}
|
148
|
+
private:
|
149
|
+
UpgradeLockable operator=(UpgradeLockable const&);
|
150
|
+
Mutex& l;
|
151
|
+
chrono::system_clock::time_point t;
|
152
|
+
chrono::system_clock::duration d;
|
153
|
+
};
|
154
|
+
//]
|
155
|
+
|
156
|
+
}
|
157
|
+
#endif
|
@@ -0,0 +1,207 @@
|
|
1
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
2
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
3
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
4
|
+
// (C) Copyright 2007 Anthony Williams
|
5
|
+
// (C) Copyright 2011-2012 Vicente J. Botet Escriba
|
6
|
+
|
7
|
+
#ifndef BOOST_THREAD_LOCKABLE_TRAITS_HPP
|
8
|
+
#define BOOST_THREAD_LOCKABLE_TRAITS_HPP
|
9
|
+
|
10
|
+
#include <boost/thread/detail/config.hpp>
|
11
|
+
|
12
|
+
#include <boost/assert.hpp>
|
13
|
+
#include <boost/detail/workaround.hpp>
|
14
|
+
#include <boost/type_traits/is_class.hpp>
|
15
|
+
|
16
|
+
#include <boost/config/abi_prefix.hpp>
|
17
|
+
|
18
|
+
// todo make use of integral_constant, true_type and false_type
|
19
|
+
|
20
|
+
namespace boost
|
21
|
+
{
|
22
|
+
namespace sync
|
23
|
+
{
|
24
|
+
|
25
|
+
#if defined(BOOST_NO_SFINAE) || \
|
26
|
+
BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) || \
|
27
|
+
BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
|
28
|
+
#if ! defined BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
29
|
+
#define BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
30
|
+
#endif
|
31
|
+
#endif
|
32
|
+
|
33
|
+
#ifndef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
34
|
+
namespace detail
|
35
|
+
{
|
36
|
+
#define BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(member_name) \
|
37
|
+
template<typename T, bool=boost::is_class<T>::value> \
|
38
|
+
struct has_member_called_##member_name \
|
39
|
+
{ \
|
40
|
+
BOOST_STATIC_CONSTANT(bool, value=false); \
|
41
|
+
}; \
|
42
|
+
\
|
43
|
+
template<typename T> \
|
44
|
+
struct has_member_called_##member_name<T,true> \
|
45
|
+
{ \
|
46
|
+
typedef char true_type; \
|
47
|
+
struct false_type \
|
48
|
+
{ \
|
49
|
+
true_type dummy[2]; \
|
50
|
+
}; \
|
51
|
+
\
|
52
|
+
struct fallback { int member_name; }; \
|
53
|
+
struct derived: \
|
54
|
+
T, fallback \
|
55
|
+
{ \
|
56
|
+
derived(); \
|
57
|
+
}; \
|
58
|
+
\
|
59
|
+
template<int fallback::*> struct tester; \
|
60
|
+
\
|
61
|
+
template<typename U> \
|
62
|
+
static false_type has_member(tester<&U::member_name>*); \
|
63
|
+
template<typename U> \
|
64
|
+
static true_type has_member(...); \
|
65
|
+
\
|
66
|
+
BOOST_STATIC_CONSTANT( \
|
67
|
+
bool, value=sizeof(has_member<derived>(0))==sizeof(true_type)); \
|
68
|
+
}
|
69
|
+
|
70
|
+
BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(lock)
|
71
|
+
; BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(unlock);
|
72
|
+
BOOST_THREAD_DEFINE_HAS_MEMBER_CALLED(try_lock);
|
73
|
+
|
74
|
+
template<typename T,bool=has_member_called_lock<T>::value >
|
75
|
+
struct has_member_lock
|
76
|
+
{
|
77
|
+
BOOST_STATIC_CONSTANT(bool, value=false);
|
78
|
+
};
|
79
|
+
|
80
|
+
template<typename T>
|
81
|
+
struct has_member_lock<T,true>
|
82
|
+
{
|
83
|
+
typedef char true_type;
|
84
|
+
struct false_type
|
85
|
+
{
|
86
|
+
true_type dummy[2];
|
87
|
+
};
|
88
|
+
|
89
|
+
template<typename U,typename V>
|
90
|
+
static true_type has_member(V (U::*)());
|
91
|
+
template<typename U>
|
92
|
+
static false_type has_member(U);
|
93
|
+
|
94
|
+
BOOST_STATIC_CONSTANT(
|
95
|
+
bool,value=sizeof(has_member_lock<T>::has_member(&T::lock))==sizeof(true_type));
|
96
|
+
};
|
97
|
+
|
98
|
+
template<typename T,bool=has_member_called_unlock<T>::value >
|
99
|
+
struct has_member_unlock
|
100
|
+
{
|
101
|
+
BOOST_STATIC_CONSTANT(bool, value=false);
|
102
|
+
};
|
103
|
+
|
104
|
+
template<typename T>
|
105
|
+
struct has_member_unlock<T,true>
|
106
|
+
{
|
107
|
+
typedef char true_type;
|
108
|
+
struct false_type
|
109
|
+
{
|
110
|
+
true_type dummy[2];
|
111
|
+
};
|
112
|
+
|
113
|
+
template<typename U,typename V>
|
114
|
+
static true_type has_member(V (U::*)());
|
115
|
+
template<typename U>
|
116
|
+
static false_type has_member(U);
|
117
|
+
|
118
|
+
BOOST_STATIC_CONSTANT(
|
119
|
+
bool,value=sizeof(has_member_unlock<T>::has_member(&T::unlock))==sizeof(true_type));
|
120
|
+
};
|
121
|
+
|
122
|
+
template<typename T,bool=has_member_called_try_lock<T>::value >
|
123
|
+
struct has_member_try_lock
|
124
|
+
{
|
125
|
+
BOOST_STATIC_CONSTANT(bool, value=false);
|
126
|
+
};
|
127
|
+
|
128
|
+
template<typename T>
|
129
|
+
struct has_member_try_lock<T,true>
|
130
|
+
{
|
131
|
+
typedef char true_type;
|
132
|
+
struct false_type
|
133
|
+
{
|
134
|
+
true_type dummy[2];
|
135
|
+
};
|
136
|
+
|
137
|
+
template<typename U>
|
138
|
+
static true_type has_member(bool (U::*)());
|
139
|
+
template<typename U>
|
140
|
+
static false_type has_member(U);
|
141
|
+
|
142
|
+
BOOST_STATIC_CONSTANT(
|
143
|
+
bool,value=sizeof(has_member_try_lock<T>::has_member(&T::try_lock))==sizeof(true_type));
|
144
|
+
};
|
145
|
+
|
146
|
+
}
|
147
|
+
|
148
|
+
template<typename T>
|
149
|
+
struct is_basic_lockable
|
150
|
+
{
|
151
|
+
BOOST_STATIC_CONSTANT(bool, value = detail::has_member_lock<T>::value &&
|
152
|
+
detail::has_member_unlock<T>::value);
|
153
|
+
};
|
154
|
+
template<typename T>
|
155
|
+
struct is_lockable
|
156
|
+
{
|
157
|
+
BOOST_STATIC_CONSTANT(bool, value =
|
158
|
+
is_basic_lockable<T>::value &&
|
159
|
+
detail::has_member_try_lock<T>::value);
|
160
|
+
};
|
161
|
+
|
162
|
+
#else
|
163
|
+
template<typename T>
|
164
|
+
struct is_basic_lockable
|
165
|
+
{
|
166
|
+
BOOST_STATIC_CONSTANT(bool, value = false);
|
167
|
+
};
|
168
|
+
template<typename T>
|
169
|
+
struct is_lockable
|
170
|
+
{
|
171
|
+
BOOST_STATIC_CONSTANT(bool, value = false);
|
172
|
+
};
|
173
|
+
#endif
|
174
|
+
|
175
|
+
template<typename T>
|
176
|
+
struct is_recursive_mutex_sur_parole
|
177
|
+
{
|
178
|
+
BOOST_STATIC_CONSTANT(bool, value = false);
|
179
|
+
};
|
180
|
+
template<typename T>
|
181
|
+
struct is_recursive_mutex_sur_parolle : is_recursive_mutex_sur_parole<T>
|
182
|
+
{
|
183
|
+
};
|
184
|
+
|
185
|
+
template<typename T>
|
186
|
+
struct is_recursive_basic_lockable
|
187
|
+
{
|
188
|
+
BOOST_STATIC_CONSTANT(bool, value = is_basic_lockable<T>::value &&
|
189
|
+
is_recursive_mutex_sur_parolle<T>::value);
|
190
|
+
};
|
191
|
+
template<typename T>
|
192
|
+
struct is_recursive_lockable
|
193
|
+
{
|
194
|
+
BOOST_STATIC_CONSTANT(bool, value = is_lockable<T>::value &&
|
195
|
+
is_recursive_mutex_sur_parolle<T>::value);
|
196
|
+
};
|
197
|
+
}
|
198
|
+
template<typename T>
|
199
|
+
struct is_mutex_type
|
200
|
+
{
|
201
|
+
BOOST_STATIC_CONSTANT(bool, value = sync::is_lockable<T>::value);
|
202
|
+
};
|
203
|
+
|
204
|
+
}
|
205
|
+
#include <boost/config/abi_suffix.hpp>
|
206
|
+
|
207
|
+
#endif
|