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,724 @@
1
+ #ifndef BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP
2
+ #define BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP
3
+
4
+ // (C) Copyright 2006-8 Anthony Williams
5
+ // (C) Copyright 2012 Vicente J. Botet Escriba
6
+ //
7
+ // Distributed under the Boost Software License, Version 1.0. (See
8
+ // accompanying file LICENSE_1_0.txt or copy at
9
+ // http://www.boost.org/LICENSE_1_0.txt)
10
+
11
+ #include <boost/assert.hpp>
12
+ #include <boost/static_assert.hpp>
13
+ #include <boost/thread/mutex.hpp>
14
+ #include <boost/thread/condition_variable.hpp>
15
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
16
+ #include <boost/thread/detail/thread_interruption.hpp>
17
+ #endif
18
+ #ifdef BOOST_THREAD_USES_CHRONO
19
+ #include <boost/chrono/system_clocks.hpp>
20
+ #include <boost/chrono/ceil.hpp>
21
+ #endif
22
+ #include <boost/thread/detail/delete.hpp>
23
+ #include <boost/assert.hpp>
24
+
25
+ #include <boost/config/abi_prefix.hpp>
26
+
27
+ namespace boost
28
+ {
29
+ class shared_mutex
30
+ {
31
+ private:
32
+ class state_data
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 is_last_shared () const
104
+ {
105
+ return !shared_count ;
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
+ lock_shared ();
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
+ unlock_shared();
148
+ }
149
+
150
+ //private:
151
+ unsigned shared_count;
152
+ bool exclusive;
153
+ bool upgrade;
154
+ bool exclusive_waiting_blocked;
155
+ };
156
+
157
+
158
+
159
+ state_data state;
160
+ boost::mutex state_change;
161
+ boost::condition_variable shared_cond;
162
+ boost::condition_variable exclusive_cond;
163
+ boost::condition_variable upgrade_cond;
164
+
165
+ void release_waiters()
166
+ {
167
+ exclusive_cond.notify_one();
168
+ shared_cond.notify_all();
169
+ }
170
+
171
+ public:
172
+ BOOST_THREAD_NO_COPYABLE(shared_mutex)
173
+
174
+ shared_mutex()
175
+ {
176
+ }
177
+
178
+ ~shared_mutex()
179
+ {
180
+ }
181
+
182
+ void lock_shared()
183
+ {
184
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
185
+ boost::this_thread::disable_interruption do_not_disturb;
186
+ #endif
187
+ boost::unique_lock<boost::mutex> lk(state_change);
188
+
189
+ while(!state.can_lock_shared())
190
+ {
191
+ shared_cond.wait(lk);
192
+ }
193
+ state.lock_shared();
194
+ }
195
+
196
+ bool try_lock_shared()
197
+ {
198
+ boost::unique_lock<boost::mutex> lk(state_change);
199
+ if(!state.can_lock_shared())
200
+ {
201
+ return false;
202
+ }
203
+ else
204
+ {
205
+ state.lock_shared();
206
+ return true;
207
+ }
208
+ }
209
+
210
+ #if defined BOOST_THREAD_USES_DATETIME
211
+ bool timed_lock_shared(system_time const& timeout)
212
+ {
213
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
214
+ boost::this_thread::disable_interruption do_not_disturb;
215
+ #endif
216
+ boost::unique_lock<boost::mutex> lk(state_change);
217
+
218
+ while(!state.can_lock_shared())
219
+ {
220
+ if(!shared_cond.timed_wait(lk,timeout))
221
+ {
222
+ return false;
223
+ }
224
+ }
225
+ state.lock_shared();
226
+ return true;
227
+ }
228
+
229
+ template<typename TimeDuration>
230
+ bool timed_lock_shared(TimeDuration const & relative_time)
231
+ {
232
+ return timed_lock_shared(get_system_time()+relative_time);
233
+ }
234
+ #endif
235
+ #ifdef BOOST_THREAD_USES_CHRONO
236
+ template <class Rep, class Period>
237
+ bool try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time)
238
+ {
239
+ return try_lock_shared_until(chrono::steady_clock::now() + rel_time);
240
+ }
241
+ template <class Clock, class Duration>
242
+ bool try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time)
243
+ {
244
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
245
+ boost::this_thread::disable_interruption do_not_disturb;
246
+ #endif
247
+ boost::unique_lock<boost::mutex> lk(state_change);
248
+
249
+ while(!state.can_lock_shared())
250
+ {
251
+ if(cv_status::timeout==shared_cond.wait_until(lk,abs_time))
252
+ {
253
+ return false;
254
+ }
255
+ }
256
+ state.lock_shared();
257
+ return true;
258
+ }
259
+ #endif
260
+ void unlock_shared()
261
+ {
262
+ boost::unique_lock<boost::mutex> lk(state_change);
263
+ state.assert_lock_shared();
264
+ state.unlock_shared();
265
+ if (state.get_shared_count () == 0)
266
+ {
267
+ if (state.unlock_shared_downgrades())
268
+ {
269
+ lk.unlock();
270
+ upgrade_cond.notify_one();
271
+ } else {
272
+ lk.unlock();
273
+ }
274
+ release_waiters();
275
+ }
276
+ }
277
+
278
+ void lock()
279
+ {
280
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
281
+ boost::this_thread::disable_interruption do_not_disturb;
282
+ #endif
283
+ boost::unique_lock<boost::mutex> lk(state_change);
284
+
285
+ while(!state.can_lock())
286
+ {
287
+ state.exclusive_blocked(true);
288
+ exclusive_cond.wait(lk);
289
+ }
290
+ state.lock();
291
+ }
292
+
293
+ #if defined BOOST_THREAD_USES_DATETIME
294
+ bool timed_lock(system_time const& timeout)
295
+ {
296
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
297
+ boost::this_thread::disable_interruption do_not_disturb;
298
+ #endif
299
+ boost::unique_lock<boost::mutex> lk(state_change);
300
+
301
+ while(!state.can_lock())
302
+ {
303
+ state.exclusive_blocked(true);
304
+ if(!exclusive_cond.timed_wait(lk,timeout))
305
+ {
306
+ if(!state.can_lock())
307
+ {
308
+ state.exclusive_blocked(false);
309
+ release_waiters();
310
+ return false;
311
+ }
312
+ break;
313
+ }
314
+ }
315
+ state.exclusive=true;
316
+ //state.lock();
317
+ return true;
318
+ }
319
+
320
+ template<typename TimeDuration>
321
+ bool timed_lock(TimeDuration const & relative_time)
322
+ {
323
+ return timed_lock(get_system_time()+relative_time);
324
+ }
325
+ #endif
326
+ #ifdef BOOST_THREAD_USES_CHRONO
327
+ template <class Rep, class Period>
328
+ bool try_lock_for(const chrono::duration<Rep, Period>& rel_time)
329
+ {
330
+ return try_lock_until(chrono::steady_clock::now() + rel_time);
331
+ }
332
+ template <class Clock, class Duration>
333
+ bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time)
334
+ {
335
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
336
+ boost::this_thread::disable_interruption do_not_disturb;
337
+ #endif
338
+ boost::unique_lock<boost::mutex> lk(state_change);
339
+
340
+ while(!state.can_lock())
341
+ {
342
+ state.exclusive_blocked(true);
343
+ if(cv_status::timeout == exclusive_cond.wait_until(lk,abs_time))
344
+ {
345
+ if(!state.can_lock())
346
+ {
347
+ state.exclusive_blocked(false);
348
+ release_waiters();
349
+ return false;
350
+ }
351
+ break;
352
+ }
353
+ }
354
+ state.exclusive=true;
355
+ //state.lock();
356
+ return true;
357
+ }
358
+ #endif
359
+
360
+ bool try_lock()
361
+ {
362
+ boost::unique_lock<boost::mutex> lk(state_change);
363
+
364
+ if(!state.can_lock())
365
+ {
366
+ return false;
367
+ }
368
+ else
369
+ {
370
+ state.lock();
371
+ return true;
372
+ }
373
+
374
+ }
375
+
376
+ void unlock()
377
+ {
378
+ boost::unique_lock<boost::mutex> lk(state_change);
379
+ state.assert_locked();
380
+ state.unlock();
381
+ state.assert_free();
382
+ release_waiters();
383
+ }
384
+
385
+ void lock_upgrade()
386
+ {
387
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
388
+ boost::this_thread::disable_interruption do_not_disturb;
389
+ #endif
390
+ boost::unique_lock<boost::mutex> lk(state_change);
391
+ while(!state.can_lock_upgrade())
392
+ {
393
+ shared_cond.wait(lk);
394
+ }
395
+ state.lock_upgrade();
396
+ }
397
+
398
+ #if defined BOOST_THREAD_USES_DATETIME
399
+ bool timed_lock_upgrade(system_time const& timeout)
400
+ {
401
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
402
+ boost::this_thread::disable_interruption do_not_disturb;
403
+ #endif
404
+ boost::unique_lock<boost::mutex> lk(state_change);
405
+ while(!state.can_lock_upgrade())
406
+ {
407
+ if(!shared_cond.timed_wait(lk,timeout))
408
+ {
409
+ if(!state.can_lock_upgrade())
410
+ {
411
+ return false;
412
+ }
413
+ break;
414
+ }
415
+ }
416
+ state.lock_upgrade();
417
+ return true;
418
+ }
419
+
420
+ template<typename TimeDuration>
421
+ bool timed_lock_upgrade(TimeDuration const & relative_time)
422
+ {
423
+ return timed_lock_upgrade(get_system_time()+relative_time);
424
+ }
425
+ #endif
426
+ #ifdef BOOST_THREAD_USES_CHRONO
427
+ template <class Rep, class Period>
428
+ bool try_lock_upgrade_for(const chrono::duration<Rep, Period>& rel_time)
429
+ {
430
+ return try_lock_upgrade_until(chrono::steady_clock::now() + rel_time);
431
+ }
432
+ template <class Clock, class Duration>
433
+ bool try_lock_upgrade_until(const chrono::time_point<Clock, Duration>& abs_time)
434
+ {
435
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
436
+ boost::this_thread::disable_interruption do_not_disturb;
437
+ #endif
438
+ boost::unique_lock<boost::mutex> lk(state_change);
439
+ while(!state.can_lock_upgrade())
440
+ {
441
+ if(cv_status::timeout == shared_cond.wait_until(lk,abs_time))
442
+ {
443
+ if(!state.can_lock_upgrade())
444
+ {
445
+ return false;
446
+ }
447
+ break;
448
+ }
449
+ }
450
+ state.lock_upgrade();
451
+ return true;
452
+ }
453
+ #endif
454
+ bool try_lock_upgrade()
455
+ {
456
+ boost::unique_lock<boost::mutex> lk(state_change);
457
+ if(!state.can_lock_upgrade())
458
+ {
459
+ return false;
460
+ }
461
+ else
462
+ {
463
+ state.lock_upgrade();
464
+ state.assert_lock_upgraded();
465
+ return true;
466
+ }
467
+ }
468
+
469
+ void unlock_upgrade()
470
+ {
471
+ boost::unique_lock<boost::mutex> lk(state_change);
472
+ state.assert_lock_upgraded();
473
+ state.unlock_upgrade();
474
+ state.assert_lock_not_upgraded ();
475
+ if(state.get_shared_count () == 0)
476
+ {
477
+ state.exclusive_blocked(false);
478
+ lk.unlock();
479
+ release_waiters();
480
+ } else {
481
+ lk.unlock();
482
+ shared_cond.notify_all();
483
+ }
484
+ }
485
+
486
+ // Upgrade <-> Exclusive
487
+ void unlock_upgrade_and_lock()
488
+ {
489
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
490
+ boost::this_thread::disable_interruption do_not_disturb;
491
+ #endif
492
+ boost::unique_lock<boost::mutex> lk(state_change);
493
+ state.assert_lock_upgraded();
494
+ // assert state.get_shared_count() >=1
495
+ while(
496
+ //! state.exclusive_waiting_blocked // Fixme: is this needed?
497
+ //&&
498
+ state.get_shared_count()!=1)
499
+ {
500
+ upgrade_cond.wait(lk);
501
+ }
502
+ state.unlock_upgrade();
503
+ state.lock();
504
+ state.assert_locked();
505
+ }
506
+
507
+ void unlock_and_lock_upgrade()
508
+ {
509
+ boost::unique_lock<boost::mutex> lk(state_change);
510
+ state.assert_locked();
511
+ state.unlock();
512
+ state.lock_upgrade();
513
+ state.assert_lock_upgraded();
514
+ release_waiters();
515
+ }
516
+
517
+ bool try_unlock_upgrade_and_lock()
518
+ {
519
+ boost::unique_lock<boost::mutex> lk(state_change);
520
+ state.assert_lock_upgraded();
521
+ if( //!state.exclusive // this should be removed once the assertion work
522
+ ! state.exclusive_waiting_blocked // Fixme: why this is needed?
523
+ //&& state.upgrade // this should be removed once the assertion work
524
+ && state.get_shared_count()==1)
525
+ {
526
+ state.unlock_upgrade();
527
+ state.lock();
528
+ state.assert_locked();
529
+ return true;
530
+ }
531
+ return false;
532
+ }
533
+ #ifdef BOOST_THREAD_USES_CHRONO
534
+ template <class Rep, class Period>
535
+ bool
536
+ try_unlock_upgrade_and_lock_for(
537
+ const chrono::duration<Rep, Period>& rel_time)
538
+ {
539
+ return try_unlock_upgrade_and_lock_until(
540
+ chrono::steady_clock::now() + rel_time);
541
+ }
542
+ template <class Clock, class Duration>
543
+ bool
544
+ try_unlock_upgrade_and_lock_until(
545
+ const chrono::time_point<Clock, Duration>& abs_time)
546
+ {
547
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
548
+ boost::this_thread::disable_interruption do_not_disturb;
549
+ #endif
550
+ boost::unique_lock<boost::mutex> lk(state_change);
551
+ state.assert_lock_upgraded();
552
+ if (//state.exclusive // this should be removed once the assertion work
553
+ state.exclusive_waiting_blocked // Fixme: is this needed?
554
+ //|| ! state.upgrade // this should be removed once the assertion work
555
+ || state.get_shared_count() != 1)
556
+ {
557
+ for (;;)
558
+ {
559
+ //cv_status status = shared_cond.wait_until(lk,abs_time);
560
+ cv_status status = upgrade_cond.wait_until(lk,abs_time);
561
+ if (//!state.exclusive // this should be removed once the assertion work
562
+ ! state.exclusive_waiting_blocked // Fixme: is this needed?
563
+ //&& ! state.upgrade // this should be removed once the assertion work
564
+ && state.get_shared_count() == 1)
565
+ break;
566
+ if(status == cv_status::timeout)
567
+ return false;
568
+ }
569
+ }
570
+ state.unlock_upgrade();
571
+ state.lock();
572
+ return true;
573
+ }
574
+ #endif
575
+
576
+ // Shared <-> Exclusive
577
+ void unlock_and_lock_shared()
578
+ {
579
+ boost::unique_lock<boost::mutex> lk(state_change);
580
+ state.assert_locked();
581
+ state.unlock();
582
+ state.lock_shared();
583
+ release_waiters();
584
+ }
585
+
586
+ #ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
587
+ bool try_unlock_shared_and_lock()
588
+ {
589
+ boost::unique_lock<boost::mutex> lk(state_change);
590
+ state.assert_lock_shared();
591
+ if( //!state.exclusive // this should be removed once the assertion work
592
+ ! state.exclusive_waiting_blocked // Fixme: why this is needed?
593
+ //&& ! state.upgrade // Fixme: why this is needed if state.get_shared_count()==1?
594
+ && state.get_shared_count()==1)
595
+ {
596
+ state.unlock_shared();
597
+ state.lock();
598
+ return true;
599
+ }
600
+ return false;
601
+ }
602
+ #ifdef BOOST_THREAD_USES_CHRONO
603
+ template <class Rep, class Period>
604
+ bool
605
+ try_unlock_shared_and_lock_for(
606
+ const chrono::duration<Rep, Period>& rel_time)
607
+ {
608
+ return try_unlock_shared_and_lock_until(
609
+ chrono::steady_clock::now() + rel_time);
610
+ }
611
+ template <class Clock, class Duration>
612
+ bool
613
+ try_unlock_shared_and_lock_until(
614
+ const chrono::time_point<Clock, Duration>& abs_time)
615
+ {
616
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
617
+ boost::this_thread::disable_interruption do_not_disturb;
618
+ #endif
619
+ boost::unique_lock<boost::mutex> lk(state_change);
620
+ state.assert_lock_shared();
621
+ if ( // !state.exclusive // this should be removed once the assertion work
622
+ state.exclusive_waiting_blocked // Fixme: is this needed?
623
+ //|| state.upgrade // Fixme: why this is needed if state.get_shared_count()==1?
624
+ || state.get_shared_count() != 1)
625
+ {
626
+ for (;;)
627
+ {
628
+ cv_status status = shared_cond.wait_until(lk,abs_time);
629
+ if ( //! state.exclusive // this should be removed once the assertion work
630
+ ! state.exclusive_waiting_blocked // Fixme: is this needed?
631
+ //&& ! state.upgrade
632
+ && state.get_shared_count() == 1)
633
+ break;
634
+ if(status == cv_status::timeout)
635
+ return false;
636
+ }
637
+ }
638
+ state.unlock_shared();
639
+ state.lock();
640
+ state.upgrade=false; // Is this absolutely needed?
641
+ state.exclusive_waiting_blocked=false; // Is this absolutely needed?
642
+ return true;
643
+ }
644
+ #endif
645
+ #endif
646
+
647
+ // Shared <-> Upgrade
648
+ void unlock_upgrade_and_lock_shared()
649
+ {
650
+ boost::unique_lock<boost::mutex> lk(state_change);
651
+ state.assert_lock_upgraded();
652
+ //state.unlock_upgrade();
653
+ //state.lock_shared(); // less efficient
654
+ state.upgrade=false;
655
+ state.exclusive_waiting_blocked=false; // Is this absolutely needed?
656
+ release_waiters();
657
+ }
658
+
659
+ #ifdef BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
660
+ bool try_unlock_shared_and_lock_upgrade()
661
+ {
662
+ boost::unique_lock<boost::mutex> lk(state_change);
663
+ state.assert_lock_shared();
664
+ if( //! state.exclusive // this should be removed once the assertion work
665
+ ! state.exclusive_waiting_blocked // Fixme: is this needed?
666
+ && ! state.upgrade
667
+ )
668
+ {
669
+ state.upgrade=true;
670
+ return true;
671
+ }
672
+ return false;
673
+ }
674
+ #ifdef BOOST_THREAD_USES_CHRONO
675
+ template <class Rep, class Period>
676
+ bool
677
+ try_unlock_shared_and_lock_upgrade_for(
678
+ const chrono::duration<Rep, Period>& rel_time)
679
+ {
680
+ return try_unlock_shared_and_lock_upgrade_until(
681
+ chrono::steady_clock::now() + rel_time);
682
+ }
683
+ template <class Clock, class Duration>
684
+ bool
685
+ try_unlock_shared_and_lock_upgrade_until(
686
+ const chrono::time_point<Clock, Duration>& abs_time)
687
+ {
688
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
689
+ boost::this_thread::disable_interruption do_not_disturb;
690
+ #endif
691
+ boost::unique_lock<boost::mutex> lk(state_change);
692
+ state.assert_lock_shared();
693
+ if( //state.exclusive // this should be removed once the assertion work
694
+ state.exclusive_waiting_blocked // Fixme: is this needed?
695
+ || state.upgrade
696
+ )
697
+ {
698
+ for (;;)
699
+ {
700
+ cv_status status = exclusive_cond.wait_until(lk,abs_time);
701
+ if( //! state.exclusive // this should be removed once the assertion work
702
+ ! state.exclusive_waiting_blocked // Fixme: is this needed?
703
+ && ! state.upgrade
704
+ )
705
+ break;
706
+ if(status == cv_status::timeout)
707
+ return false;
708
+ }
709
+ }
710
+ //state.unlock_shared();
711
+ //state.lock_upgrade(); // less efficient
712
+ state.upgrade=true;
713
+ return true;
714
+ }
715
+ #endif
716
+ #endif
717
+ };
718
+
719
+ typedef shared_mutex upgrade_mutex;
720
+ }
721
+
722
+ #include <boost/config/abi_suffix.hpp>
723
+
724
+ #endif