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
data/ext/boost/thread/locks.hpp
CHANGED
@@ -6,1822 +6,11 @@
|
|
6
6
|
|
7
7
|
#ifndef BOOST_THREAD_LOCKS_HPP
|
8
8
|
#define BOOST_THREAD_LOCKS_HPP
|
9
|
-
#include <boost/thread/detail/config.hpp>
|
10
|
-
#include <boost/thread/exceptions.hpp>
|
11
|
-
#include <boost/thread/detail/move.hpp>
|
12
|
-
#include <algorithm>
|
13
|
-
#include <iterator>
|
14
|
-
#include <boost/thread/thread_time.hpp>
|
15
|
-
#include <boost/detail/workaround.hpp>
|
16
|
-
#include <boost/type_traits/is_class.hpp>
|
17
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
18
|
-
#include <boost/chrono/time_point.hpp>
|
19
|
-
#include <boost/chrono/duration.hpp>
|
20
|
-
#endif
|
21
|
-
|
22
|
-
#include <boost/config/abi_prefix.hpp>
|
23
|
-
|
24
|
-
namespace boost
|
25
|
-
{
|
26
|
-
struct xtime;
|
27
|
-
|
28
|
-
#if defined(BOOST_NO_SFINAE) || \
|
29
|
-
BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) || \
|
30
|
-
BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
|
31
|
-
#define BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
32
|
-
#endif
|
33
|
-
|
34
|
-
#ifndef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
35
|
-
namespace detail
|
36
|
-
{
|
37
|
-
#define BOOST_DEFINE_HAS_MEMBER_CALLED(member_name) \
|
38
|
-
template<typename T, bool=boost::is_class<T>::value> \
|
39
|
-
struct has_member_called_##member_name \
|
40
|
-
{ \
|
41
|
-
BOOST_STATIC_CONSTANT(bool, value=false); \
|
42
|
-
}; \
|
43
|
-
\
|
44
|
-
template<typename T> \
|
45
|
-
struct has_member_called_##member_name<T,true> \
|
46
|
-
{ \
|
47
|
-
typedef char true_type; \
|
48
|
-
struct false_type \
|
49
|
-
{ \
|
50
|
-
true_type dummy[2]; \
|
51
|
-
}; \
|
52
|
-
\
|
53
|
-
struct fallback { int member_name; }; \
|
54
|
-
struct derived: \
|
55
|
-
T, fallback \
|
56
|
-
{ \
|
57
|
-
derived(); \
|
58
|
-
}; \
|
59
|
-
\
|
60
|
-
template<int fallback::*> struct tester; \
|
61
|
-
\
|
62
|
-
template<typename U> \
|
63
|
-
static false_type has_member(tester<&U::member_name>*); \
|
64
|
-
template<typename U> \
|
65
|
-
static true_type has_member(...); \
|
66
|
-
\
|
67
|
-
BOOST_STATIC_CONSTANT( \
|
68
|
-
bool, value=sizeof(has_member<derived>(0))==sizeof(true_type)); \
|
69
|
-
}
|
70
|
-
|
71
|
-
BOOST_DEFINE_HAS_MEMBER_CALLED(lock);
|
72
|
-
BOOST_DEFINE_HAS_MEMBER_CALLED(unlock);
|
73
|
-
BOOST_DEFINE_HAS_MEMBER_CALLED(try_lock);
|
74
|
-
|
75
|
-
template<typename T,bool=has_member_called_lock<T>::value >
|
76
|
-
struct has_member_lock
|
77
|
-
{
|
78
|
-
BOOST_STATIC_CONSTANT(bool, value=false);
|
79
|
-
};
|
80
|
-
|
81
|
-
template<typename T>
|
82
|
-
struct has_member_lock<T,true>
|
83
|
-
{
|
84
|
-
typedef char true_type;
|
85
|
-
struct false_type
|
86
|
-
{
|
87
|
-
true_type dummy[2];
|
88
|
-
};
|
89
|
-
|
90
|
-
template<typename U,typename V>
|
91
|
-
static true_type has_member(V (U::*)());
|
92
|
-
template<typename U>
|
93
|
-
static false_type has_member(U);
|
94
|
-
|
95
|
-
BOOST_STATIC_CONSTANT(
|
96
|
-
bool,value=sizeof(has_member_lock<T>::has_member(&T::lock))==sizeof(true_type));
|
97
|
-
};
|
98
|
-
|
99
|
-
template<typename T,bool=has_member_called_unlock<T>::value >
|
100
|
-
struct has_member_unlock
|
101
|
-
{
|
102
|
-
BOOST_STATIC_CONSTANT(bool, value=false);
|
103
|
-
};
|
104
|
-
|
105
|
-
template<typename T>
|
106
|
-
struct has_member_unlock<T,true>
|
107
|
-
{
|
108
|
-
typedef char true_type;
|
109
|
-
struct false_type
|
110
|
-
{
|
111
|
-
true_type dummy[2];
|
112
|
-
};
|
113
|
-
|
114
|
-
template<typename U,typename V>
|
115
|
-
static true_type has_member(V (U::*)());
|
116
|
-
template<typename U>
|
117
|
-
static false_type has_member(U);
|
118
|
-
|
119
|
-
BOOST_STATIC_CONSTANT(
|
120
|
-
bool,value=sizeof(has_member_unlock<T>::has_member(&T::unlock))==sizeof(true_type));
|
121
|
-
};
|
122
|
-
|
123
|
-
template<typename T,bool=has_member_called_try_lock<T>::value >
|
124
|
-
struct has_member_try_lock
|
125
|
-
{
|
126
|
-
BOOST_STATIC_CONSTANT(bool, value=false);
|
127
|
-
};
|
128
|
-
|
129
|
-
template<typename T>
|
130
|
-
struct has_member_try_lock<T,true>
|
131
|
-
{
|
132
|
-
typedef char true_type;
|
133
|
-
struct false_type
|
134
|
-
{
|
135
|
-
true_type dummy[2];
|
136
|
-
};
|
137
|
-
|
138
|
-
template<typename U>
|
139
|
-
static true_type has_member(bool (U::*)());
|
140
|
-
template<typename U>
|
141
|
-
static false_type has_member(U);
|
142
|
-
|
143
|
-
BOOST_STATIC_CONSTANT(
|
144
|
-
bool,value=sizeof(has_member_try_lock<T>::has_member(&T::try_lock))==sizeof(true_type));
|
145
|
-
};
|
146
|
-
|
147
|
-
}
|
148
|
-
|
149
|
-
|
150
|
-
template<typename T>
|
151
|
-
struct is_mutex_type
|
152
|
-
{
|
153
|
-
BOOST_STATIC_CONSTANT(bool, value = detail::has_member_lock<T>::value &&
|
154
|
-
detail::has_member_unlock<T>::value &&
|
155
|
-
detail::has_member_try_lock<T>::value);
|
156
|
-
|
157
|
-
};
|
158
|
-
#else
|
159
|
-
template<typename T>
|
160
|
-
struct is_mutex_type
|
161
|
-
{
|
162
|
-
BOOST_STATIC_CONSTANT(bool, value = false);
|
163
|
-
};
|
164
|
-
#endif
|
165
|
-
|
166
|
-
struct defer_lock_t
|
167
|
-
{};
|
168
|
-
struct try_to_lock_t
|
169
|
-
{};
|
170
|
-
struct adopt_lock_t
|
171
|
-
{};
|
172
|
-
|
173
|
-
BOOST_CONSTEXPR_OR_CONST defer_lock_t defer_lock={};
|
174
|
-
BOOST_CONSTEXPR_OR_CONST try_to_lock_t try_to_lock={};
|
175
|
-
BOOST_CONSTEXPR_OR_CONST adopt_lock_t adopt_lock={};
|
176
|
-
|
177
|
-
template<typename Mutex>
|
178
|
-
class shared_lock;
|
179
|
-
|
180
|
-
template<typename Mutex>
|
181
|
-
class upgrade_lock;
|
182
|
-
|
183
|
-
template<typename Mutex>
|
184
|
-
class unique_lock;
|
185
|
-
|
186
|
-
namespace detail
|
187
|
-
{
|
188
|
-
template<typename Mutex>
|
189
|
-
class try_lock_wrapper;
|
190
|
-
}
|
191
|
-
|
192
|
-
#ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
|
193
|
-
template<typename T>
|
194
|
-
struct is_mutex_type<unique_lock<T> >
|
195
|
-
{
|
196
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
197
|
-
};
|
198
|
-
|
199
|
-
template<typename T>
|
200
|
-
struct is_mutex_type<shared_lock<T> >
|
201
|
-
{
|
202
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
203
|
-
};
|
204
|
-
|
205
|
-
template<typename T>
|
206
|
-
struct is_mutex_type<upgrade_lock<T> >
|
207
|
-
{
|
208
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
209
|
-
};
|
210
|
-
|
211
|
-
template<typename T>
|
212
|
-
struct is_mutex_type<detail::try_lock_wrapper<T> >
|
213
|
-
{
|
214
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
215
|
-
};
|
216
|
-
|
217
|
-
class mutex;
|
218
|
-
class timed_mutex;
|
219
|
-
class recursive_mutex;
|
220
|
-
class recursive_timed_mutex;
|
221
|
-
class shared_mutex;
|
222
|
-
|
223
|
-
template<>
|
224
|
-
struct is_mutex_type<mutex>
|
225
|
-
{
|
226
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
227
|
-
};
|
228
|
-
template<>
|
229
|
-
struct is_mutex_type<timed_mutex>
|
230
|
-
{
|
231
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
232
|
-
};
|
233
|
-
template<>
|
234
|
-
struct is_mutex_type<recursive_mutex>
|
235
|
-
{
|
236
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
237
|
-
};
|
238
|
-
template<>
|
239
|
-
struct is_mutex_type<recursive_timed_mutex>
|
240
|
-
{
|
241
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
242
|
-
};
|
243
|
-
template<>
|
244
|
-
struct is_mutex_type<shared_mutex>
|
245
|
-
{
|
246
|
-
BOOST_STATIC_CONSTANT(bool, value = true);
|
247
|
-
};
|
248
|
-
|
249
|
-
#endif
|
250
|
-
|
251
|
-
template<typename Mutex>
|
252
|
-
class lock_guard
|
253
|
-
{
|
254
|
-
private:
|
255
|
-
Mutex& m;
|
256
|
-
|
257
|
-
public:
|
258
|
-
typedef Mutex mutex_type;
|
259
|
-
BOOST_THREAD_NO_COPYABLE(lock_guard)
|
260
|
-
|
261
|
-
explicit lock_guard(Mutex& m_):
|
262
|
-
m(m_)
|
263
|
-
{
|
264
|
-
m.lock();
|
265
|
-
}
|
266
|
-
lock_guard(Mutex& m_,adopt_lock_t):
|
267
|
-
m(m_)
|
268
|
-
{}
|
269
|
-
~lock_guard()
|
270
|
-
{
|
271
|
-
m.unlock();
|
272
|
-
}
|
273
|
-
};
|
274
|
-
|
275
|
-
template<typename Mutex>
|
276
|
-
class unique_lock
|
277
|
-
{
|
278
|
-
private:
|
279
|
-
Mutex* m;
|
280
|
-
bool is_locked;
|
281
|
-
|
282
|
-
private:
|
283
|
-
explicit unique_lock(upgrade_lock<Mutex>&);
|
284
|
-
unique_lock& operator=(upgrade_lock<Mutex>& other);
|
285
|
-
public:
|
286
|
-
typedef Mutex mutex_type;
|
287
|
-
BOOST_THREAD_MOVABLE_ONLY(unique_lock)
|
288
|
-
|
289
|
-
#if 0 // This should not be needed anymore. Use instead BOOST_THREAD_MAKE_RV_REF.
|
290
|
-
#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
|
291
|
-
unique_lock(const volatile unique_lock&);
|
292
|
-
#endif
|
293
|
-
#endif
|
294
|
-
unique_lock() BOOST_NOEXCEPT :
|
295
|
-
m(0),is_locked(false)
|
296
|
-
{}
|
297
|
-
|
298
|
-
explicit unique_lock(Mutex& m_):
|
299
|
-
m(&m_),is_locked(false)
|
300
|
-
{
|
301
|
-
lock();
|
302
|
-
}
|
303
|
-
unique_lock(Mutex& m_,adopt_lock_t):
|
304
|
-
m(&m_),is_locked(true)
|
305
|
-
{}
|
306
|
-
unique_lock(Mutex& m_,defer_lock_t) BOOST_NOEXCEPT:
|
307
|
-
m(&m_),is_locked(false)
|
308
|
-
{}
|
309
|
-
unique_lock(Mutex& m_,try_to_lock_t):
|
310
|
-
m(&m_),is_locked(false)
|
311
|
-
{
|
312
|
-
try_lock();
|
313
|
-
}
|
314
|
-
template<typename TimeDuration>
|
315
|
-
unique_lock(Mutex& m_,TimeDuration const& target_time):
|
316
|
-
m(&m_),is_locked(false)
|
317
|
-
{
|
318
|
-
timed_lock(target_time);
|
319
|
-
}
|
320
|
-
unique_lock(Mutex& m_,system_time const& target_time):
|
321
|
-
m(&m_),is_locked(false)
|
322
|
-
{
|
323
|
-
timed_lock(target_time);
|
324
|
-
}
|
325
|
-
|
326
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
327
|
-
template <class Clock, class Duration>
|
328
|
-
unique_lock(Mutex& mtx, const chrono::time_point<Clock, Duration>& t)
|
329
|
-
: m(&mtx), is_locked(mtx.try_lock_until(t))
|
330
|
-
{
|
331
|
-
}
|
332
|
-
template <class Rep, class Period>
|
333
|
-
unique_lock(Mutex& mtx, const chrono::duration<Rep, Period>& d)
|
334
|
-
: m(&mtx), is_locked(mtx.try_lock_for(d))
|
335
|
-
{
|
336
|
-
}
|
337
|
-
#endif
|
338
|
-
|
339
|
-
unique_lock(BOOST_THREAD_RV_REF(unique_lock) other) BOOST_NOEXCEPT:
|
340
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
341
|
-
{
|
342
|
-
BOOST_THREAD_RV(other).is_locked=false;
|
343
|
-
BOOST_THREAD_RV(other).m=0;
|
344
|
-
}
|
345
|
-
BOOST_THREAD_EXPLICIT_LOCK_CONVERSION unique_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other);
|
346
|
-
|
347
|
-
#ifndef BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
|
348
|
-
unique_lock& operator=(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT
|
349
|
-
{
|
350
|
-
unique_lock temp(::boost::move(other));
|
351
|
-
swap(temp);
|
352
|
-
return *this;
|
353
|
-
}
|
354
|
-
#endif
|
355
|
-
|
356
|
-
unique_lock& operator=(BOOST_THREAD_RV_REF(unique_lock) other) BOOST_NOEXCEPT
|
357
|
-
{
|
358
|
-
unique_lock temp(::boost::move(other));
|
359
|
-
swap(temp);
|
360
|
-
return *this;
|
361
|
-
}
|
362
|
-
#if 0 // This should not be needed anymore. Use instead BOOST_THREAD_MAKE_RV_REF.
|
363
|
-
#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
|
364
|
-
unique_lock& operator=(unique_lock<Mutex> other)
|
365
|
-
{
|
366
|
-
swap(other);
|
367
|
-
return *this;
|
368
|
-
}
|
369
|
-
#endif // BOOST_WORKAROUND
|
370
|
-
#endif
|
371
|
-
|
372
|
-
// Conversion from upgrade locking
|
373
|
-
unique_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<mutex_type> BOOST_THREAD_RV_REF_END ul, try_to_lock_t)
|
374
|
-
: m(0),is_locked(false)
|
375
|
-
{
|
376
|
-
if (BOOST_THREAD_RV(ul).owns_lock()) {
|
377
|
-
if (BOOST_THREAD_RV(ul).mutex()->try_unlock_upgrade_and_lock())
|
378
|
-
{
|
379
|
-
m = BOOST_THREAD_RV(ul).release();
|
380
|
-
is_locked = true;
|
381
|
-
}
|
382
|
-
}
|
383
|
-
else
|
384
|
-
{
|
385
|
-
m = BOOST_THREAD_RV(ul).release();
|
386
|
-
}
|
387
|
-
}
|
388
|
-
|
389
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
390
|
-
template <class Clock, class Duration>
|
391
|
-
unique_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<mutex_type> BOOST_THREAD_RV_REF_END ul,
|
392
|
-
const chrono::time_point<Clock, Duration>& abs_time)
|
393
|
-
: m(0),is_locked(false)
|
394
|
-
{
|
395
|
-
if (BOOST_THREAD_RV(ul).owns_lock()) {
|
396
|
-
if (BOOST_THREAD_RV(ul).mutex()->try_unlock_upgrade_and_lock_until(abs_time))
|
397
|
-
{
|
398
|
-
m = BOOST_THREAD_RV(ul).release();
|
399
|
-
is_locked = true;
|
400
|
-
}
|
401
|
-
}
|
402
|
-
else
|
403
|
-
{
|
404
|
-
m = BOOST_THREAD_RV(ul).release();
|
405
|
-
}
|
406
|
-
}
|
407
|
-
|
408
|
-
template <class Rep, class Period>
|
409
|
-
unique_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<mutex_type> BOOST_THREAD_RV_REF_END ul,
|
410
|
-
const chrono::duration<Rep, Period>& rel_time)
|
411
|
-
: m(0),is_locked(false)
|
412
|
-
{
|
413
|
-
if (BOOST_THREAD_RV(ul).owns_lock()) {
|
414
|
-
if (BOOST_THREAD_RV(ul).mutex()->try_unlock_upgrade_and_lock_for(rel_time))
|
415
|
-
{
|
416
|
-
m = BOOST_THREAD_RV(ul).release();
|
417
|
-
is_locked = true;
|
418
|
-
}
|
419
|
-
}
|
420
|
-
else
|
421
|
-
{
|
422
|
-
m = BOOST_THREAD_RV(ul).release();
|
423
|
-
}
|
424
|
-
}
|
425
|
-
#endif
|
426
|
-
|
427
|
-
#ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
428
|
-
// Conversion from shared locking
|
429
|
-
unique_lock(BOOST_THREAD_RV_REF_BEG shared_lock<mutex_type> BOOST_THREAD_RV_REF_END sl, try_to_lock_t)
|
430
|
-
: m(0),is_locked(false)
|
431
|
-
{
|
432
|
-
if (BOOST_THREAD_RV(sl).owns_lock()) {
|
433
|
-
if (BOOST_THREAD_RV(sl).mutex()->try_unlock_shared_and_lock())
|
434
|
-
{
|
435
|
-
m = BOOST_THREAD_RV(sl).release();
|
436
|
-
is_locked = true;
|
437
|
-
}
|
438
|
-
}
|
439
|
-
else
|
440
|
-
{
|
441
|
-
m = BOOST_THREAD_RV(sl).release();
|
442
|
-
}
|
443
|
-
}
|
444
|
-
|
445
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
446
|
-
template <class Clock, class Duration>
|
447
|
-
unique_lock(BOOST_THREAD_RV_REF_BEG shared_lock<mutex_type> BOOST_THREAD_RV_REF_END sl,
|
448
|
-
const chrono::time_point<Clock, Duration>& abs_time)
|
449
|
-
: m(0),is_locked(false)
|
450
|
-
{
|
451
|
-
if (BOOST_THREAD_RV(sl).owns_lock()) {
|
452
|
-
if (BOOST_THREAD_RV(sl).mutex()->try_unlock_shared_and_lock_until(abs_time))
|
453
|
-
{
|
454
|
-
m = BOOST_THREAD_RV(sl).release();
|
455
|
-
is_locked = true;
|
456
|
-
}
|
457
|
-
}
|
458
|
-
else
|
459
|
-
{
|
460
|
-
m = BOOST_THREAD_RV(sl).release();
|
461
|
-
}
|
462
|
-
}
|
463
|
-
|
464
|
-
template <class Rep, class Period>
|
465
|
-
unique_lock(BOOST_THREAD_RV_REF_BEG shared_lock<mutex_type> BOOST_THREAD_RV_REF_END sl,
|
466
|
-
const chrono::duration<Rep, Period>& rel_time)
|
467
|
-
: m(0),is_locked(false)
|
468
|
-
{
|
469
|
-
if (BOOST_THREAD_RV(sl).owns_lock()) {
|
470
|
-
if (BOOST_THREAD_RV(sl).mutex()->try_unlock_shared_and_lock_for(rel_time))
|
471
|
-
{
|
472
|
-
m = BOOST_THREAD_RV(sl).release();
|
473
|
-
is_locked = true;
|
474
|
-
}
|
475
|
-
}
|
476
|
-
else
|
477
|
-
{
|
478
|
-
m = BOOST_THREAD_RV(sl).release();
|
479
|
-
}
|
480
|
-
}
|
481
|
-
#endif // BOOST_THREAD_USES_CHRONO
|
482
|
-
#endif // BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
483
|
-
|
484
|
-
|
485
|
-
void swap(unique_lock& other) BOOST_NOEXCEPT
|
486
|
-
{
|
487
|
-
std::swap(m,other.m);
|
488
|
-
std::swap(is_locked,other.is_locked);
|
489
|
-
}
|
490
|
-
|
491
|
-
~unique_lock()
|
492
|
-
{
|
493
|
-
if(owns_lock())
|
494
|
-
{
|
495
|
-
m->unlock();
|
496
|
-
}
|
497
|
-
}
|
498
|
-
void lock()
|
499
|
-
{
|
500
|
-
if(m==0)
|
501
|
-
{
|
502
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
503
|
-
}
|
504
|
-
if(owns_lock())
|
505
|
-
{
|
506
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
507
|
-
}
|
508
|
-
m->lock();
|
509
|
-
is_locked=true;
|
510
|
-
}
|
511
|
-
bool try_lock()
|
512
|
-
{
|
513
|
-
if(m==0)
|
514
|
-
{
|
515
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
516
|
-
}
|
517
|
-
if(owns_lock())
|
518
|
-
{
|
519
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
520
|
-
}
|
521
|
-
is_locked=m->try_lock();
|
522
|
-
return is_locked;
|
523
|
-
}
|
524
|
-
template<typename TimeDuration>
|
525
|
-
bool timed_lock(TimeDuration const& relative_time)
|
526
|
-
{
|
527
|
-
if(m==0)
|
528
|
-
{
|
529
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
530
|
-
}
|
531
|
-
if(owns_lock())
|
532
|
-
{
|
533
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
534
|
-
}
|
535
|
-
is_locked=m->timed_lock(relative_time);
|
536
|
-
return is_locked;
|
537
|
-
}
|
538
|
-
|
539
|
-
bool timed_lock(::boost::system_time const& absolute_time)
|
540
|
-
{
|
541
|
-
if(m==0)
|
542
|
-
{
|
543
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
544
|
-
}
|
545
|
-
if(owns_lock())
|
546
|
-
{
|
547
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
548
|
-
}
|
549
|
-
is_locked=m->timed_lock(absolute_time);
|
550
|
-
return is_locked;
|
551
|
-
}
|
552
|
-
bool timed_lock(::boost::xtime const& absolute_time)
|
553
|
-
{
|
554
|
-
if(m==0)
|
555
|
-
{
|
556
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
557
|
-
}
|
558
|
-
if(owns_lock())
|
559
|
-
{
|
560
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
561
|
-
}
|
562
|
-
is_locked=m->timed_lock(absolute_time);
|
563
|
-
return is_locked;
|
564
|
-
}
|
565
|
-
|
566
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
567
|
-
|
568
|
-
template <class Rep, class Period>
|
569
|
-
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
570
|
-
{
|
571
|
-
if(m==0)
|
572
|
-
{
|
573
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
574
|
-
}
|
575
|
-
if(owns_lock())
|
576
|
-
{
|
577
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
578
|
-
}
|
579
|
-
is_locked=m->try_lock_for(rel_time);
|
580
|
-
return is_locked;
|
581
|
-
}
|
582
|
-
template <class Clock, class Duration>
|
583
|
-
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
|
584
|
-
{
|
585
|
-
if(m==0)
|
586
|
-
{
|
587
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
588
|
-
}
|
589
|
-
if(owns_lock())
|
590
|
-
{
|
591
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost unique_lock owns already the mutex"));
|
592
|
-
}
|
593
|
-
is_locked=m->try_lock_until(abs_time);
|
594
|
-
return is_locked;
|
595
|
-
}
|
596
|
-
#endif
|
597
|
-
|
598
|
-
void unlock()
|
599
|
-
{
|
600
|
-
if(m==0)
|
601
|
-
{
|
602
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock has no mutex"));
|
603
|
-
}
|
604
|
-
if(!owns_lock())
|
605
|
-
{
|
606
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost unique_lock doesn't own the mutex"));
|
607
|
-
}
|
608
|
-
m->unlock();
|
609
|
-
is_locked=false;
|
610
|
-
}
|
611
|
-
|
612
|
-
#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
613
|
-
typedef void (unique_lock::*bool_type)();
|
614
|
-
operator bool_type() const BOOST_NOEXCEPT
|
615
|
-
{
|
616
|
-
return is_locked?&unique_lock::lock:0;
|
617
|
-
}
|
618
|
-
bool operator!() const BOOST_NOEXCEPT
|
619
|
-
{
|
620
|
-
return !owns_lock();
|
621
|
-
}
|
622
|
-
#else
|
623
|
-
explicit operator bool() const BOOST_NOEXCEPT
|
624
|
-
{
|
625
|
-
return owns_lock();
|
626
|
-
}
|
627
|
-
#endif
|
628
|
-
bool owns_lock() const BOOST_NOEXCEPT
|
629
|
-
{
|
630
|
-
return is_locked;
|
631
|
-
}
|
632
|
-
|
633
|
-
Mutex* mutex() const BOOST_NOEXCEPT
|
634
|
-
{
|
635
|
-
return m;
|
636
|
-
}
|
637
|
-
|
638
|
-
Mutex* release() BOOST_NOEXCEPT
|
639
|
-
{
|
640
|
-
Mutex* const res=m;
|
641
|
-
m=0;
|
642
|
-
is_locked=false;
|
643
|
-
return res;
|
644
|
-
}
|
645
|
-
|
646
|
-
friend class shared_lock<Mutex>;
|
647
|
-
friend class upgrade_lock<Mutex>;
|
648
|
-
};
|
649
|
-
|
650
|
-
template<typename Mutex>
|
651
|
-
void swap(unique_lock<Mutex>& lhs,unique_lock<Mutex>& rhs) BOOST_NOEXCEPT
|
652
|
-
{
|
653
|
-
lhs.swap(rhs);
|
654
|
-
}
|
655
|
-
|
656
|
-
BOOST_THREAD_DCL_MOVABLE_BEG(Mutex) unique_lock<Mutex> BOOST_THREAD_DCL_MOVABLE_END
|
657
|
-
|
658
|
-
template<typename Mutex>
|
659
|
-
class shared_lock
|
660
|
-
{
|
661
|
-
protected:
|
662
|
-
Mutex* m;
|
663
|
-
bool is_locked;
|
664
|
-
|
665
|
-
public:
|
666
|
-
typedef Mutex mutex_type;
|
667
|
-
BOOST_THREAD_MOVABLE_ONLY(shared_lock)
|
668
|
-
|
669
|
-
shared_lock() BOOST_NOEXCEPT:
|
670
|
-
m(0),is_locked(false)
|
671
|
-
{}
|
672
|
-
|
673
|
-
explicit shared_lock(Mutex& m_):
|
674
|
-
m(&m_),is_locked(false)
|
675
|
-
{
|
676
|
-
lock();
|
677
|
-
}
|
678
|
-
shared_lock(Mutex& m_,adopt_lock_t):
|
679
|
-
m(&m_),is_locked(true)
|
680
|
-
{}
|
681
|
-
shared_lock(Mutex& m_,defer_lock_t) BOOST_NOEXCEPT:
|
682
|
-
m(&m_),is_locked(false)
|
683
|
-
{}
|
684
|
-
shared_lock(Mutex& m_,try_to_lock_t):
|
685
|
-
m(&m_),is_locked(false)
|
686
|
-
{
|
687
|
-
try_lock();
|
688
|
-
}
|
689
|
-
shared_lock(Mutex& m_,system_time const& target_time):
|
690
|
-
m(&m_),is_locked(false)
|
691
|
-
{
|
692
|
-
timed_lock(target_time);
|
693
|
-
}
|
694
|
-
|
695
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
696
|
-
template <class Clock, class Duration>
|
697
|
-
shared_lock(Mutex& mtx, const chrono::time_point<Clock, Duration>& t)
|
698
|
-
: m(&mtx), is_locked(mtx.try_lock_shared_until(t))
|
699
|
-
{
|
700
|
-
}
|
701
|
-
template <class Rep, class Period>
|
702
|
-
shared_lock(Mutex& mtx, const chrono::duration<Rep, Period>& d)
|
703
|
-
: m(&mtx), is_locked(mtx.try_lock_shared_for(d))
|
704
|
-
{
|
705
|
-
}
|
706
|
-
#endif
|
707
|
-
|
708
|
-
shared_lock(BOOST_THREAD_RV_REF_BEG shared_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT:
|
709
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
710
|
-
{
|
711
|
-
BOOST_THREAD_RV(other).is_locked=false;
|
712
|
-
BOOST_THREAD_RV(other).m=0;
|
713
|
-
}
|
714
|
-
|
715
|
-
BOOST_THREAD_EXPLICIT_LOCK_CONVERSION shared_lock(BOOST_THREAD_RV_REF_BEG unique_lock<Mutex> BOOST_THREAD_RV_REF_END other):
|
716
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
717
|
-
{
|
718
|
-
if(is_locked)
|
719
|
-
{
|
720
|
-
m->unlock_and_lock_shared();
|
721
|
-
}
|
722
|
-
BOOST_THREAD_RV(other).is_locked=false;
|
723
|
-
BOOST_THREAD_RV(other).m=0;
|
724
|
-
}
|
725
|
-
|
726
|
-
BOOST_THREAD_EXPLICIT_LOCK_CONVERSION shared_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other):
|
727
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
728
|
-
{
|
729
|
-
if(is_locked)
|
730
|
-
{
|
731
|
-
m->unlock_upgrade_and_lock_shared();
|
732
|
-
}
|
733
|
-
BOOST_THREAD_RV(other).is_locked=false;
|
734
|
-
BOOST_THREAD_RV(other).m=0;
|
735
|
-
}
|
736
|
-
|
737
|
-
|
738
|
-
shared_lock& operator=(BOOST_THREAD_RV_REF_BEG shared_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT
|
739
|
-
{
|
740
|
-
shared_lock temp(::boost::move(other));
|
741
|
-
swap(temp);
|
742
|
-
return *this;
|
743
|
-
}
|
744
|
-
#ifndef BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
|
745
|
-
shared_lock& operator=(BOOST_THREAD_RV_REF_BEG unique_lock<Mutex> BOOST_THREAD_RV_REF_END other)
|
746
|
-
{
|
747
|
-
shared_lock temp(::boost::move(other));
|
748
|
-
swap(temp);
|
749
|
-
return *this;
|
750
|
-
}
|
751
|
-
|
752
|
-
shared_lock& operator=(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other)
|
753
|
-
{
|
754
|
-
shared_lock temp(::boost::move(other));
|
755
|
-
swap(temp);
|
756
|
-
return *this;
|
757
|
-
}
|
758
|
-
#endif
|
759
|
-
|
760
|
-
void swap(shared_lock& other) BOOST_NOEXCEPT
|
761
|
-
{
|
762
|
-
std::swap(m,other.m);
|
763
|
-
std::swap(is_locked,other.is_locked);
|
764
|
-
}
|
765
|
-
|
766
|
-
Mutex* mutex() const BOOST_NOEXCEPT
|
767
|
-
{
|
768
|
-
return m;
|
769
|
-
}
|
770
|
-
|
771
|
-
Mutex* release() BOOST_NOEXCEPT
|
772
|
-
{
|
773
|
-
Mutex* const res=m;
|
774
|
-
m=0;
|
775
|
-
is_locked=false;
|
776
|
-
return res;
|
777
|
-
}
|
778
|
-
|
779
|
-
~shared_lock()
|
780
|
-
{
|
781
|
-
if(owns_lock())
|
782
|
-
{
|
783
|
-
m->unlock_shared();
|
784
|
-
}
|
785
|
-
}
|
786
|
-
void lock()
|
787
|
-
{
|
788
|
-
if(m==0)
|
789
|
-
{
|
790
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
791
|
-
}
|
792
|
-
if(owns_lock())
|
793
|
-
{
|
794
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
795
|
-
}
|
796
|
-
m->lock_shared();
|
797
|
-
is_locked=true;
|
798
|
-
}
|
799
|
-
bool try_lock()
|
800
|
-
{
|
801
|
-
if(m==0)
|
802
|
-
{
|
803
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
804
|
-
}
|
805
|
-
if(owns_lock())
|
806
|
-
{
|
807
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
808
|
-
}
|
809
|
-
is_locked=m->try_lock_shared();
|
810
|
-
return is_locked;
|
811
|
-
}
|
812
|
-
bool timed_lock(boost::system_time const& target_time)
|
813
|
-
{
|
814
|
-
if(m==0)
|
815
|
-
{
|
816
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
817
|
-
}
|
818
|
-
if(owns_lock())
|
819
|
-
{
|
820
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
821
|
-
}
|
822
|
-
is_locked=m->timed_lock_shared(target_time);
|
823
|
-
return is_locked;
|
824
|
-
}
|
825
|
-
template<typename Duration>
|
826
|
-
bool timed_lock(Duration const& target_time)
|
827
|
-
{
|
828
|
-
if(m==0)
|
829
|
-
{
|
830
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
831
|
-
}
|
832
|
-
if(owns_lock())
|
833
|
-
{
|
834
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
835
|
-
}
|
836
|
-
is_locked=m->timed_lock_shared(target_time);
|
837
|
-
return is_locked;
|
838
|
-
}
|
839
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
840
|
-
template <class Rep, class Period>
|
841
|
-
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
842
|
-
{
|
843
|
-
if(m==0)
|
844
|
-
{
|
845
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
846
|
-
}
|
847
|
-
if(owns_lock())
|
848
|
-
{
|
849
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
850
|
-
}
|
851
|
-
is_locked=m->try_lock_shared_for(rel_time);
|
852
|
-
return is_locked;
|
853
|
-
}
|
854
|
-
template <class Clock, class Duration>
|
855
|
-
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
|
856
|
-
{
|
857
|
-
if(m==0)
|
858
|
-
{
|
859
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
860
|
-
}
|
861
|
-
if(owns_lock())
|
862
|
-
{
|
863
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
864
|
-
}
|
865
|
-
is_locked=m->try_lock_shared_until(abs_time);
|
866
|
-
return is_locked;
|
867
|
-
}
|
868
|
-
#endif
|
869
|
-
void unlock()
|
870
|
-
{
|
871
|
-
if(m==0)
|
872
|
-
{
|
873
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
874
|
-
}
|
875
|
-
if(!owns_lock())
|
876
|
-
{
|
877
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock doesn't own the mutex"));
|
878
|
-
}
|
879
|
-
m->unlock_shared();
|
880
|
-
is_locked=false;
|
881
|
-
}
|
882
|
-
|
883
|
-
#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
884
|
-
typedef void (shared_lock<Mutex>::*bool_type)();
|
885
|
-
operator bool_type() const BOOST_NOEXCEPT
|
886
|
-
{
|
887
|
-
return is_locked?&shared_lock::lock:0;
|
888
|
-
}
|
889
|
-
bool operator!() const BOOST_NOEXCEPT
|
890
|
-
{
|
891
|
-
return !owns_lock();
|
892
|
-
}
|
893
|
-
#else
|
894
|
-
explicit operator bool() const BOOST_NOEXCEPT
|
895
|
-
{
|
896
|
-
return owns_lock();
|
897
|
-
}
|
898
|
-
#endif
|
899
|
-
bool owns_lock() const BOOST_NOEXCEPT
|
900
|
-
{
|
901
|
-
return is_locked;
|
902
|
-
}
|
903
|
-
|
904
|
-
};
|
905
|
-
|
906
|
-
BOOST_THREAD_DCL_MOVABLE_BEG(Mutex) shared_lock<Mutex> BOOST_THREAD_DCL_MOVABLE_END
|
907
|
-
|
908
|
-
template<typename Mutex>
|
909
|
-
void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs) BOOST_NOEXCEPT
|
910
|
-
{
|
911
|
-
lhs.swap(rhs);
|
912
|
-
}
|
913
|
-
|
914
|
-
template<typename Mutex>
|
915
|
-
class upgrade_lock
|
916
|
-
{
|
917
|
-
protected:
|
918
|
-
Mutex* m;
|
919
|
-
bool is_locked;
|
920
|
-
|
921
|
-
public:
|
922
|
-
typedef Mutex mutex_type;
|
923
|
-
BOOST_THREAD_MOVABLE_ONLY(upgrade_lock)
|
924
|
-
|
925
|
-
upgrade_lock() BOOST_NOEXCEPT:
|
926
|
-
m(0),is_locked(false)
|
927
|
-
{}
|
928
|
-
|
929
|
-
explicit upgrade_lock(Mutex& m_):
|
930
|
-
m(&m_),is_locked(false)
|
931
|
-
{
|
932
|
-
lock();
|
933
|
-
}
|
934
|
-
upgrade_lock(Mutex& m_,adopt_lock_t):
|
935
|
-
m(&m_),is_locked(true)
|
936
|
-
{}
|
937
|
-
upgrade_lock(Mutex& m_,defer_lock_t) BOOST_NOEXCEPT:
|
938
|
-
m(&m_),is_locked(false)
|
939
|
-
{}
|
940
|
-
upgrade_lock(Mutex& m_,try_to_lock_t):
|
941
|
-
m(&m_),is_locked(false)
|
942
|
-
{
|
943
|
-
try_lock();
|
944
|
-
}
|
945
|
-
|
946
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
947
|
-
template <class Clock, class Duration>
|
948
|
-
upgrade_lock(Mutex& mtx, const chrono::time_point<Clock, Duration>& t)
|
949
|
-
: m(&mtx), is_locked(mtx.try_lock_upgrade_until(t))
|
950
|
-
{
|
951
|
-
}
|
952
|
-
template <class Rep, class Period>
|
953
|
-
upgrade_lock(Mutex& mtx, const chrono::duration<Rep, Period>& d)
|
954
|
-
: m(&mtx), is_locked(mtx.try_lock_upgrade_for(d))
|
955
|
-
{
|
956
|
-
}
|
957
|
-
#endif
|
958
|
-
|
959
|
-
upgrade_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT:
|
960
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
961
|
-
{
|
962
|
-
BOOST_THREAD_RV(other).is_locked=false;
|
963
|
-
BOOST_THREAD_RV(other).m=0;
|
964
|
-
}
|
965
|
-
|
966
|
-
BOOST_THREAD_EXPLICIT_LOCK_CONVERSION upgrade_lock(BOOST_THREAD_RV_REF_BEG unique_lock<Mutex> BOOST_THREAD_RV_REF_END other):
|
967
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
968
|
-
{
|
969
|
-
if(is_locked)
|
970
|
-
{
|
971
|
-
m->unlock_and_lock_upgrade();
|
972
|
-
}
|
973
|
-
BOOST_THREAD_RV(other).is_locked=false;
|
974
|
-
BOOST_THREAD_RV(other).m=0;
|
975
|
-
}
|
976
|
-
|
977
|
-
upgrade_lock& operator=(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT
|
978
|
-
{
|
979
|
-
upgrade_lock temp(::boost::move(other));
|
980
|
-
swap(temp);
|
981
|
-
return *this;
|
982
|
-
}
|
983
|
-
|
984
|
-
#ifndef BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
|
985
|
-
upgrade_lock& operator=(BOOST_THREAD_RV_REF_BEG unique_lock<Mutex> BOOST_THREAD_RV_REF_END other)
|
986
|
-
{
|
987
|
-
upgrade_lock temp(::boost::move(other));
|
988
|
-
swap(temp);
|
989
|
-
return *this;
|
990
|
-
}
|
991
|
-
#endif
|
992
|
-
|
993
|
-
#ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
994
|
-
// Conversion from shared locking
|
995
|
-
upgrade_lock(BOOST_THREAD_RV_REF_BEG shared_lock<mutex_type> BOOST_THREAD_RV_REF_END sl, try_to_lock_t)
|
996
|
-
: m(0),is_locked(false)
|
997
|
-
{
|
998
|
-
if (BOOST_THREAD_RV(sl).owns_lock()) {
|
999
|
-
if (BOOST_THREAD_RV(sl).mutex()->try_unlock_shared_and_lock_upgrade())
|
1000
|
-
{
|
1001
|
-
m = BOOST_THREAD_RV(sl).release();
|
1002
|
-
is_locked = true;
|
1003
|
-
}
|
1004
|
-
}
|
1005
|
-
else
|
1006
|
-
{
|
1007
|
-
m = BOOST_THREAD_RV(sl).release();
|
1008
|
-
}
|
1009
|
-
}
|
1010
|
-
|
1011
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
1012
|
-
template <class Clock, class Duration>
|
1013
|
-
upgrade_lock(BOOST_THREAD_RV_REF_BEG shared_lock<mutex_type> BOOST_THREAD_RV_REF_END sl,
|
1014
|
-
const chrono::time_point<Clock, Duration>& abs_time)
|
1015
|
-
: m(0),is_locked(false)
|
1016
|
-
{
|
1017
|
-
if (BOOST_THREAD_RV(sl).owns_lock()) {
|
1018
|
-
if (BOOST_THREAD_RV(sl).mutex()->try_unlock_shared_and_lock_upgrade_until(abs_time))
|
1019
|
-
{
|
1020
|
-
m = BOOST_THREAD_RV(sl).release();
|
1021
|
-
is_locked = true;
|
1022
|
-
}
|
1023
|
-
}
|
1024
|
-
else
|
1025
|
-
{
|
1026
|
-
m = BOOST_THREAD_RV(sl).release();
|
1027
|
-
}
|
1028
|
-
}
|
1029
|
-
|
1030
|
-
template <class Rep, class Period>
|
1031
|
-
upgrade_lock(BOOST_THREAD_RV_REF_BEG shared_lock<mutex_type> BOOST_THREAD_RV_REF_END sl,
|
1032
|
-
const chrono::duration<Rep, Period>& rel_time)
|
1033
|
-
: m(0),is_locked(false)
|
1034
|
-
{
|
1035
|
-
if (BOOST_THREAD_RV(sl).owns_lock()) {
|
1036
|
-
if (BOOST_THREAD_RV(sl).mutex()->try_unlock_shared_and_lock_upgrade_for(rel_time))
|
1037
|
-
{
|
1038
|
-
m = BOOST_THREAD_RV(sl).release();
|
1039
|
-
is_locked = true;
|
1040
|
-
}
|
1041
|
-
}
|
1042
|
-
else
|
1043
|
-
{
|
1044
|
-
m = BOOST_THREAD_RV(sl).release();
|
1045
|
-
}
|
1046
|
-
}
|
1047
|
-
#endif // BOOST_THREAD_USES_CHRONO
|
1048
|
-
#endif // BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
|
1049
|
-
|
1050
|
-
void swap(upgrade_lock& other) BOOST_NOEXCEPT
|
1051
|
-
{
|
1052
|
-
std::swap(m,other.m);
|
1053
|
-
std::swap(is_locked,other.is_locked);
|
1054
|
-
}
|
1055
|
-
Mutex* mutex() const BOOST_NOEXCEPT
|
1056
|
-
{
|
1057
|
-
return m;
|
1058
|
-
}
|
1059
|
-
|
1060
|
-
Mutex* release() BOOST_NOEXCEPT
|
1061
|
-
{
|
1062
|
-
Mutex* const res=m;
|
1063
|
-
m=0;
|
1064
|
-
is_locked=false;
|
1065
|
-
return res;
|
1066
|
-
}
|
1067
|
-
~upgrade_lock()
|
1068
|
-
{
|
1069
|
-
if(owns_lock())
|
1070
|
-
{
|
1071
|
-
m->unlock_upgrade();
|
1072
|
-
}
|
1073
|
-
}
|
1074
|
-
void lock()
|
1075
|
-
{
|
1076
|
-
if(m==0)
|
1077
|
-
{
|
1078
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
1079
|
-
}
|
1080
|
-
if(owns_lock())
|
1081
|
-
{
|
1082
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost upgrade_lock owns already the mutex"));
|
1083
|
-
}
|
1084
|
-
m->lock_upgrade();
|
1085
|
-
is_locked=true;
|
1086
|
-
}
|
1087
|
-
bool try_lock()
|
1088
|
-
{
|
1089
|
-
if(m==0)
|
1090
|
-
{
|
1091
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
1092
|
-
}
|
1093
|
-
if(owns_lock())
|
1094
|
-
{
|
1095
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost upgrade_lock owns already the mutex"));
|
1096
|
-
}
|
1097
|
-
is_locked=m->try_lock_upgrade();
|
1098
|
-
return is_locked;
|
1099
|
-
}
|
1100
|
-
void unlock()
|
1101
|
-
{
|
1102
|
-
if(m==0)
|
1103
|
-
{
|
1104
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
1105
|
-
}
|
1106
|
-
if(!owns_lock())
|
1107
|
-
{
|
1108
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost upgrade_lock doesn't own the mutex"));
|
1109
|
-
}
|
1110
|
-
m->unlock_upgrade();
|
1111
|
-
is_locked=false;
|
1112
|
-
}
|
1113
|
-
#ifdef BOOST_THREAD_USES_CHRONO
|
1114
|
-
template <class Rep, class Period>
|
1115
|
-
bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
|
1116
|
-
{
|
1117
|
-
if(m==0)
|
1118
|
-
{
|
1119
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
1120
|
-
}
|
1121
|
-
if(owns_lock())
|
1122
|
-
{
|
1123
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
1124
|
-
}
|
1125
|
-
is_locked=m->try_lock_upgrade_for(rel_time);
|
1126
|
-
return is_locked;
|
1127
|
-
}
|
1128
|
-
template <class Clock, class Duration>
|
1129
|
-
bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
|
1130
|
-
{
|
1131
|
-
if(m==0)
|
1132
|
-
{
|
1133
|
-
boost::throw_exception(boost::lock_error(system::errc::operation_not_permitted, "boost shared_lock has no mutex"));
|
1134
|
-
}
|
1135
|
-
if(owns_lock())
|
1136
|
-
{
|
1137
|
-
boost::throw_exception(boost::lock_error(system::errc::resource_deadlock_would_occur, "boost shared_lock owns already the mutex"));
|
1138
|
-
}
|
1139
|
-
is_locked=m->try_lock_upgrade_until(abs_time);
|
1140
|
-
return is_locked;
|
1141
|
-
}
|
1142
|
-
#endif
|
1143
|
-
#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
1144
|
-
typedef void (upgrade_lock::*bool_type)();
|
1145
|
-
operator bool_type() const BOOST_NOEXCEPT
|
1146
|
-
{
|
1147
|
-
return is_locked?&upgrade_lock::lock:0;
|
1148
|
-
}
|
1149
|
-
bool operator!() const BOOST_NOEXCEPT
|
1150
|
-
{
|
1151
|
-
return !owns_lock();
|
1152
|
-
}
|
1153
|
-
#else
|
1154
|
-
explicit operator bool() const BOOST_NOEXCEPT
|
1155
|
-
{
|
1156
|
-
return owns_lock();
|
1157
|
-
}
|
1158
|
-
#endif
|
1159
|
-
bool owns_lock() const BOOST_NOEXCEPT
|
1160
|
-
{
|
1161
|
-
return is_locked;
|
1162
|
-
}
|
1163
|
-
friend class shared_lock<Mutex>;
|
1164
|
-
friend class unique_lock<Mutex>;
|
1165
|
-
};
|
1166
|
-
|
1167
|
-
template<typename Mutex>
|
1168
|
-
void swap(upgrade_lock<Mutex>& lhs,upgrade_lock<Mutex>& rhs) BOOST_NOEXCEPT
|
1169
|
-
{
|
1170
|
-
lhs.swap(rhs);
|
1171
|
-
}
|
1172
|
-
|
1173
|
-
BOOST_THREAD_DCL_MOVABLE_BEG(Mutex) upgrade_lock<Mutex> BOOST_THREAD_DCL_MOVABLE_END
|
1174
|
-
|
1175
|
-
template<typename Mutex>
|
1176
|
-
unique_lock<Mutex>::unique_lock(BOOST_THREAD_RV_REF_BEG upgrade_lock<Mutex> BOOST_THREAD_RV_REF_END other):
|
1177
|
-
m(BOOST_THREAD_RV(other).m),is_locked(BOOST_THREAD_RV(other).is_locked)
|
1178
|
-
{
|
1179
|
-
if(is_locked)
|
1180
|
-
{
|
1181
|
-
m->unlock_upgrade_and_lock();
|
1182
|
-
}
|
1183
|
-
BOOST_THREAD_RV(other).release();
|
1184
|
-
}
|
1185
|
-
|
1186
|
-
template <class Mutex>
|
1187
|
-
class upgrade_to_unique_lock
|
1188
|
-
{
|
1189
|
-
private:
|
1190
|
-
upgrade_lock<Mutex>* source;
|
1191
|
-
unique_lock<Mutex> exclusive;
|
1192
|
-
|
1193
|
-
public:
|
1194
|
-
typedef Mutex mutex_type;
|
1195
|
-
BOOST_THREAD_MOVABLE_ONLY(upgrade_to_unique_lock)
|
1196
|
-
|
1197
|
-
explicit upgrade_to_unique_lock(upgrade_lock<Mutex>& m_):
|
1198
|
-
source(&m_),exclusive(::boost::move(*source))
|
1199
|
-
{}
|
1200
|
-
~upgrade_to_unique_lock()
|
1201
|
-
{
|
1202
|
-
if(source)
|
1203
|
-
{
|
1204
|
-
*source=BOOST_THREAD_MAKE_RV_REF(upgrade_lock<Mutex>(::boost::move(exclusive)));
|
1205
|
-
}
|
1206
|
-
}
|
1207
|
-
|
1208
|
-
upgrade_to_unique_lock(BOOST_THREAD_RV_REF_BEG upgrade_to_unique_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT:
|
1209
|
-
source(BOOST_THREAD_RV(other).source),exclusive(::boost::move(BOOST_THREAD_RV(other).exclusive))
|
1210
|
-
{
|
1211
|
-
BOOST_THREAD_RV(other).source=0;
|
1212
|
-
}
|
1213
|
-
|
1214
|
-
upgrade_to_unique_lock& operator=(BOOST_THREAD_RV_REF_BEG upgrade_to_unique_lock<Mutex> BOOST_THREAD_RV_REF_END other) BOOST_NOEXCEPT
|
1215
|
-
{
|
1216
|
-
upgrade_to_unique_lock temp(other);
|
1217
|
-
swap(temp);
|
1218
|
-
return *this;
|
1219
|
-
}
|
1220
|
-
|
1221
|
-
void swap(upgrade_to_unique_lock& other) BOOST_NOEXCEPT
|
1222
|
-
{
|
1223
|
-
std::swap(source,other.source);
|
1224
|
-
exclusive.swap(other.exclusive);
|
1225
|
-
}
|
1226
|
-
|
1227
|
-
#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
1228
|
-
typedef void (upgrade_to_unique_lock::*bool_type)(upgrade_to_unique_lock&);
|
1229
|
-
operator bool_type() const BOOST_NOEXCEPT
|
1230
|
-
{
|
1231
|
-
return exclusive.owns_lock()?&upgrade_to_unique_lock::swap:0;
|
1232
|
-
}
|
1233
|
-
bool operator!() const BOOST_NOEXCEPT
|
1234
|
-
{
|
1235
|
-
return !owns_lock();
|
1236
|
-
}
|
1237
|
-
#else
|
1238
|
-
explicit operator bool() const BOOST_NOEXCEPT
|
1239
|
-
{
|
1240
|
-
return owns_lock();
|
1241
|
-
}
|
1242
|
-
#endif
|
1243
|
-
|
1244
|
-
bool owns_lock() const BOOST_NOEXCEPT
|
1245
|
-
{
|
1246
|
-
return exclusive.owns_lock();
|
1247
|
-
}
|
1248
|
-
};
|
1249
|
-
|
1250
|
-
BOOST_THREAD_DCL_MOVABLE_BEG(Mutex) upgrade_to_unique_lock<Mutex> BOOST_THREAD_DCL_MOVABLE_END
|
1251
|
-
|
1252
|
-
namespace detail
|
1253
|
-
{
|
1254
|
-
template<typename Mutex>
|
1255
|
-
class try_lock_wrapper:
|
1256
|
-
private unique_lock<Mutex>
|
1257
|
-
{
|
1258
|
-
typedef unique_lock<Mutex> base;
|
1259
|
-
public:
|
1260
|
-
BOOST_THREAD_MOVABLE_ONLY(try_lock_wrapper)
|
1261
|
-
|
1262
|
-
try_lock_wrapper()
|
1263
|
-
{}
|
1264
|
-
|
1265
|
-
explicit try_lock_wrapper(Mutex& m):
|
1266
|
-
base(m,try_to_lock)
|
1267
|
-
{}
|
1268
|
-
|
1269
|
-
try_lock_wrapper(Mutex& m_,adopt_lock_t):
|
1270
|
-
base(m_,adopt_lock)
|
1271
|
-
{}
|
1272
|
-
try_lock_wrapper(Mutex& m_,defer_lock_t):
|
1273
|
-
base(m_,defer_lock)
|
1274
|
-
{}
|
1275
|
-
try_lock_wrapper(Mutex& m_,try_to_lock_t):
|
1276
|
-
base(m_,try_to_lock)
|
1277
|
-
{}
|
1278
|
-
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
1279
|
-
try_lock_wrapper(BOOST_THREAD_RV_REF(try_lock_wrapper) other):
|
1280
|
-
base(::boost::move(other))
|
1281
|
-
{}
|
1282
|
-
|
1283
|
-
#elif defined BOOST_THREAD_USES_MOVE
|
1284
|
-
try_lock_wrapper(BOOST_THREAD_RV_REF(try_lock_wrapper) other):
|
1285
|
-
base(::boost::move(static_cast<base&>(other)))
|
1286
|
-
{}
|
1287
|
-
|
1288
|
-
#else
|
1289
|
-
try_lock_wrapper(BOOST_THREAD_RV_REF(try_lock_wrapper) other):
|
1290
|
-
base(BOOST_THREAD_RV_REF(base)(*other))
|
1291
|
-
{}
|
1292
|
-
#endif
|
1293
|
-
try_lock_wrapper& operator=(BOOST_THREAD_RV_REF_BEG try_lock_wrapper<Mutex> BOOST_THREAD_RV_REF_END other)
|
1294
|
-
{
|
1295
|
-
try_lock_wrapper temp(other);
|
1296
|
-
swap(temp);
|
1297
|
-
return *this;
|
1298
|
-
}
|
1299
|
-
void swap(try_lock_wrapper& other)
|
1300
|
-
{
|
1301
|
-
base::swap(other);
|
1302
|
-
}
|
1303
|
-
void lock()
|
1304
|
-
{
|
1305
|
-
base::lock();
|
1306
|
-
}
|
1307
|
-
bool try_lock()
|
1308
|
-
{
|
1309
|
-
return base::try_lock();
|
1310
|
-
}
|
1311
|
-
void unlock()
|
1312
|
-
{
|
1313
|
-
base::unlock();
|
1314
|
-
}
|
1315
|
-
bool owns_lock() const
|
1316
|
-
{
|
1317
|
-
return base::owns_lock();
|
1318
|
-
}
|
1319
|
-
Mutex* mutex() const
|
1320
|
-
{
|
1321
|
-
return base::mutex();
|
1322
|
-
}
|
1323
|
-
Mutex* release()
|
1324
|
-
{
|
1325
|
-
return base::release();
|
1326
|
-
}
|
1327
|
-
|
1328
|
-
#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
|
1329
|
-
typedef typename base::bool_type bool_type;
|
1330
|
-
operator bool_type() const
|
1331
|
-
{
|
1332
|
-
return base::operator bool_type();
|
1333
|
-
}
|
1334
|
-
bool operator!() const
|
1335
|
-
{
|
1336
|
-
return !this->owns_lock();
|
1337
|
-
}
|
1338
|
-
#else
|
1339
|
-
explicit operator bool() const
|
1340
|
-
{
|
1341
|
-
return owns_lock();
|
1342
|
-
}
|
1343
|
-
#endif
|
1344
|
-
};
|
1345
|
-
|
1346
|
-
template<typename Mutex>
|
1347
|
-
void swap(try_lock_wrapper<Mutex>& lhs,try_lock_wrapper<Mutex>& rhs)
|
1348
|
-
{
|
1349
|
-
lhs.swap(rhs);
|
1350
|
-
}
|
1351
|
-
|
1352
|
-
template<typename MutexType1,typename MutexType2>
|
1353
|
-
unsigned try_lock_internal(MutexType1& m1,MutexType2& m2)
|
1354
|
-
{
|
1355
|
-
boost::unique_lock<MutexType1> l1(m1,boost::try_to_lock);
|
1356
|
-
if(!l1)
|
1357
|
-
{
|
1358
|
-
return 1;
|
1359
|
-
}
|
1360
|
-
if(!m2.try_lock())
|
1361
|
-
{
|
1362
|
-
return 2;
|
1363
|
-
}
|
1364
|
-
l1.release();
|
1365
|
-
return 0;
|
1366
|
-
}
|
1367
|
-
|
1368
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3>
|
1369
|
-
unsigned try_lock_internal(MutexType1& m1,MutexType2& m2,MutexType3& m3)
|
1370
|
-
{
|
1371
|
-
boost::unique_lock<MutexType1> l1(m1,boost::try_to_lock);
|
1372
|
-
if(!l1)
|
1373
|
-
{
|
1374
|
-
return 1;
|
1375
|
-
}
|
1376
|
-
if(unsigned const failed_lock=try_lock_internal(m2,m3))
|
1377
|
-
{
|
1378
|
-
return failed_lock+1;
|
1379
|
-
}
|
1380
|
-
l1.release();
|
1381
|
-
return 0;
|
1382
|
-
}
|
1383
|
-
|
1384
|
-
|
1385
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,
|
1386
|
-
typename MutexType4>
|
1387
|
-
unsigned try_lock_internal(MutexType1& m1,MutexType2& m2,MutexType3& m3,
|
1388
|
-
MutexType4& m4)
|
1389
|
-
{
|
1390
|
-
boost::unique_lock<MutexType1> l1(m1,boost::try_to_lock);
|
1391
|
-
if(!l1)
|
1392
|
-
{
|
1393
|
-
return 1;
|
1394
|
-
}
|
1395
|
-
if(unsigned const failed_lock=try_lock_internal(m2,m3,m4))
|
1396
|
-
{
|
1397
|
-
return failed_lock+1;
|
1398
|
-
}
|
1399
|
-
l1.release();
|
1400
|
-
return 0;
|
1401
|
-
}
|
1402
|
-
|
1403
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,
|
1404
|
-
typename MutexType4,typename MutexType5>
|
1405
|
-
unsigned try_lock_internal(MutexType1& m1,MutexType2& m2,MutexType3& m3,
|
1406
|
-
MutexType4& m4,MutexType5& m5)
|
1407
|
-
{
|
1408
|
-
boost::unique_lock<MutexType1> l1(m1,boost::try_to_lock);
|
1409
|
-
if(!l1)
|
1410
|
-
{
|
1411
|
-
return 1;
|
1412
|
-
}
|
1413
|
-
if(unsigned const failed_lock=try_lock_internal(m2,m3,m4,m5))
|
1414
|
-
{
|
1415
|
-
return failed_lock+1;
|
1416
|
-
}
|
1417
|
-
l1.release();
|
1418
|
-
return 0;
|
1419
|
-
}
|
1420
|
-
|
1421
|
-
|
1422
|
-
template<typename MutexType1,typename MutexType2>
|
1423
|
-
unsigned lock_helper(MutexType1& m1,MutexType2& m2)
|
1424
|
-
{
|
1425
|
-
boost::unique_lock<MutexType1> l1(m1);
|
1426
|
-
if(!m2.try_lock())
|
1427
|
-
{
|
1428
|
-
return 1;
|
1429
|
-
}
|
1430
|
-
l1.release();
|
1431
|
-
return 0;
|
1432
|
-
}
|
1433
|
-
|
1434
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3>
|
1435
|
-
unsigned lock_helper(MutexType1& m1,MutexType2& m2,MutexType3& m3)
|
1436
|
-
{
|
1437
|
-
boost::unique_lock<MutexType1> l1(m1);
|
1438
|
-
if(unsigned const failed_lock=try_lock_internal(m2,m3))
|
1439
|
-
{
|
1440
|
-
return failed_lock;
|
1441
|
-
}
|
1442
|
-
l1.release();
|
1443
|
-
return 0;
|
1444
|
-
}
|
1445
|
-
|
1446
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,
|
1447
|
-
typename MutexType4>
|
1448
|
-
unsigned lock_helper(MutexType1& m1,MutexType2& m2,MutexType3& m3,
|
1449
|
-
MutexType4& m4)
|
1450
|
-
{
|
1451
|
-
boost::unique_lock<MutexType1> l1(m1);
|
1452
|
-
if(unsigned const failed_lock=try_lock_internal(m2,m3,m4))
|
1453
|
-
{
|
1454
|
-
return failed_lock;
|
1455
|
-
}
|
1456
|
-
l1.release();
|
1457
|
-
return 0;
|
1458
|
-
}
|
1459
|
-
|
1460
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,
|
1461
|
-
typename MutexType4,typename MutexType5>
|
1462
|
-
unsigned lock_helper(MutexType1& m1,MutexType2& m2,MutexType3& m3,
|
1463
|
-
MutexType4& m4,MutexType5& m5)
|
1464
|
-
{
|
1465
|
-
boost::unique_lock<MutexType1> l1(m1);
|
1466
|
-
if(unsigned const failed_lock=try_lock_internal(m2,m3,m4,m5))
|
1467
|
-
{
|
1468
|
-
return failed_lock;
|
1469
|
-
}
|
1470
|
-
l1.release();
|
1471
|
-
return 0;
|
1472
|
-
}
|
1473
|
-
}
|
1474
|
-
|
1475
|
-
namespace detail
|
1476
|
-
{
|
1477
|
-
template<bool x>
|
1478
|
-
struct is_mutex_type_wrapper
|
1479
|
-
{};
|
1480
|
-
|
1481
|
-
template<typename MutexType1,typename MutexType2>
|
1482
|
-
void lock_impl(MutexType1& m1,MutexType2& m2,is_mutex_type_wrapper<true>)
|
1483
|
-
{
|
1484
|
-
unsigned const lock_count=2;
|
1485
|
-
unsigned lock_first=0;
|
1486
|
-
for(;;)
|
1487
|
-
{
|
1488
|
-
switch(lock_first)
|
1489
|
-
{
|
1490
|
-
case 0:
|
1491
|
-
lock_first=detail::lock_helper(m1,m2);
|
1492
|
-
if(!lock_first)
|
1493
|
-
return;
|
1494
|
-
break;
|
1495
|
-
case 1:
|
1496
|
-
lock_first=detail::lock_helper(m2,m1);
|
1497
|
-
if(!lock_first)
|
1498
|
-
return;
|
1499
|
-
lock_first=(lock_first+1)%lock_count;
|
1500
|
-
break;
|
1501
|
-
}
|
1502
|
-
}
|
1503
|
-
}
|
1504
|
-
|
1505
|
-
template<typename Iterator>
|
1506
|
-
void lock_impl(Iterator begin,Iterator end,is_mutex_type_wrapper<false>);
|
1507
|
-
}
|
1508
|
-
|
1509
|
-
|
1510
|
-
template<typename MutexType1,typename MutexType2>
|
1511
|
-
void lock(MutexType1& m1,MutexType2& m2)
|
1512
|
-
{
|
1513
|
-
detail::lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1514
|
-
}
|
1515
|
-
|
1516
|
-
template<typename MutexType1,typename MutexType2>
|
1517
|
-
void lock(const MutexType1& m1,MutexType2& m2)
|
1518
|
-
{
|
1519
|
-
detail::lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1520
|
-
}
|
1521
|
-
|
1522
|
-
template<typename MutexType1,typename MutexType2>
|
1523
|
-
void lock(MutexType1& m1,const MutexType2& m2)
|
1524
|
-
{
|
1525
|
-
detail::lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1526
|
-
}
|
1527
|
-
|
1528
|
-
template<typename MutexType1,typename MutexType2>
|
1529
|
-
void lock(const MutexType1& m1,const MutexType2& m2)
|
1530
|
-
{
|
1531
|
-
detail::lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1532
|
-
}
|
1533
|
-
|
1534
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3>
|
1535
|
-
void lock(MutexType1& m1,MutexType2& m2,MutexType3& m3)
|
1536
|
-
{
|
1537
|
-
unsigned const lock_count=3;
|
1538
|
-
unsigned lock_first=0;
|
1539
|
-
for(;;)
|
1540
|
-
{
|
1541
|
-
switch(lock_first)
|
1542
|
-
{
|
1543
|
-
case 0:
|
1544
|
-
lock_first=detail::lock_helper(m1,m2,m3);
|
1545
|
-
if(!lock_first)
|
1546
|
-
return;
|
1547
|
-
break;
|
1548
|
-
case 1:
|
1549
|
-
lock_first=detail::lock_helper(m2,m3,m1);
|
1550
|
-
if(!lock_first)
|
1551
|
-
return;
|
1552
|
-
lock_first=(lock_first+1)%lock_count;
|
1553
|
-
break;
|
1554
|
-
case 2:
|
1555
|
-
lock_first=detail::lock_helper(m3,m1,m2);
|
1556
|
-
if(!lock_first)
|
1557
|
-
return;
|
1558
|
-
lock_first=(lock_first+2)%lock_count;
|
1559
|
-
break;
|
1560
|
-
}
|
1561
|
-
}
|
1562
|
-
}
|
1563
|
-
|
1564
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,
|
1565
|
-
typename MutexType4>
|
1566
|
-
void lock(MutexType1& m1,MutexType2& m2,MutexType3& m3,
|
1567
|
-
MutexType4& m4)
|
1568
|
-
{
|
1569
|
-
unsigned const lock_count=4;
|
1570
|
-
unsigned lock_first=0;
|
1571
|
-
for(;;)
|
1572
|
-
{
|
1573
|
-
switch(lock_first)
|
1574
|
-
{
|
1575
|
-
case 0:
|
1576
|
-
lock_first=detail::lock_helper(m1,m2,m3,m4);
|
1577
|
-
if(!lock_first)
|
1578
|
-
return;
|
1579
|
-
break;
|
1580
|
-
case 1:
|
1581
|
-
lock_first=detail::lock_helper(m2,m3,m4,m1);
|
1582
|
-
if(!lock_first)
|
1583
|
-
return;
|
1584
|
-
lock_first=(lock_first+1)%lock_count;
|
1585
|
-
break;
|
1586
|
-
case 2:
|
1587
|
-
lock_first=detail::lock_helper(m3,m4,m1,m2);
|
1588
|
-
if(!lock_first)
|
1589
|
-
return;
|
1590
|
-
lock_first=(lock_first+2)%lock_count;
|
1591
|
-
break;
|
1592
|
-
case 3:
|
1593
|
-
lock_first=detail::lock_helper(m4,m1,m2,m3);
|
1594
|
-
if(!lock_first)
|
1595
|
-
return;
|
1596
|
-
lock_first=(lock_first+3)%lock_count;
|
1597
|
-
break;
|
1598
|
-
}
|
1599
|
-
}
|
1600
|
-
}
|
1601
|
-
|
1602
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,
|
1603
|
-
typename MutexType4,typename MutexType5>
|
1604
|
-
void lock(MutexType1& m1,MutexType2& m2,MutexType3& m3,
|
1605
|
-
MutexType4& m4,MutexType5& m5)
|
1606
|
-
{
|
1607
|
-
unsigned const lock_count=5;
|
1608
|
-
unsigned lock_first=0;
|
1609
|
-
for(;;)
|
1610
|
-
{
|
1611
|
-
switch(lock_first)
|
1612
|
-
{
|
1613
|
-
case 0:
|
1614
|
-
lock_first=detail::lock_helper(m1,m2,m3,m4,m5);
|
1615
|
-
if(!lock_first)
|
1616
|
-
return;
|
1617
|
-
break;
|
1618
|
-
case 1:
|
1619
|
-
lock_first=detail::lock_helper(m2,m3,m4,m5,m1);
|
1620
|
-
if(!lock_first)
|
1621
|
-
return;
|
1622
|
-
lock_first=(lock_first+1)%lock_count;
|
1623
|
-
break;
|
1624
|
-
case 2:
|
1625
|
-
lock_first=detail::lock_helper(m3,m4,m5,m1,m2);
|
1626
|
-
if(!lock_first)
|
1627
|
-
return;
|
1628
|
-
lock_first=(lock_first+2)%lock_count;
|
1629
|
-
break;
|
1630
|
-
case 3:
|
1631
|
-
lock_first=detail::lock_helper(m4,m5,m1,m2,m3);
|
1632
|
-
if(!lock_first)
|
1633
|
-
return;
|
1634
|
-
lock_first=(lock_first+3)%lock_count;
|
1635
|
-
break;
|
1636
|
-
case 4:
|
1637
|
-
lock_first=detail::lock_helper(m5,m1,m2,m3,m4);
|
1638
|
-
if(!lock_first)
|
1639
|
-
return;
|
1640
|
-
lock_first=(lock_first+4)%lock_count;
|
1641
|
-
break;
|
1642
|
-
}
|
1643
|
-
}
|
1644
|
-
}
|
1645
|
-
|
1646
|
-
namespace detail
|
1647
|
-
{
|
1648
|
-
template<typename Mutex,bool x=is_mutex_type<Mutex>::value>
|
1649
|
-
struct try_lock_impl_return
|
1650
|
-
{
|
1651
|
-
typedef int type;
|
1652
|
-
};
|
1653
|
-
|
1654
|
-
template<typename Iterator>
|
1655
|
-
struct try_lock_impl_return<Iterator,false>
|
1656
|
-
{
|
1657
|
-
typedef Iterator type;
|
1658
|
-
};
|
1659
|
-
|
1660
|
-
template<typename MutexType1,typename MutexType2>
|
1661
|
-
int try_lock_impl(MutexType1& m1,MutexType2& m2,is_mutex_type_wrapper<true>)
|
1662
|
-
{
|
1663
|
-
return ((int)detail::try_lock_internal(m1,m2))-1;
|
1664
|
-
}
|
1665
|
-
|
1666
|
-
template<typename Iterator>
|
1667
|
-
Iterator try_lock_impl(Iterator begin,Iterator end,is_mutex_type_wrapper<false>);
|
1668
|
-
}
|
1669
|
-
|
1670
|
-
template<typename MutexType1,typename MutexType2>
|
1671
|
-
typename detail::try_lock_impl_return<MutexType1>::type try_lock(MutexType1& m1,MutexType2& m2)
|
1672
|
-
{
|
1673
|
-
return detail::try_lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1674
|
-
}
|
1675
|
-
|
1676
|
-
template<typename MutexType1,typename MutexType2>
|
1677
|
-
typename detail::try_lock_impl_return<MutexType1>::type try_lock(const MutexType1& m1,MutexType2& m2)
|
1678
|
-
{
|
1679
|
-
return detail::try_lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1680
|
-
}
|
1681
|
-
|
1682
|
-
template<typename MutexType1,typename MutexType2>
|
1683
|
-
typename detail::try_lock_impl_return<MutexType1>::type try_lock(MutexType1& m1,const MutexType2& m2)
|
1684
|
-
{
|
1685
|
-
return detail::try_lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1686
|
-
}
|
1687
|
-
|
1688
|
-
template<typename MutexType1,typename MutexType2>
|
1689
|
-
typename detail::try_lock_impl_return<MutexType1>::type try_lock(const MutexType1& m1,const MutexType2& m2)
|
1690
|
-
{
|
1691
|
-
return detail::try_lock_impl(m1,m2,detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
|
1692
|
-
}
|
1693
|
-
|
1694
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3>
|
1695
|
-
int try_lock(MutexType1& m1,MutexType2& m2,MutexType3& m3)
|
1696
|
-
{
|
1697
|
-
return ((int)detail::try_lock_internal(m1,m2,m3))-1;
|
1698
|
-
}
|
1699
|
-
|
1700
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,typename MutexType4>
|
1701
|
-
int try_lock(MutexType1& m1,MutexType2& m2,MutexType3& m3,MutexType4& m4)
|
1702
|
-
{
|
1703
|
-
return ((int)detail::try_lock_internal(m1,m2,m3,m4))-1;
|
1704
|
-
}
|
1705
|
-
|
1706
|
-
template<typename MutexType1,typename MutexType2,typename MutexType3,typename MutexType4,typename MutexType5>
|
1707
|
-
int try_lock(MutexType1& m1,MutexType2& m2,MutexType3& m3,MutexType4& m4,MutexType5& m5)
|
1708
|
-
{
|
1709
|
-
return ((int)detail::try_lock_internal(m1,m2,m3,m4,m5))-1;
|
1710
|
-
}
|
1711
|
-
|
1712
|
-
|
1713
|
-
namespace detail
|
1714
|
-
{
|
1715
|
-
template<typename Iterator>
|
1716
|
-
struct range_lock_guard
|
1717
|
-
{
|
1718
|
-
Iterator begin;
|
1719
|
-
Iterator end;
|
1720
|
-
|
1721
|
-
range_lock_guard(Iterator begin_,Iterator end_):
|
1722
|
-
begin(begin_),end(end_)
|
1723
|
-
{
|
1724
|
-
boost::lock(begin,end);
|
1725
|
-
}
|
1726
|
-
|
1727
|
-
void release()
|
1728
|
-
{
|
1729
|
-
begin=end;
|
1730
|
-
}
|
1731
|
-
|
1732
|
-
~range_lock_guard()
|
1733
|
-
{
|
1734
|
-
for(;begin!=end;++begin)
|
1735
|
-
{
|
1736
|
-
begin->unlock();
|
1737
|
-
}
|
1738
|
-
}
|
1739
|
-
};
|
1740
|
-
|
1741
|
-
template<typename Iterator>
|
1742
|
-
Iterator try_lock_impl(Iterator begin,Iterator end,is_mutex_type_wrapper<false>)
|
1743
|
-
|
1744
|
-
{
|
1745
|
-
if(begin==end)
|
1746
|
-
{
|
1747
|
-
return end;
|
1748
|
-
}
|
1749
|
-
typedef typename std::iterator_traits<Iterator>::value_type lock_type;
|
1750
|
-
unique_lock<lock_type> guard(*begin,try_to_lock);
|
1751
|
-
|
1752
|
-
if(!guard.owns_lock())
|
1753
|
-
{
|
1754
|
-
return begin;
|
1755
|
-
}
|
1756
|
-
Iterator const failed=boost::try_lock(++begin,end);
|
1757
|
-
if(failed==end)
|
1758
|
-
{
|
1759
|
-
guard.release();
|
1760
|
-
}
|
1761
|
-
|
1762
|
-
return failed;
|
1763
|
-
}
|
1764
|
-
}
|
1765
|
-
|
1766
|
-
|
1767
|
-
namespace detail
|
1768
|
-
{
|
1769
|
-
template<typename Iterator>
|
1770
|
-
void lock_impl(Iterator begin,Iterator end,is_mutex_type_wrapper<false>)
|
1771
|
-
{
|
1772
|
-
typedef typename std::iterator_traits<Iterator>::value_type lock_type;
|
1773
|
-
|
1774
|
-
if(begin==end)
|
1775
|
-
{
|
1776
|
-
return;
|
1777
|
-
}
|
1778
|
-
bool start_with_begin=true;
|
1779
|
-
Iterator second=begin;
|
1780
|
-
++second;
|
1781
|
-
Iterator next=second;
|
1782
|
-
|
1783
|
-
for(;;)
|
1784
|
-
{
|
1785
|
-
unique_lock<lock_type> begin_lock(*begin,defer_lock);
|
1786
|
-
if(start_with_begin)
|
1787
|
-
{
|
1788
|
-
begin_lock.lock();
|
1789
|
-
Iterator const failed_lock=boost::try_lock(next,end);
|
1790
|
-
if(failed_lock==end)
|
1791
|
-
{
|
1792
|
-
begin_lock.release();
|
1793
|
-
return;
|
1794
|
-
}
|
1795
|
-
start_with_begin=false;
|
1796
|
-
next=failed_lock;
|
1797
|
-
}
|
1798
|
-
else
|
1799
|
-
{
|
1800
|
-
detail::range_lock_guard<Iterator> guard(next,end);
|
1801
|
-
if(begin_lock.try_lock())
|
1802
|
-
{
|
1803
|
-
Iterator const failed_lock=boost::try_lock(second,next);
|
1804
|
-
if(failed_lock==next)
|
1805
|
-
{
|
1806
|
-
begin_lock.release();
|
1807
|
-
guard.release();
|
1808
|
-
return;
|
1809
|
-
}
|
1810
|
-
start_with_begin=false;
|
1811
|
-
next=failed_lock;
|
1812
|
-
}
|
1813
|
-
else
|
1814
|
-
{
|
1815
|
-
start_with_begin=true;
|
1816
|
-
next=second;
|
1817
|
-
}
|
1818
|
-
}
|
1819
|
-
}
|
1820
|
-
}
|
1821
|
-
|
1822
|
-
}
|
1823
9
|
|
1824
|
-
|
1825
|
-
#include <boost/
|
10
|
+
#include <boost/thread/lock_algorithms.hpp>
|
11
|
+
#include <boost/thread/lock_types.hpp>
|
12
|
+
#include <boost/thread/lock_guard.hpp>
|
13
|
+
#include <boost/thread/lockable_traits.hpp>
|
14
|
+
#include <boost/thread/lock_options.hpp>
|
1826
15
|
|
1827
16
|
#endif
|