passenger 4.0.20 → 4.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -6,7 +6,8 @@
6
6
  #ifndef BOOST_THREAD_SHARED_LOCK_GUARD_HPP
7
7
  #define BOOST_THREAD_SHARED_LOCK_GUARD_HPP
8
8
  #include <boost/thread/detail/config.hpp>
9
- #include <boost/thread/locks.hpp>
9
+ //#include <boost/thread/locks.hpp>
10
+ #include <boost/thread/lock_options.hpp>
10
11
  #include <boost/thread/detail/delete.hpp>
11
12
 
12
13
  namespace boost
@@ -18,9 +18,32 @@
18
18
  #include <boost/thread/win32/shared_mutex.hpp>
19
19
  #endif
20
20
  #elif defined(BOOST_THREAD_PLATFORM_PTHREAD)
21
+ //#include <boost/thread/v2/shared_mutex.hpp>
21
22
  #include <boost/thread/pthread/shared_mutex.hpp>
22
23
  #else
23
24
  #error "Boost threads unavailable on this platform"
24
25
  #endif
25
26
 
27
+ #include <boost/thread/lockable_traits.hpp>
28
+
29
+ namespace boost
30
+ {
31
+ namespace sync
32
+ {
33
+ #ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
34
+ template<>
35
+ struct is_basic_lockable<shared_mutex>
36
+ {
37
+ BOOST_STATIC_CONSTANT(bool, value = true);
38
+ };
39
+ template<>
40
+ struct is_lockable<shared_mutex>
41
+ {
42
+ BOOST_STATIC_CONSTANT(bool, value = true);
43
+ };
44
+ #endif
45
+
46
+ }
47
+ }
48
+
26
49
  #endif
@@ -0,0 +1,235 @@
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 2008-2009,2012 Vicente J. Botet Escriba
5
+
6
+ #ifndef BOOST_THREAD_STRICT_LOCK_HPP
7
+ #define BOOST_THREAD_STRICT_LOCK_HPP
8
+
9
+ #include <boost/thread/detail/config.hpp>
10
+ #include <boost/thread/detail/delete.hpp>
11
+ #include <boost/thread/detail/lockable_wrapper.hpp>
12
+ #include <boost/thread/lock_options.hpp>
13
+ #include <boost/thread/lock_traits.hpp>
14
+ #include <boost/thread/lockable_traits.hpp>
15
+ #include <boost/thread/lockable_concepts.hpp>
16
+ #include <boost/thread/lock_concepts.hpp>
17
+ #include <boost/thread/exceptions.hpp>
18
+ #include <boost/throw_exception.hpp>
19
+
20
+ #include <boost/config/abi_prefix.hpp>
21
+
22
+ namespace boost
23
+ {
24
+
25
+
26
+ //[strict_lock
27
+ template <typename Lockable>
28
+ class strict_lock
29
+ {
30
+
31
+ BOOST_CONCEPT_ASSERT(( BasicLockable<Lockable> ));
32
+ public:
33
+ typedef Lockable mutex_type;
34
+
35
+ // construct/copy/destroy:
36
+
37
+ BOOST_THREAD_NO_COPYABLE( strict_lock)
38
+
39
+ /**
40
+ * Constructor from a mutex reference.
41
+ *
42
+ * @param mtx the mutex to lock.
43
+ *
44
+ * __Effects: Stores a reference to the mutex to lock and locks it.
45
+ * __Throws: Any exception BasicMutex::lock() can throw.
46
+ */
47
+ explicit strict_lock(mutex_type& mtx) :
48
+ mtx_(mtx)
49
+ {
50
+ mtx.lock();
51
+ } /*< locks on construction >*/
52
+
53
+
54
+ #if ! defined BOOST_THREAD_NO_CXX11_HDR_INITIALIZER_LIST
55
+ strict_lock(std::initializer_list<thread_detail::lockable_wrapper<Lockable> > l_) :
56
+ mtx_(*(const_cast<thread_detail::lockable_wrapper<Lockable>*>(l_.begin())->m))
57
+ {
58
+ mtx_.lock();
59
+ }
60
+ #endif
61
+
62
+ /**
63
+ * Destructor
64
+ *
65
+ * __Effects: unlocks the stored mutex.
66
+ *
67
+ * __Throws
68
+ */
69
+ ~strict_lock()
70
+ {
71
+ mtx_.unlock();
72
+ } /*< unlocks on destruction >*/
73
+
74
+
75
+ // observers
76
+
77
+ /**
78
+ * @return the owned mutex.
79
+ */
80
+ mutex_type* mutex() const BOOST_NOEXCEPT
81
+ {
82
+ return &mtx_;
83
+ }
84
+
85
+ /**
86
+ * @return whether this lock is locking a mutex.
87
+ */
88
+ bool owns_lock() const BOOST_NOEXCEPT
89
+ {
90
+ return true;
91
+ }
92
+
93
+ /**
94
+ * @return whether this lock is locking that mutex.
95
+ */
96
+ bool owns_lock(const mutex_type* l) const BOOST_NOEXCEPT
97
+ {
98
+ return l == mutex();
99
+ } /*< strict locks specific function >*/
100
+
101
+ //BOOST_ADRESS_OF_DELETE(strict_lock) /*< disable aliasing >*/
102
+ //BOOST_HEAP_ALLOCATION_DELETE(strict_lock) /*< disable heap allocation >*/
103
+
104
+ /*< no possibility to unlock >*/
105
+
106
+ private:
107
+ mutex_type& mtx_;
108
+ };
109
+ //]
110
+ template <typename Lockable>
111
+ struct is_strict_lock_sur_parole<strict_lock<Lockable> > : true_type
112
+ {
113
+ };
114
+
115
+ /**
116
+ * A nested strict lock is a scoped lock guard ensuring the mutex is locked on its
117
+ * scope, by taking ownership of an nesting lock, locking the mutex on construction if not already locked
118
+ * and restoring the ownership to the nesting lock on destruction.
119
+ */
120
+ //[nested_strict_lock
121
+ template <typename Lock>
122
+ class nested_strict_lock
123
+ {
124
+ BOOST_CONCEPT_ASSERT(( BasicLock<Lock> )); /*< The Lock must be a movable lock >*/
125
+ public:
126
+ typedef typename Lock::mutex_type mutex_type; /*< Name the lockable type locked by Lock >*/
127
+
128
+ BOOST_THREAD_NO_COPYABLE( nested_strict_lock)
129
+
130
+ /**
131
+ * Constructor from a nesting @c Lock.
132
+ *
133
+ * @param lk the nesting lock
134
+ *
135
+ * __Requires: <c>lk.mutex() != null_ptr</c>
136
+ * __Effects: Stores the reference to the lock parameter and takes ownership on it.
137
+ * If the lock doesn't owns the mutex @c mtx lock it.
138
+ * __Postconditions: @c owns_lock(lk.mutex())
139
+ * __StrongException
140
+ * __Throws:
141
+ *
142
+ * - lock_error when BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED is defined and lk.mutex() == null_ptr
143
+ *
144
+ * - Any exception that @c lk.lock() can throw.
145
+ *
146
+ */
147
+ explicit nested_strict_lock(Lock& lk) :
148
+ lk_(lk) /*< Store reference to lk >*/
149
+ {
150
+ /*< Define BOOST_THREAD_DONT_CHECK_PRECONDITIONS if you don't want to check lk ownership >*/
151
+ BOOST_THREAD_ASSERT_PRECONDITION( lk.mutex() != 0,
152
+ lock_error()
153
+ );
154
+ if (!lk.owns_lock()) lk.lock(); /*< ensures it is locked >*/
155
+ tmp_lk_ = move(lk); /*< Move ownership to temporary lk >*/
156
+ }
157
+
158
+ #if ! defined BOOST_THREAD_NO_CXX11_HDR_INITIALIZER_LIST
159
+ nested_strict_lock(std::initializer_list<thread_detail::lockable_wrapper<Lock> > l_) :
160
+ lk_(*(const_cast<thread_detail::lockable_wrapper<Lock>*>(l_.begin())->m))
161
+ {
162
+ /*< Define BOOST_THREAD_DONT_CHECK_PRECONDITIONS if you don't want to check lk ownership >*/
163
+ BOOST_THREAD_ASSERT_PRECONDITION( lk_.mutex() != 0,
164
+ lock_error()
165
+ );
166
+ if (!lk_.owns_lock()) lk_.lock(); /*< ensures it is locked >*/
167
+ tmp_lk_ = move(lk_); /*< Move ownership to temporary lk >*/
168
+ }
169
+ #endif
170
+
171
+ /**
172
+ * Destructor
173
+ *
174
+ * __Effects: Restores ownership to the nesting lock.
175
+ */
176
+ ~nested_strict_lock()BOOST_NOEXCEPT
177
+ {
178
+ lk_ = move(tmp_lk_); /*< Move ownership to nesting lock >*/
179
+ }
180
+
181
+ // observers
182
+ /**
183
+ * return @c the owned mutex.
184
+ */
185
+ mutex_type* mutex() const BOOST_NOEXCEPT
186
+ {
187
+ return tmp_lk_.mutex();
188
+ }
189
+
190
+ /**
191
+ * @return whether this lock is locking a mutex.
192
+ */
193
+ bool owns_lock() const BOOST_NOEXCEPT
194
+ {
195
+ return true;
196
+ }
197
+
198
+ /**
199
+ * @return whether if this lock is locking that mutex.
200
+ */
201
+ bool owns_lock(mutex_type const* l) const BOOST_NOEXCEPT
202
+ {
203
+ return l == mutex();
204
+ }
205
+
206
+ //BOOST_ADRESS_OF_DELETE(nested_strict_lock)
207
+ //BOOST_HEAP_ALLOCATEION_DELETE(nested_strict_lock)
208
+
209
+ private:
210
+ Lock& lk_;
211
+ Lock tmp_lk_;
212
+ };
213
+ //]
214
+
215
+ template <typename Lock>
216
+ struct is_strict_lock_sur_parole<nested_strict_lock<Lock> > : true_type
217
+ {
218
+ };
219
+
220
+ #if ! defined BOOST_THREAD_NO_MAKE_STRICT_LOCK
221
+ template <typename Lockable>
222
+ strict_lock<Lockable> make_strict_lock(Lockable& mtx)
223
+ {
224
+ return { thread_detail::lockable_wrapper<Lockable>(mtx) };
225
+ }
226
+ template <typename Lock>
227
+ nested_strict_lock<Lock> make_nested_strict_lock(Lock& lk)
228
+ {
229
+ return { thread_detail::lockable_wrapper<Lock>(lk) };
230
+ }
231
+ #endif
232
+ }
233
+ #include <boost/config/abi_suffix.hpp>
234
+
235
+ #endif
@@ -0,0 +1,594 @@
1
+ #ifndef BOOST_THREAD_SYNC_BOUNDED_QUEUE_HPP
2
+ #define BOOST_THREAD_SYNC_BOUNDED_QUEUE_HPP
3
+
4
+ //////////////////////////////////////////////////////////////////////////////
5
+ //
6
+ // (C) Copyright Vicente J. Botet Escriba 2013. Distributed under the Boost
7
+ // Software License, Version 1.0. (See accompanying file
8
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9
+ //
10
+ // See http://www.boost.org/libs/thread for documentation.
11
+ //
12
+ //////////////////////////////////////////////////////////////////////////////
13
+
14
+ #include <boost/thread/detail/config.hpp>
15
+ #include <boost/thread/condition_variable.hpp>
16
+ #include <boost/thread/mutex.hpp>
17
+ #include <boost/thread/detail/move.hpp>
18
+ #include <boost/throw_exception.hpp>
19
+ #include <boost/smart_ptr/shared_ptr.hpp>
20
+ #include <boost/smart_ptr/make_shared.hpp>
21
+
22
+ #include <boost/config/abi_prefix.hpp>
23
+
24
+ namespace boost
25
+ {
26
+
27
+ BOOST_SCOPED_ENUM_DECLARE_BEGIN(queue_op_status)
28
+ { success = 0, empty, full, closed, busy }
29
+ BOOST_SCOPED_ENUM_DECLARE_END(queue_op_status)
30
+
31
+ struct no_block_tag{};
32
+ BOOST_CONSTEXPR_OR_CONST no_block_tag no_block = {};
33
+
34
+ struct sync_queue_is_closed : std::exception {};
35
+
36
+ template <typename ValueType>
37
+ class sync_bounded_queue
38
+ {
39
+ public:
40
+ typedef ValueType value_type;
41
+ typedef std::size_t size_type;
42
+
43
+ // Constructors/Assignment/Destructors
44
+ BOOST_THREAD_NO_COPYABLE(sync_bounded_queue)
45
+ explicit sync_bounded_queue(size_type max_elems);
46
+ template <typename Range>
47
+ sync_bounded_queue(size_type max_elems, Range range);
48
+ ~sync_bounded_queue();
49
+
50
+ // Observers
51
+ bool empty() const;
52
+ bool full() const;
53
+ size_type capacity() const;
54
+ size_type size() const;
55
+ bool closed() const;
56
+
57
+ // Modifiers
58
+ void close();
59
+
60
+ void push(const value_type& x);
61
+ void push(BOOST_THREAD_RV_REF(value_type) x);
62
+ bool try_push(const value_type& x);
63
+ bool try_push(BOOST_THREAD_RV_REF(value_type) x);
64
+ bool try_push(no_block_tag, const value_type& x);
65
+ bool try_push(no_block_tag, BOOST_THREAD_RV_REF(value_type) x);
66
+
67
+ // Observers/Modifiers
68
+ void pull(value_type&);
69
+ void pull(ValueType& elem, bool & closed);
70
+ // enable_if is_nothrow_copy_movable<value_type>
71
+ value_type pull();
72
+ shared_ptr<ValueType> ptr_pull();
73
+ bool try_pull(value_type&);
74
+ bool try_pull(no_block_tag,value_type&);
75
+ shared_ptr<ValueType> try_pull();
76
+
77
+ private:
78
+ mutable mutex mtx_;
79
+ condition_variable not_empty_;
80
+ condition_variable not_full_;
81
+ size_type waiting_full_;
82
+ size_type waiting_empty_;
83
+ value_type* data_;
84
+ size_type in_;
85
+ size_type out_;
86
+ size_type capacity_;
87
+ bool closed_;
88
+
89
+ size_type inc(size_type idx) const BOOST_NOEXCEPT
90
+ {
91
+ return (idx + 1) % capacity_;
92
+ }
93
+
94
+ bool empty(unique_lock<mutex>& ) const BOOST_NOEXCEPT
95
+ {
96
+ return in_ == out_;
97
+ }
98
+ bool empty(lock_guard<mutex>& ) const BOOST_NOEXCEPT
99
+ {
100
+ return in_ == out_;
101
+ }
102
+ size_type capacity(lock_guard<mutex>& ) const BOOST_NOEXCEPT
103
+ {
104
+ return capacity;
105
+ }
106
+ size_type size(lock_guard<mutex>& ) const BOOST_NOEXCEPT
107
+ {
108
+ return ((out_+capacity_-in_) % capacity_)-1;
109
+ }
110
+
111
+ void throw_if_closed(unique_lock<mutex>&);
112
+
113
+ bool try_pull(value_type& x, unique_lock<mutex>& lk);
114
+ bool try_push(const value_type& x, unique_lock<mutex>& lk);
115
+ bool try_push(BOOST_THREAD_RV_REF(value_type) x, unique_lock<mutex>& lk);
116
+ shared_ptr<value_type> try_pull(unique_lock<mutex>& lk);
117
+
118
+ void wait_until_not_empty(unique_lock<mutex>& lk);
119
+ void wait_until_not_empty(unique_lock<mutex>& lk, bool&);
120
+ size_type wait_until_not_full(unique_lock<mutex>& lk);
121
+ size_type wait_until_not_full(unique_lock<mutex>& lk, bool&);
122
+
123
+
124
+ void notify_not_empty_if_needed(unique_lock<mutex>& lk)
125
+ {
126
+ if (waiting_empty_ > 0)
127
+ {
128
+ --waiting_empty_;
129
+ lk.unlock();
130
+ not_empty_.notify_one();
131
+ }
132
+ }
133
+ void notify_not_full_if_needed(unique_lock<mutex>& lk)
134
+ {
135
+ if (waiting_full_ > 0)
136
+ {
137
+ --waiting_full_;
138
+ lk.unlock();
139
+ not_full_.notify_one();
140
+ }
141
+ }
142
+
143
+ void pull(value_type& elem, unique_lock<mutex>& lk)
144
+ {
145
+ elem = boost::move(data_[out_]);
146
+ out_ = inc(out_);
147
+ notify_not_full_if_needed(lk);
148
+ }
149
+ boost::shared_ptr<value_type> ptr_pull(unique_lock<mutex>& lk)
150
+ {
151
+ shared_ptr<value_type> res = make_shared<value_type>(boost::move(data_[out_]));
152
+ out_ = inc(out_);
153
+ notify_not_full_if_needed(lk);
154
+ return res;
155
+ }
156
+
157
+
158
+ void set_in(size_type in, unique_lock<mutex>& lk)
159
+ {
160
+ in_ = in;
161
+ notify_not_empty_if_needed(lk);
162
+ }
163
+
164
+ void push_at(const value_type& elem, size_type in_p_1, unique_lock<mutex>& lk)
165
+ {
166
+ data_[in_] = elem;
167
+ set_in(in_p_1, lk);
168
+ }
169
+
170
+ void push_at(BOOST_THREAD_RV_REF(value_type) elem, size_type in_p_1, unique_lock<mutex>& lk)
171
+ {
172
+ data_[in_] = boost::move(elem);
173
+ set_in(in_p_1, lk);
174
+ }
175
+
176
+
177
+ };
178
+
179
+ template <typename ValueType>
180
+ sync_bounded_queue<ValueType>::sync_bounded_queue(typename sync_bounded_queue<ValueType>::size_type max_elems) :
181
+ waiting_full_(0), waiting_empty_(0), data_(new value_type[max_elems + 1]), in_(0), out_(0), capacity_(max_elems + 1),
182
+ closed_(false)
183
+ {
184
+ BOOST_ASSERT_MSG(max_elems >= 1, "number of elements must be > 1");
185
+ }
186
+
187
+ // template <typename ValueType>
188
+ // template <typename Range>
189
+ // sync_bounded_queue<ValueType>::sync_bounded_queue(size_type max_elems, Range range) :
190
+ // waiting_full_(0), waiting_empty_(0), data_(new value_type[max_elems + 1]), in_(0), out_(0), capacity_(max_elems + 1),
191
+ // closed_(false)
192
+ // {
193
+ // BOOST_ASSERT_MSG(max_elems >= 1, "number of elements must be > 1");
194
+ // BOOST_ASSERT_MSG(max_elems == size(range), "number of elements must match range's size");
195
+ // try
196
+ // {
197
+ // typedef typename Range::iterator iterator_t;
198
+ // iterator_t first = boost::begin(range);
199
+ // iterator_t end = boost::end(range);
200
+ // size_type in = 0;
201
+ // for (iterator_t cur = first; cur != end; ++cur, ++in)
202
+ // {
203
+ // data_[in] = *cur;
204
+ // }
205
+ // set_in(in);
206
+ // }
207
+ // catch (...)
208
+ // {
209
+ // delete[] data_;
210
+ // }
211
+ // }
212
+
213
+ template <typename ValueType>
214
+ sync_bounded_queue<ValueType>::~sync_bounded_queue()
215
+ {
216
+ delete[] data_;
217
+ }
218
+
219
+ template <typename ValueType>
220
+ void sync_bounded_queue<ValueType>::close()
221
+ {
222
+ {
223
+ lock_guard<mutex> lk(mtx_);
224
+ closed_ = true;
225
+ }
226
+ not_empty_.notify_all();
227
+ not_full_.notify_all();
228
+ }
229
+
230
+ template <typename ValueType>
231
+ bool sync_bounded_queue<ValueType>::closed() const
232
+ {
233
+ lock_guard<mutex> lk(mtx_);
234
+ return closed_;
235
+ }
236
+
237
+ template <typename ValueType>
238
+ bool sync_bounded_queue<ValueType>::empty() const
239
+ {
240
+ lock_guard<mutex> lk(mtx_);
241
+ return empty(lk);
242
+ }
243
+ template <typename ValueType>
244
+ bool sync_bounded_queue<ValueType>::full() const
245
+ {
246
+ lock_guard<mutex> lk(mtx_);
247
+ return full(lk);
248
+ }
249
+
250
+ template <typename ValueType>
251
+ typename sync_bounded_queue<ValueType>::size_type sync_bounded_queue<ValueType>::capacity() const
252
+ {
253
+ lock_guard<mutex> lk(mtx_);
254
+ return capacity(lk);
255
+ }
256
+
257
+ template <typename ValueType>
258
+ typename sync_bounded_queue<ValueType>::size_type sync_bounded_queue<ValueType>::size() const
259
+ {
260
+ lock_guard<mutex> lk(mtx_);
261
+ return size(lk);
262
+ }
263
+
264
+
265
+ template <typename ValueType>
266
+ bool sync_bounded_queue<ValueType>::try_pull(ValueType& elem, unique_lock<mutex>& lk)
267
+ {
268
+ if (empty(lk))
269
+ {
270
+ throw_if_closed(lk);
271
+ return false;
272
+ }
273
+ pull(elem, lk);
274
+ return true;
275
+ }
276
+ template <typename ValueType>
277
+ shared_ptr<ValueType> sync_bounded_queue<ValueType>::try_pull(unique_lock<mutex>& lk)
278
+ {
279
+ if (empty(lk))
280
+ {
281
+ throw_if_closed(lk);
282
+ return shared_ptr<ValueType>();
283
+ }
284
+ return ptr_pull(lk);
285
+ }
286
+
287
+ template <typename ValueType>
288
+ bool sync_bounded_queue<ValueType>::try_pull(ValueType& elem)
289
+ {
290
+ try
291
+ {
292
+ unique_lock<mutex> lk(mtx_);
293
+ return try_pull(elem, lk);
294
+ }
295
+ catch (...)
296
+ {
297
+ close();
298
+ throw;
299
+ }
300
+ }
301
+
302
+ template <typename ValueType>
303
+ bool sync_bounded_queue<ValueType>::try_pull(no_block_tag,ValueType& elem)
304
+ {
305
+ try
306
+ {
307
+ unique_lock<mutex> lk(mtx_, try_to_lock);
308
+ if (!lk.owns_lock())
309
+ {
310
+ return false;
311
+ }
312
+ return try_pull(elem, lk);
313
+ }
314
+ catch (...)
315
+ {
316
+ close();
317
+ throw;
318
+ }
319
+ }
320
+ template <typename ValueType>
321
+ boost::shared_ptr<ValueType> sync_bounded_queue<ValueType>::try_pull()
322
+ {
323
+ try
324
+ {
325
+ unique_lock<mutex> lk(mtx_);
326
+ return try_pull(lk);
327
+ }
328
+ catch (...)
329
+ {
330
+ close();
331
+ throw;
332
+ }
333
+ }
334
+
335
+ template <typename ValueType>
336
+ void sync_bounded_queue<ValueType>::throw_if_closed(unique_lock<mutex>&)
337
+ {
338
+ if (closed_)
339
+ {
340
+ BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
341
+ }
342
+ }
343
+
344
+ template <typename ValueType>
345
+ void sync_bounded_queue<ValueType>::wait_until_not_empty(unique_lock<mutex>& lk)
346
+ {
347
+ for (;;)
348
+ {
349
+ if (out_ != in_) break;
350
+ throw_if_closed(lk);
351
+ ++waiting_empty_;
352
+ not_empty_.wait(lk);
353
+ }
354
+ }
355
+ template <typename ValueType>
356
+ void sync_bounded_queue<ValueType>::wait_until_not_empty(unique_lock<mutex>& lk, bool & closed)
357
+ {
358
+ for (;;)
359
+ {
360
+ if (out_ != in_) break;
361
+ if (closed_) {closed=true; return;}
362
+ ++waiting_empty_;
363
+ not_empty_.wait(lk);
364
+ }
365
+ }
366
+
367
+ template <typename ValueType>
368
+ void sync_bounded_queue<ValueType>::pull(ValueType& elem)
369
+ {
370
+ try
371
+ {
372
+ unique_lock<mutex> lk(mtx_);
373
+ wait_until_not_empty(lk);
374
+ pull(elem, lk);
375
+ }
376
+ catch (...)
377
+ {
378
+ close();
379
+ throw;
380
+ }
381
+ }
382
+ template <typename ValueType>
383
+ void sync_bounded_queue<ValueType>::pull(ValueType& elem, bool & closed)
384
+ {
385
+ try
386
+ {
387
+ unique_lock<mutex> lk(mtx_);
388
+ wait_until_not_empty(lk, closed);
389
+ if (closed) {return;}
390
+ pull(elem, lk);
391
+ }
392
+ catch (...)
393
+ {
394
+ close();
395
+ throw;
396
+ }
397
+ }
398
+
399
+ // enable if ValueType is nothrow movable
400
+ template <typename ValueType>
401
+ ValueType sync_bounded_queue<ValueType>::pull()
402
+ {
403
+ try
404
+ {
405
+ value_type elem;
406
+ pull(elem);
407
+ return boost::move(elem);
408
+ }
409
+ catch (...)
410
+ {
411
+ close();
412
+ throw;
413
+ }
414
+ }
415
+ template <typename ValueType>
416
+ boost::shared_ptr<ValueType> sync_bounded_queue<ValueType>::ptr_pull()
417
+ {
418
+ try
419
+ {
420
+ unique_lock<mutex> lk(mtx_);
421
+ wait_until_not_empty(lk);
422
+ return ptr_pull(lk);
423
+ }
424
+ catch (...)
425
+ {
426
+ close();
427
+ throw;
428
+ }
429
+ }
430
+
431
+ template <typename ValueType>
432
+ bool sync_bounded_queue<ValueType>::try_push(const ValueType& elem, unique_lock<mutex>& lk)
433
+ {
434
+ throw_if_closed(lk);
435
+ size_type in_p_1 = inc(in_);
436
+ if (in_p_1 == out_) // full()
437
+ {
438
+ return false;
439
+ }
440
+ push_at(elem, in_p_1, lk);
441
+ return true;
442
+ }
443
+
444
+ template <typename ValueType>
445
+ bool sync_bounded_queue<ValueType>::try_push(const ValueType& elem)
446
+ {
447
+ try
448
+ {
449
+ unique_lock<mutex> lk(mtx_);
450
+ return try_push(elem, lk);
451
+ }
452
+ catch (...)
453
+ {
454
+ close();
455
+ throw;
456
+ }
457
+ }
458
+
459
+ template <typename ValueType>
460
+ bool sync_bounded_queue<ValueType>::try_push(no_block_tag, const ValueType& elem)
461
+ {
462
+ try
463
+ {
464
+ unique_lock<mutex> lk(mtx_, try_to_lock);
465
+ if (!lk.owns_lock()) return false;
466
+ return try_push(elem, lk);
467
+ }
468
+ catch (...)
469
+ {
470
+ close();
471
+ throw;
472
+ }
473
+ }
474
+
475
+
476
+ template <typename ValueType>
477
+ typename sync_bounded_queue<ValueType>::size_type sync_bounded_queue<ValueType>::wait_until_not_full(unique_lock<mutex>& lk)
478
+ {
479
+ for (;;)
480
+ {
481
+ throw_if_closed(lk);
482
+ size_type in_p_1 = inc(in_);
483
+ if (in_p_1 != out_) // ! full()
484
+ {
485
+ return in_p_1;
486
+ }
487
+ ++waiting_full_;
488
+ not_full_.wait(lk);
489
+ }
490
+ }
491
+
492
+ template <typename ValueType>
493
+ void sync_bounded_queue<ValueType>::push(const ValueType& elem)
494
+ {
495
+ try
496
+ {
497
+ unique_lock<mutex> lk(mtx_);
498
+ push_at(elem, wait_until_not_full(lk), lk);
499
+ }
500
+ catch (...)
501
+ {
502
+ close();
503
+ throw;
504
+ }
505
+ }
506
+
507
+ template <typename ValueType>
508
+ bool sync_bounded_queue<ValueType>::try_push(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
509
+ {
510
+ throw_if_closed(lk);
511
+ size_type in_p_1 = inc(in_);
512
+ if (in_p_1 == out_) // full()
513
+ {
514
+ return false;
515
+ }
516
+ push_at(boost::move(elem), in_p_1, lk);
517
+ return true;
518
+ }
519
+
520
+ template <typename ValueType>
521
+ bool sync_bounded_queue<ValueType>::try_push(BOOST_THREAD_RV_REF(ValueType) elem)
522
+ {
523
+ try
524
+ {
525
+ unique_lock<mutex> lk(mtx_);
526
+ return try_push(elem, lk);
527
+ }
528
+ catch (...)
529
+ {
530
+ close();
531
+ throw;
532
+ }
533
+ }
534
+
535
+ template <typename ValueType>
536
+ bool sync_bounded_queue<ValueType>::try_push(no_block_tag, BOOST_THREAD_RV_REF(ValueType) elem)
537
+ {
538
+ try
539
+ {
540
+ unique_lock<mutex> lk(mtx_, try_to_lock);
541
+ if (!lk.owns_lock())
542
+ {
543
+ return false;
544
+ }
545
+ return try_push(elem, lk);
546
+ }
547
+ catch (...)
548
+ {
549
+ close();
550
+ throw;
551
+ }
552
+ }
553
+
554
+ template <typename ValueType>
555
+ void sync_bounded_queue<ValueType>::push(BOOST_THREAD_RV_REF(ValueType) elem)
556
+ {
557
+ try
558
+ {
559
+ unique_lock<mutex> lk(mtx_);
560
+ push_at(elem, wait_until_not_full(lk), lk);
561
+ }
562
+ catch (...)
563
+ {
564
+ close();
565
+ throw;
566
+ }
567
+ }
568
+
569
+ template <typename ValueType>
570
+ sync_bounded_queue<ValueType>& operator<<(sync_bounded_queue<ValueType>& sbq, BOOST_THREAD_RV_REF(ValueType) elem)
571
+ {
572
+ sbq.push(boost::forward<ValueType>(elem));
573
+ return sbq;
574
+ }
575
+
576
+ template <typename ValueType>
577
+ sync_bounded_queue<ValueType>& operator<<(sync_bounded_queue<ValueType>& sbq, ValueType const&elem)
578
+ {
579
+ sbq.push(elem);
580
+ return sbq;
581
+ }
582
+
583
+ template <typename ValueType>
584
+ sync_bounded_queue<ValueType>& operator>>(sync_bounded_queue<ValueType>& sbq, ValueType &elem)
585
+ {
586
+ sbq.pull(elem);
587
+ return sbq;
588
+ }
589
+
590
+ }
591
+
592
+ #include <boost/config/abi_suffix.hpp>
593
+
594
+ #endif