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
@@ -0,0 +1,313 @@
1
+ #ifndef BOOST_THREAD_PTHREAD_ONCE_ATOMIC_HPP
2
+ #define BOOST_THREAD_PTHREAD_ONCE_ATOMIC_HPP
3
+
4
+ // once.hpp
5
+ //
6
+ // (C) Copyright 2013 Andrey Semashev
7
+ // (C) Copyright 2013 Vicente J. Botet Escriba
8
+ //
9
+ // Distributed under the Boost Software License, Version 1.0. (See
10
+ // accompanying file LICENSE_1_0.txt or copy at
11
+ // http://www.boost.org/LICENSE_1_0.txt)
12
+
13
+ #include <boost/thread/detail/config.hpp>
14
+
15
+ #include <boost/cstdint.hpp>
16
+ #include <boost/thread/detail/move.hpp>
17
+ #include <boost/thread/detail/invoke.hpp>
18
+ #include <boost/detail/no_exceptions_support.hpp>
19
+ #include <boost/bind.hpp>
20
+ #include <boost/atomic.hpp>
21
+
22
+ #include <boost/config/abi_prefix.hpp>
23
+
24
+ namespace boost
25
+ {
26
+
27
+ struct once_flag;
28
+
29
+ namespace thread_detail
30
+ {
31
+
32
+ #if BOOST_ATOMIC_INT_LOCK_FREE == 2
33
+ typedef unsigned int atomic_int_type;
34
+ #elif BOOST_ATOMIC_SHORT_LOCK_FREE == 2
35
+ typedef unsigned short atomic_int_type;
36
+ #elif BOOST_ATOMIC_CHAR_LOCK_FREE == 2
37
+ typedef unsigned char atomic_int_type;
38
+ #elif BOOST_ATOMIC_LONG_LOCK_FREE == 2
39
+ typedef unsigned long atomic_int_type;
40
+ #elif defined(BOOST_HAS_LONG_LONG) && BOOST_ATOMIC_LLONG_LOCK_FREE == 2
41
+ typedef ulong_long_type atomic_int_type;
42
+ #else
43
+ // All tested integer types are not atomic, the spinlock pool will be used
44
+ typedef unsigned int atomic_int_type;
45
+ #endif
46
+
47
+ typedef boost::atomic<atomic_int_type> atomic_type;
48
+
49
+ BOOST_THREAD_DECL bool enter_once_region(once_flag& flag) BOOST_NOEXCEPT;
50
+ BOOST_THREAD_DECL void commit_once_region(once_flag& flag) BOOST_NOEXCEPT;
51
+ BOOST_THREAD_DECL void rollback_once_region(once_flag& flag) BOOST_NOEXCEPT;
52
+ inline atomic_type& get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT;
53
+ }
54
+
55
+ #ifdef BOOST_THREAD_PROVIDES_ONCE_CXX11
56
+
57
+ struct once_flag
58
+ {
59
+ BOOST_THREAD_NO_COPYABLE(once_flag)
60
+ BOOST_CONSTEXPR once_flag() BOOST_NOEXCEPT : storage(0)
61
+ {
62
+ }
63
+
64
+ private:
65
+ thread_detail::atomic_type storage;
66
+
67
+ friend BOOST_THREAD_DECL bool thread_detail::enter_once_region(once_flag& flag) BOOST_NOEXCEPT;
68
+ friend BOOST_THREAD_DECL void thread_detail::commit_once_region(once_flag& flag) BOOST_NOEXCEPT;
69
+ friend BOOST_THREAD_DECL void thread_detail::rollback_once_region(once_flag& flag) BOOST_NOEXCEPT;
70
+ friend thread_detail::atomic_type& thread_detail::get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT;
71
+ };
72
+
73
+ #define BOOST_ONCE_INIT boost::once_flag()
74
+
75
+ namespace thread_detail
76
+ {
77
+ inline atomic_type& get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT
78
+ {
79
+ //return reinterpret_cast< atomic_type& >(flag.storage);
80
+ return flag.storage;
81
+ }
82
+ }
83
+
84
+ #else // BOOST_THREAD_PROVIDES_ONCE_CXX11
85
+ struct once_flag
86
+ {
87
+ // The thread_detail::atomic_int_type storage is marked
88
+ // with this attribute in order to let the compiler know that it will alias this member
89
+ // and silence compilation warnings.
90
+ BOOST_THREAD_ATTRIBUTE_MAY_ALIAS thread_detail::atomic_int_type storage;
91
+ };
92
+
93
+ #define BOOST_ONCE_INIT {0}
94
+
95
+ namespace thread_detail
96
+ {
97
+ inline atomic_type& get_atomic_storage(once_flag& flag) BOOST_NOEXCEPT
98
+ {
99
+ return reinterpret_cast< atomic_type& >(flag.storage);
100
+ }
101
+
102
+ }
103
+
104
+ #endif // BOOST_THREAD_PROVIDES_ONCE_CXX11
105
+
106
+ #if defined BOOST_THREAD_PROVIDES_INVOKE
107
+ #define BOOST_THREAD_INVOKE_RET_VOID detail::invoke
108
+ #define BOOST_THREAD_INVOKE_RET_VOID_CALL
109
+ #elif defined BOOST_THREAD_PROVIDES_INVOKE_RET
110
+ #define BOOST_THREAD_INVOKE_RET_VOID detail::invoke<void>
111
+ #define BOOST_THREAD_INVOKE_RET_VOID_CALL
112
+ #else
113
+ #define BOOST_THREAD_INVOKE_RET_VOID boost::bind
114
+ #define BOOST_THREAD_INVOKE_RET_VOID_CALL ()
115
+ #endif
116
+
117
+
118
+ #ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES
119
+
120
+ template<typename Function, class ...ArgTypes>
121
+ inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(ArgTypes)... args)
122
+ {
123
+ if (thread_detail::enter_once_region(flag))
124
+ {
125
+ BOOST_TRY
126
+ {
127
+ BOOST_THREAD_INVOKE_RET_VOID(
128
+ thread_detail::decay_copy(boost::forward<Function>(f)),
129
+ thread_detail::decay_copy(boost::forward<ArgTypes>(args))...
130
+ ) BOOST_THREAD_INVOKE_RET_VOID_CALL;
131
+ }
132
+ BOOST_CATCH (...)
133
+ {
134
+ thread_detail::rollback_once_region(flag);
135
+ BOOST_RETHROW
136
+ }
137
+ BOOST_CATCH_END
138
+ thread_detail::commit_once_region(flag);
139
+ }
140
+ }
141
+ #else
142
+ template<typename Function>
143
+ inline void call_once(once_flag& flag, Function f)
144
+ {
145
+ if (thread_detail::enter_once_region(flag))
146
+ {
147
+ BOOST_TRY
148
+ {
149
+ f();
150
+ }
151
+ BOOST_CATCH (...)
152
+ {
153
+ thread_detail::rollback_once_region(flag);
154
+ BOOST_RETHROW
155
+ }
156
+ BOOST_CATCH_END
157
+ thread_detail::commit_once_region(flag);
158
+ }
159
+ }
160
+
161
+ template<typename Function, typename T1>
162
+ inline void call_once(once_flag& flag, Function f, T1 p1)
163
+ {
164
+ if (thread_detail::enter_once_region(flag))
165
+ {
166
+ BOOST_TRY
167
+ {
168
+ BOOST_THREAD_INVOKE_RET_VOID(f, p1) BOOST_THREAD_INVOKE_RET_VOID_CALL;
169
+ }
170
+ BOOST_CATCH (...)
171
+ {
172
+ thread_detail::rollback_once_region(flag);
173
+ BOOST_RETHROW
174
+ }
175
+ BOOST_CATCH_END
176
+ thread_detail::commit_once_region(flag);
177
+ }
178
+ }
179
+
180
+ template<typename Function, typename T1, typename T2>
181
+ inline void call_once(once_flag& flag, Function f, T1 p1, T2 p2)
182
+ {
183
+ if (thread_detail::enter_once_region(flag))
184
+ {
185
+ BOOST_TRY
186
+ {
187
+ BOOST_THREAD_INVOKE_RET_VOID(f, p1, p2) BOOST_THREAD_INVOKE_RET_VOID_CALL;
188
+ }
189
+ BOOST_CATCH (...)
190
+ {
191
+ thread_detail::rollback_once_region(flag);
192
+ BOOST_RETHROW
193
+ }
194
+ BOOST_CATCH_END
195
+ thread_detail::commit_once_region(flag);
196
+ }
197
+ }
198
+
199
+ template<typename Function, typename T1, typename T2, typename T3>
200
+ inline void call_once(once_flag& flag, Function f, T1 p1, T2 p2, T3 p3)
201
+ {
202
+ if (thread_detail::enter_once_region(flag))
203
+ {
204
+ BOOST_TRY
205
+ {
206
+ BOOST_THREAD_INVOKE_RET_VOID(f, p1, p2, p3) BOOST_THREAD_INVOKE_RET_VOID_CALL;
207
+ }
208
+ BOOST_CATCH (...)
209
+ {
210
+ thread_detail::rollback_once_region(flag);
211
+ BOOST_RETHROW
212
+ }
213
+ BOOST_CATCH_END
214
+ thread_detail::commit_once_region(flag);
215
+ }
216
+ }
217
+
218
+ template<typename Function>
219
+ inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f)
220
+ {
221
+ if (thread_detail::enter_once_region(flag))
222
+ {
223
+ BOOST_TRY
224
+ {
225
+ f();
226
+ }
227
+ BOOST_CATCH (...)
228
+ {
229
+ thread_detail::rollback_once_region(flag);
230
+ BOOST_RETHROW
231
+ }
232
+ BOOST_CATCH_END
233
+ thread_detail::commit_once_region(flag);
234
+ }
235
+ }
236
+
237
+ template<typename Function, typename T1>
238
+ inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(T1) p1)
239
+ {
240
+ if (thread_detail::enter_once_region(flag))
241
+ {
242
+ BOOST_TRY
243
+ {
244
+ BOOST_THREAD_INVOKE_RET_VOID(
245
+ thread_detail::decay_copy(boost::forward<Function>(f)),
246
+ thread_detail::decay_copy(boost::forward<T1>(p1))
247
+ ) BOOST_THREAD_INVOKE_RET_VOID_CALL;
248
+ }
249
+ BOOST_CATCH (...)
250
+ {
251
+ thread_detail::rollback_once_region(flag);
252
+ BOOST_RETHROW
253
+ }
254
+ BOOST_CATCH_END
255
+ thread_detail::commit_once_region(flag);
256
+ }
257
+ }
258
+ template<typename Function, typename T1, typename T2>
259
+ inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(T1) p1, BOOST_THREAD_RV_REF(T2) p2)
260
+ {
261
+ if (thread_detail::enter_once_region(flag))
262
+ {
263
+ BOOST_TRY
264
+ {
265
+ BOOST_THREAD_INVOKE_RET_VOID(
266
+ thread_detail::decay_copy(boost::forward<Function>(f)),
267
+ thread_detail::decay_copy(boost::forward<T1>(p1)),
268
+ thread_detail::decay_copy(boost::forward<T1>(p2))
269
+ ) BOOST_THREAD_INVOKE_RET_VOID_CALL;
270
+ }
271
+ BOOST_CATCH (...)
272
+ {
273
+ thread_detail::rollback_once_region(flag);
274
+ BOOST_RETHROW
275
+ }
276
+ BOOST_CATCH_END
277
+ thread_detail::commit_once_region(flag);
278
+ }
279
+ }
280
+ template<typename Function, typename T1, typename T2, typename T3>
281
+ inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f, BOOST_THREAD_RV_REF(T1) p1, BOOST_THREAD_RV_REF(T2) p2, BOOST_THREAD_RV_REF(T3) p3)
282
+ {
283
+ if (thread_detail::enter_once_region(flag))
284
+ {
285
+ BOOST_TRY
286
+ {
287
+ BOOST_THREAD_INVOKE_RET_VOID(
288
+ thread_detail::decay_copy(boost::forward<Function>(f)),
289
+ thread_detail::decay_copy(boost::forward<T1>(p1)),
290
+ thread_detail::decay_copy(boost::forward<T1>(p2)),
291
+ thread_detail::decay_copy(boost::forward<T1>(p3))
292
+ ) BOOST_THREAD_INVOKE_RET_VOID_CALL;
293
+
294
+ }
295
+ BOOST_CATCH (...)
296
+ {
297
+ thread_detail::rollback_once_region(flag);
298
+ BOOST_RETHROW
299
+ }
300
+ BOOST_CATCH_END
301
+ thread_detail::commit_once_region(flag);
302
+ }
303
+ }
304
+
305
+
306
+
307
+ #endif
308
+ }
309
+
310
+ #include <boost/config/abi_suffix.hpp>
311
+
312
+ #endif
313
+
@@ -9,7 +9,9 @@
9
9
  #include <pthread.h>
10
10
  #include <boost/throw_exception.hpp>
11
11
  #include <boost/thread/exceptions.hpp>
12
- #include <boost/thread/locks.hpp>
12
+ #if defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
13
+ #include <boost/thread/lock_types.hpp>
14
+ #endif
13
15
  #include <boost/thread/thread_time.hpp>
14
16
  #include <boost/assert.hpp>
15
17
  #ifndef _WIN32
@@ -26,10 +28,13 @@
26
28
  #include <boost/thread/detail/delete.hpp>
27
29
 
28
30
  #ifdef _POSIX_TIMEOUTS
29
- #if _POSIX_TIMEOUTS >= 0
31
+ #if _POSIX_TIMEOUTS >= 0 && _POSIX_TIMEOUTS>=200112L
32
+ #ifndef BOOST_PTHREAD_HAS_TIMEDLOCK
30
33
  #define BOOST_PTHREAD_HAS_TIMEDLOCK
31
34
  #endif
32
35
  #endif
36
+ #endif
37
+
33
38
 
34
39
  #if defined(BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE) && defined(BOOST_PTHREAD_HAS_TIMEDLOCK)
35
40
  #define BOOST_USE_PTHREAD_RECURSIVE_TIMEDLOCK
@@ -167,8 +172,10 @@ namespace boost
167
172
 
168
173
  #endif
169
174
 
175
+ #if defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
170
176
  typedef unique_lock<recursive_mutex> scoped_lock;
171
177
  typedef detail::try_lock_wrapper<recursive_mutex> scoped_try_lock;
178
+ #endif
172
179
  };
173
180
 
174
181
  typedef recursive_mutex recursive_try_mutex;
@@ -232,11 +239,13 @@ namespace boost
232
239
  #endif
233
240
  }
234
241
 
242
+ #if defined BOOST_THREAD_USES_DATETIME
235
243
  template<typename TimeDuration>
236
244
  bool timed_lock(TimeDuration const & relative_time)
237
245
  {
238
246
  return timed_lock(get_system_time()+relative_time);
239
247
  }
248
+ #endif
240
249
 
241
250
  #ifdef BOOST_USE_PTHREAD_RECURSIVE_TIMEDLOCK
242
251
  void lock()
@@ -334,12 +343,13 @@ namespace boost
334
343
 
335
344
  #endif
336
345
 
346
+ #if defined BOOST_THREAD_USES_DATETIME
337
347
  bool timed_lock(system_time const & abs_time)
338
348
  {
339
- struct timespec const ts=detail::get_timespec(abs_time);
349
+ struct timespec const ts=detail::to_timespec(abs_time);
340
350
  return do_try_lock_until(ts);
341
351
  }
342
-
352
+ #endif
343
353
  #ifdef BOOST_THREAD_USES_CHRONO
344
354
  template <class Rep, class Period>
345
355
  bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
@@ -363,12 +373,9 @@ namespace boost
363
373
  }
364
374
  bool try_lock_until(const chrono::time_point<chrono::system_clock, chrono::nanoseconds>& tp)
365
375
  {
366
- using namespace chrono;
367
- nanoseconds d = tp.time_since_epoch();
368
- timespec ts;
369
- seconds s = duration_cast<seconds>(d);
370
- ts.tv_sec = static_cast<long>(s.count());
371
- ts.tv_nsec = static_cast<long>((d - s).count());
376
+ //using namespace chrono;
377
+ chrono::nanoseconds d = tp.time_since_epoch();
378
+ timespec ts = boost::detail::to_timespec(d);
372
379
  return do_try_lock_until(ts);
373
380
  }
374
381
  #endif
@@ -380,9 +387,11 @@ namespace boost
380
387
  return &m;
381
388
  }
382
389
 
390
+ #if defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
383
391
  typedef unique_lock<recursive_timed_mutex> scoped_timed_lock;
384
392
  typedef detail::try_lock_wrapper<recursive_timed_mutex> scoped_try_lock;
385
393
  typedef scoped_timed_lock scoped_lock;
394
+ #endif
386
395
  };
387
396
 
388
397
  }
@@ -12,12 +12,15 @@
12
12
  #include <boost/static_assert.hpp>
13
13
  #include <boost/thread/mutex.hpp>
14
14
  #include <boost/thread/condition_variable.hpp>
15
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
15
16
  #include <boost/thread/detail/thread_interruption.hpp>
17
+ #endif
16
18
  #ifdef BOOST_THREAD_USES_CHRONO
17
19
  #include <boost/chrono/system_clocks.hpp>
18
20
  #include <boost/chrono/ceil.hpp>
19
21
  #endif
20
22
  #include <boost/thread/detail/delete.hpp>
23
+ #include <boost/assert.hpp>
21
24
 
22
25
  #include <boost/config/abi_prefix.hpp>
23
26
 
@@ -26,8 +29,125 @@ namespace boost
26
29
  class shared_mutex
27
30
  {
28
31
  private:
29
- struct state_data
32
+ class state_data
30
33
  {
34
+ public:
35
+ state_data () :
36
+ shared_count(0),
37
+ exclusive(false),
38
+ upgrade(false),
39
+ exclusive_waiting_blocked(false)
40
+ {}
41
+
42
+ void assert_free() const
43
+ {
44
+ BOOST_ASSERT( ! exclusive );
45
+ BOOST_ASSERT( ! upgrade );
46
+ BOOST_ASSERT( shared_count==0 );
47
+ }
48
+
49
+ void assert_locked() const
50
+ {
51
+ BOOST_ASSERT( exclusive );
52
+ BOOST_ASSERT( shared_count==0 );
53
+ BOOST_ASSERT( ! upgrade );
54
+ }
55
+
56
+ void assert_lock_shared () const
57
+ {
58
+ BOOST_ASSERT( ! exclusive );
59
+ BOOST_ASSERT( shared_count>0 );
60
+ //BOOST_ASSERT( (! upgrade) || (shared_count>1));
61
+ // if upgraded there are at least 2 threads sharing the mutex,
62
+ // except when unlock_upgrade_and_lock has decreased the number of readers but has not taken yet exclusive ownership.
63
+ }
64
+
65
+ void assert_lock_upgraded () const
66
+ {
67
+ BOOST_ASSERT( ! exclusive );
68
+ BOOST_ASSERT( upgrade );
69
+ BOOST_ASSERT( shared_count>0 );
70
+ }
71
+
72
+ void assert_lock_not_upgraded () const
73
+ {
74
+ BOOST_ASSERT( ! upgrade );
75
+ }
76
+
77
+ bool can_lock () const
78
+ {
79
+ return ! (shared_count || exclusive);
80
+ }
81
+
82
+ void exclusive_blocked (bool blocked)
83
+ {
84
+ exclusive_waiting_blocked = blocked;
85
+ }
86
+
87
+ void lock ()
88
+ {
89
+ exclusive = true;
90
+ }
91
+
92
+ void unlock ()
93
+ {
94
+ exclusive = false;
95
+ exclusive_waiting_blocked = false;
96
+ }
97
+
98
+ bool can_lock_shared () const
99
+ {
100
+ return ! (exclusive || exclusive_waiting_blocked);
101
+ }
102
+
103
+ bool more_shared () const
104
+ {
105
+ return shared_count > 0 ;
106
+ }
107
+ unsigned get_shared_count () const
108
+ {
109
+ return shared_count ;
110
+ }
111
+ unsigned lock_shared ()
112
+ {
113
+ return ++shared_count;
114
+ }
115
+
116
+
117
+ void unlock_shared ()
118
+ {
119
+ --shared_count;
120
+ }
121
+
122
+ bool unlock_shared_downgrades()
123
+ {
124
+ if (upgrade) {
125
+ upgrade=false;
126
+ exclusive=true;
127
+ return true;
128
+ } else {
129
+ exclusive_waiting_blocked=false;
130
+ return false;
131
+ }
132
+ }
133
+
134
+ void lock_upgrade ()
135
+ {
136
+ ++shared_count;
137
+ upgrade=true;
138
+ }
139
+ bool can_lock_upgrade () const
140
+ {
141
+ return ! (exclusive || exclusive_waiting_blocked || upgrade);
142
+ }
143
+
144
+ void unlock_upgrade ()
145
+ {
146
+ upgrade=false;
147
+ --shared_count;
148
+ }
149
+
150
+ //private:
31
151
  unsigned shared_count;
32
152
  bool exclusive;
33
153
  bool upgrade;
@@ -49,12 +169,11 @@ namespace boost
49
169
  }
50
170
 
51
171
  public:
172
+
52
173
  BOOST_THREAD_NO_COPYABLE(shared_mutex)
53
174
 
54
175
  shared_mutex()
55
176
  {
56
- state_data state_={0,0,0,0};
57
- state=state_;
58
177
  }
59
178
 
60
179
  ~shared_mutex()
@@ -63,44 +182,45 @@ namespace boost
63
182
 
64
183
  void lock_shared()
65
184
  {
185
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
66
186
  boost::this_thread::disable_interruption do_not_disturb;
67
- boost::mutex::scoped_lock lk(state_change);
68
-
69
- while(state.exclusive || state.exclusive_waiting_blocked)
187
+ #endif
188
+ boost::unique_lock<boost::mutex> lk(state_change);
189
+ while(!state.can_lock_shared())
70
190
  {
71
191
  shared_cond.wait(lk);
72
192
  }
73
- ++state.shared_count;
193
+ state.lock_shared();
74
194
  }
75
195
 
76
196
  bool try_lock_shared()
77
197
  {
78
- boost::mutex::scoped_lock lk(state_change);
198
+ boost::unique_lock<boost::mutex> lk(state_change);
79
199
 
80
- if(state.exclusive || state.exclusive_waiting_blocked)
200
+ if(!state.can_lock_shared())
81
201
  {
82
202
  return false;
83
203
  }
84
- else
85
- {
86
- ++state.shared_count;
87
- return true;
88
- }
204
+ state.lock_shared();
205
+ return true;
89
206
  }
90
207
 
208
+ #if defined BOOST_THREAD_USES_DATETIME
91
209
  bool timed_lock_shared(system_time const& timeout)
92
210
  {
211
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
93
212
  boost::this_thread::disable_interruption do_not_disturb;
94
- boost::mutex::scoped_lock lk(state_change);
213
+ #endif
214
+ boost::unique_lock<boost::mutex> lk(state_change);
95
215
 
96
- while(state.exclusive || state.exclusive_waiting_blocked)
216
+ while(!state.can_lock_shared())
97
217
  {
98
218
  if(!shared_cond.timed_wait(lk,timeout))
99
219
  {
100
220
  return false;
101
221
  }
102
222
  }
103
- ++state.shared_count;
223
+ state.lock_shared();
104
224
  return true;
105
225
  }
106
226
 
@@ -109,6 +229,7 @@ namespace boost
109
229
  {
110
230
  return timed_lock_shared(get_system_time()+relative_time);
111
231
  }
232
+ #endif
112
233
  #ifdef BOOST_THREAD_USES_CHRONO
113
234
  template <class Rep, class Period>
114
235
  bool try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time)
@@ -118,36 +239,43 @@ namespace boost
118
239
  template <class Clock, class Duration>
119
240
  bool try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time)
120
241
  {
242
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
121
243
  boost::this_thread::disable_interruption do_not_disturb;
122
- boost::mutex::scoped_lock lk(state_change);
244
+ #endif
245
+ boost::unique_lock<boost::mutex> lk(state_change);
123
246
 
124
- while(state.exclusive || state.exclusive_waiting_blocked)
247
+ while(!state.can_lock_shared())
248
+ //while(state.exclusive || state.exclusive_waiting_blocked)
125
249
  {
126
250
  if(cv_status::timeout==shared_cond.wait_until(lk,abs_time))
127
251
  {
128
252
  return false;
129
253
  }
130
254
  }
131
- ++state.shared_count;
255
+ state.lock_shared();
132
256
  return true;
133
257
  }
134
258
  #endif
135
259
  void unlock_shared()
136
260
  {
137
- boost::mutex::scoped_lock lk(state_change);
138
- bool const last_reader=!--state.shared_count;
139
-
140
- if(last_reader)
261
+ boost::unique_lock<boost::mutex> lk(state_change);
262
+ state.assert_lock_shared();
263
+ state.unlock_shared();
264
+ if (! state.more_shared())
141
265
  {
142
- if(state.upgrade)
266
+ if (state.upgrade)
143
267
  {
268
+ // As there is a thread doing a unlock_upgrade_and_lock that is waiting for ! state.more_shared()
269
+ // avoid other threads to lock, lock_upgrade or lock_shared, so only this thread is notified.
144
270
  state.upgrade=false;
145
271
  state.exclusive=true;
272
+ lk.unlock();
146
273
  upgrade_cond.notify_one();
147
274
  }
148
275
  else
149
276
  {
150
277
  state.exclusive_waiting_blocked=false;
278
+ lk.unlock();
151
279
  }
152
280
  release_waiters();
153
281
  }
@@ -155,10 +283,12 @@ namespace boost
155
283
 
156
284
  void lock()
157
285
  {
286
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
158
287
  boost::this_thread::disable_interruption do_not_disturb;
159
- boost::mutex::scoped_lock lk(state_change);
288
+ #endif
289
+ boost::unique_lock<boost::mutex> lk(state_change);
160
290
 
161
- while(state.shared_count || state.exclusive)
291
+ while (state.shared_count || state.exclusive)
162
292
  {
163
293
  state.exclusive_waiting_blocked=true;
164
294
  exclusive_cond.wait(lk);
@@ -166,10 +296,13 @@ namespace boost
166
296
  state.exclusive=true;
167
297
  }
168
298
 
299
+ #if defined BOOST_THREAD_USES_DATETIME
169
300
  bool timed_lock(system_time const& timeout)
170
301
  {
302
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
171
303
  boost::this_thread::disable_interruption do_not_disturb;
172
- boost::mutex::scoped_lock lk(state_change);
304
+ #endif
305
+ boost::unique_lock<boost::mutex> lk(state_change);
173
306
 
174
307
  while(state.shared_count || state.exclusive)
175
308
  {
@@ -194,7 +327,7 @@ namespace boost
194
327
  {
195
328
  return timed_lock(get_system_time()+relative_time);
196
329
  }
197
-
330
+ #endif
198
331
  #ifdef BOOST_THREAD_USES_CHRONO
199
332
  template <class Rep, class Period>
200
333
  bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
@@ -204,8 +337,10 @@ namespace boost
204
337
  template <class Clock, class Duration>
205
338
  bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
206
339
  {
340
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
207
341
  boost::this_thread::disable_interruption do_not_disturb;
208
- boost::mutex::scoped_lock lk(state_change);
342
+ #endif
343
+ boost::unique_lock<boost::mutex> lk(state_change);
209
344
 
210
345
  while(state.shared_count || state.exclusive)
211
346
  {
@@ -228,7 +363,7 @@ namespace boost
228
363
 
229
364
  bool try_lock()
230
365
  {
231
- boost::mutex::scoped_lock lk(state_change);
366
+ boost::unique_lock<boost::mutex> lk(state_change);
232
367
 
233
368
  if(state.shared_count || state.exclusive)
234
369
  {
@@ -244,28 +379,35 @@ namespace boost
244
379
 
245
380
  void unlock()
246
381
  {
247
- boost::mutex::scoped_lock lk(state_change);
382
+ boost::unique_lock<boost::mutex> lk(state_change);
383
+ state.assert_locked();
248
384
  state.exclusive=false;
249
385
  state.exclusive_waiting_blocked=false;
386
+ state.assert_free();
250
387
  release_waiters();
251
388
  }
252
389
 
253
390
  void lock_upgrade()
254
391
  {
392
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
255
393
  boost::this_thread::disable_interruption do_not_disturb;
256
- boost::mutex::scoped_lock lk(state_change);
394
+ #endif
395
+ boost::unique_lock<boost::mutex> lk(state_change);
257
396
  while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
258
397
  {
259
398
  shared_cond.wait(lk);
260
399
  }
261
- ++state.shared_count;
400
+ state.lock_shared();
262
401
  state.upgrade=true;
263
402
  }
264
403
 
404
+ #if defined BOOST_THREAD_USES_DATETIME
265
405
  bool timed_lock_upgrade(system_time const& timeout)
266
406
  {
407
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
267
408
  boost::this_thread::disable_interruption do_not_disturb;
268
- boost::mutex::scoped_lock lk(state_change);
409
+ #endif
410
+ boost::unique_lock<boost::mutex> lk(state_change);
269
411
  while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
270
412
  {
271
413
  if(!shared_cond.timed_wait(lk,timeout))
@@ -277,7 +419,7 @@ namespace boost
277
419
  break;
278
420
  }
279
421
  }
280
- ++state.shared_count;
422
+ state.lock_shared();
281
423
  state.upgrade=true;
282
424
  return true;
283
425
  }
@@ -287,7 +429,7 @@ namespace boost
287
429
  {
288
430
  return timed_lock_upgrade(get_system_time()+relative_time);
289
431
  }
290
-
432
+ #endif
291
433
  #ifdef BOOST_THREAD_USES_CHRONO
292
434
  template <class Rep, class Period>
293
435
  bool try_lock_upgrade_for(const chrono::duration<Rep, Period>& rel_time)
@@ -297,8 +439,10 @@ namespace boost
297
439
  template <class Clock, class Duration>
298
440
  bool try_lock_upgrade_until(const chrono::time_point<Clock, Duration>& abs_time)
299
441
  {
442
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
300
443
  boost::this_thread::disable_interruption do_not_disturb;
301
- boost::mutex::scoped_lock lk(state_change);
444
+ #endif
445
+ boost::unique_lock<boost::mutex> lk(state_change);
302
446
  while(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
303
447
  {
304
448
  if(cv_status::timeout == shared_cond.wait_until(lk,abs_time))
@@ -310,68 +454,75 @@ namespace boost
310
454
  break;
311
455
  }
312
456
  }
313
- ++state.shared_count;
457
+ state.lock_shared();
314
458
  state.upgrade=true;
315
459
  return true;
316
460
  }
317
461
  #endif
318
462
  bool try_lock_upgrade()
319
463
  {
320
- boost::mutex::scoped_lock lk(state_change);
464
+ boost::unique_lock<boost::mutex> lk(state_change);
321
465
  if(state.exclusive || state.exclusive_waiting_blocked || state.upgrade)
322
466
  {
323
467
  return false;
324
468
  }
325
469
  else
326
470
  {
327
- ++state.shared_count;
471
+ state.lock_shared();
328
472
  state.upgrade=true;
473
+ state.assert_lock_upgraded();
329
474
  return true;
330
475
  }
331
476
  }
332
477
 
333
478
  void unlock_upgrade()
334
479
  {
335
- boost::mutex::scoped_lock lk(state_change);
336
- state.upgrade=false;
337
- bool const last_reader=!--state.shared_count;
338
-
339
- if(last_reader)
480
+ boost::unique_lock<boost::mutex> lk(state_change);
481
+ //state.upgrade=false;
482
+ state.unlock_upgrade();
483
+ if(! state.more_shared() )
340
484
  {
341
485
  state.exclusive_waiting_blocked=false;
342
486
  release_waiters();
343
487
  } else {
344
- shared_cond.notify_all();
488
+ shared_cond.notify_all();
345
489
  }
346
490
  }
347
491
 
348
492
  // Upgrade <-> Exclusive
349
493
  void unlock_upgrade_and_lock()
350
494
  {
495
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
351
496
  boost::this_thread::disable_interruption do_not_disturb;
352
- boost::mutex::scoped_lock lk(state_change);
353
- --state.shared_count;
354
- while(state.shared_count)
497
+ #endif
498
+ boost::unique_lock<boost::mutex> lk(state_change);
499
+ state.assert_lock_upgraded();
500
+ state.unlock_shared();
501
+ while (state.more_shared())
355
502
  {
356
503
  upgrade_cond.wait(lk);
357
504
  }
358
505
  state.upgrade=false;
359
506
  state.exclusive=true;
507
+ state.assert_locked();
360
508
  }
361
509
 
362
510
  void unlock_and_lock_upgrade()
363
511
  {
364
- boost::mutex::scoped_lock lk(state_change);
512
+ boost::unique_lock<boost::mutex> lk(state_change);
513
+ state.assert_locked();
365
514
  state.exclusive=false;
366
515
  state.upgrade=true;
367
- ++state.shared_count;
516
+ state.lock_shared();
368
517
  state.exclusive_waiting_blocked=false;
518
+ state.assert_lock_upgraded();
369
519
  release_waiters();
370
520
  }
371
521
 
372
522
  bool try_unlock_upgrade_and_lock()
373
523
  {
374
- boost::mutex::scoped_lock lk(state_change);
524
+ boost::unique_lock<boost::mutex> lk(state_change);
525
+ state.assert_lock_upgraded();
375
526
  if( !state.exclusive
376
527
  && !state.exclusive_waiting_blocked
377
528
  && state.upgrade
@@ -380,6 +531,7 @@ namespace boost
380
531
  state.shared_count=0;
381
532
  state.exclusive=true;
382
533
  state.upgrade=false;
534
+ state.assert_locked();
383
535
  return true;
384
536
  }
385
537
  return false;
@@ -398,8 +550,11 @@ namespace boost
398
550
  try_unlock_upgrade_and_lock_until(
399
551
  const chrono::time_point<Clock, Duration>& abs_time)
400
552
  {
553
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
401
554
  boost::this_thread::disable_interruption do_not_disturb;
402
- boost::mutex::scoped_lock lk(state_change);
555
+ #endif
556
+ boost::unique_lock<boost::mutex> lk(state_change);
557
+ state.assert_lock_upgraded();
403
558
  if (state.shared_count != 1)
404
559
  {
405
560
  for (;;)
@@ -422,9 +577,10 @@ namespace boost
422
577
  // Shared <-> Exclusive
423
578
  void unlock_and_lock_shared()
424
579
  {
425
- boost::mutex::scoped_lock lk(state_change);
580
+ boost::unique_lock<boost::mutex> lk(state_change);
581
+ state.assert_locked();
426
582
  state.exclusive=false;
427
- ++state.shared_count;
583
+ state.lock_shared();
428
584
  state.exclusive_waiting_blocked=false;
429
585
  release_waiters();
430
586
  }
@@ -432,7 +588,8 @@ namespace boost
432
588
  #ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
433
589
  bool try_unlock_shared_and_lock()
434
590
  {
435
- boost::mutex::scoped_lock lk(state_change);
591
+ boost::unique_lock<boost::mutex> lk(state_change);
592
+ state.assert_lock_shared();
436
593
  if( !state.exclusive
437
594
  && !state.exclusive_waiting_blocked
438
595
  && !state.upgrade
@@ -458,8 +615,11 @@ namespace boost
458
615
  try_unlock_shared_and_lock_until(
459
616
  const chrono::time_point<Clock, Duration>& abs_time)
460
617
  {
618
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
461
619
  boost::this_thread::disable_interruption do_not_disturb;
462
- boost::mutex::scoped_lock lk(state_change);
620
+ #endif
621
+ boost::unique_lock<boost::mutex> lk(state_change);
622
+ state.assert_lock_shared();
463
623
  if (state.shared_count != 1)
464
624
  {
465
625
  for (;;)
@@ -483,7 +643,8 @@ namespace boost
483
643
  // Shared <-> Upgrade
484
644
  void unlock_upgrade_and_lock_shared()
485
645
  {
486
- boost::mutex::scoped_lock lk(state_change);
646
+ boost::unique_lock<boost::mutex> lk(state_change);
647
+ state.assert_lock_upgraded();
487
648
  state.upgrade=false;
488
649
  state.exclusive_waiting_blocked=false;
489
650
  release_waiters();
@@ -492,7 +653,8 @@ namespace boost
492
653
  #ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
493
654
  bool try_unlock_shared_and_lock_upgrade()
494
655
  {
495
- boost::mutex::scoped_lock lk(state_change);
656
+ boost::unique_lock<boost::mutex> lk(state_change);
657
+ state.assert_lock_shared();
496
658
  if( !state.exclusive
497
659
  && !state.exclusive_waiting_blocked
498
660
  && !state.upgrade
@@ -517,8 +679,11 @@ namespace boost
517
679
  try_unlock_shared_and_lock_upgrade_until(
518
680
  const chrono::time_point<Clock, Duration>& abs_time)
519
681
  {
682
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
520
683
  boost::this_thread::disable_interruption do_not_disturb;
521
- boost::mutex::scoped_lock lk(state_change);
684
+ #endif
685
+ boost::unique_lock<boost::mutex> lk(state_change);
686
+ state.assert_lock_shared();
522
687
  if( state.exclusive
523
688
  || state.exclusive_waiting_blocked
524
689
  || state.upgrade