passenger 4.0.20 → 4.0.21
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/NEWS +15 -0
- data/README.md +5 -3
- data/Rakefile +1 -0
- data/bin/passenger-config +1 -5
- data/bin/passenger-install-apache2-module +53 -5
- data/bin/passenger-install-nginx-module +19 -6
- data/bin/passenger-memory-stats +3 -3
- data/build/agents.rb +11 -8
- data/build/apache2.rb +9 -5
- data/build/basics.rb +15 -21
- data/build/common_library.rb +16 -6
- data/build/cplusplus_support.rb +5 -5
- data/build/cxx_tests.rb +3 -3
- data/build/documentation.rb +1 -1
- data/build/misc.rb +4 -37
- data/build/node_tests.rb +29 -0
- data/build/oxt_tests.rb +1 -1
- data/build/packaging.rb +29 -10
- data/build/preprocessor.rb +2 -1
- data/build/test_basics.rb +15 -6
- data/debian.template/locations.ini.template +1 -0
- data/debian.template/passenger.install.template +1 -0
- data/dev/copy_boost_headers.rb +7 -3
- data/dev/run_travis.sh +32 -16
- data/doc/Users guide Apache.idmap.txt +22 -34
- data/doc/Users guide Apache.txt +20 -234
- data/doc/Users guide Nginx.idmap.txt +84 -66
- data/doc/Users guide Nginx.txt +50 -1
- data/doc/Users guide Standalone.idmap.txt +74 -0
- data/doc/Users guide Standalone.txt +22 -9
- data/doc/Users guide.txt +51 -0
- data/doc/users_guide_snippets/environment_variables.txt +0 -3
- data/doc/users_guide_snippets/installation.txt +337 -380
- data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
- data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
- data/doc/users_guide_snippets/support_information.txt +2 -9
- data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
- data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
- data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
- data/ext/apache2/Bucket.h +1 -1
- data/ext/apache2/Configuration.hpp +0 -44
- data/ext/apache2/CreateDirConfig.cpp +1 -1
- data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
- data/ext/apache2/Hooks.cpp +28 -21
- data/ext/apache2/MergeDirConfig.cpp +1 -0
- data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
- data/ext/apache2/SetHeaders.cpp +73 -0
- data/ext/apache2/SetHeaders.cpp.erb +88 -0
- data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
- data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
- data/ext/boost/algorithm/string/formatter.hpp +2 -2
- data/ext/boost/assert.hpp +6 -1
- data/ext/boost/atomic.hpp +18 -0
- data/ext/boost/atomic/atomic.hpp +241 -0
- data/ext/boost/atomic/detail/base.hpp +585 -0
- data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
- data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
- data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
- data/ext/boost/atomic/detail/config.hpp +54 -0
- data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
- data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
- data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
- data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
- data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
- data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
- data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
- data/ext/boost/atomic/detail/interlocked.hpp +200 -0
- data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
- data/ext/boost/atomic/detail/lockpool.hpp +97 -0
- data/ext/boost/atomic/detail/platform.hpp +62 -0
- data/ext/boost/atomic/detail/type-classification.hpp +45 -0
- data/ext/boost/chrono/config.hpp +8 -3
- data/ext/boost/chrono/duration.hpp +9 -10
- data/ext/boost/chrono/system_clocks.hpp +1 -1
- data/ext/boost/chrono/time_point.hpp +4 -3
- data/ext/boost/config/auto_link.hpp +53 -52
- data/ext/boost/config/compiler/borland.hpp +1 -0
- data/ext/boost/config/compiler/clang.hpp +24 -1
- data/ext/boost/config/compiler/codegear.hpp +1 -0
- data/ext/boost/config/compiler/common_edg.hpp +1 -0
- data/ext/boost/config/compiler/cray.hpp +1 -0
- data/ext/boost/config/compiler/digitalmars.hpp +1 -0
- data/ext/boost/config/compiler/gcc.hpp +29 -3
- data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
- data/ext/boost/config/compiler/hp_acc.hpp +1 -0
- data/ext/boost/config/compiler/intel.hpp +1 -1
- data/ext/boost/config/compiler/metrowerks.hpp +1 -0
- data/ext/boost/config/compiler/mpw.hpp +1 -0
- data/ext/boost/config/compiler/pathscale.hpp +1 -0
- data/ext/boost/config/compiler/pgi.hpp +1 -0
- data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
- data/ext/boost/config/compiler/vacpp.hpp +3 -2
- data/ext/boost/config/compiler/visualc.hpp +25 -11
- data/ext/boost/config/platform/vxworks.hpp +353 -15
- data/ext/boost/config/select_compiler_config.hpp +4 -4
- data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
- data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
- data/ext/boost/config/suffix.hpp +45 -19
- data/ext/boost/date_time/format_date_parser.hpp +1 -11
- data/ext/boost/date_time/strings_from_facet.hpp +5 -3
- data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
- data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
- data/ext/boost/detail/endian.hpp +52 -4
- data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
- data/ext/boost/detail/select_type.hpp +36 -0
- data/ext/boost/exception/current_exception_cast.hpp +1 -1
- data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
- data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
- data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
- data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
- data/ext/boost/exception/detail/type_info.hpp +1 -1
- data/ext/boost/exception/diagnostic_information.hpp +15 -14
- data/ext/boost/exception/exception.hpp +1 -1
- data/ext/boost/exception/get_error_info.hpp +1 -1
- data/ext/boost/exception/info.hpp +12 -13
- data/ext/boost/exception/to_string.hpp +6 -1
- data/ext/boost/exception/to_string_stub.hpp +9 -1
- data/ext/boost/foreach.hpp +5 -5
- data/ext/boost/function/function_template.hpp +6 -6
- data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
- data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
- data/ext/boost/functional/hash/extensions.hpp +14 -2
- data/ext/boost/functional/hash/hash.hpp +26 -5
- data/ext/boost/get_pointer.hpp +17 -2
- data/ext/boost/integer_traits.hpp +1 -1
- data/ext/boost/lexical_cast.hpp +615 -395
- data/ext/boost/libs/atomic/lockpool.cpp +24 -0
- data/ext/boost/libs/system/src/error_code.cpp +25 -18
- data/ext/boost/libs/thread/src/future.cpp +7 -5
- data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
- data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
- data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
- data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
- data/ext/boost/limits.hpp +1 -1
- data/ext/boost/math/policies/policy.hpp +10 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
- data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
- data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
- data/ext/boost/math/special_functions/sign.hpp +13 -8
- data/ext/boost/math/tools/config.hpp +38 -16
- data/ext/boost/move/algorithm.hpp +275 -0
- data/ext/boost/move/core.hpp +332 -0
- data/ext/boost/move/detail/config_begin.hpp +23 -0
- data/ext/boost/move/detail/config_end.hpp +20 -0
- data/ext/boost/move/detail/meta_utils.hpp +158 -0
- data/ext/boost/move/iterator.hpp +298 -0
- data/ext/boost/move/move.hpp +10 -1256
- data/ext/boost/move/traits.hpp +142 -0
- data/ext/boost/move/utility.hpp +194 -0
- data/ext/boost/mpl/assert.hpp +72 -4
- data/ext/boost/noncopyable.hpp +15 -3
- data/ext/boost/pointer_to_other.hpp +55 -0
- data/ext/boost/range/concepts.hpp +4 -4
- data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
- data/ext/boost/range/empty.hpp +1 -1
- data/ext/boost/range/iterator_range_core.hpp +4 -1
- data/ext/boost/range/iterator_range_io.hpp +2 -2
- data/ext/boost/ratio/config.hpp +6 -0
- data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
- data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
- data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
- data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
- data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
- data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
- data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
- data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
- data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
- data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
- data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
- data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
- data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
- data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
- data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
- data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
- data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
- data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
- data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
- data/ext/boost/smart_ptr/shared_array.hpp +135 -20
- data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
- data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
- data/ext/boost/static_assert.hpp +74 -17
- data/ext/boost/system/error_code.hpp +76 -68
- data/ext/boost/system/system_error.hpp +5 -1
- data/ext/boost/thread/barrier.hpp +6 -2
- data/ext/boost/thread/completion_latch.hpp +233 -0
- data/ext/boost/thread/condition.hpp +6 -1
- data/ext/boost/thread/detail/async_func.hpp +571 -0
- data/ext/boost/thread/detail/config.hpp +248 -40
- data/ext/boost/thread/detail/counter.hpp +93 -0
- data/ext/boost/thread/detail/delete.hpp +12 -0
- data/ext/boost/thread/detail/invoke.hpp +1351 -0
- data/ext/boost/thread/detail/is_convertible.hpp +48 -0
- data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
- data/ext/boost/thread/detail/log.hpp +83 -0
- data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
- data/ext/boost/thread/detail/move.hpp +32 -16
- data/ext/boost/thread/detail/thread.hpp +236 -41
- data/ext/boost/thread/detail/thread_group.hpp +55 -9
- data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
- data/ext/boost/thread/exceptions.hpp +2 -0
- data/ext/boost/thread/externally_locked.hpp +351 -0
- data/ext/boost/thread/externally_locked_stream.hpp +170 -0
- data/ext/boost/thread/future.hpp +2517 -455
- data/ext/boost/thread/future_error_code.hpp +61 -0
- data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
- data/ext/boost/thread/latch.hpp +142 -0
- data/ext/boost/thread/lock_algorithms.hpp +468 -0
- data/ext/boost/thread/lock_concepts.hpp +197 -0
- data/ext/boost/thread/lock_factories.hpp +78 -0
- data/ext/boost/thread/lock_guard.hpp +88 -0
- data/ext/boost/thread/lock_options.hpp +31 -0
- data/ext/boost/thread/lock_traits.hpp +45 -0
- data/ext/boost/thread/lock_types.hpp +1226 -0
- data/ext/boost/thread/lockable_adapter.hpp +226 -0
- data/ext/boost/thread/lockable_concepts.hpp +157 -0
- data/ext/boost/thread/lockable_traits.hpp +207 -0
- data/ext/boost/thread/locks.hpp +5 -1816
- data/ext/boost/thread/mutex.hpp +33 -1
- data/ext/boost/thread/null_mutex.hpp +243 -0
- data/ext/boost/thread/once.hpp +10 -1
- data/ext/boost/thread/poly_lockable.hpp +68 -0
- data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
- data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
- data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
- data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
- data/ext/boost/thread/pthread/mutex.hpp +101 -38
- data/ext/boost/thread/pthread/once.hpp +459 -44
- data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
- data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
- data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
- data/ext/boost/thread/pthread/thread_data.hpp +53 -50
- data/ext/boost/thread/pthread/timespec.hpp +96 -12
- data/ext/boost/thread/recursive_mutex.hpp +44 -1
- data/ext/boost/thread/reverse_lock.hpp +3 -2
- data/ext/boost/thread/scoped_thread.hpp +285 -0
- data/ext/boost/thread/shared_lock_guard.hpp +2 -1
- data/ext/boost/thread/shared_mutex.hpp +23 -0
- data/ext/boost/thread/strict_lock.hpp +235 -0
- data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
- data/ext/boost/thread/sync_queue.hpp +516 -0
- data/ext/boost/thread/synchronized_value.hpp +1001 -0
- data/ext/boost/thread/testable_mutex.hpp +148 -0
- data/ext/boost/thread/thread.hpp +1 -13
- data/ext/boost/thread/thread_functors.hpp +57 -0
- data/ext/boost/thread/thread_guard.hpp +46 -0
- data/ext/boost/thread/thread_only.hpp +29 -0
- data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
- data/ext/boost/thread/v2/thread.hpp +37 -10
- data/ext/boost/thread/xtime.hpp +2 -1
- data/ext/boost/token_functions.hpp +16 -16
- data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
- data/ext/boost/type_traits/add_reference.hpp +1 -1
- data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
- data/ext/boost/type_traits/aligned_storage.hpp +13 -0
- data/ext/boost/type_traits/common_type.hpp +11 -12
- data/ext/boost/type_traits/config.hpp +1 -1
- data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
- data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
- data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
- data/ext/boost/type_traits/has_left_shift.hpp +49 -0
- data/ext/boost/type_traits/has_right_shift.hpp +49 -0
- data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
- data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
- data/ext/boost/type_traits/intrinsics.hpp +18 -2
- data/ext/boost/type_traits/is_abstract.hpp +1 -1
- data/ext/boost/type_traits/is_array.hpp +1 -1
- data/ext/boost/type_traits/is_const.hpp +1 -1
- data/ext/boost/type_traits/is_convertible.hpp +78 -17
- data/ext/boost/type_traits/is_function.hpp +6 -1
- data/ext/boost/type_traits/is_integral.hpp +6 -1
- data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
- data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
- data/ext/boost/type_traits/is_pod.hpp +3 -1
- data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
- data/ext/boost/type_traits/is_volatile.hpp +1 -1
- data/ext/boost/type_traits/make_signed.hpp +153 -0
- data/ext/boost/type_traits/make_unsigned.hpp +16 -0
- data/ext/boost/type_traits/remove_const.hpp +1 -1
- data/ext/boost/type_traits/remove_cv.hpp +1 -1
- data/ext/boost/type_traits/remove_reference.hpp +1 -1
- data/ext/boost/type_traits/remove_volatile.hpp +1 -1
- data/ext/boost/unordered/detail/allocate.hpp +1120 -0
- data/ext/boost/unordered/detail/buckets.hpp +876 -0
- data/ext/boost/unordered/detail/equivalent.hpp +680 -0
- data/ext/boost/unordered/detail/extract_key.hpp +183 -0
- data/ext/boost/unordered/detail/fwd.hpp +23 -0
- data/ext/boost/unordered/detail/table.hpp +861 -0
- data/ext/boost/unordered/detail/unique.hpp +622 -0
- data/ext/boost/unordered/detail/util.hpp +260 -0
- data/ext/boost/unordered/unordered_map.hpp +1652 -0
- data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
- data/ext/boost/unordered/unordered_set.hpp +1549 -0
- data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
- data/ext/boost/unordered_map.hpp +18 -0
- data/ext/boost/unordered_set.hpp +18 -0
- data/ext/boost/utility/addressof.hpp +2 -2
- data/ext/boost/utility/result_of.hpp +8 -1
- data/ext/boost/version.hpp +2 -2
- data/ext/common/Account.h +1 -1
- data/ext/common/AccountsDatabase.h +1 -1
- data/ext/common/AgentsStarter.cpp +3 -1
- data/ext/common/AgentsStarter.h +2 -2
- data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
- data/ext/common/ApplicationPool2/AppTypes.h +17 -8
- data/ext/common/ApplicationPool2/Common.h +12 -12
- data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
- data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
- data/ext/common/ApplicationPool2/Group.h +6 -6
- data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
- data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
- data/ext/common/ApplicationPool2/Pool.h +21 -21
- data/ext/common/ApplicationPool2/Process.h +6 -6
- data/ext/common/ApplicationPool2/Session.h +1 -1
- data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
- data/ext/common/ApplicationPool2/Socket.h +2 -2
- data/ext/common/ApplicationPool2/Spawner.h +64 -14
- data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
- data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
- data/ext/common/BackgroundEventLoop.cpp +4 -4
- data/ext/common/BackgroundEventLoop.h +1 -1
- data/ext/common/Constants.h +13 -1
- data/ext/common/EventedBufferedInput.h +8 -8
- data/ext/common/Exceptions.cpp +71 -0
- data/ext/common/Exceptions.h +60 -7
- data/ext/common/FileDescriptor.h +4 -4
- data/ext/common/MessageClient.h +1 -1
- data/ext/common/MessageServer.h +5 -5
- data/ext/common/MultiLibeio.cpp +3 -3
- data/ext/common/MultiLibeio.h +2 -2
- data/ext/common/RandomGenerator.h +11 -11
- data/ext/common/ResourceLocator.h +8 -1
- data/ext/common/SafeLibev.h +12 -12
- data/ext/common/ServerInstanceDir.h +11 -3
- data/ext/common/UnionStation.h +10 -10
- data/ext/common/Utils.cpp +11 -13
- data/ext/common/Utils.h +9 -9
- data/ext/common/Utils/BlockingQueue.h +10 -10
- data/ext/common/Utils/BufferedIO.h +1 -1
- data/ext/common/Utils/CachedFileStat.hpp +2 -2
- data/ext/common/Utils/FileChangeChecker.h +1 -1
- data/ext/common/Utils/HashMap.h +13 -4
- data/ext/common/Utils/IOUtils.cpp +33 -10
- data/ext/common/Utils/IniFile.h +3 -3
- data/ext/common/Utils/Lock.h +2 -2
- data/ext/common/Utils/MessagePassing.h +10 -10
- data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
- data/ext/common/Utils/ScopeGuard.h +5 -5
- data/ext/common/Utils/jsoncpp.cpp +2 -0
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
- data/ext/common/agents/HelperAgent/Main.cpp +18 -18
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
- data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
- data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
- data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
- data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
- data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
- data/ext/common/agents/SpawnPreparer.cpp +1 -0
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
- data/ext/common/agents/Watchdog/Main.cpp +81 -73
- data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
- data/ext/libev/Changes +57 -0
- data/ext/libev/LICENSE +2 -1
- data/ext/libev/Makefile.in +110 -50
- data/ext/libev/README +8 -8
- data/ext/libev/aclocal.m4 +1503 -861
- data/ext/libev/config.guess +290 -304
- data/ext/libev/config.sub +77 -198
- data/ext/libev/configure +1735 -890
- data/ext/libev/configure.ac +3 -2
- data/ext/libev/ev++.h +6 -6
- data/ext/libev/ev.c +541 -214
- data/ext/libev/ev.h +106 -100
- data/ext/libev/ev_epoll.c +1 -1
- data/ext/libev/ev_kqueue.c +20 -4
- data/ext/libev/ev_vars.h +15 -16
- data/ext/libev/ev_win32.c +12 -2
- data/ext/libev/ev_wrap.h +162 -160
- data/ext/libev/event.c +29 -6
- data/ext/libev/event.h +9 -2
- data/ext/libev/ltmain.sh +2632 -1384
- data/ext/nginx/ConfigurationCommands.c +1 -1
- data/ext/nginx/ConfigurationCommands.c.erb +3 -1
- data/ext/nginx/ContentHandler.c +25 -2
- data/ext/nginx/CreateLocationConfig.c +1 -0
- data/ext/nginx/CreateLocationConfig.c.erb +1 -1
- data/ext/nginx/MergeLocationConfig.c +1 -0
- data/ext/nginx/MergeLocationConfig.c.erb +1 -1
- data/ext/nginx/config +12 -0
- data/ext/oxt/dynamic_thread_group.hpp +7 -4
- data/ext/oxt/system_calls.cpp +5 -1
- data/ext/oxt/system_calls.hpp +3 -0
- data/helper-scripts/node-loader.js +117 -249
- data/lib/phusion_passenger.rb +27 -5
- data/lib/phusion_passenger/abstract_installer.rb +104 -9
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
- data/lib/phusion_passenger/apache2/config_options.rb +6 -3
- data/lib/phusion_passenger/common_library.rb +7 -1
- data/lib/phusion_passenger/constants.rb +6 -0
- data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
- data/lib/phusion_passenger/nginx/config_options.rb +2 -1
- data/lib/phusion_passenger/packaging.rb +3 -0
- data/lib/phusion_passenger/platform_info/apache.rb +43 -6
- data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
- data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
- data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
- data/lib/phusion_passenger/platform_info/linux.rb +2 -1
- data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
- data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
- data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
- data/lib/phusion_passenger/standalone/start_command.rb +8 -2
- data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
- data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
- data/node_lib/phusion_passenger/line_reader.js +154 -0
- data/node_lib/phusion_passenger/request_handler.js +65 -0
- data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
- data/resources/templates/apache2/deployment_example.txt.erb +2 -1
- data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
- data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
- data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/general_error_with_html.html.template +1 -1
- data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
- data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
- data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
- data/resources/templates/nginx/deployment_example.txt.erb +2 -1
- data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
- data/resources/templates/standalone/config.erb +1 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
- data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
- data/test/cxx/EventedBufferedInputTest.cpp +6 -6
- data/test/cxx/FileBackedPipeTest.cpp +1 -1
- data/test/cxx/MessagePassingTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +4 -4
- data/test/cxx/RequestHandlerTest.cpp +7 -7
- data/test/cxx/UnionStationTest.cpp +2 -2
- data/test/node/line_reader_spec.js +338 -0
- data/test/node/spec_helper.js +27 -0
- data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
- metadata +131 -22
- metadata.gz.asc +7 -7
- data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
- data/ext/boost/lambda/core.hpp +0 -79
- data/ext/boost/lambda/detail/actions.hpp +0 -174
- data/ext/boost/lambda/detail/arity_code.hpp +0 -110
- data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
- data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
- data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
- data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
- data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
- data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
- data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
- data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
- data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
- data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
- data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
- data/ext/boost/lambda/detail/operators.hpp +0 -370
- data/ext/boost/lambda/detail/ret.hpp +0 -325
- data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
- data/ext/boost/lambda/detail/select_functions.hpp +0 -74
- data/ext/boost/lambda/lambda.hpp +0 -34
@@ -8,6 +8,7 @@
|
|
8
8
|
#include <list>
|
9
9
|
#include <boost/thread/shared_mutex.hpp>
|
10
10
|
#include <boost/thread/mutex.hpp>
|
11
|
+
#include <boost/thread/lock_guard.hpp>
|
11
12
|
|
12
13
|
#include <boost/config/abi_prefix.hpp>
|
13
14
|
|
@@ -22,7 +23,7 @@ namespace boost
|
|
22
23
|
{
|
23
24
|
private:
|
24
25
|
thread_group(thread_group const&);
|
25
|
-
thread_group& operator=(thread_group const&);
|
26
|
+
thread_group& operator=(thread_group const&);
|
26
27
|
public:
|
27
28
|
thread_group() {}
|
28
29
|
~thread_group()
|
@@ -35,6 +36,41 @@ namespace boost
|
|
35
36
|
}
|
36
37
|
}
|
37
38
|
|
39
|
+
bool is_this_thread_in()
|
40
|
+
{
|
41
|
+
thread::id id = this_thread::get_id();
|
42
|
+
boost::shared_lock<shared_mutex> guard(m);
|
43
|
+
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
44
|
+
it!=end;
|
45
|
+
++it)
|
46
|
+
{
|
47
|
+
if ((*it)->get_id() == id)
|
48
|
+
return true;
|
49
|
+
}
|
50
|
+
return false;
|
51
|
+
}
|
52
|
+
|
53
|
+
bool is_thread_in(thread* thrd)
|
54
|
+
{
|
55
|
+
if(thrd)
|
56
|
+
{
|
57
|
+
thread::id id = thrd->get_id();
|
58
|
+
boost::shared_lock<shared_mutex> guard(m);
|
59
|
+
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
60
|
+
it!=end;
|
61
|
+
++it)
|
62
|
+
{
|
63
|
+
if ((*it)->get_id() == id)
|
64
|
+
return true;
|
65
|
+
}
|
66
|
+
return false;
|
67
|
+
}
|
68
|
+
else
|
69
|
+
{
|
70
|
+
return false;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
38
74
|
template<typename F>
|
39
75
|
thread* create_thread(F threadfunc)
|
40
76
|
{
|
@@ -43,16 +79,20 @@ namespace boost
|
|
43
79
|
threads.push_back(new_thread.get());
|
44
80
|
return new_thread.release();
|
45
81
|
}
|
46
|
-
|
82
|
+
|
47
83
|
void add_thread(thread* thrd)
|
48
84
|
{
|
49
85
|
if(thrd)
|
50
86
|
{
|
87
|
+
BOOST_THREAD_ASSERT_PRECONDITION( ! is_thread_in(thrd) ,
|
88
|
+
thread_resource_error(system::errc::resource_deadlock_would_occur, "boost::thread_group: trying to add a duplicated thread")
|
89
|
+
);
|
90
|
+
|
51
91
|
boost::lock_guard<shared_mutex> guard(m);
|
52
92
|
threads.push_back(thrd);
|
53
93
|
}
|
54
94
|
}
|
55
|
-
|
95
|
+
|
56
96
|
void remove_thread(thread* thrd)
|
57
97
|
{
|
58
98
|
boost::lock_guard<shared_mutex> guard(m);
|
@@ -62,23 +102,28 @@ namespace boost
|
|
62
102
|
threads.erase(it);
|
63
103
|
}
|
64
104
|
}
|
65
|
-
|
105
|
+
|
66
106
|
void join_all()
|
67
107
|
{
|
108
|
+
BOOST_THREAD_ASSERT_PRECONDITION( ! is_this_thread_in() ,
|
109
|
+
thread_resource_error(system::errc::resource_deadlock_would_occur, "boost::thread_group: trying joining itself")
|
110
|
+
);
|
68
111
|
boost::shared_lock<shared_mutex> guard(m);
|
69
|
-
|
112
|
+
|
70
113
|
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
71
114
|
it!=end;
|
72
115
|
++it)
|
73
116
|
{
|
117
|
+
if ((*it)->joinable())
|
74
118
|
(*it)->join();
|
75
119
|
}
|
76
120
|
}
|
77
|
-
|
121
|
+
|
122
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
78
123
|
void interrupt_all()
|
79
124
|
{
|
80
125
|
boost::shared_lock<shared_mutex> guard(m);
|
81
|
-
|
126
|
+
|
82
127
|
for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
|
83
128
|
it!=end;
|
84
129
|
++it)
|
@@ -86,13 +131,14 @@ namespace boost
|
|
86
131
|
(*it)->interrupt();
|
87
132
|
}
|
88
133
|
}
|
89
|
-
|
134
|
+
#endif
|
135
|
+
|
90
136
|
size_t size() const
|
91
137
|
{
|
92
138
|
boost::shared_lock<shared_mutex> guard(m);
|
93
139
|
return threads.size();
|
94
140
|
}
|
95
|
-
|
141
|
+
|
96
142
|
private:
|
97
143
|
std::list<thread*> threads;
|
98
144
|
mutable shared_mutex m;
|
@@ -9,6 +9,8 @@
|
|
9
9
|
#include <boost/thread/detail/config.hpp>
|
10
10
|
#include <boost/thread/detail/delete.hpp>
|
11
11
|
|
12
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
13
|
+
|
12
14
|
namespace boost
|
13
15
|
{
|
14
16
|
namespace this_thread
|
@@ -33,4 +35,5 @@ namespace boost
|
|
33
35
|
}
|
34
36
|
}
|
35
37
|
|
36
|
-
#endif
|
38
|
+
#endif // BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
39
|
+
#endif // header
|
@@ -29,9 +29,11 @@
|
|
29
29
|
namespace boost
|
30
30
|
{
|
31
31
|
|
32
|
+
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
|
32
33
|
class BOOST_SYMBOL_VISIBLE thread_interrupted
|
33
34
|
: public oxt::tracable_exception
|
34
35
|
{};
|
36
|
+
#endif
|
35
37
|
|
36
38
|
class BOOST_SYMBOL_VISIBLE thread_exception:
|
37
39
|
public system::system_error
|
@@ -0,0 +1,351 @@
|
|
1
|
+
// (C) Copyright 2012 Vicente J. Botet Escriba
|
2
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
3
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
4
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
5
|
+
|
6
|
+
|
7
|
+
#ifndef BOOST_THREAD_EXTERNALLY_LOCKED_HPP
|
8
|
+
#define BOOST_THREAD_EXTERNALLY_LOCKED_HPP
|
9
|
+
|
10
|
+
#include <boost/thread/detail/config.hpp>
|
11
|
+
|
12
|
+
#include <boost/thread/exceptions.hpp>
|
13
|
+
#include <boost/thread/lock_concepts.hpp>
|
14
|
+
#include <boost/thread/lock_traits.hpp>
|
15
|
+
#include <boost/thread/lockable_concepts.hpp>
|
16
|
+
#include <boost/thread/strict_lock.hpp>
|
17
|
+
|
18
|
+
#include <boost/static_assert.hpp>
|
19
|
+
#include <boost/type_traits/is_same.hpp>
|
20
|
+
#include <boost/throw_exception.hpp>
|
21
|
+
#include <boost/utility/swap.hpp>
|
22
|
+
|
23
|
+
#include <boost/config/abi_prefix.hpp>
|
24
|
+
|
25
|
+
namespace boost
|
26
|
+
{
|
27
|
+
|
28
|
+
/**
|
29
|
+
* externally_locked cloaks an object of type T, and actually provides full
|
30
|
+
* access to that object through the get and set member functions, provided you
|
31
|
+
* pass a reference to a strict lock object
|
32
|
+
*/
|
33
|
+
|
34
|
+
//[externally_locked
|
35
|
+
template <typename T, typename MutexType = boost::mutex>
|
36
|
+
class externally_locked;
|
37
|
+
template <typename T, typename MutexType>
|
38
|
+
class externally_locked
|
39
|
+
{
|
40
|
+
//BOOST_CONCEPT_ASSERT(( CopyConstructible<T> ));
|
41
|
+
BOOST_CONCEPT_ASSERT(( BasicLockable<MutexType> ));
|
42
|
+
|
43
|
+
public:
|
44
|
+
typedef MutexType mutex_type;
|
45
|
+
|
46
|
+
BOOST_THREAD_COPYABLE_AND_MOVABLE( externally_locked )
|
47
|
+
/**
|
48
|
+
* Requires: T is a model of CopyConstructible.
|
49
|
+
* Effects: Constructs an externally locked object copying the cloaked type.
|
50
|
+
*/
|
51
|
+
externally_locked(mutex_type& mtx, const T& obj) :
|
52
|
+
obj_(obj), mtx_(&mtx)
|
53
|
+
{
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Requires: T is a model of Movable.
|
58
|
+
* Effects: Constructs an externally locked object by moving the cloaked type.
|
59
|
+
*/
|
60
|
+
externally_locked(mutex_type& mtx, BOOST_THREAD_RV_REF(T) obj) :
|
61
|
+
obj_(move(obj)), mtx_(&mtx)
|
62
|
+
{
|
63
|
+
}
|
64
|
+
|
65
|
+
/**
|
66
|
+
* Requires: T is a model of DefaultConstructible.
|
67
|
+
* Effects: Constructs an externally locked object initializing the cloaked type with the default constructor.
|
68
|
+
*/
|
69
|
+
externally_locked(mutex_type& mtx) // BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(T()))
|
70
|
+
: obj_(), mtx_(&mtx)
|
71
|
+
{
|
72
|
+
}
|
73
|
+
|
74
|
+
/**
|
75
|
+
* Copy constructor
|
76
|
+
*/
|
77
|
+
externally_locked(externally_locked const& rhs) //BOOST_NOEXCEPT
|
78
|
+
: obj_(rhs.obj_), mtx_(rhs.mtx_)
|
79
|
+
{
|
80
|
+
}
|
81
|
+
/**
|
82
|
+
* Move constructor
|
83
|
+
*/
|
84
|
+
externally_locked(BOOST_THREAD_RV_REF(externally_locked) rhs) //BOOST_NOEXCEPT
|
85
|
+
: obj_(move(rhs.obj_)), mtx_(rhs.mtx_)
|
86
|
+
{
|
87
|
+
}
|
88
|
+
|
89
|
+
/// assignment
|
90
|
+
externally_locked& operator=(externally_locked const& rhs) //BOOST_NOEXCEPT
|
91
|
+
{
|
92
|
+
obj_=rhs.obj_;
|
93
|
+
mtx_=rhs.mtx_;
|
94
|
+
return *this;
|
95
|
+
}
|
96
|
+
|
97
|
+
/// move assignment
|
98
|
+
externally_locked& operator=(BOOST_THREAD_RV_REF(externally_locked) rhs) // BOOST_NOEXCEPT
|
99
|
+
{
|
100
|
+
obj_=move(rhs.obj_);
|
101
|
+
mtx_=rhs.mtx_;
|
102
|
+
return *this;
|
103
|
+
}
|
104
|
+
|
105
|
+
void swap(externally_locked& rhs) //BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR)
|
106
|
+
{
|
107
|
+
swap(obj_, rhs.obj_);
|
108
|
+
swap(mtx_, rhs.mtx_);
|
109
|
+
}
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Requires: The lk parameter must be locking the associated mtx.
|
113
|
+
*
|
114
|
+
* Returns: The address of the cloaked object..
|
115
|
+
*
|
116
|
+
* Throws: lock_error if BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED is not defined and the lk parameter doesn't satisfy the preconditions
|
117
|
+
*/
|
118
|
+
T& get(strict_lock<mutex_type>& lk)
|
119
|
+
{
|
120
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
121
|
+
return obj_;
|
122
|
+
}
|
123
|
+
|
124
|
+
const T& get(strict_lock<mutex_type>& lk) const
|
125
|
+
{
|
126
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
127
|
+
return obj_;
|
128
|
+
}
|
129
|
+
|
130
|
+
template <class Lock>
|
131
|
+
T& get(nested_strict_lock<Lock>& lk)
|
132
|
+
{
|
133
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
134
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
135
|
+
return obj_;
|
136
|
+
}
|
137
|
+
|
138
|
+
template <class Lock>
|
139
|
+
const T& get(nested_strict_lock<Lock>& lk) const
|
140
|
+
{
|
141
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
142
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
143
|
+
return obj_;
|
144
|
+
}
|
145
|
+
|
146
|
+
/**
|
147
|
+
* Requires: The lk parameter must be locking the associated mtx.
|
148
|
+
* Returns: The address of the cloaked object..
|
149
|
+
*
|
150
|
+
* Throws: lock_error if BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED is not defined and the lk parameter doesn't satisfy the preconditions
|
151
|
+
*/
|
152
|
+
template <class Lock>
|
153
|
+
T& get(Lock& lk)
|
154
|
+
{
|
155
|
+
BOOST_CONCEPT_ASSERT(( StrictLock<Lock> ));
|
156
|
+
BOOST_STATIC_ASSERT( (is_strict_lock<Lock>::value)); /*< lk is a strict lock "sur parolle" >*/
|
157
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
158
|
+
|
159
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
160
|
+
|
161
|
+
return obj_;
|
162
|
+
}
|
163
|
+
|
164
|
+
mutex_type* mutex() const BOOST_NOEXCEPT
|
165
|
+
{
|
166
|
+
return mtx_;
|
167
|
+
}
|
168
|
+
|
169
|
+
// modifiers
|
170
|
+
|
171
|
+
void lock()
|
172
|
+
{
|
173
|
+
mtx_->lock();
|
174
|
+
}
|
175
|
+
void unlock()
|
176
|
+
{
|
177
|
+
mtx_->unlock();
|
178
|
+
}
|
179
|
+
bool try_lock()
|
180
|
+
{
|
181
|
+
return mtx_->try_lock();
|
182
|
+
}
|
183
|
+
// todo add time related functions
|
184
|
+
|
185
|
+
private:
|
186
|
+
T obj_;
|
187
|
+
mutex_type* mtx_;
|
188
|
+
};
|
189
|
+
//]
|
190
|
+
|
191
|
+
/**
|
192
|
+
* externally_locked<T&,M> specialization for T& that cloaks an reference to an object of type T, and actually
|
193
|
+
* provides full access to that object through the get and set member functions, provided you
|
194
|
+
* pass a reference to a strict lock object.
|
195
|
+
*/
|
196
|
+
|
197
|
+
//[externally_locked_ref
|
198
|
+
template <typename T, typename MutexType>
|
199
|
+
class externally_locked<T&, MutexType>
|
200
|
+
{
|
201
|
+
//BOOST_CONCEPT_ASSERT(( CopyConstructible<T> ));
|
202
|
+
BOOST_CONCEPT_ASSERT(( BasicLockable<MutexType> ));
|
203
|
+
|
204
|
+
public:
|
205
|
+
typedef MutexType mutex_type;
|
206
|
+
|
207
|
+
BOOST_THREAD_COPYABLE_AND_MOVABLE( externally_locked )
|
208
|
+
|
209
|
+
/**
|
210
|
+
* Effects: Constructs an externally locked object storing the cloaked reference object.
|
211
|
+
*/
|
212
|
+
externally_locked(T& obj, mutex_type& mtx) BOOST_NOEXCEPT :
|
213
|
+
obj_(&obj), mtx_(&mtx)
|
214
|
+
{
|
215
|
+
}
|
216
|
+
|
217
|
+
/// copy constructor
|
218
|
+
externally_locked(externally_locked const& rhs) BOOST_NOEXCEPT :
|
219
|
+
obj_(rhs.obj_), mtx_(rhs.mtx_)
|
220
|
+
{
|
221
|
+
}
|
222
|
+
|
223
|
+
/// move constructor
|
224
|
+
externally_locked(BOOST_THREAD_RV_REF(externally_locked) rhs) BOOST_NOEXCEPT :
|
225
|
+
obj_(rhs.obj_), mtx_(rhs.mtx_)
|
226
|
+
{
|
227
|
+
}
|
228
|
+
|
229
|
+
/// assignment
|
230
|
+
externally_locked& operator=(externally_locked const& rhs) BOOST_NOEXCEPT
|
231
|
+
{
|
232
|
+
obj_=rhs.obj_;
|
233
|
+
mtx_=rhs.mtx_;
|
234
|
+
return *this;
|
235
|
+
}
|
236
|
+
|
237
|
+
/// move assignment
|
238
|
+
externally_locked& operator=(BOOST_THREAD_RV_REF(externally_locked) rhs) BOOST_NOEXCEPT
|
239
|
+
{
|
240
|
+
obj_=rhs.obj_;
|
241
|
+
mtx_=rhs.mtx_;
|
242
|
+
return *this;
|
243
|
+
}
|
244
|
+
|
245
|
+
void swap(externally_locked& rhs) BOOST_NOEXCEPT
|
246
|
+
{
|
247
|
+
swap(obj_, rhs.obj_);
|
248
|
+
swap(mtx_, rhs.mtx_);
|
249
|
+
}
|
250
|
+
/**
|
251
|
+
* Requires: The lk parameter must be locking the associated mtx.
|
252
|
+
*
|
253
|
+
* Returns: The address of the cloaked object..
|
254
|
+
*
|
255
|
+
* Throws: lock_error if BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED is not defined and the lk parameter doesn't satisfy the preconditions
|
256
|
+
*/
|
257
|
+
T& get(strict_lock<mutex_type> const& lk)
|
258
|
+
{
|
259
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
260
|
+
return *obj_;
|
261
|
+
}
|
262
|
+
|
263
|
+
const T& get(strict_lock<mutex_type> const& lk) const
|
264
|
+
{
|
265
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
266
|
+
return *obj_;
|
267
|
+
}
|
268
|
+
|
269
|
+
template <class Lock>
|
270
|
+
T& get(nested_strict_lock<Lock> const& lk)
|
271
|
+
{
|
272
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
273
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
274
|
+
return *obj_;
|
275
|
+
}
|
276
|
+
|
277
|
+
template <class Lock>
|
278
|
+
const T& get(nested_strict_lock<Lock> const& lk) const
|
279
|
+
{
|
280
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
281
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
282
|
+
return *obj_;
|
283
|
+
}
|
284
|
+
|
285
|
+
/**
|
286
|
+
* Requires: The lk parameter must be locking the associated mtx.
|
287
|
+
* Returns: The address of the cloaked object..
|
288
|
+
*
|
289
|
+
* Throws: lock_error if BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED is not defined and the lk parameter doesn't satisfy the preconditions
|
290
|
+
*/
|
291
|
+
template <class Lock>
|
292
|
+
T& get(Lock const& lk)
|
293
|
+
{
|
294
|
+
BOOST_CONCEPT_ASSERT(( StrictLock<Lock> ));
|
295
|
+
BOOST_STATIC_ASSERT( (is_strict_lock<Lock>::value)); /*< lk is a strict lock "sur parolle" >*/
|
296
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
297
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
298
|
+
return *obj_;
|
299
|
+
}
|
300
|
+
|
301
|
+
/**
|
302
|
+
* Requires: The lk parameter must be locking the associated mtx.
|
303
|
+
* Returns: The address of the cloaked object..
|
304
|
+
*
|
305
|
+
* Throws: lock_error if BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED is not defined and the lk parameter doesn't satisfy the preconditions
|
306
|
+
*/
|
307
|
+
template <class Lock>
|
308
|
+
T const& get(Lock const& lk) const
|
309
|
+
{
|
310
|
+
BOOST_CONCEPT_ASSERT(( StrictLock<Lock> ));
|
311
|
+
BOOST_STATIC_ASSERT( (is_strict_lock<Lock>::value)); /*< lk is a strict lock "sur parolle" >*/
|
312
|
+
BOOST_STATIC_ASSERT( (is_same<mutex_type, typename Lock::mutex_type>::value)); /*< that locks the same type >*/
|
313
|
+
BOOST_THREAD_ASSERT_PRECONDITION( lk.owns_lock(mtx_), lock_error() ); /*< run time check throw if not locks the same >*/
|
314
|
+
return *obj_;
|
315
|
+
}
|
316
|
+
mutex_type* mutex() const BOOST_NOEXCEPT
|
317
|
+
{
|
318
|
+
return mtx_;
|
319
|
+
}
|
320
|
+
|
321
|
+
void lock()
|
322
|
+
{
|
323
|
+
mtx_->lock();
|
324
|
+
}
|
325
|
+
void unlock()
|
326
|
+
{
|
327
|
+
mtx_->unlock();
|
328
|
+
}
|
329
|
+
bool try_lock()
|
330
|
+
{
|
331
|
+
return mtx_->try_lock();
|
332
|
+
}
|
333
|
+
// todo add time related functions
|
334
|
+
|
335
|
+
protected:
|
336
|
+
T* obj_;
|
337
|
+
mutex_type* mtx_;
|
338
|
+
};
|
339
|
+
//]
|
340
|
+
|
341
|
+
template <typename T, typename MutexType>
|
342
|
+
void swap(externally_locked<T, MutexType> & lhs, externally_locked<T, MutexType> & rhs) // BOOST_NOEXCEPT
|
343
|
+
{
|
344
|
+
lhs.swap(rhs);
|
345
|
+
}
|
346
|
+
|
347
|
+
}
|
348
|
+
|
349
|
+
#include <boost/config/abi_suffix.hpp>
|
350
|
+
|
351
|
+
#endif // header
|