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.

Files changed (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -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/config/abi_suffix.hpp>
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