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,135 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
4
+ // Software License, Version 1.0. (See accompanying file
5
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+ // See http://www.boost.org/libs/thread for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+
11
+ #ifndef BOOST_THREAD_POLY_SHARED_LOCKABLE_HPP
12
+ #define BOOST_THREAD_POLY_SHARED_LOCKABLE_HPP
13
+
14
+ #include <boost/thread/poly_lockable.hpp>
15
+ #include <boost/chrono/chrono.hpp>
16
+
17
+ namespace boost
18
+ {
19
+
20
+
21
+ //[shared_poly_lockable
22
+ class shared_poly_lockable: public timed_poly_lockable
23
+ {
24
+ public:
25
+ virtual ~shared_poly_lockable() = 0;
26
+
27
+ virtual void lock_shared() = 0;
28
+ virtual bool try_lock_shared() = 0;
29
+ virtual void unlock_shared() = 0;
30
+
31
+ virtual bool try_lock_shared_until(chrono::system_clock::time_point const & abs_time)=0;
32
+ virtual bool try_lock_shared_until(chrono::steady_clock::time_point const & abs_time)=0;
33
+ template <typename Clock, typename Duration>
34
+ bool try_lock_shared_until(chrono::time_point<Clock, Duration> const & abs_time)
35
+ {
36
+ return try_lock_shared_until(time_point_cast<Clock::time_point>(abs_time));
37
+ }
38
+
39
+ virtual bool try_lock_shared_for(chrono::nanoseconds const & relative_time)=0;
40
+ template <typename Rep, typename Period>
41
+ bool try_lock_shared_for(chrono::duration<Rep, Period> const & rel_time)
42
+ {
43
+ return try_lock_shared_for(duration_cast<Clock::duration>(rel_time));
44
+ }
45
+
46
+ };
47
+
48
+ //]
49
+
50
+ //[upgrade_poly_lockable
51
+ class upgrade_poly_lockable: public shared_poly_lockable
52
+ {
53
+ public:
54
+ virtual ~upgrade_poly_lockable() = 0;
55
+
56
+ virtual void lock_upgrade() = 0;
57
+ virtual bool try_lock_upgrade() = 0;
58
+ virtual void unlock_upgrade() = 0;
59
+
60
+ virtual bool try_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
61
+ virtual bool try_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
62
+ template <typename Clock, typename Duration>
63
+ bool try_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
64
+ {
65
+ return try_lock_upgrade_until(time_point_cast<Clock::time_point>(abs_time));
66
+ }
67
+
68
+ virtual bool try_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
69
+ template <typename Rep, typename Period>
70
+ bool try_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
71
+ {
72
+ return try_lock_upgrade_for(duration_cast<Clock::duration>(rel_time));
73
+ }
74
+
75
+ virtual bool try_unlock_shared_and_lock() = 0;
76
+
77
+ virtual bool try_unlock_shared_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
78
+ virtual bool try_unlock_shared_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
79
+ template <typename Clock, typename Duration>
80
+ bool try_unlock_shared_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
81
+ {
82
+ return try_unlock_shared_and_lock_until(time_point_cast<Clock::time_point>(abs_time));
83
+ }
84
+
85
+ virtual bool try_unlock_shared_and_lock_for(chrono::nanoseconds const & relative_time)=0;
86
+ template <typename Rep, typename Period>
87
+ bool try_unlock_shared_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
88
+ {
89
+ return try_unlock_shared_and_lock_for(duration_cast<Clock::duration>(rel_time));
90
+ }
91
+
92
+ virtual void unlock_and_lock_shared() = 0;
93
+ virtual bool try_unlock_shared_and_lock_upgrade() = 0;
94
+
95
+ virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)=0;
96
+ virtual bool try_unlock_shared_and_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)=0;
97
+ template <typename Clock, typename Duration>
98
+ bool try_unlock_shared_and_lock_upgrade_until(chrono::time_point<Clock, Duration> const & abs_time)
99
+ {
100
+ return try_unlock_shared_and_lock_upgrade_until(time_point_cast<Clock::time_point>(abs_time));
101
+ }
102
+
103
+ virtual bool try_unlock_shared_and_lock_upgrade_for(chrono::nanoseconds const & relative_time)=0;
104
+ template <typename Rep, typename Period>
105
+ bool try_unlock_shared_and_lock_upgrade_for(chrono::duration<Rep, Period> const & rel_time)
106
+ {
107
+ return try_unlock_shared_and_lock_upgrade_for(duration_cast<Clock::duration>(rel_time));
108
+ }
109
+
110
+ virtual void unlock_and_lock_upgrade() = 0;
111
+ virtual void unlock_upgrade_and_lock() = 0;
112
+ virtual bool try_unlock_upgrade_and_lock() = 0;
113
+
114
+ virtual bool try_unlock_upgrade_and_lock_until(chrono::system_clock::time_point const & abs_time)=0;
115
+ virtual bool try_unlock_upgrade_and_lock_until(chrono::steady_clock::time_point const & abs_time)=0;
116
+ template <typename Clock, typename Duration>
117
+ bool try_unlock_upgrade_and_lock_until(chrono::time_point<Clock, Duration> const & abs_time)
118
+ {
119
+ return try_unlock_upgrade_and_lock_until(time_point_cast<Clock::time_point>(abs_time));
120
+ }
121
+
122
+ virtual bool try_unlock_upgrade_and_lock_for(chrono::nanoseconds const & relative_time)=0;
123
+ template <typename Rep, typename Period>
124
+ bool try_unlock_upgrade_and_lock_for(chrono::duration<Rep, Period> const & rel_time)
125
+ {
126
+ return try_unlock_upgrade_and_lock_for(duration_cast<Clock::duration>(rel_time));
127
+ }
128
+
129
+ virtual void unlock_upgrade_and_lock_shared() = 0;
130
+
131
+ };
132
+ //]
133
+
134
+ }
135
+ #endif
@@ -0,0 +1,170 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Vicente J. Botet Escriba 2008-2009,2012. Distributed under the Boost
4
+ // Software License, Version 1.0. (See accompanying file
5
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+ // See http://www.boost.org/libs/thread for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+
11
+ #ifndef BOOST_THREAD_POLY_SHARED_LOCKABLE_ADAPTER_HPP
12
+ #define BOOST_THREAD_POLY_SHARED_LOCKABLE_ADAPTER_HPP
13
+
14
+ #include <boost/thread/poly_lockable_adapter.hpp>
15
+ #include <boost/thread/poly_shared_lockable.hpp>
16
+
17
+ namespace boost
18
+ {
19
+
20
+ //[shared_lockable_adapter
21
+ template <typename Mutex, typename Base=poly_shared_lockable>
22
+ class poly_shared_lockable_adapter: public poly_timed_lockable_adapter<Mutex, Base>
23
+ {
24
+ public:
25
+ typedef Mutex mutex_type;
26
+
27
+ void lock_shared()
28
+ {
29
+ this->mtx().lock_shared();
30
+ }
31
+ bool try_lock_shared()
32
+ {
33
+ return this->mtx().try_lock_shared();
34
+ }
35
+ void unlock_shared()
36
+ {
37
+ this->mtx().unlock_shared();
38
+ }
39
+
40
+ bool try_lock_shared_until(chrono::system_clock::time_point const & abs_time)
41
+ {
42
+ return this->mtx().try_lock_shared_until(abs_time);
43
+ }
44
+ bool try_lock_shared_until(chrono::steady_clock::time_point const & abs_time)
45
+ {
46
+ return this->mtx().try_lock_shared_until(abs_time);
47
+ }
48
+ bool try_lock_shared_for(chrono::nanoseconds const & rel_time)
49
+ {
50
+ return this->mtx().try_lock_shared_for(rel_time);
51
+ }
52
+
53
+ };
54
+
55
+ //]
56
+
57
+ //[upgrade_lockable_adapter
58
+ template <typename Mutex, typename Base=poly_shared_lockable>
59
+ class upgrade_lockable_adapter: public shared_lockable_adapter<Mutex, Base>
60
+ {
61
+ public:
62
+ typedef Mutex mutex_type;
63
+
64
+ void lock_upgrade()
65
+ {
66
+ this->mtx().lock_upgrade();
67
+ }
68
+
69
+ bool try_lock_upgrade()
70
+ {
71
+ return this->mtx().try_lock_upgrade();
72
+ }
73
+
74
+ void unlock_upgrade()
75
+ {
76
+ this->mtx().unlock_upgrade();
77
+ }
78
+
79
+ bool try_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)
80
+ {
81
+ return this->mtx().try_lock_upgrade_until(abs_time);
82
+ }
83
+ bool try_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)
84
+ {
85
+ return this->mtx().try_lock_upgrade_until(abs_time);
86
+ }
87
+ bool try_lock_upgrade_for(chrono::nanoseconds const & rel_time)
88
+ {
89
+ return this->mtx().try_lock_upgrade_for(rel_time);
90
+ }
91
+
92
+ bool try_unlock_shared_and_lock()
93
+ {
94
+ return this->mtx().try_unlock_shared_and_lock();
95
+ }
96
+
97
+ bool try_unlock_shared_and_lock_until(chrono::system_clock::time_point const & abs_time)
98
+ {
99
+ return this->mtx().try_unlock_shared_and_lock_until(abs_time);
100
+ }
101
+ bool try_unlock_shared_and_lock_until(chrono::steady_clock::time_point const & abs_time)
102
+ {
103
+ return this->mtx().try_unlock_shared_and_lock_until(abs_time);
104
+ }
105
+ template <typename Rep, typename Period>
106
+ bool try_unlock_shared_and_lock_for(chrono::nanoseconds const & rel_time)
107
+ {
108
+ return this->mtx().try_unlock_shared_and_lock_for(rel_time);
109
+ }
110
+
111
+ void unlock_and_lock_shared()
112
+ {
113
+ this->mtx().unlock_and_lock_shared();
114
+ }
115
+
116
+ bool try_unlock_shared_and_lock_upgrade()
117
+ {
118
+ return this->mtx().try_unlock_shared_and_lock_upgrade();
119
+ }
120
+
121
+ bool try_unlock_shared_and_lock_upgrade_until(chrono::system_clock::time_point const & abs_time)
122
+ {
123
+ return this->mtx().try_unlock_shared_and_lock_upgrade_until(abs_time);
124
+ }
125
+ bool try_unlock_shared_and_lock_upgrade_until(chrono::steady_clock::time_point const & abs_time)
126
+ {
127
+ return this->mtx().try_unlock_shared_and_lock_upgrade_until(abs_time);
128
+ }
129
+ bool try_unlock_shared_and_lock_upgrade_for(chrono::nanoseconds const & rel_time)
130
+ {
131
+ return this->mtx().try_unlock_shared_and_lock_upgrade_for(rel_time);
132
+ }
133
+
134
+ void unlock_and_lock_upgrade()
135
+ {
136
+ this->mtx().unlock_and_lock_upgrade();
137
+ }
138
+
139
+ void unlock_upgrade_and_lock()
140
+ {
141
+ this->mtx().unlock_upgrade_and_lock();
142
+ }
143
+
144
+ bool try_unlock_upgrade_and_lock()
145
+ {
146
+ return this->mtx().try_unlock_upgrade_and_lock();
147
+ }
148
+ bool try_unlock_upgrade_and_lock_until(chrono::system_clock::time_point const & abs_time)
149
+ {
150
+ return this->mtx().try_unlock_upgrade_and_lock_until(abs_time);
151
+ }
152
+ bool try_unlock_upgrade_and_lock_until(chrono::steady_clock::time_point const & abs_time)
153
+ {
154
+ return this->mtx().try_unlock_upgrade_and_lock_until(abs_time);
155
+ }
156
+ bool try_unlock_upgrade_and_lock_for(chrono::nanoseconds const & rel_time)
157
+ {
158
+ return this->mtx().try_unlock_upgrade_and_lock_for(rel_time);
159
+ }
160
+
161
+ void unlock_upgrade_and_lock_shared()
162
+ {
163
+ this->mtx().unlock_upgrade_and_lock_shared();
164
+ }
165
+
166
+ };
167
+ //]
168
+
169
+ }
170
+ #endif
@@ -4,11 +4,13 @@
4
4
  // accompanying file LICENSE_1_0.txt or copy at
5
5
  // http://www.boost.org/LICENSE_1_0.txt)
6
6
  // (C) Copyright 2007-10 Anthony Williams
7
- // (C) Copyright 2011 Vicente J. Botet Escriba
7
+ // (C) Copyright 2011-2012 Vicente J. Botet Escriba
8
8
 
9
9
  #include <boost/thread/pthread/timespec.hpp>
10
10
  #include <boost/thread/pthread/pthread_mutex_scoped_lock.hpp>
11
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
11
12
  #include <boost/thread/pthread/thread_data.hpp>
13
+ #endif
12
14
  #include <boost/thread/pthread/condition_variable_fwd.hpp>
13
15
  #ifdef BOOST_THREAD_USES_CHRONO
14
16
  #include <boost/chrono/system_clocks.hpp>
@@ -20,10 +22,12 @@
20
22
 
21
23
  namespace boost
22
24
  {
25
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
23
26
  namespace this_thread
24
27
  {
25
28
  void BOOST_THREAD_DECL interruption_point();
26
29
  }
30
+ #endif
27
31
 
28
32
  namespace thread_cv_detail
29
33
  {
@@ -53,57 +57,88 @@ namespace boost
53
57
 
54
58
  inline void condition_variable::wait(unique_lock<mutex>& m)
55
59
  {
60
+ #if defined BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
61
+ if(! m.owns_lock())
62
+ {
63
+ boost::throw_exception(condition_error(-1, "boost::condition_variable::wait() failed precondition mutex not owned"));
64
+ }
65
+ #endif
56
66
  int res=0;
57
67
  {
68
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
58
69
  thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
59
70
  detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
60
71
  guard.activate(m);
61
72
  do {
62
73
  res = pthread_cond_wait(&cond,&internal_mutex);
63
74
  } while (res == EINTR);
75
+ #else
76
+ //boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
77
+ pthread_mutex_t* the_mutex = m.mutex()->native_handle();
78
+ do {
79
+ res = pthread_cond_wait(&cond,the_mutex);
80
+ } while (res == EINTR);
81
+ #endif
64
82
  }
83
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
65
84
  this_thread::interruption_point();
85
+ #endif
66
86
  if(res)
67
87
  {
68
- boost::throw_exception(condition_error(res, "boost:: condition_variable constructor failed in pthread_cond_wait"));
88
+ boost::throw_exception(condition_error(res, "boost::condition_variable::wait failed in pthread_cond_wait"));
69
89
  }
70
90
  }
71
91
 
72
- inline bool condition_variable::do_timed_wait(
92
+ inline bool condition_variable::do_wait_until(
73
93
  unique_lock<mutex>& m,
74
94
  struct timespec const &timeout)
75
95
  {
96
+ #if defined BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
76
97
  if (!m.owns_lock())
77
- boost::throw_exception(condition_error(EPERM, "condition_variable do_timed_wait: mutex not locked"));
78
-
98
+ {
99
+ boost::throw_exception(condition_error(EPERM, "boost::condition_variable::do_wait_until() failed precondition mutex not owned"));
100
+ }
101
+ #endif
79
102
  thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
80
103
  int cond_res;
81
104
  {
105
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
82
106
  detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
83
107
  guard.activate(m);
84
108
  cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
109
+ #else
110
+ //boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
111
+ pthread_mutex_t* the_mutex = m.mutex()->native_handle();
112
+ cond_res=pthread_cond_timedwait(&cond,the_mutex,&timeout);
113
+ #endif
85
114
  }
115
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
86
116
  this_thread::interruption_point();
117
+ #endif
87
118
  if(cond_res==ETIMEDOUT)
88
119
  {
89
120
  return false;
90
121
  }
91
122
  if(cond_res)
92
123
  {
93
- boost::throw_exception(condition_error(cond_res, "condition_variable failed in pthread_cond_timedwait"));
124
+ boost::throw_exception(condition_error(cond_res, "boost::condition_variable::do_wait_until failed in pthread_cond_timedwait"));
94
125
  }
95
126
  return true;
96
127
  }
97
128
 
98
129
  inline void condition_variable::notify_one() BOOST_NOEXCEPT
99
130
  {
131
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
100
132
  boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex);
133
+ #endif
101
134
  BOOST_VERIFY(!pthread_cond_signal(&cond));
102
135
  }
103
136
 
104
137
  inline void condition_variable::notify_all() BOOST_NOEXCEPT
105
138
  {
139
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
106
140
  boost::pthread::pthread_mutex_scoped_lock internal_lock(&internal_mutex);
141
+ #endif
107
142
  BOOST_VERIFY(!pthread_cond_broadcast(&cond));
108
143
  }
109
144
 
@@ -119,13 +154,13 @@ namespace boost
119
154
  int const res=pthread_mutex_init(&internal_mutex,NULL);
120
155
  if(res)
121
156
  {
122
- boost::throw_exception(thread_resource_error(res, "condition_variable_any failed in pthread_mutex_init"));
157
+ boost::throw_exception(thread_resource_error(res, "boost::condition_variable_any::condition_variable_any() failed in pthread_mutex_init"));
123
158
  }
124
159
  int const res2=pthread_cond_init(&cond,NULL);
125
160
  if(res2)
126
161
  {
127
162
  BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex));
128
- boost::throw_exception(thread_resource_error(res, "condition_variable_any failed in pthread_cond_init"));
163
+ boost::throw_exception(thread_resource_error(res, "boost::condition_variable_any::condition_variable_any() failed in pthread_cond_init"));
129
164
  }
130
165
  }
131
166
  ~condition_variable_any()
@@ -140,14 +175,20 @@ namespace boost
140
175
  int res=0;
141
176
  {
142
177
  thread_cv_detail::lock_on_exit<lock_type> guard;
178
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
143
179
  detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
180
+ #else
181
+ boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
182
+ #endif
144
183
  guard.activate(m);
145
184
  res=pthread_cond_wait(&cond,&internal_mutex);
146
185
  }
186
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
147
187
  this_thread::interruption_point();
188
+ #endif
148
189
  if(res)
149
190
  {
150
- boost::throw_exception(condition_error(res, "condition_variable_any failed in pthread_cond_wait"));
191
+ boost::throw_exception(condition_error(res, "boost::condition_variable_any::wait() failed in pthread_cond_wait"));
151
192
  }
152
193
  }
153
194
 
@@ -157,11 +198,12 @@ namespace boost
157
198
  while(!pred()) wait(m);
158
199
  }
159
200
 
201
+ #if defined BOOST_THREAD_USES_DATETIME
160
202
  template<typename lock_type>
161
203
  bool timed_wait(lock_type& m,boost::system_time const& wait_until)
162
204
  {
163
- struct timespec const timeout=detail::get_timespec(wait_until);
164
- return do_timed_wait(m, timeout);
205
+ struct timespec const timeout=detail::to_timespec(wait_until);
206
+ return do_wait_until(m, timeout);
165
207
  }
166
208
  template<typename lock_type>
167
209
  bool timed_wait(lock_type& m,xtime const& wait_until)
@@ -197,7 +239,7 @@ namespace boost
197
239
  {
198
240
  return timed_wait(m,get_system_time()+wait_duration,pred);
199
241
  }
200
-
242
+ #endif
201
243
  #ifdef BOOST_THREAD_USES_CHRONO
202
244
  template <class lock_type,class Duration>
203
245
  cv_status
@@ -265,26 +307,26 @@ namespace boost
265
307
  const chrono::duration<Rep, Period>& d,
266
308
  Predicate pred)
267
309
  {
268
- while (!pred())
269
- {
270
- if (wait_for(lock, d) == cv_status::timeout)
271
- return pred();
272
- }
273
- return true;
310
+ return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
311
+
312
+ // while (!pred())
313
+ // {
314
+ // if (wait_for(lock, d) == cv_status::timeout)
315
+ // return pred();
316
+ // }
317
+ // return true;
274
318
  }
275
319
 
276
320
  template <class lock_type>
277
- inline void wait_until(
321
+ cv_status wait_until(
278
322
  lock_type& lk,
279
323
  chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
280
324
  {
281
325
  using namespace chrono;
282
326
  nanoseconds d = tp.time_since_epoch();
283
- timespec ts;
284
- seconds s = duration_cast<seconds>(d);
285
- ts.tv_sec = static_cast<long>(s.count());
286
- ts.tv_nsec = static_cast<long>((d - s).count());
287
- do_timed_wait(lk, ts);
327
+ timespec ts = boost::detail::to_timespec(d);
328
+ if (do_wait_until(lk, ts)) return cv_status::no_timeout;
329
+ else return cv_status::timeout;
288
330
  }
289
331
  #endif
290
332
 
@@ -302,25 +344,31 @@ namespace boost
302
344
  private: // used by boost::thread::try_join_until
303
345
 
304
346
  template <class lock_type>
305
- inline bool do_timed_wait(
347
+ inline bool do_wait_until(
306
348
  lock_type& m,
307
349
  struct timespec const &timeout)
308
350
  {
309
351
  int res=0;
310
352
  {
311
353
  thread_cv_detail::lock_on_exit<lock_type> guard;
354
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
312
355
  detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
356
+ #else
357
+ boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
358
+ #endif
313
359
  guard.activate(m);
314
360
  res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
315
361
  }
362
+ #if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
316
363
  this_thread::interruption_point();
364
+ #endif
317
365
  if(res==ETIMEDOUT)
318
366
  {
319
367
  return false;
320
368
  }
321
369
  if(res)
322
370
  {
323
- boost::throw_exception(condition_error(res, "condition_variable_any failed in pthread_cond_timedwait"));
371
+ boost::throw_exception(condition_error(res, "boost::condition_variable_any::do_wait_until() failed in pthread_cond_timedwait"));
324
372
  }
325
373
  return true;
326
374
  }