passenger 4.0.60 → 5.0.0.beta1

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 (1301) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +5 -0
  5. data/.travis.yml +3 -2
  6. data/CHANGELOG +31 -53
  7. data/CONTRIBUTING.md +4 -4
  8. data/CONTRIBUTORS +0 -1
  9. data/Gemfile +18 -0
  10. data/Gemfile.lock +41 -0
  11. data/Rakefile +16 -0
  12. data/bin/passenger +2 -2
  13. data/bin/passenger-install-apache2-module +12 -12
  14. data/bin/passenger-install-nginx-module +9 -14
  15. data/bin/passenger-status +125 -87
  16. data/build/agents.rb +112 -140
  17. data/build/apache2.rb +4 -9
  18. data/build/basics.rb +5 -3
  19. data/build/common_library.rb +1 -0
  20. data/build/cxx_tests.rb +69 -47
  21. data/build/debian.rb +4 -2
  22. data/build/documentation.rb +1 -0
  23. data/build/integration_tests.rb +28 -43
  24. data/build/misc.rb +0 -18
  25. data/build/nginx.rb +2 -6
  26. data/build/packaging.rb +33 -22
  27. data/build/preprocessor.rb +2 -4
  28. data/build/ruby_tests.rb +7 -26
  29. data/build/test_basics.rb +24 -25
  30. data/debian.template/control.template +2 -2
  31. data/debian.template/locations.ini.template +2 -3
  32. data/debian.template/passenger.install.template +2 -2
  33. data/debian.template/rules.template +1 -1
  34. data/dev/ci/run_jenkins.sh +0 -1
  35. data/dev/ci/run_rpm_tests.sh +3 -0
  36. data/dev/ci/run_travis.sh +63 -17
  37. data/dev/copy_boost_headers +22 -6
  38. data/dev/ruby_server.rb +244 -0
  39. data/dev/vagrant/provision.sh +3 -1
  40. data/doc/DebuggingAndStressTesting.md +3 -3
  41. data/doc/Design and Architecture.txt +5 -6
  42. data/doc/Packaging.txt.md +35 -6
  43. data/doc/ServerOptimizationGuide.txt.md +339 -0
  44. data/doc/Users guide Apache.idmap.txt +177 -187
  45. data/doc/Users guide Apache.txt +143 -219
  46. data/doc/Users guide Nginx.idmap.txt +166 -166
  47. data/doc/Users guide Nginx.txt +265 -223
  48. data/doc/Users guide Standalone.txt +3 -3
  49. data/doc/templates/markdown.html.erb +37 -6
  50. data/doc/users_guide_snippets/environment_variables.txt +1 -1
  51. data/doc/users_guide_snippets/support_information.txt +1 -1
  52. data/doc/users_guide_snippets/tips.txt +2 -2
  53. data/ext/apache2/Configuration.cpp +23 -81
  54. data/ext/apache2/Configuration.hpp +18 -92
  55. data/ext/apache2/ConfigurationCommands.cpp +64 -15
  56. data/ext/apache2/ConfigurationCommands.cpp.erb +8 -4
  57. data/ext/apache2/ConfigurationFields.hpp +12 -0
  58. data/ext/apache2/ConfigurationSetters.cpp +73 -1
  59. data/ext/apache2/ConfigurationSetters.cpp.erb +3 -2
  60. data/ext/apache2/CreateDirConfig.cpp +6 -0
  61. data/ext/apache2/DirectoryMapper.h +11 -6
  62. data/ext/apache2/Hooks.cpp +291 -408
  63. data/ext/apache2/MergeDirConfig.cpp +42 -0
  64. data/ext/apache2/SetHeaders.cpp +61 -16
  65. data/ext/apache2/SetHeaders.cpp.erb +9 -7
  66. data/ext/boost/container/allocator_traits.hpp +400 -0
  67. data/ext/boost/container/deque.hpp +2012 -0
  68. data/ext/boost/container/detail/adaptive_node_pool_impl.hpp +874 -0
  69. data/ext/boost/container/detail/advanced_insert_int.hpp +369 -0
  70. data/ext/boost/container/detail/algorithms.hpp +84 -0
  71. data/ext/boost/container/detail/allocation_type.hpp +54 -0
  72. data/ext/boost/container/detail/allocator_version_traits.hpp +163 -0
  73. data/ext/boost/container/detail/config_begin.hpp +49 -0
  74. data/ext/boost/container/detail/config_end.hpp +17 -0
  75. data/ext/boost/container/detail/destroyers.hpp +365 -0
  76. data/ext/boost/container/detail/flat_tree.hpp +1055 -0
  77. data/ext/boost/container/detail/function_detector.hpp +88 -0
  78. data/ext/boost/container/detail/iterators.hpp +611 -0
  79. data/ext/boost/container/detail/math_functions.hpp +113 -0
  80. data/ext/boost/container/detail/memory_util.hpp +83 -0
  81. data/ext/boost/container/detail/mpl.hpp +160 -0
  82. data/ext/boost/container/detail/multiallocation_chain.hpp +286 -0
  83. data/ext/boost/container/detail/node_alloc_holder.hpp +386 -0
  84. data/ext/boost/container/detail/node_pool_impl.hpp +365 -0
  85. data/ext/boost/container/detail/pair.hpp +354 -0
  86. data/ext/boost/container/detail/pool_common.hpp +52 -0
  87. data/ext/boost/container/detail/preprocessor.hpp +232 -0
  88. data/ext/boost/container/detail/transform_iterator.hpp +176 -0
  89. data/ext/boost/container/detail/tree.hpp +1134 -0
  90. data/ext/boost/container/detail/type_traits.hpp +210 -0
  91. data/ext/boost/container/detail/utilities.hpp +1141 -0
  92. data/ext/boost/container/detail/value_init.hpp +45 -0
  93. data/ext/boost/container/detail/variadic_templates_tools.hpp +153 -0
  94. data/ext/boost/container/detail/version_type.hpp +92 -0
  95. data/ext/boost/container/detail/workaround.hpp +44 -0
  96. data/ext/boost/container/flat_map.hpp +1674 -0
  97. data/ext/boost/container/flat_set.hpp +1408 -0
  98. data/ext/boost/container/list.hpp +1475 -0
  99. data/ext/boost/container/map.hpp +1508 -0
  100. data/ext/boost/container/scoped_allocator.hpp +1503 -0
  101. data/ext/boost/container/scoped_allocator_fwd.hpp +83 -0
  102. data/ext/boost/container/set.hpp +1280 -0
  103. data/ext/boost/container/slist.hpp +1706 -0
  104. data/ext/boost/container/stable_vector.hpp +1869 -0
  105. data/ext/boost/container/static_vector.hpp +1053 -0
  106. data/ext/boost/container/string.hpp +2856 -0
  107. data/ext/boost/container/throw_exception.hpp +110 -0
  108. data/ext/boost/container/vector.hpp +2671 -0
  109. data/ext/boost/detail/is_xxx.hpp +61 -0
  110. data/ext/boost/intrusive/any_hook.hpp +344 -0
  111. data/ext/boost/intrusive/avl_set.hpp +2528 -0
  112. data/ext/boost/intrusive/avl_set_hook.hpp +297 -0
  113. data/ext/boost/intrusive/avltree.hpp +1786 -0
  114. data/ext/boost/intrusive/avltree_algorithms.hpp +968 -0
  115. data/ext/boost/intrusive/bs_set_hook.hpp +296 -0
  116. data/ext/boost/intrusive/circular_list_algorithms.hpp +413 -0
  117. data/ext/boost/intrusive/circular_slist_algorithms.hpp +404 -0
  118. data/ext/boost/intrusive/derivation_value_traits.hpp +70 -0
  119. data/ext/boost/intrusive/detail/any_node_and_algorithms.hpp +297 -0
  120. data/ext/boost/intrusive/detail/assert.hpp +41 -0
  121. data/ext/boost/intrusive/detail/avltree_node.hpp +197 -0
  122. data/ext/boost/intrusive/detail/clear_on_destructor_base.hpp +36 -0
  123. data/ext/boost/intrusive/detail/common_slist_algorithms.hpp +102 -0
  124. data/ext/boost/intrusive/detail/config_begin.hpp +52 -0
  125. data/ext/boost/intrusive/detail/config_end.hpp +15 -0
  126. data/ext/boost/intrusive/detail/ebo_functor_holder.hpp +95 -0
  127. data/ext/boost/intrusive/detail/function_detector.hpp +88 -0
  128. data/ext/boost/intrusive/detail/generic_hook.hpp +209 -0
  129. data/ext/boost/intrusive/detail/has_member_function_callable_with.hpp +357 -0
  130. data/ext/boost/intrusive/detail/hashtable_node.hpp +249 -0
  131. data/ext/boost/intrusive/detail/is_stateful_value_traits.hpp +77 -0
  132. data/ext/boost/intrusive/detail/list_node.hpp +196 -0
  133. data/ext/boost/intrusive/detail/memory_util.hpp +288 -0
  134. data/ext/boost/intrusive/detail/mpl.hpp +383 -0
  135. data/ext/boost/intrusive/detail/parent_from_member.hpp +97 -0
  136. data/ext/boost/intrusive/detail/preprocessor.hpp +52 -0
  137. data/ext/boost/intrusive/detail/rbtree_node.hpp +201 -0
  138. data/ext/boost/intrusive/detail/slist_node.hpp +166 -0
  139. data/ext/boost/intrusive/detail/transform_iterator.hpp +173 -0
  140. data/ext/boost/intrusive/detail/tree_algorithms.hpp +1742 -0
  141. data/ext/boost/intrusive/detail/tree_node.hpp +199 -0
  142. data/ext/boost/intrusive/detail/utilities.hpp +858 -0
  143. data/ext/boost/intrusive/detail/workaround.hpp +22 -0
  144. data/ext/boost/intrusive/hashtable.hpp +3110 -0
  145. data/ext/boost/intrusive/intrusive_fwd.hpp +542 -0
  146. data/ext/boost/intrusive/linear_slist_algorithms.hpp +327 -0
  147. data/ext/boost/intrusive/link_mode.hpp +46 -0
  148. data/ext/boost/intrusive/list.hpp +1525 -0
  149. data/ext/boost/intrusive/list_hook.hpp +290 -0
  150. data/ext/boost/intrusive/member_value_traits.hpp +70 -0
  151. data/ext/boost/intrusive/options.hpp +810 -0
  152. data/ext/boost/intrusive/parent_from_member.hpp +42 -0
  153. data/ext/boost/intrusive/pointer_plus_bits.hpp +86 -0
  154. data/ext/boost/intrusive/pointer_traits.hpp +265 -0
  155. data/ext/boost/intrusive/priority_compare.hpp +39 -0
  156. data/ext/boost/intrusive/rbtree.hpp +1785 -0
  157. data/ext/boost/intrusive/rbtree_algorithms.hpp +934 -0
  158. data/ext/boost/intrusive/set.hpp +2554 -0
  159. data/ext/boost/intrusive/set_hook.hpp +300 -0
  160. data/ext/boost/intrusive/sg_set.hpp +2601 -0
  161. data/ext/boost/intrusive/sgtree.hpp +2009 -0
  162. data/ext/boost/intrusive/sgtree_algorithms.hpp +807 -0
  163. data/ext/boost/intrusive/slist.hpp +2219 -0
  164. data/ext/boost/intrusive/slist_hook.hpp +294 -0
  165. data/ext/boost/intrusive/splay_set.hpp +2575 -0
  166. data/ext/boost/intrusive/splay_set_hook.hpp +292 -0
  167. data/ext/boost/intrusive/splaytree.hpp +1784 -0
  168. data/ext/boost/intrusive/splaytree_algorithms.hpp +1008 -0
  169. data/ext/boost/intrusive/treap.hpp +1882 -0
  170. data/ext/boost/intrusive/treap_algorithms.hpp +919 -0
  171. data/ext/boost/intrusive/treap_set.hpp +2751 -0
  172. data/ext/boost/intrusive/trivial_value_traits.hpp +46 -0
  173. data/ext/boost/intrusive/unordered_set.hpp +2115 -0
  174. data/ext/boost/intrusive/unordered_set_hook.hpp +434 -0
  175. data/ext/boost/intrusive_ptr.hpp +18 -0
  176. data/ext/boost/math/common_factor_ct.hpp +180 -0
  177. data/ext/boost/math_fwd.hpp +108 -0
  178. data/ext/boost/move/detail/move_helpers.hpp +175 -0
  179. data/ext/boost/parameter.hpp +21 -0
  180. data/ext/boost/parameter/aux_/arg_list.hpp +459 -0
  181. data/ext/boost/parameter/aux_/cast.hpp +143 -0
  182. data/ext/boost/parameter/aux_/default.hpp +69 -0
  183. data/ext/boost/parameter/aux_/is_maybe.hpp +26 -0
  184. data/ext/boost/parameter/aux_/maybe.hpp +120 -0
  185. data/ext/boost/parameter/aux_/overloads.hpp +88 -0
  186. data/ext/boost/parameter/aux_/parameter_requirements.hpp +25 -0
  187. data/ext/boost/parameter/aux_/parenthesized_type.hpp +119 -0
  188. data/ext/boost/parameter/aux_/preprocessor/flatten.hpp +115 -0
  189. data/ext/boost/parameter/aux_/preprocessor/for_each.hpp +103 -0
  190. data/ext/boost/parameter/aux_/python/invoker.hpp +132 -0
  191. data/ext/boost/parameter/aux_/python/invoker_iterate.hpp +93 -0
  192. data/ext/boost/parameter/aux_/result_of0.hpp +36 -0
  193. data/ext/boost/parameter/aux_/set.hpp +67 -0
  194. data/ext/boost/parameter/aux_/tag.hpp +38 -0
  195. data/ext/boost/parameter/aux_/tagged_argument.hpp +188 -0
  196. data/ext/boost/parameter/aux_/template_keyword.hpp +47 -0
  197. data/ext/boost/parameter/aux_/unwrap_cv_reference.hpp +97 -0
  198. data/ext/boost/parameter/aux_/void.hpp +29 -0
  199. data/ext/boost/parameter/aux_/yesno.hpp +26 -0
  200. data/ext/boost/parameter/binding.hpp +106 -0
  201. data/ext/boost/parameter/config.hpp +14 -0
  202. data/ext/boost/parameter/keyword.hpp +152 -0
  203. data/ext/boost/parameter/macros.hpp +99 -0
  204. data/ext/boost/parameter/match.hpp +55 -0
  205. data/ext/boost/parameter/name.hpp +156 -0
  206. data/ext/boost/parameter/parameters.hpp +931 -0
  207. data/ext/boost/parameter/preprocessor.hpp +1178 -0
  208. data/ext/boost/parameter/python.hpp +735 -0
  209. data/ext/boost/parameter/value_type.hpp +108 -0
  210. data/ext/boost/pool/detail/for.m4 +107 -0
  211. data/ext/boost/pool/detail/guard.hpp +69 -0
  212. data/ext/boost/pool/detail/mutex.hpp +42 -0
  213. data/ext/boost/pool/detail/pool_construct.bat +24 -0
  214. data/ext/boost/pool/detail/pool_construct.ipp +852 -0
  215. data/ext/boost/pool/detail/pool_construct.m4 +84 -0
  216. data/ext/boost/pool/detail/pool_construct.sh +12 -0
  217. data/ext/boost/pool/detail/pool_construct_simple.bat +25 -0
  218. data/ext/boost/pool/detail/pool_construct_simple.ipp +43 -0
  219. data/ext/boost/pool/detail/pool_construct_simple.m4 +72 -0
  220. data/ext/boost/pool/detail/pool_construct_simple.sh +12 -0
  221. data/ext/boost/pool/object_pool.hpp +287 -0
  222. data/ext/boost/pool/pool.hpp +1024 -0
  223. data/ext/boost/pool/pool_alloc.hpp +488 -0
  224. data/ext/boost/pool/poolfwd.hpp +82 -0
  225. data/ext/boost/pool/simple_segregated_storage.hpp +377 -0
  226. data/ext/boost/pool/singleton_pool.hpp +251 -0
  227. data/ext/boost/preprocessor/arithmetic.hpp +25 -0
  228. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  229. data/ext/boost/preprocessor/arithmetic/div.hpp +39 -0
  230. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  231. data/ext/boost/preprocessor/arithmetic/mul.hpp +53 -0
  232. data/ext/boost/preprocessor/array.hpp +32 -0
  233. data/ext/boost/preprocessor/array/enum.hpp +33 -0
  234. data/ext/boost/preprocessor/array/insert.hpp +55 -0
  235. data/ext/boost/preprocessor/array/pop_back.hpp +37 -0
  236. data/ext/boost/preprocessor/array/pop_front.hpp +38 -0
  237. data/ext/boost/preprocessor/array/push_back.hpp +33 -0
  238. data/ext/boost/preprocessor/array/push_front.hpp +33 -0
  239. data/ext/boost/preprocessor/array/remove.hpp +54 -0
  240. data/ext/boost/preprocessor/array/replace.hpp +49 -0
  241. data/ext/boost/preprocessor/array/reverse.hpp +29 -0
  242. data/ext/boost/preprocessor/array/to_list.hpp +33 -0
  243. data/ext/boost/preprocessor/array/to_seq.hpp +33 -0
  244. data/ext/boost/preprocessor/array/to_tuple.hpp +22 -0
  245. data/ext/boost/preprocessor/assert_msg.hpp +17 -0
  246. data/ext/boost/preprocessor/comma.hpp +17 -0
  247. data/ext/boost/preprocessor/comparison.hpp +24 -0
  248. data/ext/boost/preprocessor/comparison/equal.hpp +34 -0
  249. data/ext/boost/preprocessor/comparison/greater.hpp +38 -0
  250. data/ext/boost/preprocessor/comparison/greater_equal.hpp +38 -0
  251. data/ext/boost/preprocessor/comparison/less.hpp +46 -0
  252. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  253. data/ext/boost/preprocessor/comparison/not_equal.hpp +814 -0
  254. data/ext/boost/preprocessor/config/limits.hpp +30 -0
  255. data/ext/boost/preprocessor/control.hpp +22 -0
  256. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  257. data/ext/boost/preprocessor/control/detail/dmc/while.hpp +536 -0
  258. data/ext/boost/preprocessor/control/detail/edg/while.hpp +534 -0
  259. data/ext/boost/preprocessor/control/detail/msvc/while.hpp +277 -0
  260. data/ext/boost/preprocessor/control/expr_if.hpp +30 -0
  261. data/ext/boost/preprocessor/debug.hpp +18 -0
  262. data/ext/boost/preprocessor/debug/assert.hpp +44 -0
  263. data/ext/boost/preprocessor/debug/line.hpp +35 -0
  264. data/ext/boost/preprocessor/detail/dmc/auto_rec.hpp +286 -0
  265. data/ext/boost/preprocessor/detail/is_nullary.hpp +30 -0
  266. data/ext/boost/preprocessor/detail/is_unary.hpp +30 -0
  267. data/ext/boost/preprocessor/detail/null.hpp +17 -0
  268. data/ext/boost/preprocessor/detail/split.hpp +35 -0
  269. data/ext/boost/preprocessor/enum_params_with_defaults.hpp +17 -0
  270. data/ext/boost/preprocessor/enum_shifted.hpp +17 -0
  271. data/ext/boost/preprocessor/expand.hpp +17 -0
  272. data/ext/boost/preprocessor/expr_if.hpp +17 -0
  273. data/ext/boost/preprocessor/facilities.hpp +23 -0
  274. data/ext/boost/preprocessor/facilities/apply.hpp +34 -0
  275. data/ext/boost/preprocessor/facilities/expand.hpp +28 -0
  276. data/ext/boost/preprocessor/facilities/is_1.hpp +23 -0
  277. data/ext/boost/preprocessor/facilities/is_empty.hpp +43 -0
  278. data/ext/boost/preprocessor/facilities/is_empty_or_1.hpp +30 -0
  279. data/ext/boost/preprocessor/for.hpp +17 -0
  280. data/ext/boost/preprocessor/if.hpp +17 -0
  281. data/ext/boost/preprocessor/iteration.hpp +19 -0
  282. data/ext/boost/preprocessor/iteration/detail/bounds/lower3.hpp +99 -0
  283. data/ext/boost/preprocessor/iteration/detail/bounds/lower4.hpp +99 -0
  284. data/ext/boost/preprocessor/iteration/detail/bounds/lower5.hpp +99 -0
  285. data/ext/boost/preprocessor/iteration/detail/bounds/upper3.hpp +99 -0
  286. data/ext/boost/preprocessor/iteration/detail/bounds/upper4.hpp +99 -0
  287. data/ext/boost/preprocessor/iteration/detail/bounds/upper5.hpp +99 -0
  288. data/ext/boost/preprocessor/iteration/detail/finish.hpp +99 -0
  289. data/ext/boost/preprocessor/iteration/detail/iter/forward3.hpp +1338 -0
  290. data/ext/boost/preprocessor/iteration/detail/iter/forward4.hpp +1338 -0
  291. data/ext/boost/preprocessor/iteration/detail/iter/forward5.hpp +1338 -0
  292. data/ext/boost/preprocessor/iteration/detail/iter/reverse2.hpp +1296 -0
  293. data/ext/boost/preprocessor/iteration/detail/iter/reverse3.hpp +1296 -0
  294. data/ext/boost/preprocessor/iteration/detail/iter/reverse4.hpp +1296 -0
  295. data/ext/boost/preprocessor/iteration/detail/iter/reverse5.hpp +1296 -0
  296. data/ext/boost/preprocessor/iteration/detail/local.hpp +812 -0
  297. data/ext/boost/preprocessor/iteration/detail/rlocal.hpp +782 -0
  298. data/ext/boost/preprocessor/iteration/detail/self.hpp +21 -0
  299. data/ext/boost/preprocessor/iteration/detail/start.hpp +99 -0
  300. data/ext/boost/preprocessor/iteration/local.hpp +26 -0
  301. data/ext/boost/preprocessor/iteration/self.hpp +19 -0
  302. data/ext/boost/preprocessor/library.hpp +36 -0
  303. data/ext/boost/preprocessor/limits.hpp +17 -0
  304. data/ext/boost/preprocessor/list.hpp +37 -0
  305. data/ext/boost/preprocessor/list/at.hpp +39 -0
  306. data/ext/boost/preprocessor/list/cat.hpp +42 -0
  307. data/ext/boost/preprocessor/list/detail/dmc/fold_left.hpp +279 -0
  308. data/ext/boost/preprocessor/list/detail/edg/fold_left.hpp +536 -0
  309. data/ext/boost/preprocessor/list/detail/edg/fold_right.hpp +794 -0
  310. data/ext/boost/preprocessor/list/enum.hpp +41 -0
  311. data/ext/boost/preprocessor/list/filter.hpp +54 -0
  312. data/ext/boost/preprocessor/list/first_n.hpp +58 -0
  313. data/ext/boost/preprocessor/list/for_each.hpp +49 -0
  314. data/ext/boost/preprocessor/list/for_each_product.hpp +141 -0
  315. data/ext/boost/preprocessor/list/rest_n.hpp +55 -0
  316. data/ext/boost/preprocessor/list/size.hpp +58 -0
  317. data/ext/boost/preprocessor/list/to_array.hpp +123 -0
  318. data/ext/boost/preprocessor/list/to_seq.hpp +32 -0
  319. data/ext/boost/preprocessor/list/to_tuple.hpp +38 -0
  320. data/ext/boost/preprocessor/logical.hpp +29 -0
  321. data/ext/boost/preprocessor/logical/bitnor.hpp +38 -0
  322. data/ext/boost/preprocessor/logical/bitor.hpp +38 -0
  323. data/ext/boost/preprocessor/logical/bitxor.hpp +38 -0
  324. data/ext/boost/preprocessor/logical/nor.hpp +30 -0
  325. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  326. data/ext/boost/preprocessor/logical/or.hpp +30 -0
  327. data/ext/boost/preprocessor/logical/xor.hpp +30 -0
  328. data/ext/boost/preprocessor/max.hpp +17 -0
  329. data/ext/boost/preprocessor/min.hpp +17 -0
  330. data/ext/boost/preprocessor/punctuation.hpp +20 -0
  331. data/ext/boost/preprocessor/punctuation/paren_if.hpp +38 -0
  332. data/ext/boost/preprocessor/repeat_3rd.hpp +17 -0
  333. data/ext/boost/preprocessor/repeat_from_to.hpp +17 -0
  334. data/ext/boost/preprocessor/repeat_from_to_2nd.hpp +17 -0
  335. data/ext/boost/preprocessor/repeat_from_to_3rd.hpp +17 -0
  336. data/ext/boost/preprocessor/repetition.hpp +32 -0
  337. data/ext/boost/preprocessor/repetition/deduce_r.hpp +22 -0
  338. data/ext/boost/preprocessor/repetition/deduce_z.hpp +22 -0
  339. data/ext/boost/preprocessor/repetition/detail/dmc/for.hpp +536 -0
  340. data/ext/boost/preprocessor/repetition/detail/edg/for.hpp +534 -0
  341. data/ext/boost/preprocessor/repetition/detail/msvc/for.hpp +277 -0
  342. data/ext/boost/preprocessor/repetition/enum_params_with_defaults.hpp +24 -0
  343. data/ext/boost/preprocessor/repetition/enum_shifted.hpp +68 -0
  344. data/ext/boost/preprocessor/repetition/enum_shifted_binary_params.hpp +51 -0
  345. data/ext/boost/preprocessor/repetition/enum_trailing.hpp +63 -0
  346. data/ext/boost/preprocessor/repetition/enum_trailing_binary_params.hpp +53 -0
  347. data/ext/boost/preprocessor/selection.hpp +18 -0
  348. data/ext/boost/preprocessor/selection/max.hpp +39 -0
  349. data/ext/boost/preprocessor/selection/min.hpp +39 -0
  350. data/ext/boost/preprocessor/seq.hpp +43 -0
  351. data/ext/boost/preprocessor/seq/cat.hpp +49 -0
  352. data/ext/boost/preprocessor/seq/detail/binary_transform.hpp +40 -0
  353. data/ext/boost/preprocessor/seq/detail/split.hpp +284 -0
  354. data/ext/boost/preprocessor/seq/filter.hpp +54 -0
  355. data/ext/boost/preprocessor/seq/first_n.hpp +30 -0
  356. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  357. data/ext/boost/preprocessor/seq/fold_right.hpp +288 -0
  358. data/ext/boost/preprocessor/seq/for_each.hpp +60 -0
  359. data/ext/boost/preprocessor/seq/for_each_product.hpp +126 -0
  360. data/ext/boost/preprocessor/seq/insert.hpp +28 -0
  361. data/ext/boost/preprocessor/seq/pop_back.hpp +29 -0
  362. data/ext/boost/preprocessor/seq/pop_front.hpp +27 -0
  363. data/ext/boost/preprocessor/seq/push_back.hpp +19 -0
  364. data/ext/boost/preprocessor/seq/push_front.hpp +19 -0
  365. data/ext/boost/preprocessor/seq/remove.hpp +29 -0
  366. data/ext/boost/preprocessor/seq/replace.hpp +29 -0
  367. data/ext/boost/preprocessor/seq/rest_n.hpp +30 -0
  368. data/ext/boost/preprocessor/seq/reverse.hpp +39 -0
  369. data/ext/boost/preprocessor/seq/subseq.hpp +28 -0
  370. data/ext/boost/preprocessor/seq/to_array.hpp +28 -0
  371. data/ext/boost/preprocessor/seq/to_list.hpp +29 -0
  372. data/ext/boost/preprocessor/seq/to_tuple.hpp +27 -0
  373. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  374. data/ext/boost/preprocessor/slot.hpp +17 -0
  375. data/ext/boost/preprocessor/slot/counter.hpp +25 -0
  376. data/ext/boost/preprocessor/slot/detail/counter.hpp +269 -0
  377. data/ext/boost/preprocessor/slot/detail/slot1.hpp +267 -0
  378. data/ext/boost/preprocessor/slot/detail/slot2.hpp +267 -0
  379. data/ext/boost/preprocessor/slot/detail/slot3.hpp +267 -0
  380. data/ext/boost/preprocessor/slot/detail/slot4.hpp +267 -0
  381. data/ext/boost/preprocessor/slot/detail/slot5.hpp +267 -0
  382. data/ext/boost/preprocessor/tuple.hpp +28 -0
  383. data/ext/boost/preprocessor/tuple/enum.hpp +22 -0
  384. data/ext/boost/preprocessor/tuple/reverse.hpp +114 -0
  385. data/ext/boost/preprocessor/tuple/size.hpp +28 -0
  386. data/ext/boost/preprocessor/tuple/to_array.hpp +37 -0
  387. data/ext/boost/preprocessor/tuple/to_seq.hpp +114 -0
  388. data/ext/boost/preprocessor/variadic.hpp +23 -0
  389. data/ext/boost/preprocessor/variadic/to_array.hpp +32 -0
  390. data/ext/boost/preprocessor/variadic/to_list.hpp +25 -0
  391. data/ext/boost/preprocessor/variadic/to_seq.hpp +25 -0
  392. data/ext/boost/preprocessor/variadic/to_tuple.hpp +24 -0
  393. data/ext/boost/preprocessor/while.hpp +17 -0
  394. data/ext/boost/preprocessor/wstringize.hpp +29 -0
  395. data/ext/boost/smart_ptr/intrusive_ptr.hpp +324 -0
  396. data/ext/common/AccountsDatabase.h +3 -4
  397. data/ext/common/AgentsStarter.cpp +12 -15
  398. data/ext/common/AgentsStarter.h +54 -120
  399. data/ext/common/ApplicationPool2/AppTypes.cpp +12 -5
  400. data/ext/common/ApplicationPool2/AppTypes.h +21 -14
  401. data/ext/common/ApplicationPool2/Common.h +36 -19
  402. data/ext/common/ApplicationPool2/DirectSpawner.h +15 -16
  403. data/ext/common/ApplicationPool2/DummySpawner.h +9 -8
  404. data/ext/common/ApplicationPool2/ErrorRenderer.h +1 -1
  405. data/ext/common/ApplicationPool2/Group.h +304 -171
  406. data/ext/common/ApplicationPool2/Implementation.cpp +234 -125
  407. data/ext/common/ApplicationPool2/Options.h +50 -62
  408. data/ext/common/ApplicationPool2/Pool.h +285 -189
  409. data/ext/common/ApplicationPool2/Process.h +126 -115
  410. data/ext/common/ApplicationPool2/Session.h +70 -30
  411. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -18
  412. data/ext/common/ApplicationPool2/Socket.h +57 -43
  413. data/ext/common/ApplicationPool2/SpawnObject.h +83 -0
  414. data/ext/common/ApplicationPool2/Spawner.h +59 -38
  415. data/ext/common/ApplicationPool2/SpawnerFactory.h +8 -14
  416. data/ext/common/ApplicationPool2/SuperGroup.h +69 -40
  417. data/ext/common/BackgroundEventLoop.cpp +48 -1
  418. data/ext/common/BackgroundEventLoop.h +3 -1
  419. data/ext/common/Constants.h +30 -8
  420. data/ext/common/DataStructures/HashedStaticString.h +103 -0
  421. data/ext/common/DataStructures/LString.h +396 -0
  422. data/ext/common/DataStructures/StringKeyTable.h +588 -0
  423. data/ext/common/EventedMessageServer.h +1 -0
  424. data/ext/common/FileDescriptor.h +5 -0
  425. data/ext/common/InstanceDirectory.h +240 -0
  426. data/ext/common/Logging.cpp +38 -13
  427. data/ext/common/Logging.h +53 -22
  428. data/ext/common/MemoryKit/mbuf.cpp +413 -0
  429. data/ext/common/MemoryKit/mbuf.h +266 -0
  430. data/ext/common/MemoryKit/palloc.cpp +337 -0
  431. data/ext/common/MemoryKit/palloc.h +121 -0
  432. data/ext/common/ResourceLocator.h +62 -6
  433. data/ext/common/SafeLibev.h +4 -4
  434. data/ext/common/ServerKit/AcceptLoadBalancer.h +275 -0
  435. data/ext/common/ServerKit/Channel.h +747 -0
  436. data/ext/common/ServerKit/Client.h +166 -0
  437. data/ext/common/ServerKit/ClientRef.h +130 -0
  438. data/ext/common/ServerKit/Context.h +129 -0
  439. data/ext/common/ServerKit/Errors.h +103 -0
  440. data/ext/common/ServerKit/FdSinkChannel.h +206 -0
  441. data/ext/common/ServerKit/FdSourceChannel.h +230 -0
  442. data/ext/common/ServerKit/FileBufferedChannel.h +1399 -0
  443. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +228 -0
  444. data/ext/common/ServerKit/HeaderTable.h +472 -0
  445. data/ext/common/ServerKit/Hooks.h +79 -0
  446. data/ext/common/ServerKit/HttpChunkedBodyParser.h +289 -0
  447. data/ext/common/ServerKit/HttpChunkedBodyParserState.h +70 -0
  448. data/ext/common/ServerKit/HttpClient.h +94 -0
  449. data/ext/common/ServerKit/HttpHeaderParser.h +477 -0
  450. data/ext/common/ServerKit/HttpHeaderParserState.h +60 -0
  451. data/ext/common/ServerKit/HttpRequest.h +276 -0
  452. data/ext/common/ServerKit/HttpRequestRef.h +130 -0
  453. data/ext/common/ServerKit/HttpServer.h +1152 -0
  454. data/ext/common/ServerKit/Implementation.cpp +47 -0
  455. data/ext/common/ServerKit/Server.h +1040 -0
  456. data/ext/common/ServerKit/http_parser.cpp +2259 -0
  457. data/ext/common/ServerKit/http_parser.h +330 -0
  458. data/ext/common/StaticString.h +8 -0
  459. data/ext/common/Utils.cpp +14 -12
  460. data/ext/common/Utils.h +9 -103
  461. data/ext/common/Utils/BufferedIO.h +1 -0
  462. data/ext/common/Utils/CachedFileStat.hpp +1 -7
  463. data/ext/common/Utils/DateParsing.h +379 -0
  464. data/ext/common/Utils/FileChangeChecker.h +3 -9
  465. data/ext/common/Utils/Hasher.cpp +52 -0
  466. data/ext/common/Utils/Hasher.h +58 -0
  467. data/ext/common/Utils/IOUtils.cpp +62 -62
  468. data/ext/common/Utils/JsonUtils.h +21 -0
  469. data/ext/common/Utils/OptionParsing.h +75 -0
  470. data/ext/common/Utils/StrIntUtils.cpp +112 -19
  471. data/ext/common/Utils/StrIntUtils.h +52 -12
  472. data/ext/common/Utils/StrIntUtilsNoStrictAliasing.cpp +174 -0
  473. data/ext/common/Utils/VariantMap.h +18 -7
  474. data/ext/common/Utils/modp_b64.cpp +290 -0
  475. data/ext/common/Utils/modp_b64.h +241 -0
  476. data/ext/common/Utils/modp_b64_data.h +479 -0
  477. data/ext/common/Utils/sysqueue.h +811 -0
  478. data/ext/common/agents/Base.cpp +71 -98
  479. data/ext/common/agents/Base.h +11 -3
  480. data/ext/common/agents/HelperAgent/AdminServer.h +690 -0
  481. data/ext/common/agents/HelperAgent/Main.cpp +899 -487
  482. data/ext/common/agents/HelperAgent/OptionParser.h +311 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.h +315 -2548
  484. data/ext/common/agents/HelperAgent/RequestHandler/AppResponse.h +225 -0
  485. data/ext/common/agents/HelperAgent/RequestHandler/BufferBody.cpp +93 -0
  486. data/ext/common/agents/HelperAgent/RequestHandler/CheckoutSession.cpp +346 -0
  487. data/ext/common/agents/HelperAgent/RequestHandler/Client.h +54 -0
  488. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +846 -0
  489. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +231 -0
  490. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +434 -0
  491. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +149 -0
  492. data/ext/common/agents/HelperAgent/RequestHandler/SendRequest.cpp +887 -0
  493. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +293 -0
  494. data/ext/common/agents/HelperAgent/RequestHandler/Utils.cpp +301 -0
  495. data/ext/common/agents/HelperAgent/ResponseCache.h +624 -0
  496. data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +21 -23
  497. data/ext/common/agents/LoggingAgent/AdminServer.h +369 -0
  498. data/ext/common/agents/LoggingAgent/LoggingServer.h +1 -0
  499. data/ext/common/agents/LoggingAgent/Main.cpp +422 -215
  500. data/ext/common/agents/LoggingAgent/OptionParser.h +167 -0
  501. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  502. data/ext/common/agents/Main.cpp +107 -0
  503. data/ext/common/agents/SpawnPreparer/Main.cpp +207 -0
  504. data/ext/common/agents/TempDirToucher/Main.cpp +429 -0
  505. data/ext/common/agents/Watchdog/AdminServer.h +390 -0
  506. data/ext/common/agents/Watchdog/AgentWatcher.cpp +7 -5
  507. data/ext/common/agents/Watchdog/HelperAgentWatcher.cpp +18 -39
  508. data/ext/common/agents/Watchdog/InstanceDirToucher.cpp +116 -0
  509. data/ext/common/agents/Watchdog/LoggingAgentWatcher.cpp +13 -17
  510. data/ext/common/agents/Watchdog/Main.cpp +743 -202
  511. data/ext/libeio/eio.c +17 -0
  512. data/ext/libeio/eio.h +2 -0
  513. data/ext/nginx/CacheLocationConfig.c +177 -198
  514. data/ext/nginx/CacheLocationConfig.c.erb +35 -22
  515. data/ext/nginx/Configuration.c +402 -236
  516. data/ext/nginx/Configuration.h +12 -5
  517. data/ext/nginx/ConfigurationCommands.c +35 -15
  518. data/ext/nginx/ConfigurationCommands.c.erb +4 -4
  519. data/ext/nginx/ConfigurationFields.h +9 -5
  520. data/ext/nginx/ConfigurationFields.h.erb +3 -1
  521. data/ext/nginx/ContentHandler.c +393 -362
  522. data/ext/nginx/CreateLocationConfig.c +8 -4
  523. data/ext/nginx/CreateLocationConfig.c.erb +8 -3
  524. data/ext/nginx/MergeLocationConfig.c +36 -6
  525. data/ext/nginx/MergeLocationConfig.c.erb +42 -1
  526. data/ext/nginx/ngx_http_passenger_module.c +28 -15
  527. data/ext/oxt/detail/backtrace_disabled.hpp +2 -1
  528. data/ext/oxt/detail/backtrace_enabled.hpp +15 -2
  529. data/ext/oxt/implementation.cpp +92 -20
  530. data/ext/oxt/thread.hpp +5 -0
  531. data/ext/ruby/extconf.rb +3 -6
  532. data/ext/ruby/passenger_native_support.c +13 -40
  533. data/helper-scripts/download_binaries/extconf.rb +4 -4
  534. data/helper-scripts/meteor-loader.rb +12 -112
  535. data/helper-scripts/node-loader.js +3 -91
  536. data/helper-scripts/rack-loader.rb +13 -14
  537. data/helper-scripts/rack-preloader.rb +16 -17
  538. data/helper-scripts/wsgi-loader.py +11 -7
  539. data/lib/phusion_passenger.rb +100 -79
  540. data/lib/phusion_passenger/abstract_installer.rb +28 -3
  541. data/lib/phusion_passenger/admin_tools.rb +3 -3
  542. data/lib/phusion_passenger/admin_tools/instance.rb +207 -0
  543. data/lib/phusion_passenger/admin_tools/instance_registry.rb +98 -0
  544. data/lib/phusion_passenger/apache2/config_options.rb +72 -22
  545. data/lib/phusion_passenger/common_library.rb +79 -14
  546. data/lib/phusion_passenger/config/about_command.rb +17 -23
  547. data/lib/phusion_passenger/config/admin_command_command.rb +175 -0
  548. data/lib/phusion_passenger/config/agent_compiler.rb +170 -0
  549. data/lib/phusion_passenger/config/command.rb +1 -4
  550. data/lib/phusion_passenger/config/compile_agent_command.rb +102 -0
  551. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +112 -0
  552. data/lib/phusion_passenger/config/detach_process_command.rb +32 -10
  553. data/lib/phusion_passenger/config/download_agent_command.rb +285 -0
  554. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +281 -0
  555. data/lib/phusion_passenger/config/install_agent_command.rb +174 -0
  556. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +231 -0
  557. data/lib/phusion_passenger/config/installation_utils.rb +241 -0
  558. data/lib/phusion_passenger/config/list_instances_command.rb +13 -25
  559. data/lib/phusion_passenger/config/main.rb +43 -14
  560. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +337 -0
  561. data/lib/phusion_passenger/config/reopen_logs_command.rb +110 -0
  562. data/lib/phusion_passenger/config/restart_app_command.rb +61 -14
  563. data/lib/phusion_passenger/config/system_metrics_command.rb +2 -1
  564. data/lib/phusion_passenger/config/utils.rb +64 -39
  565. data/lib/phusion_passenger/config/validate_install_command.rb +2 -2
  566. data/lib/phusion_passenger/constants.rb +27 -6
  567. data/lib/phusion_passenger/debug_logging.rb +32 -15
  568. data/lib/phusion_passenger/loader_shared_helpers.rb +2 -5
  569. data/lib/phusion_passenger/message_client.rb +21 -22
  570. data/lib/phusion_passenger/native_support.rb +26 -31
  571. data/lib/phusion_passenger/nginx/config_options.rb +32 -19
  572. data/lib/phusion_passenger/packaging.rb +7 -3
  573. data/lib/phusion_passenger/platform_info/cxx_portability.rb +1 -2
  574. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +3 -4
  575. data/lib/phusion_passenger/platform_info/operating_system.rb +6 -6
  576. data/lib/phusion_passenger/preloader_shared_helpers.rb +2 -2
  577. data/lib/phusion_passenger/rack/out_of_band_gc.rb +2 -2
  578. data/lib/phusion_passenger/rack/thread_handler_extension.rb +168 -65
  579. data/lib/phusion_passenger/request_handler.rb +47 -82
  580. data/lib/phusion_passenger/request_handler/thread_handler.rb +46 -10
  581. data/lib/phusion_passenger/ruby_core_enhancements.rb +25 -77
  582. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +108 -0
  583. data/lib/phusion_passenger/standalone/app_finder.rb +39 -59
  584. data/lib/phusion_passenger/standalone/command.rb +27 -275
  585. data/lib/phusion_passenger/standalone/command2.rb +292 -0
  586. data/lib/phusion_passenger/standalone/config_utils.rb +87 -0
  587. data/lib/phusion_passenger/standalone/control_utils.rb +88 -0
  588. data/lib/phusion_passenger/standalone/main.rb +69 -71
  589. data/lib/phusion_passenger/standalone/start2_command.rb +799 -0
  590. data/lib/phusion_passenger/standalone/start_command.rb +406 -467
  591. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +167 -0
  592. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +165 -0
  593. data/lib/phusion_passenger/standalone/status_command.rb +64 -23
  594. data/lib/phusion_passenger/standalone/stop_command.rb +69 -32
  595. data/lib/phusion_passenger/standalone/version_command.rb +1 -5
  596. data/lib/phusion_passenger/utils.rb +0 -4
  597. data/lib/phusion_passenger/utils/json.rb +70 -4
  598. data/lib/phusion_passenger/utils/progress_bar.rb +56 -0
  599. data/lib/phusion_passenger/utils/tee_input.rb +3 -3
  600. data/lib/phusion_passenger/utils/unseekable_socket.rb +30 -0
  601. data/packaging/rpm/nginx_spec/nginx.spec.template +4 -3
  602. data/packaging/rpm/passenger_spec/passenger.spec.template +6 -10
  603. data/packaging/rpm/setup-system +2 -1
  604. data/resources/oss-binaries.phusionpassenger.com.crt +208 -0
  605. data/resources/templates/config/agent_compiler/confirm_enable_optimizations.txt.erb +5 -0
  606. data/resources/templates/config/installation_utils/cannot_create_user_support_binaries_dir.txt.erb +15 -0
  607. data/resources/templates/config/installation_utils/download_tool_missing.txt.erb +7 -0
  608. data/resources/templates/config/installation_utils/passenger_not_installed_as_root.txt.erb +12 -0
  609. data/resources/templates/config/installation_utils/support_binaries_dir_not_writable_despite_running_as_root.txt.erb +13 -0
  610. data/resources/templates/config/installation_utils/unexpected_filesystem_problem.txt.erb +16 -0
  611. data/{packaging/debian/debian_specs/passenger/patches/series → resources/templates/config/installation_utils/user_support_binaries_dir_not_writable.txt.erb} +0 -0
  612. data/resources/templates/nginx/nginx_module_sources_not_available.txt.erb +2 -2
  613. data/resources/templates/standalone/config.erb +14 -16
  614. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +1 -1
  615. data/test/.rspec +1 -0
  616. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +20 -17
  617. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -14
  618. data/test/cxx/ApplicationPool2/PoolTest.cpp +113 -90
  619. data/test/cxx/ApplicationPool2/ProcessTest.cpp +18 -27
  620. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +51 -53
  621. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +55 -57
  622. data/test/cxx/BufferedIOTest.cpp +40 -40
  623. data/test/cxx/CxxTestMain.cpp +4 -22
  624. data/test/cxx/DataStructures/LStringTest.cpp +275 -0
  625. data/test/cxx/DataStructures/StringKeyTableTest.cpp +199 -0
  626. data/test/cxx/MemoryKit/MbufTest.cpp +213 -0
  627. data/test/cxx/MessageServerTest.cpp +62 -55
  628. data/test/cxx/RequestHandlerTest.cpp +26 -27
  629. data/test/cxx/ServerKit/ChannelTest.cpp +1467 -0
  630. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +817 -0
  631. data/test/cxx/ServerKit/HeaderTableTest.cpp +171 -0
  632. data/test/cxx/ServerKit/HttpServerTest.cpp +1503 -0
  633. data/test/cxx/ServerKit/ServerTest.cpp +408 -0
  634. data/test/cxx/TestSupport.cpp +51 -15
  635. data/test/cxx/TestSupport.h +31 -21
  636. data/test/cxx/UnionStationTest.cpp +121 -122
  637. data/test/cxx/UtilsTest.cpp +9 -33
  638. data/test/integration_tests/apache2_tests.rb +65 -27
  639. data/test/integration_tests/downloaded_binaries_tests.rb +30 -6
  640. data/test/integration_tests/native_packaging_spec.rb +32 -17
  641. data/test/integration_tests/nginx_tests.rb +28 -10
  642. data/test/integration_tests/shared/example_webapp_tests.rb +40 -27
  643. data/test/integration_tests/standalone_tests.rb +232 -169
  644. data/test/ruby/debug_logging_spec.rb +44 -40
  645. data/test/ruby/rails3.0/preloader_spec.rb +1 -1
  646. data/test/ruby/rails3.1/preloader_spec.rb +1 -1
  647. data/test/ruby/rails3.2/preloader_spec.rb +1 -1
  648. data/test/ruby/rails4.0/preloader_spec.rb +1 -1
  649. data/test/ruby/rails4.1/preloader_spec.rb +1 -1
  650. data/test/ruby/request_handler_spec.rb +62 -24
  651. data/test/ruby/shared/loader_sharedspec.rb +10 -9
  652. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +23 -22
  653. data/test/ruby/spec_helper.rb +2 -11
  654. data/test/ruby/standalone/runtime_installer_spec.rb +15 -13
  655. data/test/ruby/union_station_spec.rb +45 -40
  656. data/test/ruby/utils/tee_input_spec.rb +5 -5
  657. data/test/ruby/utils_spec.rb +3 -39
  658. data/test/stub/apache2/httpd.conf.erb +5 -2
  659. data/test/stub/nginx/nginx.conf.erb +3 -1
  660. data/test/support/apache2_controller.rb +25 -25
  661. data/test/support/nginx_controller.rb +14 -14
  662. data/test/support/test_helper.rb +74 -75
  663. metadata +439 -643
  664. metadata.gz.asc +7 -7
  665. data/ext/common/MultiLibeio.cpp +0 -204
  666. data/ext/common/MultiLibeio.h +0 -67
  667. data/ext/common/ServerInstanceDir.h +0 -402
  668. data/ext/common/Utils/Base64.cpp +0 -143
  669. data/ext/common/Utils/Base64.h +0 -83
  670. data/ext/common/Utils/HttpHeaderBufferer.h +0 -184
  671. data/ext/common/Utils/PriorityQueue.h +0 -54
  672. data/ext/common/Utils/StreamBoyerMooreHorspool.h +0 -512
  673. data/ext/common/Utils/fib.c +0 -699
  674. data/ext/common/Utils/fib.h +0 -101
  675. data/ext/common/Utils/fibpriv.h +0 -67
  676. data/ext/common/agents/EnvPrinter.c +0 -16
  677. data/ext/common/agents/HelperAgent/AgentOptions.h +0 -109
  678. data/ext/common/agents/HelperAgent/FileBackedPipe.h +0 -732
  679. data/ext/common/agents/HelperAgent/RequestHandler.cpp +0 -294
  680. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +0 -457
  681. data/ext/common/agents/LoggingAgent/AdminController.h +0 -96
  682. data/ext/common/agents/SpawnPreparer.cpp +0 -206
  683. data/ext/common/agents/TempDirToucher.c +0 -383
  684. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +0 -116
  685. data/helper-scripts/classic-rails-loader.rb +0 -166
  686. data/helper-scripts/classic-rails-preloader.rb +0 -193
  687. data/lib/phusion_passenger/admin_tools/server_instance.rb +0 -339
  688. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +0 -68
  689. data/lib/phusion_passenger/classic_rails/thread_handler_extension.rb +0 -40
  690. data/lib/phusion_passenger/platform_info/openssl.rb +0 -61
  691. data/lib/phusion_passenger/standalone/config_file.rb +0 -119
  692. data/lib/phusion_passenger/standalone/help_command.rb +0 -57
  693. data/lib/phusion_passenger/standalone/runtime_installer.rb +0 -712
  694. data/lib/phusion_passenger/standalone/runtime_locator.rb +0 -170
  695. data/lib/phusion_passenger/standalone/utils.rb +0 -58
  696. data/lib/phusion_passenger/utils/tmpdir.rb +0 -69
  697. data/packaging/debian/LICENSE.md +0 -19
  698. data/packaging/debian/README.md +0 -320
  699. data/packaging/debian/Vagrantfile +0 -25
  700. data/packaging/debian/build +0 -210
  701. data/packaging/debian/debian_specs/nginx/changelog +0 -1989
  702. data/packaging/debian/debian_specs/nginx/compat.erb +0 -5
  703. data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +0 -25
  704. data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +0 -24
  705. data/packaging/debian/debian_specs/nginx/conf/koi-utf +0 -109
  706. data/packaging/debian/debian_specs/nginx/conf/koi-win +0 -103
  707. data/packaging/debian/debian_specs/nginx/conf/mime.types +0 -89
  708. data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +0 -97
  709. data/packaging/debian/debian_specs/nginx/conf/proxy_params +0 -4
  710. data/packaging/debian/debian_specs/nginx/conf/scgi_params +0 -16
  711. data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +0 -93
  712. data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +0 -13
  713. data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +0 -5
  714. data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +0 -16
  715. data/packaging/debian/debian_specs/nginx/conf/win-utf +0 -125
  716. data/packaging/debian/debian_specs/nginx/control.erb +0 -226
  717. data/packaging/debian/debian_specs/nginx/copyright +0 -196
  718. data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +0 -1
  719. data/packaging/debian/debian_specs/nginx/gbp.conf +0 -2
  720. data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +0 -14
  721. data/packaging/debian/debian_specs/nginx/help/docs/php +0 -119
  722. data/packaging/debian/debian_specs/nginx/help/docs/support-irc +0 -28
  723. data/packaging/debian/debian_specs/nginx/help/docs/upstream +0 -51
  724. data/packaging/debian/debian_specs/nginx/help/examples/drupal +0 -114
  725. data/packaging/debian/debian_specs/nginx/help/examples/http +0 -59
  726. data/packaging/debian/debian_specs/nginx/help/examples/mail +0 -30
  727. data/packaging/debian/debian_specs/nginx/help/examples/mailman +0 -59
  728. data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +0 -34
  729. data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +0 -162
  730. data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +0 -155
  731. data/packaging/debian/debian_specs/nginx/help/examples/wordpress +0 -74
  732. data/packaging/debian/debian_specs/nginx/helpers.rb +0 -41
  733. data/packaging/debian/debian_specs/nginx/index-debian.html.in +0 -32
  734. data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +0 -32
  735. data/packaging/debian/debian_specs/nginx/index.html.erb +0 -10
  736. data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +0 -65
  737. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +0 -510
  738. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +0 -5
  739. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +0 -395
  740. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +0 -119
  741. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +0 -348
  742. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +0 -80
  743. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +0 -826
  744. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +0 -26
  745. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +0 -716
  746. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +0 -26
  747. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +0 -380
  748. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +0 -52
  749. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +0 -32
  750. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +0 -215
  751. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +0 -35
  752. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +0 -25
  753. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +0 -93
  754. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +0 -4
  755. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +0 -462
  756. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +0 -66
  757. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +0 -26
  758. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +0 -171
  759. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +0 -7
  760. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +0 -21
  761. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +0 -1803
  762. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +0 -29
  763. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +0 -9
  764. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +0 -824
  765. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +0 -139
  766. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +0 -395
  767. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +0 -1
  768. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +0 -10
  769. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +0 -8
  770. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +0 -597
  771. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +0 -5
  772. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +0 -12
  773. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +0 -22
  774. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +0 -25
  775. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +0 -35
  776. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +0 -22
  777. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +0 -3
  778. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +0 -4
  779. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +0 -5
  780. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +0 -15
  781. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +0 -2
  782. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +0 -7
  783. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +0 -43
  784. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +0 -78
  785. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +0 -6
  786. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +0 -12
  787. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +0 -49
  788. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +0 -63
  789. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +0 -62
  790. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +0 -124
  791. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +0 -48
  792. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +0 -45
  793. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +0 -12
  794. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +0 -4
  795. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +0 -136
  796. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +0 -797
  797. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +0 -17
  798. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +0 -24
  799. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +0 -113
  800. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +0 -2203
  801. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +0 -5423
  802. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +0 -227
  803. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +0 -72
  804. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +0 -98
  805. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +0 -66
  806. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +0 -112
  807. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +0 -16
  808. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +0 -291
  809. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +0 -19
  810. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +0 -117
  811. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +0 -77
  812. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +0 -200
  813. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +0 -155
  814. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +0 -58
  815. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +0 -43
  816. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +0 -5
  817. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +0 -129
  818. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +0 -30
  819. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +0 -192
  820. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +0 -21
  821. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +0 -396
  822. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +0 -44
  823. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +0 -72
  824. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +0 -171
  825. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +0 -57
  826. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +0 -12
  827. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +0 -82
  828. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +0 -45
  829. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +0 -138
  830. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +0 -3
  831. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +0 -35
  832. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +0 -3
  833. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +0 -165
  834. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +0 -67
  835. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +0 -583
  836. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +0 -22
  837. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +0 -20
  838. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +0 -12
  839. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +0 -215
  840. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +0 -7
  841. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +0 -103
  842. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +0 -26
  843. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +0 -602
  844. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +0 -44
  845. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +0 -434
  846. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +0 -37
  847. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +0 -14
  848. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +0 -205
  849. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +0 -27
  850. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +0 -45
  851. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +0 -6
  852. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +0 -25
  853. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +0 -1850
  854. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +0 -5
  855. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +0 -1558
  856. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +0 -109
  857. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +0 -344
  858. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +0 -25
  859. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +0 -282
  860. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +0 -15
  861. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +0 -183
  862. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +0 -16
  863. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +0 -429
  864. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +0 -18
  865. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +0 -178
  866. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +0 -13
  867. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +0 -667
  868. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +0 -137
  869. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +0 -452
  870. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +0 -31
  871. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +0 -208
  872. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +0 -16
  873. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +0 -788
  874. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +0 -19
  875. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +0 -96
  876. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +0 -13
  877. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +0 -298
  878. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +0 -58
  879. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +0 -110
  880. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +0 -9
  881. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +0 -45
  882. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +0 -8
  883. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +0 -131
  884. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +0 -38
  885. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +0 -24
  886. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +0 -206
  887. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +0 -54
  888. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +0 -26
  889. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +0 -191
  890. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +0 -59
  891. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +0 -73
  892. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +0 -783
  893. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +0 -31
  894. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +0 -361
  895. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +0 -120
  896. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +0 -1180
  897. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +0 -1
  898. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +0 -146
  899. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +0 -5
  900. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +0 -51
  901. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +0 -178
  902. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +0 -5
  903. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +0 -246
  904. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +0 -9
  905. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +0 -51
  906. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +0 -6954
  907. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +0 -363
  908. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +0 -5898
  909. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +0 -61
  910. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +0 -3
  911. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +0 -138
  912. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +0 -140
  913. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +0 -52
  914. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +0 -82
  915. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +0 -377
  916. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +0 -22
  917. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +0 -77
  918. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +0 -537
  919. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +0 -20
  920. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +0 -632
  921. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +0 -31
  922. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +0 -296
  923. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +0 -24
  924. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +0 -175
  925. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +0 -20
  926. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +0 -887
  927. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +0 -22
  928. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +0 -478
  929. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +0 -67
  930. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +0 -19
  931. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +0 -148
  932. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +0 -20
  933. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +0 -369
  934. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +0 -26
  935. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +0 -483
  936. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +0 -20
  937. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +0 -379
  938. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +0 -23
  939. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +0 -216
  940. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +0 -23
  941. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +0 -1081
  942. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +0 -56
  943. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +0 -58
  944. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +0 -33
  945. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +0 -302
  946. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +0 -29
  947. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +0 -1370
  948. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +0 -22
  949. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +0 -782
  950. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +0 -22
  951. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +0 -625
  952. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +0 -23
  953. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +0 -42
  954. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +0 -23
  955. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +0 -320
  956. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +0 -25
  957. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +0 -300
  958. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +0 -20
  959. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +0 -227
  960. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +0 -22
  961. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +0 -252
  962. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +0 -20
  963. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +0 -924
  964. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +0 -184
  965. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +0 -21
  966. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +0 -794
  967. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +0 -28
  968. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +0 -106
  969. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +0 -23
  970. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +0 -94
  971. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +0 -13
  972. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +0 -85
  973. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +0 -2468
  974. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +0 -22
  975. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +0 -1169
  976. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +0 -20
  977. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +0 -252
  978. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +0 -19
  979. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +0 -351
  980. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +0 -22
  981. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +0 -538
  982. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +0 -86
  983. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +0 -216
  984. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +0 -15
  985. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +0 -1844
  986. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +0 -52
  987. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +0 -191
  988. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +0 -20
  989. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +0 -5314
  990. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +0 -156
  991. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +0 -1624
  992. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +0 -56
  993. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +0 -704
  994. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +0 -20
  995. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +0 -1741
  996. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +0 -46
  997. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +0 -278
  998. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +0 -21
  999. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +0 -661
  1000. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +0 -20
  1001. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +0 -110
  1002. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +0 -20
  1003. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +0 -283
  1004. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +0 -36
  1005. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +0 -3972
  1006. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +0 -423
  1007. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +0 -499
  1008. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +0 -20
  1009. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +0 -64
  1010. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +0 -17
  1011. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +0 -5
  1012. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +0 -39
  1013. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +0 -55
  1014. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +0 -27
  1015. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +0 -415
  1016. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +0 -62
  1017. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +0 -64
  1018. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +0 -8
  1019. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +0 -8
  1020. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +0 -102
  1021. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +0 -10
  1022. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +0 -4
  1023. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +0 -144
  1024. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +0 -107
  1025. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +0 -25
  1026. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +0 -8
  1027. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +0 -329
  1028. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +0 -3
  1029. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +0 -1774
  1030. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +0 -53
  1031. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +0 -3
  1032. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +0 -1356
  1033. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +0 -37
  1034. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +0 -24
  1035. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +0 -20
  1036. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +0 -182
  1037. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +0 -8
  1038. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +0 -23
  1039. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +0 -1305
  1040. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +0 -52
  1041. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +0 -103
  1042. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +0 -102
  1043. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +0 -37
  1044. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +0 -141
  1045. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +0 -3
  1046. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +0 -120
  1047. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +0 -199
  1048. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +0 -123
  1049. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +0 -1298
  1050. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +0 -275
  1051. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +0 -820
  1052. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +0 -470
  1053. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +0 -82
  1054. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +0 -83
  1055. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +0 -81
  1056. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +0 -93
  1057. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +0 -34
  1058. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +0 -415
  1059. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +0 -716
  1060. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +0 -29
  1061. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +0 -64
  1062. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +0 -63
  1063. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +0 -539
  1064. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +0 -682
  1065. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +0 -341
  1066. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +0 -1413
  1067. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +0 -81
  1068. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +0 -735
  1069. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +0 -315
  1070. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +0 -524
  1071. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +0 -1749
  1072. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +0 -874
  1073. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +0 -136
  1074. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +0 -32
  1075. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +0 -32
  1076. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +0 -108
  1077. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +0 -59
  1078. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +0 -5
  1079. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +0 -7
  1080. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +0 -29
  1081. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +0 -129
  1082. data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +0 -135
  1083. data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +0 -45
  1084. data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +0 -32
  1085. data/packaging/debian/debian_specs/nginx/nginx-common.install +0 -3
  1086. data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +0 -2
  1087. data/packaging/debian/debian_specs/nginx/nginx-common.manpages +0 -1
  1088. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +0 -10
  1089. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +0 -214
  1090. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +0 -18
  1091. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +0 -37
  1092. data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +0 -66
  1093. data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +0 -46
  1094. data/packaging/debian/debian_specs/nginx/nginx-common.preinst +0 -47
  1095. data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +0 -28
  1096. data/packaging/debian/debian_specs/nginx/nginx-doc.docs +0 -2
  1097. data/packaging/debian/debian_specs/nginx/nginx-doc.examples +0 -1
  1098. data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +0 -17
  1099. data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +0 -1
  1100. data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +0 -44
  1101. data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +0 -22
  1102. data/packaging/debian/debian_specs/nginx/nginx.1 +0 -47
  1103. data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +0 -23
  1104. data/packaging/debian/debian_specs/nginx/patches/series +0 -1
  1105. data/packaging/debian/debian_specs/nginx/rules.erb +0 -185
  1106. data/packaging/debian/debian_specs/nginx/source/format +0 -1
  1107. data/packaging/debian/debian_specs/nginx/tests/control +0 -4
  1108. data/packaging/debian/debian_specs/nginx/ufw/nginx +0 -14
  1109. data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +0 -34
  1110. data/packaging/debian/debian_specs/nginx/watch +0 -3
  1111. data/packaging/debian/debian_specs/passenger/README.Debian +0 -12
  1112. data/packaging/debian/debian_specs/passenger/changelog +0 -316
  1113. data/packaging/debian/debian_specs/passenger/compat +0 -1
  1114. data/packaging/debian/debian_specs/passenger/control.erb +0 -123
  1115. data/packaging/debian/debian_specs/passenger/copyright +0 -385
  1116. data/packaging/debian/debian_specs/passenger/helpers.rb +0 -24
  1117. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +0 -3
  1118. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +0 -36
  1119. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +0 -15
  1120. data/packaging/debian/debian_specs/passenger/locations.ini.erb +0 -14
  1121. data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +0 -3
  1122. data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +0 -2
  1123. data/packaging/debian/debian_specs/passenger/passenger.conf +0 -6
  1124. data/packaging/debian/debian_specs/passenger/passenger.docs +0 -4
  1125. data/packaging/debian/debian_specs/passenger/passenger.install.erb +0 -16
  1126. data/packaging/debian/debian_specs/passenger/passenger.load +0 -3
  1127. data/packaging/debian/debian_specs/passenger/passenger.manpages +0 -3
  1128. data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +0 -29
  1129. data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +0 -54
  1130. data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +0 -37
  1131. data/packaging/debian/debian_specs/passenger/rules.erb +0 -84
  1132. data/packaging/debian/debian_specs/passenger/source/format +0 -1
  1133. data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +0 -12
  1134. data/packaging/debian/debian_specs/passenger_enterprise/changelog +0 -316
  1135. data/packaging/debian/debian_specs/passenger_enterprise/compat +0 -1
  1136. data/packaging/debian/debian_specs/passenger_enterprise/control.erb +0 -123
  1137. data/packaging/debian/debian_specs/passenger_enterprise/copyright +0 -385
  1138. data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +0 -2
  1139. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +0 -3
  1140. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +0 -36
  1141. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +0 -15
  1142. data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +0 -14
  1143. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +0 -3
  1144. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +0 -2
  1145. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +0 -4
  1146. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +0 -14
  1147. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +0 -3
  1148. data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +0 -6
  1149. data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +0 -3
  1150. data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +0 -1
  1151. data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +0 -1
  1152. data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +0 -1
  1153. data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
  1154. data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +0 -84
  1155. data/packaging/debian/debian_specs/passenger_enterprise/source/format +0 -1
  1156. data/packaging/debian/docker_images/Makefile +0 -38
  1157. data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
  1158. data/packaging/debian/docker_images/buildbox/Dockerfile +0 -3
  1159. data/packaging/debian/docker_images/buildbox/Gemfile +0 -9
  1160. data/packaging/debian/docker_images/buildbox/Gemfile.lock +0 -42
  1161. data/packaging/debian/docker_images/buildbox/install.sh +0 -85
  1162. data/packaging/debian/docker_images/buildbox/pbuilderrc +0 -4
  1163. data/packaging/debian/docker_images/buildbox/sudoers.conf +0 -6
  1164. data/packaging/debian/docker_images/setup-buildbox-docker-image +0 -7
  1165. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +0 -7
  1166. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +0 -7
  1167. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +0 -7
  1168. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +0 -7
  1169. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +0 -7
  1170. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +0 -7
  1171. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +0 -7
  1172. data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +0 -3
  1173. data/packaging/debian/docker_images/testbox-debian-6/Gemfile +0 -2
  1174. data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +0 -23
  1175. data/packaging/debian/docker_images/testbox-debian-6/argparse.py +0 -2374
  1176. data/packaging/debian/docker_images/testbox-debian-6/install.sh +0 -78
  1177. data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +0 -3
  1178. data/packaging/debian/docker_images/testbox-debian-7/Gemfile +0 -2
  1179. data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +0 -23
  1180. data/packaging/debian/docker_images/testbox-debian-7/install.sh +0 -71
  1181. data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +0 -3
  1182. data/packaging/debian/docker_images/testbox-debian-8/Gemfile +0 -2
  1183. data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +0 -23
  1184. data/packaging/debian/docker_images/testbox-debian-8/install.sh +0 -70
  1185. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +0 -3
  1186. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +0 -2
  1187. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +0 -23
  1188. data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +0 -69
  1189. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +0 -3
  1190. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +0 -2
  1191. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +0 -23
  1192. data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +0 -69
  1193. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +0 -3
  1194. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +0 -2
  1195. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +0 -23
  1196. data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +0 -69
  1197. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +0 -3
  1198. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +0 -2
  1199. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +0 -23
  1200. data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +0 -69
  1201. data/packaging/debian/internal/build/Rakefile +0 -235
  1202. data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +0 -76
  1203. data/packaging/debian/internal/build/build-source-package.rb +0 -121
  1204. data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +0 -17
  1205. data/packaging/debian/internal/build/rakefile_support.rb +0 -96
  1206. data/packaging/debian/internal/build/setup-environment-essentials.sh +0 -15
  1207. data/packaging/debian/internal/build/setup-environment.sh +0 -29
  1208. data/packaging/debian/internal/lib/distro_info.rb +0 -82
  1209. data/packaging/debian/internal/lib/distro_info.sh +0 -303
  1210. data/packaging/debian/internal/lib/distro_info.sh.erb +0 -65
  1211. data/packaging/debian/internal/lib/library.sh +0 -83
  1212. data/packaging/debian/internal/lib/preprocessor.rb +0 -173
  1213. data/packaging/debian/internal/lib/tracking.rb +0 -95
  1214. data/packaging/debian/internal/lib/tracking_category.rb +0 -45
  1215. data/packaging/debian/internal/lib/tracking_database.rb +0 -132
  1216. data/packaging/debian/internal/lib/tracking_task.rb +0 -148
  1217. data/packaging/debian/internal/lib/utils.rb +0 -78
  1218. data/packaging/debian/internal/publish/Rakefile +0 -97
  1219. data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +0 -1
  1220. data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +0 -1
  1221. data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +0 -1
  1222. data/packaging/debian/internal/publish/preinit.sh +0 -7
  1223. data/packaging/debian/internal/publish/rakefile_support.rb +0 -183
  1224. data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +0 -11
  1225. data/packaging/debian/internal/scripts/initccache.sh +0 -35
  1226. data/packaging/debian/internal/scripts/inituidgid.sh +0 -19
  1227. data/packaging/debian/internal/scripts/my_init +0 -340
  1228. data/packaging/debian/internal/scripts/pin_certificates +0 -34
  1229. data/packaging/debian/internal/scripts/regen_distro_info_script.sh +0 -3
  1230. data/packaging/debian/internal/scripts/setup-vagrant.sh +0 -12
  1231. data/packaging/debian/internal/scripts/setuser +0 -31
  1232. data/packaging/debian/internal/shell/initpbuilder.sh +0 -3
  1233. data/packaging/debian/internal/shell/preinit.sh +0 -28
  1234. data/packaging/debian/internal/shell/sudoers.conf +0 -1
  1235. data/packaging/debian/internal/test/apache/apache-24.conf +0 -5
  1236. data/packaging/debian/internal/test/apache/apache-pre-24.conf +0 -4
  1237. data/packaging/debian/internal/test/apache/vhost.conf +0 -17
  1238. data/packaging/debian/internal/test/misc/config.json +0 -15
  1239. data/packaging/debian/internal/test/misc/hosts.conf +0 -4
  1240. data/packaging/debian/internal/test/misc/init.sh +0 -25
  1241. data/packaging/debian/internal/test/misc/nodejs_test_app.js +0 -6
  1242. data/packaging/debian/internal/test/misc/python_test_app.py +0 -3
  1243. data/packaging/debian/internal/test/misc/ruby_test_app.rb +0 -5
  1244. data/packaging/debian/internal/test/misc/test_support.rb +0 -61
  1245. data/packaging/debian/internal/test/nginx/vhost.conf +0 -23
  1246. data/packaging/debian/internal/test/system_web_server_test.rb +0 -126
  1247. data/packaging/debian/internal/test/test.sh +0 -141
  1248. data/packaging/debian/jenkins/publish/clear_caches.rb +0 -48
  1249. data/packaging/debian/jenkins/publish/publish.sh +0 -69
  1250. data/packaging/debian/jenkins/test/test.sh +0 -63
  1251. data/packaging/debian/passenger_apt_automation.sublime-project +0 -14
  1252. data/packaging/debian/publish +0 -172
  1253. data/packaging/debian/shell +0 -116
  1254. data/packaging/debian/test +0 -142
  1255. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-gcc47-include-sys_types.patch +0 -45
  1256. data/test/cxx/Base64Test.cpp +0 -50
  1257. data/test/cxx/FileBackedPipeTest.cpp +0 -626
  1258. data/test/cxx/HttpHeaderBuffererTest.cpp +0 -257
  1259. data/test/cxx/ScgiRequestParserTest.cpp +0 -423
  1260. data/test/cxx/ServerInstanceDirTest.cpp +0 -175
  1261. data/test/ruby/admin_tools_spec.rb +0 -360
  1262. data/test/ruby/classic_rails/loader_spec.rb +0 -46
  1263. data/test/ruby/classic_rails/preloader_spec.rb +0 -52
  1264. data/test/ruby/standalone/runtime_locator_spec.rb +0 -214
  1265. data/test/stub/rails2.3/Rakefile +0 -10
  1266. data/test/stub/rails2.3/app/controllers/application_controller.rb +0 -10
  1267. data/test/stub/rails2.3/app/controllers/bar_controller_1.rb +0 -5
  1268. data/test/stub/rails2.3/app/controllers/bar_controller_2.rb +0 -5
  1269. data/test/stub/rails2.3/app/controllers/foo_controller.rb +0 -21
  1270. data/test/stub/rails2.3/app/helpers/application_helper.rb +0 -3
  1271. data/test/stub/rails2.3/app/helpers/bar_helper.rb +0 -2
  1272. data/test/stub/rails2.3/app/helpers/foo_helper.rb +0 -2
  1273. data/test/stub/rails2.3/config/boot.rb +0 -110
  1274. data/test/stub/rails2.3/config/database.yml +0 -19
  1275. data/test/stub/rails2.3/config/environment.rb +0 -62
  1276. data/test/stub/rails2.3/config/environments/development.rb +0 -17
  1277. data/test/stub/rails2.3/config/environments/production.rb +0 -18
  1278. data/test/stub/rails2.3/config/environments/staging.rb +0 -18
  1279. data/test/stub/rails2.3/config/initializers/inflections.rb +0 -10
  1280. data/test/stub/rails2.3/config/initializers/mime_types.rb +0 -5
  1281. data/test/stub/rails2.3/config/routes.rb +0 -35
  1282. data/test/stub/rails2.3/log/.gitignore +0 -1
  1283. data/test/stub/rails2.3/public/.gitignore +0 -1
  1284. data/test/stub/rails2.3/script/about +0 -3
  1285. data/test/stub/rails2.3/script/console +0 -3
  1286. data/test/stub/rails2.3/script/dbconsole +0 -3
  1287. data/test/stub/rails2.3/script/destroy +0 -3
  1288. data/test/stub/rails2.3/script/generate +0 -3
  1289. data/test/stub/rails2.3/script/performance/benchmarker +0 -3
  1290. data/test/stub/rails2.3/script/performance/profiler +0 -3
  1291. data/test/stub/rails2.3/script/performance/request +0 -3
  1292. data/test/stub/rails2.3/script/plugin +0 -3
  1293. data/test/stub/rails2.3/script/process/inspector +0 -3
  1294. data/test/stub/rails2.3/script/process/reaper +0 -3
  1295. data/test/stub/rails2.3/script/process/spawner +0 -3
  1296. data/test/stub/rails2.3/script/runner +0 -3
  1297. data/test/stub/rails2.3/script/server +0 -3
  1298. data/test/stub/rails2.3/tmp/cache/.gitignore +0 -1
  1299. data/test/stub/rails2.3/tmp/pids/.gitignore +0 -1
  1300. data/test/stub/rails2.3/tmp/sessions/.gitignore +0 -1
  1301. data/test/stub/rails2.3/tmp/sockets/.gitignore +0 -1
@@ -0,0 +1,206 @@
1
+ /*
2
+ * Phusion Passenger - https://www.phusionpassenger.com/
3
+ * Copyright (c) 2014 Phusion
4
+ *
5
+ * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #ifndef _PASSENGER_SERVER_KIT_FD_SINK_CHANNEL_H_
26
+ #define _PASSENGER_SERVER_KIT_FD_SINK_CHANNEL_H_
27
+
28
+ #include <oxt/macros.hpp>
29
+ #include <cerrno>
30
+ #include <unistd.h>
31
+ #include <ev.h>
32
+ #include <ServerKit/Channel.h>
33
+
34
+ namespace Passenger {
35
+ namespace ServerKit {
36
+
37
+ using namespace oxt;
38
+
39
+
40
+ class FdSinkChannel: protected Channel {
41
+ private:
42
+ ev_io watcher;
43
+
44
+ static Result _onData(Channel *channel, const MemoryKit::mbuf &buffer, int errcode) {
45
+ return static_cast<FdSinkChannel *>(channel)->onData(buffer, errcode);
46
+ }
47
+
48
+ Result onData(const MemoryKit::mbuf &buffer, int errcode) {
49
+ if (buffer.size() > 0) {
50
+ // Data
51
+ ssize_t ret;
52
+
53
+ do {
54
+ ret = ::write(watcher.fd, buffer.start, buffer.size());
55
+ } while (ret == -1 && errno == EAGAIN);
56
+ if (ret == (ssize_t) buffer.size()) {
57
+ return Result(ret, false);
58
+ } else if (ret >= 0) {
59
+ ev_io_start(ctx->libev->getLoop(), &watcher);
60
+ stop();
61
+ return Result(ret, false);
62
+ } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
63
+ ev_io_start(ctx->libev->getLoop(), &watcher);
64
+ stop();
65
+ return Result(0, false);
66
+ } else {
67
+ Channel::feedError(errno);
68
+ return Result(0, false);
69
+ }
70
+ } else if (errcode == 0) {
71
+ // EOF
72
+ return Channel::Result(0, true);
73
+ } else {
74
+ // Error
75
+ // We do nothing here. The caller is responsible for handling the error.
76
+ return Channel::Result(0, false);
77
+ }
78
+ }
79
+
80
+ static void _onWritable(EV_P_ ev_io *io, int revents) {
81
+ FdSinkChannel *self = static_cast<FdSinkChannel *>(io->data);
82
+ ev_io_stop(self->ctx->libev->getLoop(), &self->watcher);
83
+ self->start();
84
+ }
85
+
86
+ void initialize() {
87
+ dataCallback = _onData;
88
+ watcher.fd = -1;
89
+ watcher.data = this;
90
+ }
91
+
92
+ public:
93
+ FdSinkChannel() {
94
+ initialize();
95
+ }
96
+
97
+ FdSinkChannel(Context *context)
98
+ : Channel(context)
99
+ {
100
+ initialize();
101
+ }
102
+
103
+ ~FdSinkChannel() {
104
+ if (ctx != NULL) {
105
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
106
+ }
107
+ }
108
+
109
+ // May only be called right after construction.
110
+ OXT_FORCE_INLINE
111
+ void setContext(Context *context) {
112
+ Channel::setContext(context);
113
+ }
114
+
115
+ void reinitialize(int fd) {
116
+ Channel::reinitialize();
117
+ ev_io_init(&watcher, _onWritable, fd, EV_WRITE);
118
+ }
119
+
120
+ void deinitialize() {
121
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
122
+ watcher.fd = -1;
123
+ Channel::deinitialize();
124
+ }
125
+
126
+ OXT_FORCE_INLINE
127
+ int feed(const MemoryKit::mbuf &mbuf) {
128
+ return Channel::feed(mbuf);
129
+ }
130
+
131
+ OXT_FORCE_INLINE
132
+ int feed(BOOST_RV_REF(MemoryKit::mbuf) mbuf) {
133
+ return Channel::feed(mbuf);
134
+ }
135
+
136
+ OXT_FORCE_INLINE
137
+ int feedWithoutRefGuard(const MemoryKit::mbuf &mbuf) {
138
+ return Channel::feedWithoutRefGuard(mbuf);
139
+ }
140
+
141
+ OXT_FORCE_INLINE
142
+ int feedWithoutRefGuard(BOOST_RV_REF(MemoryKit::mbuf) mbuf) {
143
+ return Channel::feedWithoutRefGuard(mbuf);
144
+ }
145
+
146
+ OXT_FORCE_INLINE
147
+ void feedError(int errcode) {
148
+ return Channel::feedError(errcode);
149
+ }
150
+
151
+ OXT_FORCE_INLINE
152
+ int getFd() const {
153
+ return watcher.fd;
154
+ }
155
+
156
+ OXT_FORCE_INLINE
157
+ bool acceptingInput() const {
158
+ return Channel::acceptingInput();
159
+ }
160
+
161
+ OXT_FORCE_INLINE
162
+ bool mayAcceptInputLater() const {
163
+ return Channel::mayAcceptInputLater();
164
+ }
165
+
166
+ OXT_FORCE_INLINE
167
+ bool hasError() const {
168
+ return Channel::hasError();
169
+ }
170
+
171
+ OXT_FORCE_INLINE
172
+ int getErrcode() const {
173
+ return Channel::getErrcode();
174
+ }
175
+
176
+ OXT_FORCE_INLINE
177
+ bool ended() const {
178
+ return Channel::ended();
179
+ }
180
+
181
+ OXT_FORCE_INLINE
182
+ bool endAcked() const {
183
+ return Channel::endAcked();
184
+ }
185
+
186
+ OXT_FORCE_INLINE
187
+ void setConsumedCallback(ConsumedCallback callback) {
188
+ Channel::consumedCallback = callback;
189
+ }
190
+
191
+ OXT_FORCE_INLINE
192
+ Hooks *getHooks() const {
193
+ return hooks;
194
+ }
195
+
196
+ OXT_FORCE_INLINE
197
+ void setHooks(Hooks *hooks) {
198
+ this->hooks = hooks;
199
+ }
200
+ };
201
+
202
+
203
+ } // namespace ServerKit
204
+ } // namespace Passenger
205
+
206
+ #endif /* _PASSENGER_SERVER_KIT_FD_SINK_CHANNEL_H_ */
@@ -0,0 +1,230 @@
1
+ /*
2
+ * Phusion Passenger - https://www.phusionpassenger.com/
3
+ * Copyright (c) 2014 Phusion
4
+ *
5
+ * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #ifndef _PASSENGER_SERVER_KIT_FD_SOURCE_CHANNEL_H_
26
+ #define _PASSENGER_SERVER_KIT_FD_SOURCE_CHANNEL_H_
27
+
28
+ #include <oxt/macros.hpp>
29
+ #include <boost/move/move.hpp>
30
+ #include <sys/types.h>
31
+ #include <unistd.h>
32
+ #include <ev.h>
33
+ #include <MemoryKit/mbuf.h>
34
+ #include <ServerKit/Context.h>
35
+ #include <ServerKit/Channel.h>
36
+
37
+ namespace Passenger {
38
+ namespace ServerKit {
39
+
40
+ using namespace oxt;
41
+
42
+
43
+ class FdSourceChannel: protected Channel {
44
+ private:
45
+ ev_io watcher;
46
+ MemoryKit::mbuf buffer;
47
+
48
+ static void _onReadable(EV_P_ ev_io *io, int revents) {
49
+ static_cast<FdSourceChannel *>(io->data)->onReadable(io, revents);
50
+ }
51
+
52
+ void onReadable(ev_io *io, int revents) {
53
+ RefGuard guard(hooks, this, __FILE__, __LINE__);
54
+ onReadableWithoutRefGuard();
55
+ }
56
+
57
+ void onReadableWithoutRefGuard() {
58
+ unsigned int generation = this->generation;
59
+ unsigned int i, origBufferSize;
60
+ bool done = false;
61
+ ssize_t ret;
62
+ int e;
63
+
64
+ if (!acceptingInput()) {
65
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
66
+ if (mayAcceptInputLater()) {
67
+ consumedCallback = onChannelConsumed;
68
+ }
69
+ return;
70
+ }
71
+
72
+ for (i = 0; i < burstReadCount && !done; i++) {
73
+ if (buffer.empty()) {
74
+ buffer = MemoryKit::mbuf_get(&ctx->mbuf_pool);
75
+ }
76
+
77
+ origBufferSize = buffer.size();
78
+ do {
79
+ ret = ::read(watcher.fd, buffer.start, buffer.size());
80
+ } while (OXT_UNLIKELY(ret == -1 && errno == EINTR));
81
+ if (ret > 0) {
82
+ MemoryKit::mbuf buffer2(buffer, 0, ret);
83
+ if (size_t(ret) == size_t(buffer.size())) {
84
+ // Unref mbuf_block
85
+ buffer = MemoryKit::mbuf();
86
+ } else {
87
+ buffer = MemoryKit::mbuf(buffer, ret);
88
+ }
89
+ feedWithoutRefGuard(boost::move(buffer2));
90
+ if (generation != this->generation) {
91
+ // Callback deinitialized this object.
92
+ return;
93
+ }
94
+
95
+ if (!acceptingInput()) {
96
+ done = true;
97
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
98
+ if (mayAcceptInputLater()) {
99
+ consumedCallback = onChannelConsumed;
100
+ }
101
+ } else {
102
+ // If we were unable to fill the entire buffer, then it's likely that
103
+ // the client is slow and that the next read() will fail with
104
+ // EAGAIN, so we stop looping and return to the event loop poller.
105
+ done = (size_t) ret < origBufferSize;
106
+ }
107
+
108
+ } else if (ret == 0) {
109
+ done = true;
110
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
111
+ buffer = MemoryKit::mbuf();
112
+ feedWithoutRefGuard(MemoryKit::mbuf());
113
+
114
+ } else {
115
+ e = errno;
116
+ done = true;
117
+ buffer = MemoryKit::mbuf();
118
+ if (e != EAGAIN && e != EWOULDBLOCK) {
119
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
120
+ feedError(e);
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ static void onChannelConsumed(Channel *channel, unsigned int size) {
127
+ FdSourceChannel *self = static_cast<FdSourceChannel *>(channel);
128
+ self->consumedCallback = NULL;
129
+ if (self->acceptingInput()) {
130
+ ev_io_start(self->ctx->libev->getLoop(), &self->watcher);
131
+ }
132
+ }
133
+
134
+ void initialize() {
135
+ burstReadCount = 1;
136
+ watcher.fd = -1;
137
+ watcher.data = this;
138
+ }
139
+
140
+ public:
141
+ unsigned int burstReadCount;
142
+
143
+ FdSourceChannel() {
144
+ initialize();
145
+ }
146
+
147
+ FdSourceChannel(Context *context)
148
+ : Channel(context)
149
+ {
150
+ initialize();
151
+ }
152
+
153
+ ~FdSourceChannel() {
154
+ if (ctx != NULL) {
155
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
156
+ }
157
+ }
158
+
159
+ // May only be called right after construction.
160
+ OXT_FORCE_INLINE
161
+ void setContext(Context *context) {
162
+ Channel::setContext(context);
163
+ }
164
+
165
+ void reinitialize(int fd) {
166
+ Channel::reinitialize();
167
+ ev_io_init(&watcher, _onReadable, fd, EV_READ);
168
+ }
169
+
170
+ void deinitialize() {
171
+ buffer = MemoryKit::mbuf();
172
+ ev_io_stop(ctx->libev->getLoop(), &watcher);
173
+ watcher.fd = -1;
174
+ consumedCallback = NULL;
175
+ Channel::deinitialize();
176
+ }
177
+
178
+ // May only be called right after the constructor or reinitialize().
179
+ void startReading() {
180
+ startReadingInNextTick();
181
+ onReadableWithoutRefGuard();
182
+ }
183
+
184
+ // May only be called right after the constructor or reinitialize().
185
+ void startReadingInNextTick() {
186
+ assert(Channel::acceptingInput());
187
+ ev_io_start(ctx->libev->getLoop(), &watcher);
188
+ }
189
+
190
+ OXT_FORCE_INLINE
191
+ void start() {
192
+ Channel::start();
193
+ }
194
+
195
+ OXT_FORCE_INLINE
196
+ void stop() {
197
+ Channel::stop();
198
+ }
199
+
200
+ OXT_FORCE_INLINE
201
+ void consumed(unsigned int size, bool end) {
202
+ Channel::consumed(size, end);
203
+ }
204
+
205
+ OXT_FORCE_INLINE
206
+ int getFd() const {
207
+ return watcher.fd;
208
+ }
209
+
210
+ OXT_FORCE_INLINE
211
+ void setDataCallback(DataCallback callback) {
212
+ Channel::dataCallback = callback;
213
+ }
214
+
215
+ OXT_FORCE_INLINE
216
+ Hooks *getHooks() const {
217
+ return hooks;
218
+ }
219
+
220
+ OXT_FORCE_INLINE
221
+ void setHooks(Hooks *hooks) {
222
+ this->hooks = hooks;
223
+ }
224
+ };
225
+
226
+
227
+ } // namespace ServerKit
228
+ } // namespace Passenger
229
+
230
+ #endif /* _PASSENGER_SERVER_KIT_FD_SOURCE_CHANNEL_H_ */
@@ -0,0 +1,1399 @@
1
+ /*
2
+ * Phusion Passenger - https://www.phusionpassenger.com/
3
+ * Copyright (c) 2014 Phusion
4
+ *
5
+ * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
25
+ #ifndef _PASSENGER_SERVER_KIT_FILE_BUFFERED_CHANNEL_H_
26
+ #define _PASSENGER_SERVER_KIT_FILE_BUFFERED_CHANNEL_H_
27
+
28
+ #include <boost/cstdint.hpp>
29
+ #include <boost/shared_ptr.hpp>
30
+ #include <boost/make_shared.hpp>
31
+ #include <boost/move/move.hpp>
32
+ #include <boost/atomic.hpp>
33
+ #include <sys/types.h>
34
+ #include <eio.h>
35
+ #include <cassert>
36
+ #include <cstddef>
37
+ #include <cstring>
38
+ #include <algorithm>
39
+ #include <utility>
40
+ #include <string>
41
+ #include <deque>
42
+ #include <Logging.h>
43
+ #include <ServerKit/Context.h>
44
+ #include <ServerKit/Errors.h>
45
+ #include <ServerKit/Channel.h>
46
+
47
+ namespace Passenger {
48
+ namespace ServerKit {
49
+
50
+ using namespace std;
51
+
52
+ #define FBC_DEBUG(expr) \
53
+ P_TRACE(3, "[FBC " << (void *) this << "] " << expr)
54
+ #define FBC_DEBUG_WITH_POS(file, line, expr) \
55
+ P_TRACE_WITH_POS(3, file, line, "[FBC " << (void *) this << "] " << expr)
56
+ #define FBC_DEBUG_FROM_STATIC(expr) \
57
+ P_TRACE(3, "[FBC " << (void *) self << "] " << expr)
58
+
59
+
60
+ /**
61
+ * Adds "unlimited" buffering capability to a Channel. A Channel has a buffer size
62
+ * of 1, which is why you can't write to a Channel until the previously written
63
+ * data is consumed. But with FileBufferedChannel, everything you write to it
64
+ * is either buffered to memory, or to disk. If the total amount of buffered data is
65
+ * below a threshold, everything is buffered in memory. Beyond the threshold, buffered
66
+ * data will be written to disk and freed from memory. This allows you to buffer
67
+ * a virtually unlimited amount of data, without using a lot of memory.
68
+ *
69
+ * FileBufferedChannel operates by default in the in-memory mode. All data is buffered
70
+ * in memory. Beyond a threshold (determined by `passedThreshold()`), it switches
71
+ * to in-file mode.
72
+ */
73
+ class FileBufferedChannel: protected Channel {
74
+ public:
75
+ /***** Types and constants *****/
76
+
77
+ enum Mode {
78
+ /**
79
+ * The default mode. The reader is responsible for switching from
80
+ * in-file mode to in-memory mode.
81
+ */
82
+ IN_MEMORY_MODE,
83
+
84
+ /**
85
+ * The `feed()` method is responsible for switching to
86
+ * in-file mode.
87
+ */
88
+ IN_FILE_MODE,
89
+
90
+ /**
91
+ * If either the reader or writer encountered an error, it will
92
+ * cancel everything and switch to the error mode.
93
+ *
94
+ * @invariant
95
+ * readerState == RS_TERMINATED
96
+ * inFileMode == NULL
97
+ */
98
+ ERROR,
99
+
100
+ /**
101
+ * When switching to the error made, an attempt is made to pass the
102
+ * error to the data callback. If the previous data callback isn't
103
+ * finsihed yet, then we'll switch to this state, wait until it
104
+ * becomes idle, then feed the error and switch to ERROR.
105
+ *
106
+ * @invariant
107
+ * readerState == RS_TERMINATED
108
+ * inFileMode == NULL
109
+ */
110
+ ERROR_WAITING
111
+ };
112
+
113
+ enum ReaderState {
114
+ /** The reader isn't active. It will be activated next time a buffer
115
+ * is pushed to the queue.
116
+ */
117
+ RS_INACTIVE,
118
+
119
+ /**
120
+ * The reader is feeding a buffer to the underlying channel.
121
+ */
122
+ RS_FEEDING,
123
+
124
+ /**
125
+ * The reader is feeding an empty buffer to the underlying channel.
126
+ */
127
+ RS_FEEDING_EOF,
128
+
129
+ /**
130
+ * The reader has just fed a buffer to the underlying channel,
131
+ * and is waiting for it to become idle.
132
+ *
133
+ * Invariant:
134
+ *
135
+ * mode < ERROR
136
+ */
137
+ RS_WAITING_FOR_CHANNEL_IDLE,
138
+
139
+ /** The reader is reading from the file.
140
+ *
141
+ * Invariant:
142
+ *
143
+ * mode == IN_FILE_MODE
144
+ * inFileMode->readRequest != NULL
145
+ * inFileMode->written > 0
146
+ */
147
+ RS_READING_FROM_FILE,
148
+
149
+ /**
150
+ * The reader has encountered EOF or an error. It cannot be reactivated
151
+ * until the FileBufferedChannel is deinitialized and reinitialized.
152
+ */
153
+ RS_TERMINATED
154
+ };
155
+
156
+ enum WriterState {
157
+ /**
158
+ * The writer isn't active. It will be activated next time
159
+ * `feed()` notices that the threshold has passed.
160
+ *
161
+ * @invariant !passedThreshold()
162
+ */
163
+ WS_INACTIVE,
164
+
165
+ /**
166
+ * The writer is creating a file.
167
+ *
168
+ * @invariant passedThreshold()
169
+ */
170
+ WS_CREATING_FILE,
171
+
172
+ /**
173
+ * The writer is moving buffers to the file. It transitions to WS_INACTIVE
174
+ * when there are no more buffers to move.
175
+ *
176
+ * @invariant nbuffers > 0
177
+ */
178
+ WS_MOVING,
179
+
180
+ /**
181
+ * The writer has encountered EOF or an error. It cannot be reactivated
182
+ * until the FileBufferedChannel is deinitialized and reinitialized.
183
+ */
184
+ WS_TERMINATED
185
+ };
186
+
187
+ typedef Channel::DataCallback DataCallback;
188
+ typedef void (*Callback)(FileBufferedChannel *channel);
189
+
190
+ // `buffered` is 25-bit. This is 2^25-1, or 32 MB.
191
+ static const unsigned int MAX_MEMORY_BUFFERING = 33554431;
192
+
193
+
194
+ private:
195
+ struct IOContext {
196
+ FileBufferedChannel *self;
197
+ SafeLibevPtr libev;
198
+ eio_req *req;
199
+ boost::atomic<bool> canceled;
200
+
201
+ eio_ssize_t result;
202
+ int errcode;
203
+
204
+ IOContext(FileBufferedChannel *_self)
205
+ : self(_self),
206
+ libev(_self->ctx->libev),
207
+ req(NULL),
208
+ canceled(false),
209
+ result(-1),
210
+ errcode(-1)
211
+ { }
212
+
213
+ virtual ~IOContext() { }
214
+
215
+ void cancel() {
216
+ if (req != NULL) {
217
+ eio_cancel(req);
218
+ }
219
+ canceled.store(true, boost::memory_order_release);
220
+ }
221
+
222
+ bool isCanceled() const {
223
+ return (req != NULL && EIO_CANCELLED(req))
224
+ || canceled.load(boost::memory_order_acquire);
225
+ }
226
+
227
+ void eioFinished() {
228
+ result = req->result;
229
+ errcode = req->errorno;
230
+ req = NULL;
231
+ }
232
+ };
233
+
234
+ struct ReadContext;
235
+
236
+ /**
237
+ * Holds all states for the in-file mode. Reasons why this is a separate
238
+ * structure:
239
+ *
240
+ * - We can keep the size of the FileBufferedChannel small for the common,
241
+ * fast case where the consumer can keep up with the writes.
242
+ * - We improve the clarity of the code by clearly grouping variables
243
+ * that are only used in the in-file mode.
244
+ * - While eio operations are in progress, they hold a smart pointer to the
245
+ * InFileMode structure, which ensures that the file descriptor that they
246
+ * operate on stays open until all eio operations have finished (or until
247
+ * their cancellation have been acknowledged by their callbacks).
248
+ *
249
+ * The variables inside this structure point to different places in the file:
250
+ *
251
+ * +------------------------+
252
+ * | |
253
+ * | already read |
254
+ * | |
255
+ * +------------------------+ <------ readOffset
256
+ * | | \
257
+ * | written but not read | |----- written
258
+ * | | /
259
+ * +------------------------+ <------ readOffset + written
260
+ * | buffer being written | --+
261
+ * +------------------------+ |
262
+ * | unwritten buffer 1 | |
263
+ * +------------------------+ |
264
+ * | unwritten buffer 2 | |---- nbuffers,
265
+ * +------------------------+ | bytesBuffered
266
+ * | .... | --+
267
+ * +------------------------+
268
+ */
269
+ struct InFileMode {
270
+ /***** Common state *****/
271
+
272
+ /**
273
+ * The file descriptor of the temp file. It's -1 if the file is being
274
+ * created.
275
+ */
276
+ int fd;
277
+
278
+
279
+ /***** Reader state *****/
280
+
281
+ /**
282
+ * The read operation that the reader is currently performing.
283
+ *
284
+ * @invariant
285
+ * (readRequest != NULL) == (readerState == RS_READING_FROM_FILE)
286
+ */
287
+ ReadContext *readRequest;
288
+
289
+
290
+ /***** Writer state *****/
291
+
292
+ WriterState writerState;
293
+
294
+ /**
295
+ * The write operation that the writer is currently performing. Might be
296
+ * an `eio_open()`, `eio_write()`, or whatever.
297
+ *
298
+ * @invariant
299
+ * (writerRequest != NULL) == (writerState == WS_CREATING_FILE || writerState == WS_MOVING)
300
+ */
301
+ IOContext *writerRequest;
302
+
303
+ /**
304
+ * Number of bytes already read from the file by the reader.
305
+ */
306
+ off_t readOffset;
307
+ /**
308
+ * Number of bytes written to the file by the writer (relative to `readOffset`),
309
+ * but not yet read by the reader.
310
+ *
311
+ * `written` can be _negative_, which means that the writer is still writing buffers to
312
+ * the file, but the reader has already fed one or more of those still-being-written
313
+ * buffers to the underlying channel.
314
+ *
315
+ * @invariant
316
+ * if written < 0:
317
+ * nbuffers > 0
318
+ */
319
+ boost::int64_t written;
320
+
321
+ InFileMode()
322
+ : fd(-1),
323
+ readRequest(NULL),
324
+ writerState(WS_INACTIVE),
325
+ writerRequest(NULL),
326
+ readOffset(0),
327
+ written(0)
328
+ { }
329
+
330
+ ~InFileMode() {
331
+ P_ASSERT_EQ(readRequest, 0);
332
+ P_ASSERT_EQ(writerRequest, 0);
333
+ if (fd != -1) {
334
+ eio_close(fd, 0, NULL, NULL);
335
+ }
336
+ }
337
+ };
338
+
339
+ FileBufferedChannelConfig *config;
340
+ Mode mode;
341
+ ReaderState readerState;
342
+ /** Number of buffers in `firstBuffer` + `moreBuffers`. */
343
+ boost::uint16_t nbuffers;
344
+
345
+ /**
346
+ * If an error is encountered, its details are stored here.
347
+ *
348
+ * @invariant
349
+ * (errcode == 0) == (mode < ERROR)
350
+ */
351
+ int errcode;
352
+
353
+ /**
354
+ * `firstBuffer` and `moreBuffers` together form a queue of buffers for the reader
355
+ * and the writer to process.
356
+ *
357
+ * A deque allocates memory on the heap. In the common case where the channel callback
358
+ * can keep up with the writes, we don't want to have any dynamic memory allocation
359
+ * at all. That's why we store the first buffer in an instance variable. Only when
360
+ * there is more than 1 buffer do we use the deque.
361
+ *
362
+ * Buffers are pushed to end of the queue, and popped from the beginning. In the in-memory
363
+ * mode, the reader is responsible for popping buffers. In the in-file mode, the writer
364
+ * is responsible for popping buffers (and writing them to the file).
365
+ */
366
+ boost::uint32_t bytesBuffered;
367
+ MemoryKit::mbuf firstBuffer;
368
+ deque<MemoryKit::mbuf> moreBuffers;
369
+
370
+ /**
371
+ * @invariant
372
+ * (inFileMode != NULL) == (mode == IN_FILE_MODE)
373
+ */
374
+ boost::shared_ptr<InFileMode> inFileMode;
375
+
376
+
377
+ /***** Buffer manipulation *****/
378
+
379
+ void clearBuffers() {
380
+ nbuffers = 0;
381
+ bytesBuffered = 0;
382
+ firstBuffer = MemoryKit::mbuf();
383
+ if (!moreBuffers.empty()) {
384
+ // Some STL implementations, like OS X's, iterate through
385
+ // the deque in its clear() implementation, so adding
386
+ // a conditional here improves performance slightly.
387
+ moreBuffers.clear();
388
+ }
389
+ }
390
+
391
+ void pushBuffer(const MemoryKit::mbuf &buffer) {
392
+ assert(bytesBuffered + buffer.size() <= MAX_MEMORY_BUFFERING);
393
+ if (nbuffers == 0) {
394
+ firstBuffer = buffer;
395
+ } else {
396
+ moreBuffers.push_back(buffer);
397
+ }
398
+ nbuffers++;
399
+ bytesBuffered += buffer.size();
400
+ FBC_DEBUG("pushBuffer() completed: nbuffers = " << nbuffers << ", bytesBuffered = " << bytesBuffered);
401
+ }
402
+
403
+ void popBuffer() {
404
+ assert(bytesBuffered >= firstBuffer.size());
405
+ bytesBuffered -= firstBuffer.size();
406
+ nbuffers--;
407
+ FBC_DEBUG("popBuffer() completed: nbuffers = " << nbuffers << ", bytesBuffered = " << bytesBuffered);
408
+ if (moreBuffers.empty()) {
409
+ firstBuffer = MemoryKit::mbuf();
410
+ P_ASSERT_EQ(nbuffers, 0);
411
+ callBuffersFlushedCallback();
412
+ } else {
413
+ firstBuffer = moreBuffers.front();
414
+ moreBuffers.pop_front();
415
+ }
416
+ }
417
+
418
+ OXT_FORCE_INLINE
419
+ bool hasBuffers() const {
420
+ return nbuffers > 0;
421
+ }
422
+
423
+ OXT_FORCE_INLINE
424
+ MemoryKit::mbuf &peekBuffer() {
425
+ return firstBuffer;
426
+ }
427
+
428
+ MemoryKit::mbuf &peekLastBuffer() {
429
+ if (nbuffers <= 1) {
430
+ return firstBuffer;
431
+ } else {
432
+ return moreBuffers.back();
433
+ }
434
+ }
435
+
436
+ const MemoryKit::mbuf &peekLastBuffer() const {
437
+ if (nbuffers <= 1) {
438
+ return firstBuffer;
439
+ } else {
440
+ return moreBuffers.back();
441
+ }
442
+ }
443
+
444
+ void callBuffersFlushedCallback() {
445
+ if (buffersFlushedCallback != NULL) {
446
+ FBC_DEBUG("Calling buffersFlushedCallback");
447
+ buffersFlushedCallback(this);
448
+ }
449
+ }
450
+
451
+ void callDataFlushedCallback() {
452
+ if (dataFlushedCallback != NULL) {
453
+ FBC_DEBUG("Calling dataFlushedCallback");
454
+ dataFlushedCallback(this);
455
+ }
456
+ }
457
+
458
+
459
+ /***** Reader *****/
460
+
461
+ void readNext() {
462
+ RefGuard guard(hooks, this, __FILE__, __LINE__);
463
+ readNextWithoutRefGuard();
464
+ }
465
+
466
+ void readNextWithoutRefGuard() {
467
+ begin:
468
+ FBC_DEBUG("Reader: reading next");
469
+ P_ASSERT_EQ(Channel::state, IDLE);
470
+ unsigned int generation = this->generation;
471
+
472
+ switch (mode) {
473
+ case IN_MEMORY_MODE:
474
+ if (!hasBuffers()) {
475
+ FBC_DEBUG("Reader: no more buffers. Transitioning to RS_INACTIVE");
476
+ readerState = RS_INACTIVE;
477
+ verifyInvariants();
478
+ callDataFlushedCallback();
479
+ } else if (peekBuffer().empty()) {
480
+ FBC_DEBUG("Reader: EOF encountered. Feeding EOF");
481
+ readerState = RS_FEEDING_EOF;
482
+ verifyInvariants();
483
+ {
484
+ // Make a copy of the buffer so that if the callback calls
485
+ // deinitialize(), it won't suddenly reset the buffer argument.
486
+ MemoryKit::mbuf buffer(peekBuffer());
487
+ Channel::feedWithoutRefGuard(buffer);
488
+ }
489
+ if (generation != this->generation || mode >= ERROR) {
490
+ // Callback deinitialized this object, or callback
491
+ // called a method that encountered an error.
492
+ return;
493
+ }
494
+ P_ASSERT_EQ(readerState, RS_FEEDING_EOF);
495
+ verifyInvariants();
496
+ FBC_DEBUG("Reader: EOF fed. Transitioning to RS_TERMINATED");
497
+ terminateReaderBecauseOfEOF();
498
+ } else {
499
+ MemoryKit::mbuf buffer(peekBuffer());
500
+ FBC_DEBUG("Reader: found buffer, " << buffer.size() << " bytes");
501
+ popBuffer();
502
+ if (generation != this->generation || mode >= ERROR) {
503
+ // buffersFlushedCallback deinitialized this object, or callback
504
+ // called a method that encountered an error.
505
+ return;
506
+ }
507
+ readerState = RS_FEEDING;
508
+ FBC_DEBUG("Reader: feeding buffer, " << buffer.size() << " bytes");
509
+ Channel::feedWithoutRefGuard(buffer);
510
+ if (generation != this->generation || mode >= ERROR) {
511
+ // Callback deinitialized this object, or callback
512
+ // called a method that encountered an error.
513
+ return;
514
+ }
515
+ P_ASSERT_EQ(readerState, RS_FEEDING);
516
+ verifyInvariants();
517
+ if (acceptingInput()) {
518
+ goto begin;
519
+ } else if (mayAcceptInputLater()) {
520
+ readNextWhenChannelIdle();
521
+ } else {
522
+ FBC_DEBUG("Reader: data callback no longer accepts further data");
523
+ terminateReaderBecauseOfEOF();
524
+ }
525
+ }
526
+ break;
527
+ case IN_FILE_MODE:
528
+ if (inFileMode->written > 0) {
529
+ // The file contains unread data. Read from
530
+ // file and feed to underlying channel.
531
+ readNextChunkFromFile();
532
+ } else {
533
+ // The file contains no unread data. Read next buffer
534
+ // from memory.
535
+ pair<MemoryKit::mbuf, bool> result = findBufferForReadProcessing();
536
+
537
+ if (!result.second) {
538
+ readerState = RS_INACTIVE;
539
+ if (config->autoTruncateFile) {
540
+ FBC_DEBUG("Reader: no more buffers. Transitioning to RS_INACTIVE, truncating file");
541
+ switchToInMemoryMode();
542
+ } else {
543
+ FBC_DEBUG("Reader: no more buffers. Transitioning to RS_INACTIVE, "
544
+ "not truncating file because config->autoTruncateFile is turned off");
545
+ }
546
+ verifyInvariants();
547
+ callDataFlushedCallback();
548
+ } else if (result.first.empty()) {
549
+ FBC_DEBUG("Reader: EOF encountered. Feeding EOF");
550
+ readerState = RS_FEEDING_EOF;
551
+ verifyInvariants();
552
+ Channel::feedWithoutRefGuard(result.first);
553
+ if (generation != this->generation || mode >= ERROR) {
554
+ // Callback deinitialized this object, or callback
555
+ // called a method that encountered an error.
556
+ return;
557
+ }
558
+ P_ASSERT_EQ(readerState, RS_FEEDING_EOF);
559
+ verifyInvariants();
560
+ FBC_DEBUG("Reader: EOF fed. Transitioning to RS_TERMINATED");
561
+ terminateReaderBecauseOfEOF();
562
+ } else {
563
+ FBC_DEBUG("Reader: found buffer, " << result.first.size() << " bytes");
564
+ inFileMode->readOffset += result.first.size();
565
+ inFileMode->written -= result.first.size();
566
+ readerState = RS_FEEDING;
567
+ FBC_DEBUG("Reader: feeding buffer, " << result.first.size() << " bytes");
568
+ Channel::feedWithoutRefGuard(result.first);
569
+ if (generation != this->generation || mode >= ERROR) {
570
+ // Callback deinitialized this object, or callback
571
+ // called a method that encountered an error.
572
+ return;
573
+ }
574
+ P_ASSERT_EQ(readerState, RS_FEEDING);
575
+ verifyInvariants();
576
+ if (acceptingInput()) {
577
+ goto begin;
578
+ } else if (mayAcceptInputLater()) {
579
+ readNextWhenChannelIdle();
580
+ } else {
581
+ FBC_DEBUG("Reader: data callback no longer accepts further data");
582
+ terminateReaderBecauseOfEOF();
583
+ }
584
+ }
585
+ }
586
+ break;
587
+ case ERROR:
588
+ case ERROR_WAITING:
589
+ P_BUG("Should never be reached");
590
+ break;
591
+ }
592
+ }
593
+
594
+ void terminateReaderBecauseOfEOF() {
595
+ readerState = RS_TERMINATED;
596
+ verifyInvariants();
597
+ callDataFlushedCallback();
598
+ }
599
+
600
+ void readNextWhenChannelIdle() {
601
+ FBC_DEBUG("Reader: waiting for underlying channel to become idle");
602
+ readerState = RS_WAITING_FOR_CHANNEL_IDLE;
603
+ verifyInvariants();
604
+ }
605
+
606
+ void channelHasBecomeIdle() {
607
+ FBC_DEBUG("Reader: underlying channel has become idle");
608
+ verifyInvariants();
609
+ //readerState = RS_INACTIVE;
610
+ readNext();
611
+ }
612
+
613
+ void channelEndedWhileWaitingForItToBecomeIdle() {
614
+ if (hasError()) {
615
+ FBC_DEBUG("Reader: error encountered while waiting for underlying channel to become idle");
616
+ } else {
617
+ FBC_DEBUG("Reader: underlying channel ended while waiting for it to become idle");
618
+ }
619
+ terminateReaderBecauseOfEOF();
620
+ }
621
+
622
+ struct ReadContext: public IOContext {
623
+ MemoryKit::mbuf buffer;
624
+ // Smart pointer to keep fd open until eio operation
625
+ // is finished.
626
+ boost::shared_ptr<InFileMode> inFileMode;
627
+
628
+ ReadContext(FileBufferedChannel *self)
629
+ : IOContext(self)
630
+ { }
631
+ };
632
+
633
+ void readNextChunkFromFile() {
634
+ size_t size = std::min<size_t>(inFileMode->written,
635
+ ctx->mbuf_pool.mbuf_block_chunk_size -
636
+ ctx->mbuf_pool.mbuf_block_offset);
637
+ FBC_DEBUG("Reader: reading next chunk from file");
638
+ verifyInvariants();
639
+ ReadContext *readContext = new ReadContext(this);
640
+ readContext->buffer = MemoryKit::mbuf_get(&ctx->mbuf_pool);
641
+ readContext->inFileMode = inFileMode;
642
+ readerState = RS_READING_FROM_FILE;
643
+ inFileMode->readRequest = readContext;
644
+ readContext->req = eio_read(inFileMode->fd, readContext->buffer.start,
645
+ size, inFileMode->readOffset, 0, _nextChunkDoneReading, readContext);
646
+ verifyInvariants();
647
+ }
648
+
649
+ static int _nextChunkDoneReading(eio_req *req) {
650
+ ReadContext *readContext = (ReadContext *) req->data;
651
+ readContext->eioFinished();
652
+ if (readContext->isCanceled()) {
653
+ delete readContext;
654
+ return 0;
655
+ }
656
+
657
+ if (readContext->libev->onEventLoopThread()) {
658
+ _nextChunkDoneReading_onEventLoopThread(readContext);
659
+ } else {
660
+ readContext->libev->runLater(boost::bind(
661
+ _nextChunkDoneReading_onEventLoopThread,
662
+ readContext));
663
+ }
664
+ return 0;
665
+ }
666
+
667
+ static void _nextChunkDoneReading_onEventLoopThread(ReadContext *readContext) {
668
+ if (readContext->isCanceled()) {
669
+ delete readContext;
670
+ return;
671
+ }
672
+
673
+ FileBufferedChannel *self = readContext->self;
674
+ self->nextChunkDoneReading(readContext);
675
+ }
676
+
677
+ void nextChunkDoneReading(ReadContext *readContext) {
678
+ RefGuard guard(hooks, this, __FILE__, __LINE__);
679
+
680
+ FBC_DEBUG("Reader: done reading chunk");
681
+ P_ASSERT_EQ(readerState, RS_READING_FROM_FILE);
682
+ verifyInvariants();
683
+ int fd = readContext->result;
684
+ int errcode = readContext->errcode;
685
+ MemoryKit::mbuf buffer(boost::move(readContext->buffer));
686
+ delete readContext;
687
+ inFileMode->readRequest = NULL;
688
+
689
+ if (fd != -1) {
690
+ unsigned int generation = this->generation;
691
+
692
+ assert(fd <= inFileMode->written);
693
+ buffer = MemoryKit::mbuf(buffer, 0, fd);
694
+ inFileMode->readOffset += buffer.size();
695
+ inFileMode->written -= buffer.size();
696
+
697
+ FBC_DEBUG("Reader: feeding buffer, " << buffer.size() << " bytes");
698
+ readerState = RS_FEEDING;
699
+ Channel::feedWithoutRefGuard(buffer);
700
+ if (generation != this->generation || mode >= ERROR) {
701
+ // Callback deinitialized this object, or callback
702
+ // called a method that encountered an error.
703
+ return;
704
+ }
705
+ P_ASSERT_EQ(readerState, RS_FEEDING);
706
+ verifyInvariants();
707
+ if (acceptingInput()) {
708
+ readerState = RS_INACTIVE;
709
+ readNext();
710
+ } else if (mayAcceptInputLater()) {
711
+ readNextWhenChannelIdle();
712
+ } else {
713
+ FBC_DEBUG("Reader: data callback no longer accepts further data");
714
+ terminateReaderBecauseOfEOF();
715
+ }
716
+ } else {
717
+ setError(errcode, __FILE__, __LINE__);
718
+ }
719
+ }
720
+
721
+ // Returns (mbuf, found).
722
+ pair<MemoryKit::mbuf, bool> findBufferForReadProcessing() {
723
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
724
+
725
+ if (nbuffers == 0) {
726
+ return make_pair(MemoryKit::mbuf(), false);
727
+ }
728
+
729
+ boost::int32_t target = -inFileMode->written;
730
+ boost::int32_t offset = 0;
731
+ deque<MemoryKit::mbuf>::iterator it, end = moreBuffers.end();
732
+
733
+ if (offset == target) {
734
+ return make_pair(firstBuffer, true);
735
+ }
736
+
737
+ it = moreBuffers.begin();
738
+ offset += firstBuffer.size();
739
+ while (it != end) {
740
+ if (offset == target || it->empty()) {
741
+ return make_pair(*it, true);
742
+ } else {
743
+ offset += it->size();
744
+ it++;
745
+ }
746
+ }
747
+
748
+ return make_pair(MemoryKit::mbuf(), false);
749
+ }
750
+
751
+
752
+ /***** Switching to or resetting in-file mode *****/
753
+
754
+ void switchToInFileMode() {
755
+ P_ASSERT_EQ(mode, IN_MEMORY_MODE);
756
+ P_ASSERT_EQ(inFileMode, 0);
757
+
758
+ FBC_DEBUG("Switching to in-file mode");
759
+ mode = IN_FILE_MODE;
760
+ inFileMode = boost::make_shared<InFileMode>();
761
+ createBufferFile();
762
+ }
763
+
764
+ /**
765
+ * "Truncates" the the temp file by closing it and creating
766
+ * a new one, instead of calling `ftruncate()` or something.
767
+ * This way, any pending I/O operations in the background won't
768
+ * affect correctness.
769
+ */
770
+ void switchToInMemoryMode() {
771
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
772
+ assert(inFileMode->written <= 0);
773
+
774
+ FBC_DEBUG("Recreating file, switching to in-memory mode");
775
+ cancelWriter();
776
+ clearBuffers();
777
+ mode = IN_MEMORY_MODE;
778
+ inFileMode.reset();
779
+ }
780
+
781
+
782
+ /***** File creator *****/
783
+
784
+ struct FileCreationContext: public IOContext {
785
+ string path;
786
+
787
+ FileCreationContext(FileBufferedChannel *self)
788
+ : IOContext(self)
789
+ { }
790
+ };
791
+
792
+ void createBufferFile() {
793
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
794
+ P_ASSERT_EQ(inFileMode->writerState, WS_INACTIVE);
795
+ P_ASSERT_EQ(inFileMode->fd, -1);
796
+
797
+ FileCreationContext *fcContext = new FileCreationContext(this);
798
+ fcContext->path = config->bufferDir;
799
+ fcContext->path.append("/buffer.");
800
+ fcContext->path.append(toString(rand()));
801
+
802
+ inFileMode->writerState = WS_CREATING_FILE;
803
+ inFileMode->writerRequest = fcContext;
804
+
805
+ if (config->delayInFileModeSwitching == 0) {
806
+ FBC_DEBUG("Writer: creating file " << fcContext->path);
807
+ fcContext->req = eio_open(fcContext->path.c_str(),
808
+ O_RDWR | O_CREAT | O_EXCL, 0600, 0,
809
+ _bufferFileCreated, fcContext);
810
+ } else {
811
+ FBC_DEBUG("Writer: delaying in-file mode switching for " <<
812
+ config->delayInFileModeSwitching << "ms");
813
+ fcContext->req = eio_busy(
814
+ (eio_tstamp) config->delayInFileModeSwitching / 1000.0,
815
+ 0, _bufferFileDoneDelaying, fcContext);
816
+ }
817
+ }
818
+
819
+ static int _bufferFileDoneDelaying(eio_req *req) {
820
+ FileCreationContext *fcContext = static_cast<FileCreationContext *>(req->data);
821
+ fcContext->eioFinished();
822
+ if (fcContext->isCanceled()) {
823
+ delete fcContext;
824
+ return 0;
825
+ }
826
+
827
+ if (fcContext->libev->onEventLoopThread()) {
828
+ _bufferFileDoneDelaying_onEventLoopThread(fcContext);
829
+ } else {
830
+ fcContext->libev->runLater(boost::bind(
831
+ _bufferFileDoneDelaying_onEventLoopThread,
832
+ fcContext));
833
+ }
834
+ return 0;
835
+ }
836
+
837
+ static void _bufferFileDoneDelaying_onEventLoopThread(FileCreationContext *fcContext) {
838
+ if (fcContext->isCanceled()) {
839
+ delete fcContext;
840
+ return;
841
+ }
842
+
843
+ FileBufferedChannel *self = fcContext->self;
844
+ self->bufferFileDoneDelaying(fcContext);
845
+ }
846
+
847
+ void bufferFileDoneDelaying(FileCreationContext *fcContext) {
848
+ FBC_DEBUG("Writer: done delaying in-file mode switching. "
849
+ "Creating file: " << fcContext->path);
850
+ fcContext->req = eio_open(fcContext->path.c_str(),
851
+ O_RDWR | O_CREAT | O_EXCL, 0600, 0,
852
+ _bufferFileCreated, fcContext);
853
+ }
854
+
855
+ static int _bufferFileCreated(eio_req *req) {
856
+ FileCreationContext *fcContext = static_cast<FileCreationContext *>(req->data);
857
+ fcContext->eioFinished();
858
+ if (fcContext->isCanceled()) {
859
+ if (req->result != -1) {
860
+ FileBufferedChannel *self = fcContext->self;
861
+ FBC_DEBUG_FROM_STATIC("Writer: creation of file " << fcContext->path <<
862
+ "canceled. Deleting file in the background");
863
+ eio_unlink(fcContext->path.c_str(), 0, bufferFileUnlinked, fcContext);
864
+ eio_close(req->result, 0, NULL, NULL);
865
+ } else {
866
+ delete fcContext;
867
+ }
868
+ return 0;
869
+ }
870
+
871
+ if (fcContext->libev->onEventLoopThread()) {
872
+ _bufferFileCreated_onEventLoopThread(fcContext);
873
+ } else {
874
+ fcContext->libev->runLater(boost::bind(
875
+ _bufferFileCreated_onEventLoopThread,
876
+ fcContext));
877
+ }
878
+ return 0;
879
+ }
880
+
881
+ static void _bufferFileCreated_onEventLoopThread(FileCreationContext *fcContext) {
882
+ if (fcContext->isCanceled()) {
883
+ if (fcContext->result != -1) {
884
+ FileBufferedChannel *self = fcContext->self;
885
+ FBC_DEBUG_FROM_STATIC("Writer: creation of file " << fcContext->path <<
886
+ "canceled. Deleting file in the background");
887
+ eio_unlink(fcContext->path.c_str(), 0, bufferFileUnlinked, fcContext);
888
+ eio_close(fcContext->result, 0, NULL, NULL);
889
+ } else {
890
+ delete fcContext;
891
+ }
892
+ return;
893
+ }
894
+
895
+ FileBufferedChannel *self = fcContext->self;
896
+ self->bufferFileCreated(fcContext);
897
+ }
898
+
899
+ void bufferFileCreated(FileCreationContext *fcContext) {
900
+ P_ASSERT_EQ(inFileMode->writerState, WS_CREATING_FILE);
901
+ verifyInvariants();
902
+ int fd = fcContext->result;
903
+ int errcode = fcContext->errcode;
904
+ inFileMode->writerRequest = NULL;
905
+
906
+ if (fd != -1) {
907
+ FBC_DEBUG("Writer: file created. Deleting file in the background");
908
+ eio_unlink(fcContext->path.c_str(), 0, bufferFileUnlinked, fcContext);
909
+ inFileMode->fd = fd;
910
+ moveNextBufferToFile();
911
+ } else {
912
+ delete fcContext;
913
+ if (errcode == EEXIST) {
914
+ FBC_DEBUG("Writer: file already exists, retrying");
915
+ inFileMode->writerState = WS_INACTIVE;
916
+ createBufferFile();
917
+ verifyInvariants();
918
+ } else {
919
+ setError(errcode, __FILE__, __LINE__);
920
+ }
921
+ }
922
+ }
923
+
924
+ static int bufferFileUnlinked(eio_req *req) {
925
+ FileCreationContext *fcContext = static_cast<FileCreationContext *>(req->data);
926
+ FileBufferedChannel *self = fcContext->self;
927
+
928
+ if (fcContext->isCanceled()) {
929
+ delete fcContext;
930
+ return 0;
931
+ }
932
+
933
+ if (req->result != -1) {
934
+ FBC_DEBUG_FROM_STATIC("Writer: file " << fcContext->path << " deleted");
935
+ } else {
936
+ FBC_DEBUG_FROM_STATIC("Writer: failed to delete " << fcContext->path <<
937
+ ": errno=" << req->errorno << " (" << strerror(req->errorno) << ")");
938
+ }
939
+
940
+ delete fcContext;
941
+ return 0;
942
+ }
943
+
944
+
945
+ /***** Mover *****/
946
+
947
+ struct MoveContext: public IOContext {
948
+ // Smart pointer to keep fd open until eio operation
949
+ // is finished.
950
+ boost::shared_ptr<InFileMode> inFileMode;
951
+ MemoryKit::mbuf buffer;
952
+ size_t written;
953
+
954
+ MoveContext(FileBufferedChannel *self)
955
+ : IOContext(self)
956
+ { }
957
+ };
958
+
959
+ void moveNextBufferToFile() {
960
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
961
+ assert(inFileMode->fd != -1);
962
+ verifyInvariants();
963
+
964
+ if (nbuffers == 0) {
965
+ FBC_DEBUG("Writer: no more buffers. Transitioning to WS_INACTIVE");
966
+ inFileMode->writerState = WS_INACTIVE;
967
+ return;
968
+ } else if (peekBuffer().empty()) {
969
+ FBC_DEBUG("Writer: EOF encountered. Transitioning to WS_TERMINATED");
970
+ inFileMode->writerState = WS_TERMINATED;
971
+ return;
972
+ }
973
+
974
+ FBC_DEBUG("Writer: moving next buffer to file: " <<
975
+ peekBuffer().size() << " bytes");
976
+
977
+ MoveContext *moveContext = new MoveContext(this);
978
+ moveContext->inFileMode = inFileMode;
979
+ moveContext->buffer = peekBuffer();
980
+ moveContext->written = 0;
981
+
982
+ inFileMode->writerState = WS_MOVING;
983
+ inFileMode->writerRequest = moveContext;
984
+ moveContext->req = eio_write(inFileMode->fd,
985
+ moveContext->buffer.start,
986
+ moveContext->buffer.size(),
987
+ inFileMode->readOffset + inFileMode->written,
988
+ 0, _bufferWrittenToFile, moveContext);
989
+ verifyInvariants();
990
+ }
991
+
992
+ static int _bufferWrittenToFile(eio_req *req) {
993
+ MoveContext *moveContext = static_cast<MoveContext *>(req->data);
994
+ moveContext->eioFinished();
995
+ if (moveContext->isCanceled()) {
996
+ delete moveContext;
997
+ return 0;
998
+ }
999
+
1000
+ if (moveContext->libev->onEventLoopThread()) {
1001
+ _bufferWrittenToFile_onEventLoopThread(moveContext);
1002
+ } else {
1003
+ moveContext->libev->runLater(boost::bind(
1004
+ _bufferWrittenToFile_onEventLoopThread,
1005
+ moveContext));
1006
+ }
1007
+ return 0;
1008
+ }
1009
+
1010
+ static void _bufferWrittenToFile_onEventLoopThread(MoveContext *moveContext) {
1011
+ if (moveContext->isCanceled()) {
1012
+ delete moveContext;
1013
+ return;
1014
+ }
1015
+
1016
+ FileBufferedChannel *self = moveContext->self;
1017
+ self->bufferWrittenToFile(moveContext);
1018
+ }
1019
+
1020
+ void bufferWrittenToFile(MoveContext *moveContext) {
1021
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
1022
+ P_ASSERT_EQ(inFileMode->writerState, WS_MOVING);
1023
+ assert(!peekBuffer().empty());
1024
+ verifyInvariants();
1025
+
1026
+ if (moveContext->result != -1) {
1027
+ moveContext->written += moveContext->result;
1028
+ assert(moveContext->written <= moveContext->buffer.size());
1029
+
1030
+ if (moveContext->written == moveContext->buffer.size()) {
1031
+ // Write completed. Proceed with next buffer.
1032
+ RefGuard guard(hooks, this, __FILE__, __LINE__);
1033
+ unsigned int generation = this->generation;
1034
+
1035
+ FBC_DEBUG("Writer: move complete");
1036
+ assert(peekBuffer().size() == moveContext->buffer.size());
1037
+ inFileMode->written += moveContext->buffer.size();
1038
+
1039
+ popBuffer();
1040
+ if (generation != this->generation || mode >= ERROR) {
1041
+ // buffersFlushedCallback deinitialized this object, or callback
1042
+ // called a method that encountered an error.
1043
+ delete moveContext;
1044
+ return;
1045
+ }
1046
+
1047
+ inFileMode->writerRequest = NULL;
1048
+ delete moveContext;
1049
+ moveNextBufferToFile();
1050
+ } else {
1051
+ FBC_DEBUG("Writer: move incomplete, proceeding " <<
1052
+ "with writing rest of buffer");
1053
+ moveContext->req = eio_write(inFileMode->fd,
1054
+ moveContext->buffer.start + moveContext->written,
1055
+ moveContext->buffer.size() - moveContext->written,
1056
+ inFileMode->readOffset + inFileMode->written,
1057
+ 0, _bufferWrittenToFile, moveContext);
1058
+ verifyInvariants();
1059
+ }
1060
+ } else {
1061
+ FBC_DEBUG("Writer: file write failed");
1062
+ int errcode = moveContext->errcode;
1063
+ delete moveContext;
1064
+ inFileMode->writerRequest = NULL;
1065
+ inFileMode->writerState = WS_TERMINATED;
1066
+ setError(errcode, __FILE__, __LINE__);
1067
+ }
1068
+ }
1069
+
1070
+
1071
+ /***** Misc *****/
1072
+
1073
+ void setError(int errcode, const char *file, unsigned int line) {
1074
+ if (mode >= ERROR) {
1075
+ return;
1076
+ }
1077
+
1078
+ FBC_DEBUG_WITH_POS(file, line, "Setting error: errno=" <<
1079
+ errcode << " (" << getErrorDesc(errcode) << ")");
1080
+ cancelReader();
1081
+ if (mode == IN_FILE_MODE) {
1082
+ cancelWriter();
1083
+ }
1084
+ readerState = RS_TERMINATED;
1085
+ this->errcode = errcode;
1086
+ inFileMode.reset();
1087
+ if (acceptingInput()) {
1088
+ FBC_DEBUG("Feeding error");
1089
+ mode = ERROR;
1090
+ Channel::feedError(errcode);
1091
+ } else {
1092
+ FBC_DEBUG("Waiting until underlying channel becomes idle for error feeding");
1093
+ mode = ERROR_WAITING;
1094
+ }
1095
+ }
1096
+
1097
+ void feedErrorWhenChannelIdleOrEnded() {
1098
+ assert(errcode != 0);
1099
+ if (isIdle()) {
1100
+ FBC_DEBUG("Channel has become idle. Feeding error");
1101
+ Channel::feedError(errcode);
1102
+ } else {
1103
+ FBC_DEBUG("Channel ended while trying to feed an error");
1104
+ }
1105
+ }
1106
+
1107
+ /**
1108
+ * Must be used in combination with `setError()`, so that the reader will
1109
+ * stop processing after returning from `Channel::feed()`.
1110
+ */
1111
+ void cancelReader() {
1112
+ switch (readerState) {
1113
+ case RS_FEEDING:
1114
+ case RS_FEEDING_EOF:
1115
+ case RS_WAITING_FOR_CHANNEL_IDLE:
1116
+ break;
1117
+ case RS_READING_FROM_FILE:
1118
+ inFileMode->readRequest->cancel();
1119
+ inFileMode->readRequest = NULL;
1120
+ break;
1121
+ case RS_INACTIVE:
1122
+ case RS_TERMINATED:
1123
+ return;
1124
+ }
1125
+ }
1126
+
1127
+ void cancelWriter() {
1128
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
1129
+
1130
+ switch (inFileMode->writerState) {
1131
+ case WS_INACTIVE:
1132
+ break;
1133
+ case WS_CREATING_FILE:
1134
+ case WS_MOVING:
1135
+ inFileMode->writerRequest->cancel();
1136
+ inFileMode->writerRequest = NULL;
1137
+ break;
1138
+ case WS_TERMINATED:
1139
+ return;
1140
+ }
1141
+ inFileMode->writerState = WS_INACTIVE;
1142
+ }
1143
+
1144
+ void verifyInvariants() const {
1145
+ #ifndef NDEBUG
1146
+ if (mode >= ERROR) {
1147
+ P_ASSERT_EQ(readerState, RS_TERMINATED);
1148
+ P_ASSERT_EQ(inFileMode, 0);
1149
+ }
1150
+
1151
+ switch (readerState) {
1152
+ case RS_INACTIVE:
1153
+ case RS_FEEDING:
1154
+ case RS_FEEDING_EOF:
1155
+ break;
1156
+ case RS_WAITING_FOR_CHANNEL_IDLE:
1157
+ assert(mode < ERROR);
1158
+ break;
1159
+ case RS_READING_FROM_FILE:
1160
+ P_ASSERT_EQ(mode, IN_FILE_MODE);
1161
+ assert(inFileMode->readRequest != NULL);
1162
+ assert(inFileMode->written > 0);
1163
+ break;
1164
+ case RS_TERMINATED:
1165
+ break;
1166
+ }
1167
+
1168
+ assert((errcode == 0) == (mode < ERROR));
1169
+ assert((inFileMode != NULL) == (mode == IN_FILE_MODE));
1170
+ #endif
1171
+ }
1172
+
1173
+ static void onChannelConsumed(Channel *channel, unsigned int size) {
1174
+ FileBufferedChannel *self = static_cast<FileBufferedChannel *>(channel);
1175
+ if (self->readerState == RS_WAITING_FOR_CHANNEL_IDLE) {
1176
+ if (self->acceptingInput()) {
1177
+ self->channelHasBecomeIdle();
1178
+ } else {
1179
+ assert(self->Channel::ended());
1180
+ self->channelEndedWhileWaitingForItToBecomeIdle();
1181
+ }
1182
+ } else if (self->mode == ERROR_WAITING) {
1183
+ self->feedErrorWhenChannelIdleOrEnded();
1184
+ }
1185
+ }
1186
+
1187
+ public:
1188
+ /**
1189
+ * Called when all the in-memory buffers have been popped. This could happen
1190
+ * (when we're in the in-memory mode) because the last in-memory buffer is being
1191
+ * processed by the data callback. It could also happen (when we're in the in-file
1192
+ * mode) when the last in-memory buffer has sucessfully been written to disk.
1193
+ *
1194
+ * This event does not imply that the data callback has consumed all memory
1195
+ * buffers. For example, in case of FileBufferedFdSinkChannel, this event does
1196
+ * not imply that all the in-memory buffers have been written to the sink FD.
1197
+ * That's what `dataFlushedCallback` is for.
1198
+ */
1199
+ Callback buffersFlushedCallback;
1200
+ /**
1201
+ * Called when all buffered data (whether in-memory or on-disk) has been consumed
1202
+ * by the data callback. In case of FileBufferedFdSinkChannel, this means that all
1203
+ * buffered data has been written out to the sink FD.
1204
+ */
1205
+ Callback dataFlushedCallback;
1206
+
1207
+ FileBufferedChannel()
1208
+ : config(NULL),
1209
+ mode(IN_MEMORY_MODE),
1210
+ readerState(RS_INACTIVE),
1211
+ nbuffers(0),
1212
+ errcode(0),
1213
+ bytesBuffered(0),
1214
+ inFileMode(),
1215
+ buffersFlushedCallback(NULL),
1216
+ dataFlushedCallback(NULL)
1217
+ {
1218
+ Channel::consumedCallback = onChannelConsumed;
1219
+ }
1220
+
1221
+ FileBufferedChannel(Context *context)
1222
+ : Channel(context),
1223
+ config(&context->defaultFileBufferedChannelConfig),
1224
+ mode(IN_MEMORY_MODE),
1225
+ readerState(RS_INACTIVE),
1226
+ nbuffers(0),
1227
+ errcode(0),
1228
+ bytesBuffered(0),
1229
+ inFileMode(),
1230
+ buffersFlushedCallback(NULL),
1231
+ dataFlushedCallback(NULL)
1232
+ {
1233
+ Channel::consumedCallback = onChannelConsumed;
1234
+ }
1235
+
1236
+ ~FileBufferedChannel() {
1237
+ cancelReader();
1238
+ if (mode == IN_FILE_MODE) {
1239
+ cancelWriter();
1240
+ }
1241
+ }
1242
+
1243
+ // May only be called right after construction.
1244
+ void setContext(Context *context) {
1245
+ Channel::setContext(context);
1246
+ if (config == NULL) {
1247
+ config = &context->defaultFileBufferedChannelConfig;
1248
+ }
1249
+ }
1250
+
1251
+ void feed(const MemoryKit::mbuf &buffer) {
1252
+ RefGuard guard(hooks, this, __FILE__, __LINE__);
1253
+ feedWithoutRefGuard(buffer);
1254
+ }
1255
+
1256
+ void feed(const char *data, unsigned int size) {
1257
+ feed(MemoryKit::mbuf(data, size));
1258
+ }
1259
+
1260
+ void feed(const char *data) {
1261
+ feed(MemoryKit::mbuf(data));
1262
+ }
1263
+
1264
+ void feedWithoutRefGuard(const MemoryKit::mbuf &buffer) {
1265
+ FBC_DEBUG("Feeding " << buffer.size() << " bytes");
1266
+ verifyInvariants();
1267
+ if (ended()) {
1268
+ FBC_DEBUG("Feeding aborted: EOF or error detected");
1269
+ return;
1270
+ }
1271
+ pushBuffer(buffer);
1272
+ if (mode == IN_MEMORY_MODE && passedThreshold()) {
1273
+ switchToInFileMode();
1274
+ } else if (mode == IN_FILE_MODE
1275
+ && inFileMode->writerState == WS_INACTIVE
1276
+ && config->autoStartMover)
1277
+ {
1278
+ moveNextBufferToFile();
1279
+ }
1280
+ if (readerState == RS_INACTIVE) {
1281
+ if (acceptingInput()) {
1282
+ readNextWithoutRefGuard();
1283
+ } else {
1284
+ readNextWhenChannelIdle();
1285
+ }
1286
+ }
1287
+ }
1288
+
1289
+ void feedWithoutRefGuard(const char *data, unsigned int size) {
1290
+ feedWithoutRefGuard(MemoryKit::mbuf(data, size));
1291
+ }
1292
+
1293
+ void feedError(int errcode, const char *file = NULL, unsigned int line = 0) {
1294
+ if (file == NULL) {
1295
+ file = __FILE__;
1296
+ }
1297
+ if (line == 0) {
1298
+ line = __LINE__;
1299
+ }
1300
+ setError(errcode, file, line);
1301
+ }
1302
+
1303
+ void reinitialize() {
1304
+ Channel::reinitialize();
1305
+ verifyInvariants();
1306
+ }
1307
+
1308
+ void deinitialize() {
1309
+ FBC_DEBUG("Deinitialize");
1310
+ cancelReader();
1311
+ if (mode == IN_FILE_MODE) {
1312
+ cancelWriter();
1313
+ }
1314
+ clearBuffers();
1315
+ mode = IN_MEMORY_MODE;
1316
+ readerState = RS_INACTIVE;
1317
+ errcode = 0;
1318
+ if (OXT_UNLIKELY(inFileMode != NULL)) {
1319
+ inFileMode.reset();
1320
+ }
1321
+ Channel::deinitialize();
1322
+ }
1323
+
1324
+ void start() {
1325
+ Channel::start();
1326
+ }
1327
+
1328
+ void stop() {
1329
+ Channel::stop();
1330
+ }
1331
+
1332
+ bool isStarted() const {
1333
+ return Channel::isStarted();
1334
+ }
1335
+
1336
+ void consumed(unsigned int size, bool end) {
1337
+ Channel::consumed(size, end);
1338
+ }
1339
+
1340
+ Channel::State getState() const {
1341
+ return state;
1342
+ }
1343
+
1344
+ Mode getMode() const {
1345
+ return mode;
1346
+ }
1347
+
1348
+ ReaderState getReaderState() const {
1349
+ return readerState;
1350
+ }
1351
+
1352
+ WriterState getWriterState() const {
1353
+ return inFileMode->writerState;
1354
+ }
1355
+
1356
+ unsigned int getBytesBuffered() const {
1357
+ return bytesBuffered;
1358
+ }
1359
+
1360
+ bool ended() const {
1361
+ return (hasBuffers() && peekLastBuffer().empty())
1362
+ || mode >= ERROR || Channel::ended();
1363
+ }
1364
+
1365
+ bool endAcked() const {
1366
+ return Channel::endAcked();
1367
+ }
1368
+
1369
+ bool passedThreshold() const {
1370
+ return bytesBuffered >= config->threshold;
1371
+ }
1372
+
1373
+ void setDataCallback(DataCallback callback) {
1374
+ Channel::dataCallback = callback;
1375
+ }
1376
+
1377
+ void setBuffersFlushedCallback(Callback callback) {
1378
+ buffersFlushedCallback = callback;
1379
+ }
1380
+
1381
+ void setDataFlushedCallback(Callback callback) {
1382
+ dataFlushedCallback = callback;
1383
+ }
1384
+
1385
+ OXT_FORCE_INLINE
1386
+ Hooks *getHooks() const {
1387
+ return Channel::hooks;
1388
+ }
1389
+
1390
+ void setHooks(Hooks *hooks) {
1391
+ Channel::hooks = hooks;
1392
+ }
1393
+ };
1394
+
1395
+
1396
+ } // namespace ServerKit
1397
+ } // namespace Passenger
1398
+
1399
+ #endif /* _PASSENGER_SERVER_KIT_FILE_BUFFERED_CHANNEL_H_ */