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,61 @@
1
+ // (C) Copyright 2008-10 Anthony Williams
2
+ // (C) Copyright 2011-2012 Vicente J. Botet Escriba
3
+ //
4
+ // Distributed under the Boost Software License, Version 1.0. (See
5
+ // accompanying file LICENSE_1_0.txt or copy at
6
+ // http://www.boost.org/LICENSE_1_0.txt)
7
+
8
+ #ifndef BOOST_THREAD_FUTURE_ERROR_CODE_HPP
9
+ #define BOOST_THREAD_FUTURE_ERROR_CODE_HPP
10
+
11
+ #include <boost/thread/detail/config.hpp>
12
+ #include <boost/detail/scoped_enum_emulation.hpp>
13
+ #include <boost/system/error_code.hpp>
14
+ #include <boost/type_traits/integral_constant.hpp>
15
+
16
+ namespace boost
17
+ {
18
+
19
+ //enum class future_errc
20
+ BOOST_SCOPED_ENUM_DECLARE_BEGIN(future_errc)
21
+ {
22
+ broken_promise = 1,
23
+ future_already_retrieved,
24
+ promise_already_satisfied,
25
+ no_state
26
+ }
27
+ BOOST_SCOPED_ENUM_DECLARE_END(future_errc)
28
+
29
+ namespace system
30
+ {
31
+ template <>
32
+ struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc> : public true_type {};
33
+
34
+ #ifdef BOOST_NO_CXX11_SCOPED_ENUMS
35
+ template <>
36
+ struct BOOST_SYMBOL_VISIBLE is_error_code_enum<future_errc::enum_type> : public true_type { };
37
+ #endif
38
+ } // system
39
+
40
+ BOOST_THREAD_DECL
41
+ const system::error_category& future_category() BOOST_NOEXCEPT;
42
+
43
+ namespace system
44
+ {
45
+ inline
46
+ error_code
47
+ make_error_code(future_errc e) BOOST_NOEXCEPT
48
+ {
49
+ return error_code(underlying_cast<int>(e), boost::future_category());
50
+ }
51
+
52
+ inline
53
+ error_condition
54
+ make_error_condition(future_errc e) BOOST_NOEXCEPT
55
+ {
56
+ return error_condition(underlying_cast<int>(e), future_category());
57
+ }
58
+ } // system
59
+ } // boost
60
+
61
+ #endif // header
@@ -0,0 +1,39 @@
1
+ // (C) Copyright 2012 Vicente J. Botet Escriba
2
+ // Distributed under the Boost Software License, Version 1.0. (See
3
+ // accompanying file LICENSE_1_0.txt or copy at
4
+ // http://www.boost.org/LICENSE_1_0.txt)
5
+
6
+
7
+ #ifndef BOOST_THREAD_IS_LOCKED_BY_THIS_THREAD_HPP
8
+ #define BOOST_THREAD_IS_LOCKED_BY_THIS_THREAD_HPP
9
+
10
+ #include <boost/thread/detail/config.hpp>
11
+
12
+ #include <boost/config/abi_prefix.hpp>
13
+
14
+ namespace boost
15
+ {
16
+ template <typename Lockable>
17
+ class testable_mutex;
18
+
19
+ /**
20
+ * Overloaded function used to check if the mutex is locked when it is testable and do nothing otherwise.
21
+ *
22
+ * This function is used usually to assert the pre-condition when the function can only be called when the mutex
23
+ * must be locked by the current thread.
24
+ */
25
+ template <typename Lockable>
26
+ bool is_locked_by_this_thread(testable_mutex<Lockable> const& mtx)
27
+ {
28
+ return mtx.is_locked_by_this_thread();
29
+ }
30
+ template <typename Lockable>
31
+ bool is_locked_by_this_thread(Lockable const&)
32
+ {
33
+ return true;
34
+ }
35
+ }
36
+
37
+ #include <boost/config/abi_suffix.hpp>
38
+
39
+ #endif // header
@@ -0,0 +1,142 @@
1
+ // Distributed under the Boost Software License, Version 1.0. (See
2
+ // accompanying file LICENSE_1_0.txt or copy at
3
+ // http://www.boost.org/LICENSE_1_0.txt)
4
+ // (C) Copyright 2013 Vicente J. Botet Escriba
5
+
6
+ #ifndef BOOST_THREAD_LATCH_HPP
7
+ #define BOOST_THREAD_LATCH_HPP
8
+
9
+ #include <boost/thread/detail/config.hpp>
10
+ #include <boost/thread/detail/delete.hpp>
11
+ #include <boost/thread/detail/counter.hpp>
12
+
13
+ #include <boost/thread/mutex.hpp>
14
+ #include <boost/thread/lock_types.hpp>
15
+ #include <boost/thread/condition_variable.hpp>
16
+ #include <boost/chrono/duration.hpp>
17
+ #include <boost/chrono/time_point.hpp>
18
+ #include <boost/assert.hpp>
19
+
20
+ #include <boost/config/abi_prefix.hpp>
21
+
22
+ namespace boost
23
+ {
24
+ class latch
25
+ {
26
+ /// @Requires: count_.value_ must be greater than 0
27
+ /// Effect: Decrement the count. Unlocks the lock notify anyone waiting if we reached zero.
28
+ /// Returns: true if count_.value_ reached the value 0.
29
+ /// @ThreadSafe ensured by the @c lk parameter
30
+ bool count_down(unique_lock<mutex> &lk)
31
+ /// pre_condition (count_.value_ > 0)
32
+ {
33
+ BOOST_ASSERT(count_.value_ > 0);
34
+ if (--count_.value_ == 0)
35
+ {
36
+ count_.cond_.notify_all();
37
+ lk.unlock();
38
+ return true;
39
+ }
40
+ return false;
41
+ }
42
+ public:
43
+ BOOST_THREAD_NO_COPYABLE( latch)
44
+
45
+ /// Constructs a latch with a given count.
46
+ latch(std::size_t count) :
47
+ count_(count)
48
+ {
49
+ }
50
+
51
+ /// Destructor
52
+ /// Precondition: No threads are waiting or invoking count_down on @c *this.
53
+
54
+ ~latch()
55
+ {
56
+
57
+ }
58
+
59
+ /// Blocks until the latch has counted down to zero.
60
+ void wait()
61
+ {
62
+ boost::unique_lock<boost::mutex> lk(mutex_);
63
+ count_.cond_.wait(lk, detail::counter_is_zero(count_));
64
+ }
65
+
66
+ /// @return true if the internal counter is already 0, false otherwise
67
+ bool try_wait()
68
+ {
69
+ boost::unique_lock<boost::mutex> lk(mutex_);
70
+ return (count_ == 0);
71
+ }
72
+
73
+ /// try to wait for a specified amount of time is elapsed.
74
+ /// @return whether there is a timeout or not.
75
+ template <class Rep, class Period>
76
+ cv_status wait_for(const chrono::duration<Rep, Period>& rel_time)
77
+ {
78
+ boost::unique_lock<boost::mutex> lk(mutex_);
79
+ return count_.cond_.wait_for(lk, rel_time, detail::counter_is_zero(count_))
80
+ ? cv_status::no_timeout
81
+ : cv_status::timeout;
82
+ }
83
+
84
+ /// try to wait until the specified time_point is reached
85
+ /// @return whether there were a timeout or not.
86
+ template <class Clock, class Duration>
87
+ cv_status wait_until(const chrono::time_point<Clock, Duration>& abs_time)
88
+ {
89
+ boost::unique_lock<boost::mutex> lk(mutex_);
90
+ return count_.cond_.wait_until(lk, abs_time, detail::counter_is_zero(count_))
91
+ ? cv_status::no_timeout
92
+ : cv_status::timeout;
93
+ }
94
+
95
+ /// Decrement the count and notify anyone waiting if we reach zero.
96
+ /// @Requires count must be greater than 0
97
+ void count_down()
98
+ {
99
+ boost::unique_lock<boost::mutex> lk(mutex_);
100
+ count_down(lk);
101
+ }
102
+ void signal()
103
+ {
104
+ count_down();
105
+ }
106
+
107
+ /// Decrement the count and notify anyone waiting if we reach zero.
108
+ /// Blocks until the latch has counted down to zero.
109
+ /// @Requires count must be greater than 0
110
+ void count_down_and_wait()
111
+ {
112
+ boost::unique_lock<boost::mutex> lk(mutex_);
113
+ if (count_down(lk))
114
+ {
115
+ return;
116
+ }
117
+ count_.cond_.wait(lk, detail::counter_is_zero(count_));
118
+ }
119
+ void sync()
120
+ {
121
+ count_down_and_wait();
122
+ }
123
+
124
+ /// Reset the counter
125
+ /// #Requires This method may only be invoked when there are no other threads currently inside the count_down_and_wait() method.
126
+ void reset(std::size_t count)
127
+ {
128
+ boost::lock_guard<boost::mutex> lk(mutex_);
129
+ //BOOST_ASSERT(count_ == 0);
130
+ count_ = count;
131
+ }
132
+
133
+ private:
134
+ mutex mutex_;
135
+ detail::counter count_;
136
+ };
137
+
138
+ } // namespace boost
139
+
140
+ #include <boost/config/abi_suffix.hpp>
141
+
142
+ #endif
@@ -0,0 +1,468 @@
1
+ // Distributed under the Boost Software License, Version 1.0. (See
2
+ // accompanying file LICENSE_1_0.txt or copy at
3
+ // http://www.boost.org/LICENSE_1_0.txt)
4
+ // (C) Copyright 2007 Anthony Williams
5
+ // (C) Copyright 2011-2012 Vicente J. Botet Escriba
6
+
7
+ #ifndef BOOST_THREAD_LOCK_ALGORITHMS_HPP
8
+ #define BOOST_THREAD_LOCK_ALGORITHMS_HPP
9
+
10
+ #include <boost/thread/detail/config.hpp>
11
+ #include <boost/thread/lock_types.hpp>
12
+ #include <boost/thread/lockable_traits.hpp>
13
+
14
+ #include <algorithm>
15
+ #include <iterator>
16
+
17
+ #include <boost/config/abi_prefix.hpp>
18
+
19
+ namespace boost
20
+ {
21
+ namespace detail
22
+ {
23
+ template <typename MutexType1, typename MutexType2>
24
+ unsigned try_lock_internal(MutexType1& m1, MutexType2& m2)
25
+ {
26
+ boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
27
+ if (!l1)
28
+ {
29
+ return 1;
30
+ }
31
+ if (!m2.try_lock())
32
+ {
33
+ return 2;
34
+ }
35
+ l1.release();
36
+ return 0;
37
+ }
38
+
39
+ template <typename MutexType1, typename MutexType2, typename MutexType3>
40
+ unsigned try_lock_internal(MutexType1& m1, MutexType2& m2, MutexType3& m3)
41
+ {
42
+ boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
43
+ if (!l1)
44
+ {
45
+ return 1;
46
+ }
47
+ if (unsigned const failed_lock=try_lock_internal(m2,m3))
48
+ {
49
+ return failed_lock + 1;
50
+ }
51
+ l1.release();
52
+ return 0;
53
+ }
54
+
55
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
56
+ unsigned try_lock_internal(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
57
+ {
58
+ boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
59
+ if (!l1)
60
+ {
61
+ return 1;
62
+ }
63
+ if (unsigned const failed_lock=try_lock_internal(m2,m3,m4))
64
+ {
65
+ return failed_lock + 1;
66
+ }
67
+ l1.release();
68
+ return 0;
69
+ }
70
+
71
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
72
+ unsigned try_lock_internal(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
73
+ {
74
+ boost::unique_lock<MutexType1> l1(m1, boost::try_to_lock);
75
+ if (!l1)
76
+ {
77
+ return 1;
78
+ }
79
+ if (unsigned const failed_lock=try_lock_internal(m2,m3,m4,m5))
80
+ {
81
+ return failed_lock + 1;
82
+ }
83
+ l1.release();
84
+ return 0;
85
+ }
86
+
87
+ template <typename MutexType1, typename MutexType2>
88
+ unsigned lock_helper(MutexType1& m1, MutexType2& m2)
89
+ {
90
+ boost::unique_lock<MutexType1> l1(m1);
91
+ if (!m2.try_lock())
92
+ {
93
+ return 1;
94
+ }
95
+ l1.release();
96
+ return 0;
97
+ }
98
+
99
+ template <typename MutexType1, typename MutexType2, typename MutexType3>
100
+ unsigned lock_helper(MutexType1& m1, MutexType2& m2, MutexType3& m3)
101
+ {
102
+ boost::unique_lock<MutexType1> l1(m1);
103
+ if (unsigned const failed_lock=try_lock_internal(m2,m3))
104
+ {
105
+ return failed_lock;
106
+ }
107
+ l1.release();
108
+ return 0;
109
+ }
110
+
111
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
112
+ unsigned lock_helper(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
113
+ {
114
+ boost::unique_lock<MutexType1> l1(m1);
115
+ if (unsigned const failed_lock=try_lock_internal(m2,m3,m4))
116
+ {
117
+ return failed_lock;
118
+ }
119
+ l1.release();
120
+ return 0;
121
+ }
122
+
123
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
124
+ unsigned lock_helper(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
125
+ {
126
+ boost::unique_lock<MutexType1> l1(m1);
127
+ if (unsigned const failed_lock=try_lock_internal(m2,m3,m4,m5))
128
+ {
129
+ return failed_lock;
130
+ }
131
+ l1.release();
132
+ return 0;
133
+ }
134
+ }
135
+
136
+ namespace detail
137
+ {
138
+ template <bool x>
139
+ struct is_mutex_type_wrapper
140
+ {
141
+ };
142
+
143
+ template <typename MutexType1, typename MutexType2>
144
+ void lock_impl(MutexType1& m1, MutexType2& m2, is_mutex_type_wrapper<true> )
145
+ {
146
+ unsigned const lock_count = 2;
147
+ unsigned lock_first = 0;
148
+ for (;;)
149
+ {
150
+ switch (lock_first)
151
+ {
152
+ case 0:
153
+ lock_first = detail::lock_helper(m1, m2);
154
+ if (!lock_first) return;
155
+ break;
156
+ case 1:
157
+ lock_first = detail::lock_helper(m2, m1);
158
+ if (!lock_first) return;
159
+ lock_first = (lock_first + 1) % lock_count;
160
+ break;
161
+ }
162
+ }
163
+ }
164
+
165
+ template <typename Iterator>
166
+ void lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> );
167
+ }
168
+
169
+ template <typename MutexType1, typename MutexType2>
170
+ void lock(MutexType1& m1, MutexType2& m2)
171
+ {
172
+ detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
173
+ }
174
+
175
+ template <typename MutexType1, typename MutexType2>
176
+ void lock(const MutexType1& m1, MutexType2& m2)
177
+ {
178
+ detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
179
+ }
180
+
181
+ template <typename MutexType1, typename MutexType2>
182
+ void lock(MutexType1& m1, const MutexType2& m2)
183
+ {
184
+ detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
185
+ }
186
+
187
+ template <typename MutexType1, typename MutexType2>
188
+ void lock(const MutexType1& m1, const MutexType2& m2)
189
+ {
190
+ detail::lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
191
+ }
192
+
193
+ template <typename MutexType1, typename MutexType2, typename MutexType3>
194
+ void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3)
195
+ {
196
+ unsigned const lock_count = 3;
197
+ unsigned lock_first = 0;
198
+ for (;;)
199
+ {
200
+ switch (lock_first)
201
+ {
202
+ case 0:
203
+ lock_first = detail::lock_helper(m1, m2, m3);
204
+ if (!lock_first) return;
205
+ break;
206
+ case 1:
207
+ lock_first = detail::lock_helper(m2, m3, m1);
208
+ if (!lock_first) return;
209
+ lock_first = (lock_first + 1) % lock_count;
210
+ break;
211
+ case 2:
212
+ lock_first = detail::lock_helper(m3, m1, m2);
213
+ if (!lock_first) return;
214
+ lock_first = (lock_first + 2) % lock_count;
215
+ break;
216
+ }
217
+ }
218
+ }
219
+
220
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
221
+ void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
222
+ {
223
+ unsigned const lock_count = 4;
224
+ unsigned lock_first = 0;
225
+ for (;;)
226
+ {
227
+ switch (lock_first)
228
+ {
229
+ case 0:
230
+ lock_first = detail::lock_helper(m1, m2, m3, m4);
231
+ if (!lock_first) return;
232
+ break;
233
+ case 1:
234
+ lock_first = detail::lock_helper(m2, m3, m4, m1);
235
+ if (!lock_first) return;
236
+ lock_first = (lock_first + 1) % lock_count;
237
+ break;
238
+ case 2:
239
+ lock_first = detail::lock_helper(m3, m4, m1, m2);
240
+ if (!lock_first) return;
241
+ lock_first = (lock_first + 2) % lock_count;
242
+ break;
243
+ case 3:
244
+ lock_first = detail::lock_helper(m4, m1, m2, m3);
245
+ if (!lock_first) return;
246
+ lock_first = (lock_first + 3) % lock_count;
247
+ break;
248
+ }
249
+ }
250
+ }
251
+
252
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
253
+ void lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
254
+ {
255
+ unsigned const lock_count = 5;
256
+ unsigned lock_first = 0;
257
+ for (;;)
258
+ {
259
+ switch (lock_first)
260
+ {
261
+ case 0:
262
+ lock_first = detail::lock_helper(m1, m2, m3, m4, m5);
263
+ if (!lock_first) return;
264
+ break;
265
+ case 1:
266
+ lock_first = detail::lock_helper(m2, m3, m4, m5, m1);
267
+ if (!lock_first) return;
268
+ lock_first = (lock_first + 1) % lock_count;
269
+ break;
270
+ case 2:
271
+ lock_first = detail::lock_helper(m3, m4, m5, m1, m2);
272
+ if (!lock_first) return;
273
+ lock_first = (lock_first + 2) % lock_count;
274
+ break;
275
+ case 3:
276
+ lock_first = detail::lock_helper(m4, m5, m1, m2, m3);
277
+ if (!lock_first) return;
278
+ lock_first = (lock_first + 3) % lock_count;
279
+ break;
280
+ case 4:
281
+ lock_first = detail::lock_helper(m5, m1, m2, m3, m4);
282
+ if (!lock_first) return;
283
+ lock_first = (lock_first + 4) % lock_count;
284
+ break;
285
+ }
286
+ }
287
+ }
288
+
289
+ namespace detail
290
+ {
291
+ template <typename Mutex, bool x = is_mutex_type<Mutex>::value>
292
+ struct try_lock_impl_return
293
+ {
294
+ typedef int type;
295
+ };
296
+
297
+ template <typename Iterator>
298
+ struct try_lock_impl_return<Iterator, false>
299
+ {
300
+ typedef Iterator type;
301
+ };
302
+
303
+ template <typename MutexType1, typename MutexType2>
304
+ int try_lock_impl(MutexType1& m1, MutexType2& m2, is_mutex_type_wrapper<true> )
305
+ {
306
+ return ((int) detail::try_lock_internal(m1, m2)) - 1;
307
+ }
308
+
309
+ template <typename Iterator>
310
+ Iterator try_lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> );
311
+ }
312
+
313
+ template <typename MutexType1, typename MutexType2>
314
+ typename detail::try_lock_impl_return<MutexType1>::type try_lock(MutexType1& m1, MutexType2& m2)
315
+ {
316
+ return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
317
+ }
318
+
319
+ template <typename MutexType1, typename MutexType2>
320
+ typename detail::try_lock_impl_return<MutexType1>::type try_lock(const MutexType1& m1, MutexType2& m2)
321
+ {
322
+ return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
323
+ }
324
+
325
+ template <typename MutexType1, typename MutexType2>
326
+ typename detail::try_lock_impl_return<MutexType1>::type try_lock(MutexType1& m1, const MutexType2& m2)
327
+ {
328
+ return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
329
+ }
330
+
331
+ template <typename MutexType1, typename MutexType2>
332
+ typename detail::try_lock_impl_return<MutexType1>::type try_lock(const MutexType1& m1, const MutexType2& m2)
333
+ {
334
+ return detail::try_lock_impl(m1, m2, detail::is_mutex_type_wrapper<is_mutex_type<MutexType1>::value>());
335
+ }
336
+
337
+ template <typename MutexType1, typename MutexType2, typename MutexType3>
338
+ int try_lock(MutexType1& m1, MutexType2& m2, MutexType3& m3)
339
+ {
340
+ return ((int) detail::try_lock_internal(m1, m2, m3)) - 1;
341
+ }
342
+
343
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4>
344
+ int try_lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4)
345
+ {
346
+ return ((int) detail::try_lock_internal(m1, m2, m3, m4)) - 1;
347
+ }
348
+
349
+ template <typename MutexType1, typename MutexType2, typename MutexType3, typename MutexType4, typename MutexType5>
350
+ int try_lock(MutexType1& m1, MutexType2& m2, MutexType3& m3, MutexType4& m4, MutexType5& m5)
351
+ {
352
+ return ((int) detail::try_lock_internal(m1, m2, m3, m4, m5)) - 1;
353
+ }
354
+
355
+ namespace detail
356
+ {
357
+ template <typename Iterator>
358
+ struct range_lock_guard
359
+ {
360
+ Iterator begin;
361
+ Iterator end;
362
+
363
+ range_lock_guard(Iterator begin_, Iterator end_) :
364
+ begin(begin_), end(end_)
365
+ {
366
+ boost::lock(begin, end);
367
+ }
368
+
369
+ void release()
370
+ {
371
+ begin = end;
372
+ }
373
+
374
+ ~range_lock_guard()
375
+ {
376
+ for (; begin != end; ++begin)
377
+ {
378
+ begin->unlock();
379
+ }
380
+ }
381
+ };
382
+
383
+ template <typename Iterator>
384
+ Iterator try_lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> )
385
+
386
+ {
387
+ if (begin == end)
388
+ {
389
+ return end;
390
+ }
391
+ typedef typename std::iterator_traits<Iterator>::value_type lock_type;
392
+ unique_lock<lock_type> guard(*begin, try_to_lock);
393
+
394
+ if (!guard.owns_lock())
395
+ {
396
+ return begin;
397
+ }
398
+ Iterator const failed = boost::try_lock(++begin, end);
399
+ if (failed == end)
400
+ {
401
+ guard.release();
402
+ }
403
+
404
+ return failed;
405
+ }
406
+ }
407
+
408
+ namespace detail
409
+ {
410
+ template <typename Iterator>
411
+ void lock_impl(Iterator begin, Iterator end, is_mutex_type_wrapper<false> )
412
+ {
413
+ typedef typename std::iterator_traits<Iterator>::value_type lock_type;
414
+
415
+ if (begin == end)
416
+ {
417
+ return;
418
+ }
419
+ bool start_with_begin = true;
420
+ Iterator second = begin;
421
+ ++second;
422
+ Iterator next = second;
423
+
424
+ for (;;)
425
+ {
426
+ unique_lock<lock_type> begin_lock(*begin, defer_lock);
427
+ if (start_with_begin)
428
+ {
429
+ begin_lock.lock();
430
+ Iterator const failed_lock = boost::try_lock(next, end);
431
+ if (failed_lock == end)
432
+ {
433
+ begin_lock.release();
434
+ return;
435
+ }
436
+ start_with_begin = false;
437
+ next = failed_lock;
438
+ }
439
+ else
440
+ {
441
+ detail::range_lock_guard<Iterator> guard(next, end);
442
+ if (begin_lock.try_lock())
443
+ {
444
+ Iterator const failed_lock = boost::try_lock(second, next);
445
+ if (failed_lock == next)
446
+ {
447
+ begin_lock.release();
448
+ guard.release();
449
+ return;
450
+ }
451
+ start_with_begin = false;
452
+ next = failed_lock;
453
+ }
454
+ else
455
+ {
456
+ start_with_begin = true;
457
+ next = second;
458
+ }
459
+ }
460
+ }
461
+ }
462
+
463
+ }
464
+
465
+ }
466
+ #include <boost/config/abi_suffix.hpp>
467
+
468
+ #endif