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
@@ -21,7 +21,7 @@ namespace boost
21
21
 
22
22
  class BOOST_SYMBOL_VISIBLE system_error : public std::runtime_error
23
23
  // BOOST_SYMBOL_VISIBLE is needed by GCC to ensure system_error thrown from a shared
24
- // library can be caught. See svn.boost.org/trac/boost/ticket/3697
24
+ // library can be caught. See svn.boost.org/trac/boost/ticket/3697
25
25
  {
26
26
  public:
27
27
  system_error( error_code ec )
@@ -61,13 +61,17 @@ namespace boost
61
61
  {
62
62
  if ( m_what.empty() )
63
63
  {
64
+ #ifndef BOOST_NO_EXCEPTIONS
64
65
  try
66
+ #endif
65
67
  {
66
68
  m_what = this->std::runtime_error::what();
67
69
  if ( !m_what.empty() ) m_what += ": ";
68
70
  m_what += m_error_code.message();
69
71
  }
72
+ #ifndef BOOST_NO_EXCEPTIONS
70
73
  catch (...) { return std::runtime_error::what(); }
74
+ #endif
71
75
  }
72
76
  return m_what.c_str();
73
77
  }
@@ -9,9 +9,11 @@
9
9
  #define BOOST_BARRIER_JDM030602_HPP
10
10
 
11
11
  #include <boost/thread/detail/config.hpp>
12
- #include <boost/throw_exception.hpp>
12
+ #include <boost/thread/detail/delete.hpp>
13
13
 
14
+ #include <boost/throw_exception.hpp>
14
15
  #include <boost/thread/mutex.hpp>
16
+ #include <boost/thread/lock_types.hpp>
15
17
  #include <boost/thread/condition_variable.hpp>
16
18
  #include <string>
17
19
  #include <stdexcept>
@@ -24,6 +26,8 @@ namespace boost
24
26
  class barrier
25
27
  {
26
28
  public:
29
+ BOOST_THREAD_NO_COPYABLE( barrier )
30
+
27
31
  barrier(unsigned int count)
28
32
  : m_threshold(count), m_count(count), m_generation(0)
29
33
  {
@@ -33,7 +37,7 @@ namespace boost
33
37
 
34
38
  bool wait()
35
39
  {
36
- boost::mutex::scoped_lock lock(m_mutex);
40
+ boost::unique_lock<boost::mutex> lock(m_mutex);
37
41
  unsigned int gen = m_generation;
38
42
 
39
43
  if (--m_count == 0)
@@ -0,0 +1,233 @@
1
+ // Distributed under the Boost Software License, Version 1.0. (See
2
+ // accompanying file LICENSE_1_0.txt or copy at
3
+ // http://www.boost.org/LICENSE_1_0.txt)
4
+ // (C) Copyright 2013 Vicente J. Botet Escriba
5
+
6
+ #ifndef BOOST_THREAD_COMPLETION_LATCH_HPP
7
+ #define BOOST_THREAD_COMPLETION_LATCH_HPP
8
+
9
+ #include <boost/thread/detail/config.hpp>
10
+ #include <boost/thread/detail/delete.hpp>
11
+ #include <boost/thread/detail/counter.hpp>
12
+
13
+ #include <boost/thread/mutex.hpp>
14
+ #include <boost/thread/lock_types.hpp>
15
+ #include <boost/thread/condition_variable.hpp>
16
+ #include <boost/chrono/duration.hpp>
17
+ #include <boost/chrono/time_point.hpp>
18
+ #include <boost/assert.hpp>
19
+ #ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL
20
+ #include <boost/function.hpp>
21
+ #else
22
+ #include <functional>
23
+ #endif
24
+ //#include <boost/thread/latch.hpp>
25
+
26
+ #include <boost/config/abi_prefix.hpp>
27
+
28
+ namespace boost
29
+ {
30
+ namespace thread_detail
31
+ {
32
+ void noop()
33
+ {
34
+ }
35
+ }
36
+ class completion_latch
37
+ {
38
+ public:
39
+ /// the implementation defined completion function type
40
+ #ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL
41
+ typedef function<void()> completion_function;
42
+ #else
43
+ typedef std::function<void()> completion_function;
44
+ #endif
45
+ /// noop completion function factory
46
+ static completion_function noop()
47
+ {
48
+ return completion_function(&thread_detail::noop);
49
+ }
50
+
51
+ private:
52
+ struct around_wait;
53
+ friend struct around_wait;
54
+ struct around_wait
55
+ {
56
+ completion_latch &that_;
57
+ boost::unique_lock<boost::mutex> &lk_;
58
+ around_wait(completion_latch &that, boost::unique_lock<boost::mutex> &lk)
59
+ : that_(that), lk_(lk)
60
+ {
61
+ that_.leavers_.cond_.wait(lk, detail::counter_is_zero(that_.leavers_));
62
+ that_.waiters_.inc_and_notify_all();
63
+ that_.leavers_.cond_.wait(lk, detail::counter_is_not_zero(that_.leavers_));
64
+ }
65
+ ~around_wait()
66
+ {
67
+ that_.waiters_.dec_and_notify_all();
68
+ }
69
+ };
70
+
71
+ bool count_down(unique_lock<mutex> &lk)
72
+ {
73
+ BOOST_ASSERT(count_ > 0);
74
+ if (--count_ == 0)
75
+ {
76
+ waiters_.cond_.wait(lk, detail::counter_is_not_zero(waiters_));
77
+ leavers_.assign_and_notify_all(waiters_);
78
+ count_.cond_.notify_all();
79
+ waiters_.cond_.wait(lk, detail::counter_is_zero(waiters_));
80
+ leavers_.assign_and_notify_all(0);
81
+ lk.unlock();
82
+ funct_();
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+
88
+ public:
89
+ BOOST_THREAD_NO_COPYABLE( completion_latch )
90
+
91
+ /// Constructs a latch with a given count.
92
+ completion_latch(std::size_t count) :
93
+ count_(count), funct_(noop()), waiters_(0), leavers_(0)
94
+ {
95
+ }
96
+
97
+ /// Constructs a latch with a given count and a completion function.
98
+ template <typename F>
99
+ completion_latch(std::size_t count, BOOST_THREAD_RV_REF(F) funct) :
100
+ count_(count),
101
+ funct_(boost::move(funct)),
102
+ waiters_(0),
103
+ leavers_(0)
104
+ {
105
+ }
106
+ template <typename F>
107
+ completion_latch(std::size_t count, void(*funct)()) :
108
+ count_(count), funct_(funct), waiters_(0), leavers_(0)
109
+ {
110
+ }
111
+
112
+ ///
113
+ ~completion_latch()
114
+ {
115
+ }
116
+
117
+ /// Blocks until the latch has counted down to zero.
118
+ void wait()
119
+ {
120
+ boost::unique_lock<boost::mutex> lk(mutex_);
121
+ around_wait aw(*this, lk);
122
+ count_.cond_.wait(lk, detail::counter_is_zero(count_));
123
+ }
124
+
125
+ /// @return true if the internal counter is already 0, false otherwise
126
+ bool try_wait()
127
+ {
128
+ boost::unique_lock<boost::mutex> lk(mutex_);
129
+ around_wait aw(*this, lk);
130
+ return (count_ == 0);
131
+ }
132
+
133
+ /// try to wait for a specified amount of time
134
+ /// @return whether there is a timeout or not.
135
+ template <class Rep, class Period>
136
+ cv_status wait_for(const chrono::duration<Rep, Period>& rel_time)
137
+ {
138
+ boost::unique_lock<boost::mutex> lk(mutex_);
139
+ around_wait aw(*this, lk);
140
+ return count_.cond_.wait_for(lk, rel_time, detail::counter_is_zero(count_))
141
+ ? cv_status::no_timeout
142
+ : cv_status::timeout;
143
+ }
144
+
145
+ /// try to wait until the specified time_point is reached
146
+ /// @return whether there is a timeout or not.
147
+ template <class Clock, class Duration>
148
+ cv_status wait_until(const chrono::time_point<Clock, Duration>& abs_time)
149
+ {
150
+ boost::unique_lock<boost::mutex> lk(mutex_);
151
+ around_wait aw(*this, lk);
152
+ return count_.cond_.wait_until(lk, abs_time, detail::counter_is_zero(count_))
153
+ ? cv_status::no_timeout
154
+ : cv_status::timeout;
155
+ }
156
+
157
+ /// Decrement the count and notify anyone waiting if we reach zero.
158
+ /// @Requires count must be greater than 0
159
+ void count_down()
160
+ {
161
+ unique_lock<mutex> lk(mutex_);
162
+ count_down(lk);
163
+ }
164
+ void signal()
165
+ {
166
+ count_down();
167
+ }
168
+
169
+ /// Decrement the count and notify anyone waiting if we reach zero.
170
+ /// Blocks until the latch has counted down to zero.
171
+ /// @Requires count must be greater than 0
172
+ void count_down_and_wait()
173
+ {
174
+ boost::unique_lock<boost::mutex> lk(mutex_);
175
+ if (count_down(lk))
176
+ {
177
+ return;
178
+ }
179
+ around_wait aw(*this, lk);
180
+ count_.cond_.wait(lk, detail::counter_is_zero(count_));
181
+ }
182
+ void sync()
183
+ {
184
+ count_down_and_wait();
185
+ }
186
+
187
+ /// Reset the counter
188
+ /// #Requires This method may only be invoked when there are no other threads currently inside the count_down_and_wait() method.
189
+ void reset(std::size_t count)
190
+ {
191
+ boost::lock_guard<boost::mutex> lk(mutex_);
192
+ //BOOST_ASSERT(count_ == 0);
193
+ count_ = count;
194
+ }
195
+
196
+ /// Resets the latch with the new completion function.
197
+ /// The next time the internal count reaches 0, this function will be invoked.
198
+ /// This completion function may only be invoked when there are no other threads
199
+ /// currently inside the count_down and wait related functions.
200
+ /// It may also be invoked from within the registered completion function.
201
+ /// @Returns the old completion function if any or noop if
202
+
203
+ #ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL
204
+ template <typename F>
205
+ completion_function then(BOOST_THREAD_RV_REF(F) funct)
206
+ {
207
+ boost::lock_guard<boost::mutex> lk(mutex_);
208
+ completion_function tmp(funct_);
209
+ funct_ = boost::move(funct);
210
+ return tmp;
211
+ }
212
+ #endif
213
+ completion_function then(void(*funct)())
214
+ {
215
+ boost::lock_guard<boost::mutex> lk(mutex_);
216
+ completion_function tmp(funct_);
217
+ funct_ = completion_function(funct);
218
+ return tmp;
219
+ }
220
+
221
+ private:
222
+ mutex mutex_;
223
+ detail::counter count_;
224
+ completion_function funct_;
225
+ detail::counter waiters_;
226
+ detail::counter leavers_;
227
+ };
228
+
229
+ } // namespace boost
230
+
231
+ #include <boost/config/abi_suffix.hpp>
232
+
233
+ #endif
@@ -1,11 +1,15 @@
1
1
  #ifndef BOOST_THREAD_CONDITION_HPP
2
2
  #define BOOST_THREAD_CONDITION_HPP
3
- // (C) Copyright 2007 Anthony Williams
3
+ // (C) Copyright 2007 Anthony Williams
4
4
  //
5
5
  // Distributed under the Boost Software License, Version 1.0. (See
6
6
  // accompanying file LICENSE_1_0.txt or copy at
7
7
  // http://www.boost.org/LICENSE_1_0.txt)
8
8
 
9
+ #include <boost/thread/detail/config.hpp>
10
+
11
+ #if defined BOOST_THREAD_PROVIDES_CONDITION
12
+
9
13
  #include <boost/thread/condition_variable.hpp>
10
14
 
11
15
  namespace boost
@@ -14,3 +18,4 @@ namespace boost
14
18
  }
15
19
 
16
20
  #endif
21
+ #endif
@@ -0,0 +1,571 @@
1
+ // Copyright (C) 2012 Vicente J. Botet Escriba
2
+ //
3
+ // Distributed under the Boost Software License, Version 1.0. (See accompanying
4
+ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
+
6
+ // 2013/04 Vicente J. Botet Escriba
7
+ // Provide implementation up to 9 parameters when BOOST_NO_CXX11_VARIADIC_TEMPLATES is defined.
8
+ // Make use of Boost.Move
9
+ // Make use of Boost.Tuple (movable)
10
+ // 2012/11 Vicente J. Botet Escriba
11
+ // Adapt to boost libc++ implementation
12
+
13
+ //===----------------------------------------------------------------------===//
14
+ //
15
+ // The LLVM Compiler Infrastructure
16
+ //
17
+ // This file is dual licensed under the MIT and the University of Illinois Open
18
+ // Source Licenses. See LICENSE.TXT for details.
19
+ //
20
+ // The async_func code is based on the one from libcxx.
21
+ //===----------------------------------------------------------------------===//
22
+
23
+ #ifndef BOOST_THREAD_DETAIL_ASYNC_FUNCT_HPP
24
+ #define BOOST_THREAD_DETAIL_ASYNC_FUNCT_HPP
25
+
26
+ #include <boost/config.hpp>
27
+
28
+ #include <boost/utility/result_of.hpp>
29
+ #include <boost/thread/detail/move.hpp>
30
+ #include <boost/thread/detail/invoke.hpp>
31
+ #include <boost/thread/detail/make_tuple_indices.hpp>
32
+
33
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
34
+ ! defined(BOOST_NO_CXX11_HDR_TUPLE)
35
+ #include <tuple>
36
+ #else
37
+ #include <boost/tuple/tuple.hpp>
38
+ #endif
39
+
40
+ namespace boost
41
+ {
42
+ namespace detail
43
+ {
44
+
45
+ #if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
46
+ ! defined(BOOST_NO_CXX11_HDR_TUPLE)
47
+
48
+ template <class Fp, class ... Args>
49
+ class async_func
50
+ {
51
+ std::tuple<Fp, Args...> f_;
52
+
53
+ public:
54
+ BOOST_THREAD_MOVABLE_ONLY( async_func)
55
+ //typedef typename invoke_of<_Fp, _Args...>::type Rp;
56
+ typedef typename result_of<Fp(Args...)>::type result_type;
57
+
58
+ BOOST_SYMBOL_VISIBLE
59
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f, BOOST_THREAD_RV_REF(Args)... args)
60
+ : f_(boost::move(f), boost::move(args)...)
61
+ {}
62
+
63
+ BOOST_SYMBOL_VISIBLE
64
+ async_func(BOOST_THREAD_RV_REF(async_func) f) : f_(boost::move(f.f_))
65
+ {}
66
+
67
+ result_type operator()()
68
+ {
69
+ typedef typename make_tuple_indices<1+sizeof...(Args), 1>::type Index;
70
+ return execute(Index());
71
+ }
72
+ private:
73
+ template <size_t ...Indices>
74
+ result_type
75
+ execute(tuple_indices<Indices...>)
76
+ {
77
+ return invoke(boost::move(std::get<0>(f_)), boost::move(std::get<Indices>(f_))...);
78
+ }
79
+ };
80
+ //BOOST_THREAD_DCL_MOVABLE_BEG(X) async_func<Fp> BOOST_THREAD_DCL_MOVABLE_END
81
+ #else
82
+ template <class Fp,
83
+ class T0 = tuples::null_type, class T1 = tuples::null_type, class T2 = tuples::null_type,
84
+ class T3 = tuples::null_type, class T4 = tuples::null_type, class T5 = tuples::null_type,
85
+ class T6 = tuples::null_type, class T7 = tuples::null_type, class T8 = tuples::null_type
86
+ , class T9 = tuples::null_type
87
+ >
88
+ class async_func;
89
+
90
+ template <class Fp,
91
+ class T0 , class T1 , class T2 ,
92
+ class T3 , class T4 , class T5 ,
93
+ class T6 , class T7 , class T8 >
94
+ class async_func<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8>
95
+ {
96
+ Fp fp_;
97
+ T0 v0_;
98
+ T1 v1_;
99
+ T2 v2_;
100
+ T3 v3_;
101
+ T4 v4_;
102
+ T5 v5_;
103
+ T6 v6_;
104
+ T7 v7_;
105
+ T8 v8_;
106
+ //::boost::tuple<Fp, T0, T1, T2, T3, T4, T5, T6, T7, T8> f_;
107
+
108
+ public:
109
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
110
+ typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7, T8)>::type result_type;
111
+
112
+ BOOST_SYMBOL_VISIBLE
113
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
114
+ , BOOST_THREAD_RV_REF(T0) a0
115
+ , BOOST_THREAD_RV_REF(T1) a1
116
+ , BOOST_THREAD_RV_REF(T2) a2
117
+ , BOOST_THREAD_RV_REF(T3) a3
118
+ , BOOST_THREAD_RV_REF(T4) a4
119
+ , BOOST_THREAD_RV_REF(T5) a5
120
+ , BOOST_THREAD_RV_REF(T6) a6
121
+ , BOOST_THREAD_RV_REF(T7) a7
122
+ , BOOST_THREAD_RV_REF(T8) a8
123
+ )
124
+ : fp_(boost::move(f))
125
+ , v0_(boost::move(a0))
126
+ , v1_(boost::move(a1))
127
+ , v2_(boost::move(a2))
128
+ , v3_(boost::move(a3))
129
+ , v4_(boost::move(a4))
130
+ , v5_(boost::move(a5))
131
+ , v6_(boost::move(a6))
132
+ , v7_(boost::move(a7))
133
+ , v8_(boost::move(a8))
134
+ {}
135
+
136
+ BOOST_SYMBOL_VISIBLE
137
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
138
+ : fp_(boost::move(f.fp))
139
+ , v0_(boost::move(f.a0))
140
+ , v1_(boost::move(f.a1))
141
+ , v2_(boost::move(f.a2))
142
+ , v3_(boost::move(f.a3))
143
+ , v4_(boost::move(f.a4))
144
+ , v5_(boost::move(f.a5))
145
+ , v6_(boost::move(f.a6))
146
+ , v7_(boost::move(f.a7))
147
+ , v8_(boost::move(f.a8))
148
+ {}
149
+
150
+ result_type operator()()
151
+ {
152
+ return invoke(boost::move(fp_)
153
+ , boost::move(v0_)
154
+ , boost::move(v1_)
155
+ , boost::move(v2_)
156
+ , boost::move(v3_)
157
+ , boost::move(v4_)
158
+ , boost::move(v5_)
159
+ , boost::move(v6_)
160
+ , boost::move(v7_)
161
+ , boost::move(v8_)
162
+ );
163
+ }
164
+ };
165
+ template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7 >
166
+ class async_func<Fp, T0, T1, T2, T3, T4, T5, T6, T7>
167
+ {
168
+ Fp fp_;
169
+ T0 v0_;
170
+ T1 v1_;
171
+ T2 v2_;
172
+ T3 v3_;
173
+ T4 v4_;
174
+ T5 v5_;
175
+ T6 v6_;
176
+ T7 v7_;
177
+ public:
178
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
179
+ typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6, T7)>::type result_type;
180
+
181
+ BOOST_SYMBOL_VISIBLE
182
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
183
+ , BOOST_THREAD_RV_REF(T0) a0
184
+ , BOOST_THREAD_RV_REF(T1) a1
185
+ , BOOST_THREAD_RV_REF(T2) a2
186
+ , BOOST_THREAD_RV_REF(T3) a3
187
+ , BOOST_THREAD_RV_REF(T4) a4
188
+ , BOOST_THREAD_RV_REF(T5) a5
189
+ , BOOST_THREAD_RV_REF(T6) a6
190
+ , BOOST_THREAD_RV_REF(T7) a7
191
+ )
192
+ : fp_(boost::move(f))
193
+ , v0_(boost::move(a0))
194
+ , v1_(boost::move(a1))
195
+ , v2_(boost::move(a2))
196
+ , v3_(boost::move(a3))
197
+ , v4_(boost::move(a4))
198
+ , v5_(boost::move(a5))
199
+ , v6_(boost::move(a6))
200
+ , v7_(boost::move(a7))
201
+ {}
202
+
203
+ BOOST_SYMBOL_VISIBLE
204
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
205
+ : fp_(boost::move(f.fp))
206
+ , v0_(boost::move(f.a0))
207
+ , v1_(boost::move(f.a1))
208
+ , v2_(boost::move(f.a2))
209
+ , v3_(boost::move(f.a3))
210
+ , v4_(boost::move(f.a4))
211
+ , v5_(boost::move(f.a5))
212
+ , v6_(boost::move(f.a6))
213
+ , v7_(boost::move(f.a7))
214
+ {}
215
+
216
+ result_type operator()()
217
+ {
218
+ return invoke(boost::move(fp_)
219
+ , boost::move(v0_)
220
+ , boost::move(v1_)
221
+ , boost::move(v2_)
222
+ , boost::move(v3_)
223
+ , boost::move(v4_)
224
+ , boost::move(v5_)
225
+ , boost::move(v6_)
226
+ , boost::move(v7_)
227
+ );
228
+ }
229
+ };
230
+ template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5, class T6>
231
+ class async_func<Fp, T0, T1, T2, T3, T4, T5, T6>
232
+ {
233
+ Fp fp_;
234
+ T0 v0_;
235
+ T1 v1_;
236
+ T2 v2_;
237
+ T3 v3_;
238
+ T4 v4_;
239
+ T5 v5_;
240
+ T6 v6_;
241
+ public:
242
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
243
+ typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5, T6)>::type result_type;
244
+
245
+ BOOST_SYMBOL_VISIBLE
246
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
247
+ , BOOST_THREAD_RV_REF(T0) a0
248
+ , BOOST_THREAD_RV_REF(T1) a1
249
+ , BOOST_THREAD_RV_REF(T2) a2
250
+ , BOOST_THREAD_RV_REF(T3) a3
251
+ , BOOST_THREAD_RV_REF(T4) a4
252
+ , BOOST_THREAD_RV_REF(T5) a5
253
+ , BOOST_THREAD_RV_REF(T6) a6
254
+ )
255
+ : fp_(boost::move(f))
256
+ , v0_(boost::move(a0))
257
+ , v1_(boost::move(a1))
258
+ , v2_(boost::move(a2))
259
+ , v3_(boost::move(a3))
260
+ , v4_(boost::move(a4))
261
+ , v5_(boost::move(a5))
262
+ , v6_(boost::move(a6))
263
+ {}
264
+
265
+ BOOST_SYMBOL_VISIBLE
266
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
267
+ : fp_(boost::move(f.fp))
268
+ , v0_(boost::move(f.a0))
269
+ , v1_(boost::move(f.a1))
270
+ , v2_(boost::move(f.a2))
271
+ , v3_(boost::move(f.a3))
272
+ , v4_(boost::move(f.a4))
273
+ , v5_(boost::move(f.a5))
274
+ , v6_(boost::move(f.a6))
275
+ {}
276
+
277
+ result_type operator()()
278
+ {
279
+ return invoke(boost::move(fp_)
280
+ , boost::move(v0_)
281
+ , boost::move(v1_)
282
+ , boost::move(v2_)
283
+ , boost::move(v3_)
284
+ , boost::move(v4_)
285
+ , boost::move(v5_)
286
+ , boost::move(v6_)
287
+ );
288
+ }
289
+ };
290
+ template <class Fp, class T0, class T1, class T2, class T3, class T4, class T5>
291
+ class async_func<Fp, T0, T1, T2, T3, T4, T5>
292
+ {
293
+ Fp fp_;
294
+ T0 v0_;
295
+ T1 v1_;
296
+ T2 v2_;
297
+ T3 v3_;
298
+ T4 v4_;
299
+ T5 v5_;
300
+ public:
301
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
302
+ typedef typename result_of<Fp(T0, T1, T2, T3, T4, T5)>::type result_type;
303
+
304
+ BOOST_SYMBOL_VISIBLE
305
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
306
+ , BOOST_THREAD_RV_REF(T0) a0
307
+ , BOOST_THREAD_RV_REF(T1) a1
308
+ , BOOST_THREAD_RV_REF(T2) a2
309
+ , BOOST_THREAD_RV_REF(T3) a3
310
+ , BOOST_THREAD_RV_REF(T4) a4
311
+ , BOOST_THREAD_RV_REF(T5) a5
312
+ )
313
+ : fp_(boost::move(f))
314
+ , v0_(boost::move(a0))
315
+ , v1_(boost::move(a1))
316
+ , v2_(boost::move(a2))
317
+ , v3_(boost::move(a3))
318
+ , v4_(boost::move(a4))
319
+ , v5_(boost::move(a5))
320
+ {}
321
+
322
+ BOOST_SYMBOL_VISIBLE
323
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
324
+ : fp_(boost::move(f.fp))
325
+ , v0_(boost::move(f.a0))
326
+ , v1_(boost::move(f.a1))
327
+ , v2_(boost::move(f.a2))
328
+ , v3_(boost::move(f.a3))
329
+ , v4_(boost::move(f.a4))
330
+ , v5_(boost::move(f.a5))
331
+ {}
332
+
333
+ result_type operator()()
334
+ {
335
+ return invoke(boost::move(fp_)
336
+ , boost::move(v0_)
337
+ , boost::move(v1_)
338
+ , boost::move(v2_)
339
+ , boost::move(v3_)
340
+ , boost::move(v4_)
341
+ , boost::move(v5_)
342
+ );
343
+ }
344
+ };
345
+ template <class Fp, class T0, class T1, class T2, class T3, class T4>
346
+ class async_func<Fp, T0, T1, T2, T3, T4>
347
+ {
348
+ Fp fp_;
349
+ T0 v0_;
350
+ T1 v1_;
351
+ T2 v2_;
352
+ T3 v3_;
353
+ T4 v4_;
354
+ public:
355
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
356
+ typedef typename result_of<Fp(T0, T1, T2, T3, T4)>::type result_type;
357
+
358
+ BOOST_SYMBOL_VISIBLE
359
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
360
+ , BOOST_THREAD_RV_REF(T0) a0
361
+ , BOOST_THREAD_RV_REF(T1) a1
362
+ , BOOST_THREAD_RV_REF(T2) a2
363
+ , BOOST_THREAD_RV_REF(T3) a3
364
+ , BOOST_THREAD_RV_REF(T4) a4
365
+ )
366
+ : fp_(boost::move(f))
367
+ , v0_(boost::move(a0))
368
+ , v1_(boost::move(a1))
369
+ , v2_(boost::move(a2))
370
+ , v3_(boost::move(a3))
371
+ , v4_(boost::move(a4))
372
+ {}
373
+
374
+ BOOST_SYMBOL_VISIBLE
375
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
376
+ : fp_(boost::move(f.fp))
377
+ , v0_(boost::move(f.a0))
378
+ , v1_(boost::move(f.a1))
379
+ , v2_(boost::move(f.a2))
380
+ , v3_(boost::move(f.a3))
381
+ , v4_(boost::move(f.a4))
382
+ {}
383
+
384
+ result_type operator()()
385
+ {
386
+ return invoke(boost::move(fp_)
387
+ , boost::move(v0_)
388
+ , boost::move(v1_)
389
+ , boost::move(v2_)
390
+ , boost::move(v3_)
391
+ , boost::move(v4_)
392
+ );
393
+ }
394
+ };
395
+ template <class Fp, class T0, class T1, class T2, class T3>
396
+ class async_func<Fp, T0, T1, T2, T3>
397
+ {
398
+ Fp fp_;
399
+ T0 v0_;
400
+ T1 v1_;
401
+ T2 v2_;
402
+ T3 v3_;
403
+ public:
404
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
405
+ typedef typename result_of<Fp(T0, T1, T2, T3)>::type result_type;
406
+
407
+ BOOST_SYMBOL_VISIBLE
408
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
409
+ , BOOST_THREAD_RV_REF(T0) a0
410
+ , BOOST_THREAD_RV_REF(T1) a1
411
+ , BOOST_THREAD_RV_REF(T2) a2
412
+ , BOOST_THREAD_RV_REF(T3) a3
413
+ )
414
+ : fp_(boost::move(f))
415
+ , v0_(boost::move(a0))
416
+ , v1_(boost::move(a1))
417
+ , v2_(boost::move(a2))
418
+ , v3_(boost::move(a3))
419
+ {}
420
+
421
+ BOOST_SYMBOL_VISIBLE
422
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
423
+ : fp_(boost::move(f.fp))
424
+ , v0_(boost::move(f.a0))
425
+ , v1_(boost::move(f.a1))
426
+ , v2_(boost::move(f.a2))
427
+ , v3_(boost::move(f.a3))
428
+ {}
429
+
430
+ result_type operator()()
431
+ {
432
+ return invoke(boost::move(fp_)
433
+ , boost::move(v0_)
434
+ , boost::move(v1_)
435
+ , boost::move(v2_)
436
+ , boost::move(v3_)
437
+ );
438
+ }
439
+ };
440
+ template <class Fp, class T0, class T1, class T2>
441
+ class async_func<Fp, T0, T1, T2>
442
+ {
443
+ Fp fp_;
444
+ T0 v0_;
445
+ T1 v1_;
446
+ T2 v2_;
447
+ public:
448
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
449
+ typedef typename result_of<Fp(T0, T1, T2)>::type result_type;
450
+
451
+ BOOST_SYMBOL_VISIBLE
452
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
453
+ , BOOST_THREAD_RV_REF(T0) a0
454
+ , BOOST_THREAD_RV_REF(T1) a1
455
+ , BOOST_THREAD_RV_REF(T2) a2
456
+ )
457
+ : fp_(boost::move(f))
458
+ , v0_(boost::move(a0))
459
+ , v1_(boost::move(a1))
460
+ , v2_(boost::move(a2))
461
+ {}
462
+
463
+ BOOST_SYMBOL_VISIBLE
464
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
465
+ : fp_(boost::move(f.fp))
466
+ , v0_(boost::move(f.a0))
467
+ , v1_(boost::move(f.a1))
468
+ , v2_(boost::move(f.a2))
469
+ {}
470
+
471
+ result_type operator()()
472
+ {
473
+ return invoke(boost::move(fp_)
474
+ , boost::move(v0_)
475
+ , boost::move(v1_)
476
+ , boost::move(v2_)
477
+ );
478
+ }
479
+ };
480
+ template <class Fp, class T0, class T1>
481
+ class async_func<Fp, T0, T1>
482
+ {
483
+ Fp fp_;
484
+ T0 v0_;
485
+ T1 v1_;
486
+ public:
487
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
488
+ typedef typename result_of<Fp(T0, T1)>::type result_type;
489
+
490
+ BOOST_SYMBOL_VISIBLE
491
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
492
+ , BOOST_THREAD_RV_REF(T0) a0
493
+ , BOOST_THREAD_RV_REF(T1) a1
494
+ )
495
+ : fp_(boost::move(f))
496
+ , v0_(boost::move(a0))
497
+ , v1_(boost::move(a1))
498
+ {}
499
+
500
+ BOOST_SYMBOL_VISIBLE
501
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
502
+ : fp_(boost::move(f.fp))
503
+ , v0_(boost::move(f.a0))
504
+ , v1_(boost::move(f.a1))
505
+ {}
506
+
507
+ result_type operator()()
508
+ {
509
+ return invoke(boost::move(fp_)
510
+ , boost::move(v0_)
511
+ , boost::move(v1_)
512
+ );
513
+ }
514
+ };
515
+ template <class Fp, class T0>
516
+ class async_func<Fp, T0>
517
+ {
518
+ Fp fp_;
519
+ T0 v0_;
520
+ public:
521
+ BOOST_THREAD_MOVABLE_ONLY(async_func)
522
+ typedef typename result_of<Fp(T0)>::type result_type;
523
+
524
+ BOOST_SYMBOL_VISIBLE
525
+ explicit async_func(BOOST_THREAD_RV_REF(Fp) f
526
+ , BOOST_THREAD_RV_REF(T0) a0
527
+ )
528
+ : fp_(boost::move(f))
529
+ , v0_(boost::move(a0))
530
+ {}
531
+
532
+ BOOST_SYMBOL_VISIBLE
533
+ async_func(BOOST_THREAD_RV_REF(async_func) f)
534
+ : fp_(boost::move(f.fp))
535
+ , v0_(boost::move(f.a0))
536
+ {}
537
+
538
+ result_type operator()()
539
+ {
540
+ return invoke(boost::move(fp_)
541
+ , boost::move(v0_)
542
+ );
543
+ }
544
+ };
545
+ template <class Fp>
546
+ class async_func<Fp>
547
+ {
548
+ Fp fp_;
549
+ public:
550
+ BOOST_THREAD_COPYABLE_AND_MOVABLE(async_func)
551
+ typedef typename result_of<Fp()>::type result_type;
552
+ BOOST_SYMBOL_VISIBLE
553
+ explicit async_func(BOOST_THREAD_FWD_REF(Fp) f)
554
+ : fp_(boost::move(f))
555
+ {}
556
+
557
+ BOOST_SYMBOL_VISIBLE
558
+ async_func(BOOST_THREAD_FWD_REF(async_func) f)
559
+ : fp_(boost::move(f.fp_))
560
+ {}
561
+ result_type operator()()
562
+ {
563
+ return fp_();
564
+ }
565
+ };
566
+ #endif
567
+
568
+ }
569
+ }
570
+
571
+ #endif // header