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
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - https://www.phusionpassenger.com/
3
- * Copyright (c) 2011-2013 Phusion
3
+ * Copyright (c) 2011-2014 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -27,14 +27,17 @@
27
27
 
28
28
  #include <boost/thread.hpp>
29
29
  #include <boost/shared_ptr.hpp>
30
+ #include <boost/intrusive_ptr.hpp>
30
31
  #include <boost/function.hpp>
31
32
  #include <oxt/tracable_exception.hpp>
32
33
  #include <ResourceLocator.h>
33
34
  #include <RandomGenerator.h>
35
+ #include <StaticString.h>
36
+ #include <MemoryKit/palloc.h>
37
+ #include <DataStructures/StringKeyTable.h>
34
38
  #include <UnionStation/Core.h>
35
39
  #include <UnionStation/Transaction.h>
36
40
  #include <ApplicationPool2/Options.h>
37
- #include <Utils/StringMap.h>
38
41
  #include <Utils/VariantMap.h>
39
42
 
40
43
  namespace tut {
@@ -52,6 +55,7 @@ class Pool;
52
55
  class SuperGroup;
53
56
  class Group;
54
57
  class Process;
58
+ class Socket;
55
59
  class Session;
56
60
 
57
61
  /**
@@ -160,13 +164,25 @@ typedef boost::shared_ptr<Pool> PoolPtr;
160
164
  typedef boost::shared_ptr<SuperGroup> SuperGroupPtr;
161
165
  typedef boost::shared_ptr<Group> GroupPtr;
162
166
  typedef boost::shared_ptr<Process> ProcessPtr;
163
- typedef boost::shared_ptr<Session> SessionPtr;
167
+ typedef boost::intrusive_ptr<Session> SessionPtr;
164
168
  typedef boost::shared_ptr<tracable_exception> ExceptionPtr;
165
- typedef StringMap<SuperGroupPtr> SuperGroupMap;
166
- typedef boost::function<void (const SessionPtr &session, const ExceptionPtr &e)> GetCallback;
169
+ typedef StringKeyTable<SuperGroupPtr> SuperGroupMap;
167
170
  typedef boost::function<void (const ProcessPtr &process, DisableResult result)> DisableCallback;
168
171
  typedef boost::function<void ()> Callback;
169
172
 
173
+ struct GetCallback {
174
+ void (*func)(const SessionPtr &session, const ExceptionPtr &e, void *userData);
175
+ mutable void *userData;
176
+
177
+ void operator()(const SessionPtr &session, const ExceptionPtr &e) const {
178
+ func(session, e, userData);
179
+ }
180
+
181
+ static void call(GetCallback cb, const SessionPtr &session, const ExceptionPtr &e) {
182
+ cb(session, e);
183
+ }
184
+ };
185
+
170
186
  struct GetWaiter {
171
187
  Options options;
172
188
  GetCallback callback;
@@ -188,36 +204,36 @@ struct Ticket {
188
204
 
189
205
  struct SpawnerConfig {
190
206
  // Used by error pages and hooks.
191
- ResourceLocator resourceLocator;
207
+ ResourceLocator *resourceLocator;
192
208
  const VariantMap *agentsOptions;
193
209
 
194
210
  // Used for Union Station logging.
195
211
  UnionStation::CorePtr unionStationCore;
196
212
 
197
213
  // Used by SmartSpawner and DirectSpawner.
198
- /** A random generator to use. */
199
214
  RandomGeneratorPtr randomGenerator;
215
+ string instanceDir;
200
216
 
201
217
  // Used by DummySpawner and SpawnerFactory.
202
218
  unsigned int concurrency;
203
219
  unsigned int spawnerCreationSleepTime;
204
220
  unsigned int spawnTime;
205
221
 
206
- SpawnerConfig(const ResourceLocator &_resourceLocator,
207
- const UnionStation::CorePtr &_unionStationCore = UnionStation::CorePtr(),
208
- const RandomGeneratorPtr &randomGenerator = RandomGeneratorPtr(),
209
- const VariantMap *_agentsOptions = NULL)
210
- : resourceLocator(_resourceLocator),
211
- agentsOptions(_agentsOptions),
212
- unionStationCore(_unionStationCore),
222
+ SpawnerConfig()
223
+ : resourceLocator(NULL),
224
+ agentsOptions(NULL),
213
225
  concurrency(1),
214
226
  spawnerCreationSleepTime(0),
215
227
  spawnTime(0)
216
- {
217
- if (randomGenerator != NULL) {
218
- this->randomGenerator = randomGenerator;
219
- } else {
220
- this->randomGenerator = boost::make_shared<RandomGenerator>();
228
+ { }
229
+
230
+ void finalize() {
231
+ TRACE_POINT();
232
+ if (resourceLocator == NULL) {
233
+ throw RuntimeException("ResourceLocator not initialized");
234
+ }
235
+ if (randomGenerator == NULL) {
236
+ randomGenerator = boost::make_shared<RandomGenerator>();
221
237
  }
222
238
  }
223
239
  };
@@ -228,6 +244,7 @@ ExceptionPtr copyException(const tracable_exception &e);
228
244
  void rethrowException(const ExceptionPtr &e);
229
245
  void processAndLogNewSpawnException(SpawnException &e, const Options &options,
230
246
  const SpawnerConfigPtr &config);
247
+ void recreateString(psg_pool_t *pool, StaticString &str);
231
248
 
232
249
  } // namespace ApplicationPool2
233
250
  } // namespace Passenger
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - https://www.phusionpassenger.com/
3
- * Copyright (c) 2011-2013 Phusion
3
+ * Copyright (c) 2011-2014 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -26,6 +26,7 @@
26
26
  #define _PASSENGER_APPLICATION_POOL2_DIRECT_SPAWNER_H_
27
27
 
28
28
  #include <ApplicationPool2/Spawner.h>
29
+ #include <Constants.h>
29
30
  #include <limits.h> // for PTHREAD_STACK_MIN
30
31
  #include <pthread.h>
31
32
 
@@ -111,10 +112,10 @@ private:
111
112
  shared_array<const char *> &args) const
112
113
  {
113
114
  vector<string> startCommandArgs;
114
- string agentsDir = config->resourceLocator.getAgentsDir();
115
+ string agentFilename = config->resourceLocator->findSupportBinary(AGENT_EXE);
115
116
  vector<string> command;
116
117
 
117
- split(options.getStartCommand(config->resourceLocator), '\t', startCommandArgs);
118
+ split(options.getStartCommand(*config->resourceLocator), '\t', startCommandArgs);
118
119
  if (startCommandArgs.empty()) {
119
120
  throw RuntimeException("No startCommand given");
120
121
  }
@@ -126,9 +127,10 @@ private:
126
127
  command.push_back("exec \"$@\"");
127
128
  command.push_back("SpawnPreparerShell");
128
129
  } else {
129
- command.push_back(agentsDir + "/SpawnPreparer");
130
+ command.push_back(agentFilename);
130
131
  }
131
- command.push_back(agentsDir + "/SpawnPreparer");
132
+ command.push_back(agentFilename);
133
+ command.push_back("spawn-preparer");
132
134
  command.push_back(preparation.appRoot);
133
135
  command.push_back(serializeEnvvarsFromPoolOptions(options));
134
136
  command.push_back(startCommandArgs[0]);
@@ -144,14 +146,11 @@ private:
144
146
  }
145
147
 
146
148
  public:
147
- DirectSpawner(const ServerInstanceDir::GenerationPtr &_generation,
148
- const SpawnerConfigPtr &_config)
149
+ DirectSpawner(const SpawnerConfigPtr &_config)
149
150
  : Spawner(_config)
150
- {
151
- generation = _generation;
152
- }
151
+ { }
153
152
 
154
- virtual ProcessPtr spawn(const Options &options) {
153
+ virtual SpawnObject spawn(const Options &options) {
155
154
  TRACE_POINT();
156
155
  this_thread::disable_interruption di;
157
156
  this_thread::disable_syscall_interruption dsi;
@@ -222,17 +221,17 @@ public:
222
221
  details.options = &options;
223
222
  details.debugDir = debugDir;
224
223
 
225
- ProcessPtr process;
224
+ SpawnObject object;
226
225
  {
227
226
  this_thread::restore_interruption ri(di);
228
227
  this_thread::restore_syscall_interruption rsi(dsi);
229
- process = negotiateSpawn(details);
228
+ object = negotiateSpawn(details);
230
229
  }
231
- detachProcess(process->pid);
230
+ detachProcess(object.process->pid);
232
231
  guard.clear();
233
232
  P_DEBUG("Process spawning done: appRoot=" << options.appRoot <<
234
- ", pid=" << process->pid);
235
- return process;
233
+ ", pid=" << object.process->pid);
234
+ return boost::move(object);
236
235
  }
237
236
  }
238
237
  };
@@ -50,24 +50,25 @@ public:
50
50
  cleanCount = 0;
51
51
  }
52
52
 
53
- virtual ProcessPtr spawn(const Options &options) {
53
+ virtual SpawnObject spawn(const Options &options) {
54
54
  TRACE_POINT();
55
55
  possiblyRaiseInternalError(options);
56
56
 
57
57
  SocketPair adminSocket = createUnixSocketPair();
58
- SocketListPtr sockets = boost::make_shared<SocketList>();
59
- sockets->add("main", "tcp://127.0.0.1:1234", "session", config->concurrency);
58
+ SocketList sockets;
59
+ sockets.add("main", "tcp://127.0.0.1:1234", "session", config->concurrency);
60
60
  syscalls::usleep(config->spawnTime);
61
61
 
62
62
  boost::lock_guard<boost::mutex> l(lock);
63
63
  count++;
64
- ProcessPtr process = boost::make_shared<Process>(
65
- (pid_t) count, "gupid-" + toString(count),
66
- toString(count),
64
+ SpawnObject object;
65
+ string gupid = "gupid-" + toString(count);
66
+ object.process = boost::make_shared<Process>(
67
+ (pid_t) count, gupid,
67
68
  adminSocket.second, FileDescriptor(), sockets,
68
69
  SystemTime::getUsec(), SystemTime::getUsec());
69
- process->dummy = true;
70
- return process;
70
+ object.process->dummy = true;
71
+ return boost::move(object);
71
72
  }
72
73
 
73
74
  virtual bool cleanable() const {
@@ -74,7 +74,7 @@ public:
74
74
  params.set("ENVIRONMENT", options.environment);
75
75
  params.set("MESSAGE", message);
76
76
  params.set("IS_RUBY_APP",
77
- (options.appType == "classic-rails" || options.appType == "rack")
77
+ (options.appType == "rack")
78
78
  ? "true" : "false");
79
79
  if (e != NULL) {
80
80
  params.set("TITLE", "Web application could not be started");
@@ -34,9 +34,12 @@
34
34
  #include <boost/foreach.hpp>
35
35
  #include <boost/shared_ptr.hpp>
36
36
  #include <boost/make_shared.hpp>
37
+ #include <boost/container/vector.hpp>
38
+ #include <boost/atomic.hpp>
37
39
  #include <oxt/macros.hpp>
38
40
  #include <oxt/thread.hpp>
39
41
  #include <oxt/dynamic_thread_group.hpp>
42
+ #include <sys/stat.h>
40
43
  #include <cstdlib>
41
44
  #include <cassert>
42
45
  #include <ApplicationPool2/Common.h>
@@ -44,10 +47,9 @@
44
47
  #include <ApplicationPool2/SpawnerFactory.h>
45
48
  #include <ApplicationPool2/Process.h>
46
49
  #include <ApplicationPool2/Options.h>
50
+ #include <MemoryKit/palloc.h>
47
51
  #include <Hooks.h>
48
52
  #include <Utils.h>
49
- #include <Utils/CachedFileStat.hpp>
50
- #include <Utils/FileChangeChecker.h>
51
53
  #include <Utils/SmallVector.h>
52
54
 
53
55
  namespace Passenger {
@@ -93,22 +95,6 @@ public:
93
95
  { }
94
96
  };
95
97
 
96
- /**
97
- * Protects `lifeStatus`.
98
- */
99
- mutable boost::mutex lifetimeSyncher;
100
- /**
101
- * A Group object progresses through a life.
102
- *
103
- * Do not access directly, always use `isAlive()`/`getLifeStatus()` or
104
- * through `lifetimeSyncher`.
105
- *
106
- * Invariant:
107
- * if lifeStatus != ALIVE:
108
- * enabledCount == 0
109
- * disablingCount == 0
110
- * disabledCount == 0
111
- */
112
98
  enum LifeStatus {
113
99
  /** Up and operational. */
114
100
  ALIVE,
@@ -124,7 +110,7 @@ public:
124
110
  * from this Group anymore.
125
111
  */
126
112
  SHUT_DOWN
127
- } lifeStatus;
113
+ };
128
114
 
129
115
  /**
130
116
  * A back reference to the containing SuperGroup. Should never
@@ -132,11 +118,9 @@ public:
132
118
  * Groups.
133
119
  * Read-only; only set during initialization.
134
120
  */
135
- boost::weak_ptr<SuperGroup> superGroup;
136
- CachedFileStat cstat;
137
- FileChangeChecker fileChangeChecker;
138
- string restartFile;
139
- string alwaysRestartFile;
121
+ SuperGroup *superGroup;
122
+ time_t lastRestartFileMtime;
123
+ time_t lastRestartFileCheckTime;
140
124
 
141
125
  /** Number of times a restart has been initiated so far. This is incremented immediately
142
126
  * in Group::restart(), and is used to abort the restarter thread that was active at the
@@ -150,6 +134,19 @@ public:
150
134
  * if processesBeingSpawned > 0: m_spawning
151
135
  */
152
136
  short processesBeingSpawned;
137
+ /**
138
+ * A Group object progresses through a life.
139
+ *
140
+ * You should not access this directly. You should use `isAlive()`/`getLifeStatus()`.
141
+ *
142
+ * Invariant:
143
+ * if lifeStatus != ALIVE:
144
+ * enabledCount == 0
145
+ * disablingCount == 0
146
+ * disabledCount == 0
147
+ * nEnabledProcessesTotallyBusy == 0
148
+ */
149
+ boost::atomic<boost::uint8_t> lifeStatus;
153
150
  /**
154
151
  * Whether the spawner thread is currently working. Note that even
155
152
  * if it's working, it doesn't necessarily mean that processes are
@@ -158,7 +155,7 @@ public:
158
155
  * the newly-spawned process to the group. During that time it's not
159
156
  * technically spawning anything.
160
157
  */
161
- bool m_spawning;
158
+ bool m_spawning: 1;
162
159
  /** Whether a non-rolling restart is in progress (i.e. whether spawnThreadRealMain()
163
160
  * is at work). While it is in progress, it is not possible to signal the desire to
164
161
  * spawn new process. If spawning was already in progress when the restart was initiated,
@@ -169,11 +166,16 @@ public:
169
166
  * Invariant:
170
167
  * if m_restarting: processesBeingSpawned == 0
171
168
  */
172
- bool m_restarting;
169
+ bool m_restarting: 1;
170
+ bool alwaysRestartFileExists: 1;
173
171
 
174
172
  /** Contains the spawn loop thread and the restarter thread. */
175
173
  dynamic_thread_group interruptableThreads;
176
174
 
175
+ string restartFile;
176
+ string alwaysRestartFile;
177
+ ProcessPtr nullProcess;
178
+
177
179
  /** This timer scans `detachedProcesses` periodically to see
178
180
  * whether any of the Processes can be shut down.
179
181
  */
@@ -183,28 +185,18 @@ public:
183
185
  GroupPtr selfPointer;
184
186
 
185
187
 
186
- static void _onSessionInitiateFailure(Session *session) {
187
- ProcessPtr process = session->getProcess();
188
- assert(process != NULL);
189
- process->getGroup()->onSessionInitiateFailure(process, session);
190
- }
191
-
192
- static void _onSessionClose(Session *session) {
193
- ProcessPtr process = session->getProcess();
194
- assert(process != NULL);
195
- process->getGroup()->onSessionClose(process, session);
196
- }
197
-
198
- static string generateSecret(const SuperGroupPtr &superGroup);
199
- static string generateUuid(const SuperGroupPtr &superGroup);
200
- void onSessionInitiateFailure(const ProcessPtr &process, Session *session);
201
- void onSessionClose(const ProcessPtr &process, Session *session);
188
+ static void generateSecret(const SuperGroup *superGroup, char *secret);
189
+ static string generateUuid(const SuperGroup *superGroup);
190
+ static void _onSessionInitiateFailure(Session *session);
191
+ static void _onSessionClose(Session *session);
192
+ OXT_FORCE_INLINE void onSessionInitiateFailure(Process *process, Session *session);
193
+ OXT_FORCE_INLINE void onSessionClose(Process *process, Session *session);
202
194
 
203
195
  /** Returns whether it is allowed to perform a new OOBW in this group. */
204
196
  bool oobwAllowed() const;
205
197
  /** Returns whether a new OOBW should be initiated for this process. */
206
- bool shouldInitiateOobw(const ProcessPtr &process) const;
207
- void maybeInitiateOobw(const ProcessPtr &process);
198
+ bool shouldInitiateOobw(Process *process) const;
199
+ void maybeInitiateOobw(Process *process);
208
200
  void lockAndMaybeInitiateOobw(const ProcessPtr &process, DisableResult result, GroupPtr self);
209
201
  void initiateOobw(const ProcessPtr &process);
210
202
  void spawnThreadOOBWRequest(GroupPtr self, ProcessPtr process);
@@ -214,17 +206,20 @@ public:
214
206
  unsigned int restartsInitiated);
215
207
  void spawnThreadRealMain(const SpawnerPtr &spawner, const Options &options,
216
208
  unsigned int restartsInitiated);
217
- void finalizeRestart(GroupPtr self, Options oldOptions, Options newOptions,
218
- RestartMethod method, SpawnerFactoryPtr spawnerFactory,
219
- unsigned int restartsInitiated, vector<Callback> postLockActions);
209
+ void finalizeRestart(GroupPtr self, Options options, RestartMethod method,
210
+ SpawnerFactoryPtr spawnerFactory, unsigned int restartsInitiated,
211
+ boost::container::vector<Callback> postLockActions);
220
212
  void startCheckingDetachedProcesses(bool immediately);
221
213
  void detachedProcessesCheckerMain(GroupPtr self);
222
214
  void wakeUpGarbageCollector();
215
+ bool selfCheckingEnabled() const;
223
216
  bool poolAtFullCapacity() const;
224
217
  bool anotherGroupIsWaitingForCapacity() const;
225
- boost::shared_ptr<Group> findOtherGroupWaitingForCapacity() const;
226
- ProcessPtr poolForceFreeCapacity(const Group *exclude, vector<Callback> &postLockActions);
218
+ Group *findOtherGroupWaitingForCapacity() const;
219
+ ProcessPtr poolForceFreeCapacity(const Group *exclude, boost::container::vector<Callback> &postLockActions);
227
220
  bool testOverflowRequestQueue() const;
221
+ void callAbortLongRunningConnectionsCallback(const ProcessPtr &process);
222
+ psg_pool_t *getPallocPool() const;
228
223
  const ResourceLocator &getResourceLocator() const;
229
224
  void runAttachHooks(const ProcessPtr process) const;
230
225
  void runDetachHooks(const ProcessPtr process) const;
@@ -232,11 +227,17 @@ public:
232
227
 
233
228
  void verifyInvariants() const {
234
229
  // !a || b: logical equivalent of a IMPLIES b.
230
+ #ifndef NDEBUG
231
+ if (!selfCheckingEnabled()) {
232
+ return;
233
+ }
234
+
235
+ LifeStatus lifeStatus = (LifeStatus) this->lifeStatus.load(boost::memory_order_relaxed);
235
236
 
236
237
  assert(enabledCount >= 0);
237
238
  assert(disablingCount >= 0);
238
239
  assert(disabledCount >= 0);
239
- assert(enabledProcesses.empty() == (pqueue.top() == NULL));
240
+ assert(nEnabledProcessesTotallyBusy >= 0);
240
241
  assert(!( enabledCount == 0 && disablingCount > 0 ) || ( processesBeingSpawned > 0) );
241
242
  assert(!( !m_spawning ) || ( enabledCount > 0 || disablingCount == 0 ));
242
243
 
@@ -255,19 +256,28 @@ public:
255
256
  assert(!( m_restarting ) || ( processesBeingSpawned == 0 ));
256
257
 
257
258
  // Verify lifeStatus.
258
- LifeStatus lifeStatus = getLifeStatus();
259
- assert(!( lifeStatus != ALIVE ) || ( enabledCount == 0 ));
260
- assert(!( lifeStatus != ALIVE ) || ( disablingCount == 0 ));
261
- assert(!( lifeStatus != ALIVE ) || ( disabledCount == 0 ));
259
+ if (lifeStatus != ALIVE) {
260
+ assert(enabledCount == 0);
261
+ assert(disablingCount == 0);
262
+ assert(disabledCount == 0);
263
+ assert(nEnabledProcessesTotallyBusy == 0);
264
+ }
265
+
266
+ // Verify list sizes.
267
+ assert((int) enabledProcesses.size() == enabledCount);
268
+ assert((int) disablingProcesses.size() == disablingCount);
269
+ assert((int) disabledProcesses.size() == disabledCount);
270
+ assert(nEnabledProcessesTotallyBusy <= enabledCount);
271
+ #endif
262
272
  }
263
273
 
264
274
  void verifyExpensiveInvariants() const {
265
275
  #ifndef NDEBUG
266
276
  // !a || b: logical equivalent of a IMPLIES b.
267
277
 
268
- assert((int) enabledProcesses.size() == enabledCount);
269
- assert((int) disablingProcesses.size() == disablingCount);
270
- assert((int) disabledProcesses.size() == disabledCount);
278
+ if (!selfCheckingEnabled()) {
279
+ return;
280
+ }
271
281
 
272
282
  ProcessList::const_iterator it, end;
273
283
 
@@ -275,7 +285,6 @@ public:
275
285
  for (it = enabledProcesses.begin(); it != end; it++) {
276
286
  const ProcessPtr &process = *it;
277
287
  assert(process->enabled == Process::ENABLED);
278
- assert(process->pqHandle != NULL);
279
288
  assert(process->isAlive());
280
289
  assert(process->oobwStatus == Process::OOBW_NOT_ACTIVE
281
290
  || process->oobwStatus == Process::OOBW_REQUESTED);
@@ -285,7 +294,6 @@ public:
285
294
  for (it = disablingProcesses.begin(); it != end; it++) {
286
295
  const ProcessPtr &process = *it;
287
296
  assert(process->enabled == Process::DISABLING);
288
- assert(process->pqHandle == NULL);
289
297
  assert(process->isAlive());
290
298
  assert(process->oobwStatus == Process::OOBW_NOT_ACTIVE
291
299
  || process->oobwStatus == Process::OOBW_IN_PROGRESS);
@@ -295,7 +303,6 @@ public:
295
303
  for (it = disabledProcesses.begin(); it != end; it++) {
296
304
  const ProcessPtr &process = *it;
297
305
  assert(process->enabled == Process::DISABLED);
298
- assert(process->pqHandle == NULL);
299
306
  assert(process->isAlive());
300
307
  assert(process->oobwStatus == Process::OOBW_NOT_ACTIVE
301
308
  || process->oobwStatus == Process::OOBW_IN_PROGRESS);
@@ -303,7 +310,6 @@ public:
303
310
 
304
311
  foreach (const ProcessPtr &process, detachedProcesses) {
305
312
  assert(process->enabled == Process::DETACHED);
306
- assert(process->pqHandle == NULL);
307
313
  }
308
314
  #endif
309
315
  }
@@ -322,18 +328,14 @@ public:
322
328
  #endif
323
329
 
324
330
  /**
325
- * Persists options into this Group. Called at creation time and at restart time.
326
- * Values will be persisted into `destination`. Or if it's NULL, into `this->options`.
331
+ * Sets options for this Group. Called at creation time and at restart time.
327
332
  */
328
- void resetOptions(const Options &newOptions, Options *destination = NULL) {
329
- if (destination == NULL) {
330
- destination = &this->options;
331
- }
332
- *destination = newOptions;
333
- destination->persist(newOptions);
334
- destination->clearPerRequestFields();
335
- destination->groupSecret = secret;
336
- destination->groupUuid = uuid;
333
+ void resetOptions(const Options &newOptions) {
334
+ options = newOptions;
335
+ options.persist(newOptions);
336
+ options.clearPerRequestFields();
337
+ options.groupSecret = StaticString(secret, SECRET_SIZE);
338
+ options.groupUuid = uuid;
337
339
  }
338
340
 
339
341
  /**
@@ -346,8 +348,8 @@ public:
346
348
  options.maxPreloaderIdleTime = other.maxPreloaderIdleTime;
347
349
  }
348
350
 
349
- static void runAllActions(const vector<Callback> &actions) {
350
- vector<Callback>::const_iterator it, end = actions.end();
351
+ static void runAllActions(const boost::container::vector<Callback> &actions) {
352
+ boost::container::vector<Callback>::const_iterator it, end = actions.end();
351
353
  for (it = actions.begin(); it != end; it++) {
352
354
  (*it)();
353
355
  }
@@ -382,21 +384,21 @@ public:
382
384
  RouteResult route(const Options &options) const {
383
385
  if (OXT_LIKELY(enabledCount > 0)) {
384
386
  if (options.stickySessionId == 0) {
385
- if (pqueue.top()->canBeRoutedTo()) {
386
- return RouteResult(pqueue.top());
387
+ Process *process = findProcessWithLowestBusyness(enabledProcesses);
388
+ if (process->canBeRoutedTo()) {
389
+ return RouteResult(process);
387
390
  } else {
388
391
  return RouteResult(NULL, true);
389
392
  }
390
393
  } else {
391
- Process *process = findProcessWithStickySessionId(options.stickySessionId);
394
+ Process *process = findProcessWithStickySessionIdOrLowestBusyness(
395
+ options.stickySessionId);
392
396
  if (process != NULL) {
393
397
  if (process->canBeRoutedTo()) {
394
398
  return RouteResult(process);
395
399
  } else {
396
400
  return RouteResult(NULL, false);
397
401
  }
398
- } else if (pqueue.top()->canBeRoutedTo()) {
399
- return RouteResult(pqueue.top());
400
402
  } else {
401
403
  return RouteResult(NULL, true);
402
404
  }
@@ -411,22 +413,23 @@ public:
411
413
  }
412
414
  }
413
415
 
414
- SessionPtr newSession(Process *process) {
415
- SessionPtr session = process->newSession();
416
+ SessionPtr newSession(Process *process, unsigned long long now = 0) {
417
+ bool wasTotallyBusy = process->isTotallyBusy();
418
+ SessionPtr session = process->newSession(now);
416
419
  session->onInitiateFailure = _onSessionInitiateFailure;
417
420
  session->onClose = _onSessionClose;
418
421
  if (process->enabled == Process::ENABLED) {
419
- if (process == pqueue.top()) {
420
- pqueue.pop();
421
- } else {
422
- pqueue.erase(process->pqHandle);
422
+ enabledProcessBusynessLevels[process->index] = process->busyness();
423
+ if (!wasTotallyBusy && process->isTotallyBusy()) {
424
+ nEnabledProcessesTotallyBusy++;
423
425
  }
424
- process->pqHandle = pqueue.push(process, process->busyness());
425
426
  }
426
427
  return session;
427
428
  }
428
429
 
429
- bool pushGetWaiter(const Options &newOptions, const GetCallback &callback) {
430
+ bool pushGetWaiter(const Options &newOptions, const GetCallback &callback,
431
+ boost::container::vector<Callback> &postLockActions)
432
+ {
430
433
  if (OXT_LIKELY(!testOverflowRequestQueue()
431
434
  && (newOptions.maxRequestQueueSize == 0
432
435
  || getWaitlist.size() < newOptions.maxRequestQueueSize)))
@@ -437,7 +440,8 @@ public:
437
440
  return true;
438
441
  } else {
439
442
  P_WARN("Request queue is full. Returning an error");
440
- callback(SessionPtr(), boost::make_shared<RequestQueueFullException>());
443
+ postLockActions.push_back(boost::bind(GetCallback::call,
444
+ callback, SessionPtr(), boost::make_shared<RequestQueueFullException>()));
441
445
  return false;
442
446
  }
443
447
  }
@@ -453,16 +457,46 @@ public:
453
457
  return NULL;
454
458
  }
455
459
 
460
+ Process *findProcessWithStickySessionIdOrLowestBusyness(unsigned int id) const {
461
+ int leastBusyProcessIndex = -1;
462
+ int lowestBusyness = 0;
463
+ unsigned int i, size = enabledProcessBusynessLevels.size();
464
+ const int *enabledProcessBusynessLevels = &this->enabledProcessBusynessLevels[0];
465
+
466
+ for (i = 0; i < size; i++) {
467
+ Process *process = enabledProcesses[i].get();
468
+ if (process->stickySessionId == id) {
469
+ return process;
470
+ } else if (leastBusyProcessIndex == -1 || enabledProcessBusynessLevels[i] < lowestBusyness) {
471
+ leastBusyProcessIndex = i;
472
+ lowestBusyness = enabledProcessBusynessLevels[i];
473
+ }
474
+ }
475
+
476
+ if (leastBusyProcessIndex == -1) {
477
+ return NULL;
478
+ } else {
479
+ return enabledProcesses[leastBusyProcessIndex].get();
480
+ }
481
+ }
482
+
456
483
  Process *findProcessWithLowestBusyness(const ProcessList &processes) const {
457
- Process *result = NULL;
458
- ProcessList::const_iterator it, end = processes.end();
459
- for (it = processes.begin(); it != end; it++) {
460
- Process *process = it->get();
461
- if (result == NULL || process->busyness() < result->busyness()) {
462
- result = process;
484
+ if (processes.empty()) {
485
+ return NULL;
486
+ }
487
+
488
+ int leastBusyProcessIndex = -1;
489
+ int lowestBusyness = 0;
490
+ unsigned int i, size = enabledProcessBusynessLevels.size();
491
+ const int *enabledProcessBusynessLevels = &this->enabledProcessBusynessLevels[0];
492
+
493
+ for (i = 0; i < size; i++) {
494
+ if (leastBusyProcessIndex == -1 || enabledProcessBusynessLevels[i] < lowestBusyness) {
495
+ leastBusyProcessIndex = i;
496
+ lowestBusyness = enabledProcessBusynessLevels[i];
463
497
  }
464
498
  }
465
- return result;
499
+ return enabledProcesses[leastBusyProcessIndex].get();
466
500
  }
467
501
 
468
502
  /**
@@ -471,13 +505,17 @@ public:
471
505
  */
472
506
  void removeProcessFromList(const ProcessPtr &process, ProcessList &source) {
473
507
  ProcessPtr p = process; // Keep an extra reference count just in case.
474
- source.erase(process->it);
508
+
509
+ source.erase(source.begin() + process->index);
510
+ process->index = -1;
511
+
475
512
  switch (process->enabled) {
476
513
  case Process::ENABLED:
477
514
  assert(&source == &enabledProcesses);
478
515
  enabledCount--;
479
- pqueue.erase(process->pqHandle);
480
- process->pqHandle = NULL;
516
+ if (process->isTotallyBusy()) {
517
+ nEnabledProcessesTotallyBusy--;
518
+ }
481
519
  break;
482
520
  case Process::DISABLING:
483
521
  assert(&source == &disablingProcesses);
@@ -493,6 +531,24 @@ public:
493
531
  default:
494
532
  P_BUG("Unknown 'enabled' state " << (int) process->enabled);
495
533
  }
534
+
535
+ // Rebuild indices
536
+ ProcessList::iterator it, end = source.end();
537
+ unsigned int i = 0;
538
+ for (it = source.begin(); it != end; it++, i++) {
539
+ const ProcessPtr &process = *it;
540
+ process->index = i;
541
+ }
542
+
543
+ // Rebuild enabledProcessBusynessLevels
544
+ if (&source == &enabledProcesses) {
545
+ enabledProcessBusynessLevels.clear();
546
+ for (it = source.begin(); it != end; it++, i++) {
547
+ const ProcessPtr &process = *it;
548
+ enabledProcessBusynessLevels.push_back(process->busyness());
549
+ }
550
+ enabledProcessBusynessLevels.shrink_to_fit();
551
+ }
496
552
  }
497
553
 
498
554
  /**
@@ -503,11 +559,14 @@ public:
503
559
  */
504
560
  void addProcessToList(const ProcessPtr &process, ProcessList &destination) {
505
561
  destination.push_back(process);
506
- process->it = destination.last_iterator();
562
+ process->index = destination.size() - 1;
507
563
  if (&destination == &enabledProcesses) {
508
564
  process->enabled = Process::ENABLED;
509
- process->pqHandle = pqueue.push(process.get(), process->busyness());
510
565
  enabledCount++;
566
+ enabledProcessBusynessLevels.push_back(process->busyness());
567
+ if (process->isTotallyBusy()) {
568
+ nEnabledProcessesTotallyBusy++;
569
+ }
511
570
  } else if (&destination == &disablingProcesses) {
512
571
  process->enabled = Process::DISABLING;
513
572
  disablingCount++;
@@ -518,7 +577,7 @@ public:
518
577
  } else if (&destination == &detachedProcesses) {
519
578
  assert(process->isAlive());
520
579
  process->enabled = Process::DETACHED;
521
- process->abortLongRunningConnections();
580
+ callAbortLongRunningConnectionsCallback(process);
522
581
  } else {
523
582
  P_BUG("Unknown destination list");
524
583
  }
@@ -532,7 +591,7 @@ public:
532
591
  return;
533
592
  }
534
593
 
535
- SmallVector<GetAction, 50> actions;
594
+ SmallVector<GetAction, 8> actions;
536
595
  unsigned int i = 0;
537
596
  bool done = false;
538
597
 
@@ -563,7 +622,7 @@ public:
563
622
  }
564
623
  }
565
624
 
566
- void assignSessionsToGetWaiters(vector<Callback> &postLockActions) {
625
+ void assignSessionsToGetWaiters(boost::container::vector<Callback> &postLockActions) {
567
626
  unsigned int i = 0;
568
627
  bool done = false;
569
628
 
@@ -572,6 +631,7 @@ public:
572
631
  RouteResult result = route(waiter.options);
573
632
  if (result.process != NULL) {
574
633
  postLockActions.push_back(boost::bind(
634
+ GetCallback::call,
575
635
  waiter.callback,
576
636
  newSession(result.process),
577
637
  ExceptionPtr()));
@@ -585,7 +645,7 @@ public:
585
645
  }
586
646
  }
587
647
 
588
- void enableAllDisablingProcesses(vector<Callback> &postLockActions) {
648
+ void enableAllDisablingProcesses(boost::container::vector<Callback> &postLockActions) {
589
649
  P_DEBUG("Enabling all DISABLING processes with result DR_ERROR");
590
650
  deque<DisableWaiter>::iterator it, end = disableWaitlist.end();
591
651
  for (it = disableWaitlist.begin(); it != end; it++) {
@@ -604,7 +664,7 @@ public:
604
664
  }
605
665
 
606
666
  void removeFromDisableWaitlist(const ProcessPtr &p, DisableResult result,
607
- vector<Callback> &postLockActions)
667
+ boost::container::vector<Callback> &postLockActions)
608
668
  {
609
669
  deque<DisableWaiter>::const_iterator it, end = disableWaitlist.end();
610
670
  deque<DisableWaiter> newList;
@@ -620,7 +680,9 @@ public:
620
680
  disableWaitlist = newList;
621
681
  }
622
682
 
623
- void clearDisableWaitlist(DisableResult result, vector<Callback> &postLockActions) {
683
+ void clearDisableWaitlist(DisableResult result,
684
+ boost::container::vector<Callback> &postLockActions)
685
+ {
624
686
  // This function may be called after processes in the disableWaitlist
625
687
  // have been disabled or enabled, so do not assume any value for
626
688
  // waiter.process->enabled in this function.
@@ -633,7 +695,8 @@ public:
633
695
  }
634
696
 
635
697
  bool shutdownCanFinish() const {
636
- return getLifeStatus() == SHUTTING_DOWN
698
+ LifeStatus lifeStatus = (LifeStatus) this->lifeStatus.load(boost::memory_order_relaxed);
699
+ return lifeStatus == SHUTTING_DOWN
637
700
  && enabledCount == 0
638
701
  && disablingCount == 0
639
702
  && disabledCount == 0
@@ -647,9 +710,12 @@ public:
647
710
  /** One of the post lock actions can potentially perform a long-running
648
711
  * operation, so running them in a thread is advised.
649
712
  */
650
- void finishShutdown(vector<Callback> &postLockActions) {
713
+ void finishShutdown(boost::container::vector<Callback> &postLockActions) {
651
714
  TRACE_POINT();
652
- assert(getLifeStatus() == SHUTTING_DOWN);
715
+ #ifndef NDEBUG
716
+ LifeStatus lifeStatus = (LifeStatus) this->lifeStatus.load(boost::memory_order_relaxed);
717
+ P_ASSERT_EQ(lifeStatus, SHUTTING_DOWN);
718
+ #endif
653
719
  P_DEBUG("Finishing shutdown of group " << name);
654
720
  if (shutdownCallback) {
655
721
  postLockActions.push_back(shutdownCallback);
@@ -657,21 +723,20 @@ public:
657
723
  }
658
724
  postLockActions.push_back(boost::bind(interruptAndJoinAllThreads,
659
725
  shared_from_this()));
660
- {
661
- boost::lock_guard<boost::mutex> l(lifetimeSyncher);
662
- lifeStatus = SHUT_DOWN;
663
- }
726
+ this->lifeStatus.store(SHUT_DOWN, boost::memory_order_release);
664
727
  selfPointer.reset();
665
728
  }
666
729
 
667
730
  public:
731
+ static const unsigned int SECRET_SIZE = 16;
732
+
668
733
  Options options;
669
734
  /** This name uniquely identifies this Group within its Pool. It can also be used as the display name. */
670
735
  const string name;
671
736
  /** A secret token that may be known among all processes in this Group. Used for securing
672
737
  * intra-group process communication.
673
738
  */
674
- const string secret;
739
+ char secret[SECRET_SIZE];
675
740
  /** A UUID that's generated on Group initialization, and changes every time
676
741
  * the Group receives a restart command. Allows Union Station to track app
677
742
  * restarts. This information is public.
@@ -698,8 +763,8 @@ public:
698
763
  * their numbers.
699
764
  * These lists do not intersect. A process is in exactly 1 list.
700
765
  *
701
- * 'pqueue' orders all enabled processes according to busyness() values,
702
- * from small to large.
766
+ * `nEnabledProcessesTotallyBusy` counts the number of enabled processes for which
767
+ * `isTotallyBusy()` is true.
703
768
  *
704
769
  * Invariants:
705
770
  * enabledCount >= 0
@@ -708,9 +773,8 @@ public:
708
773
  * enabledProcesses.size() == enabledCount
709
774
  * disablingProcesses.size() == disabingCount
710
775
  * disabledProcesses.size() == disabledCount
776
+ * nEnabledProcessesTotallyBusy <= enabledCount
711
777
  *
712
- * enabledProcesses.empty() == (pqueue.top() == NULL)
713
- *
714
778
  * if (enabledCount == 0):
715
779
  * processesBeingSpawned > 0 || restarting() || poolAtFullCapacity()
716
780
  * if (enabledCount == 0) and (disablingCount > 0):
@@ -718,29 +782,23 @@ public:
718
782
  * if !m_spawning:
719
783
  * (enabledCount > 0) || (disablingCount == 0)
720
784
  *
721
- * if pqueue.top().isTotallyBusy():
722
- * All enabled processes are totally busy.
723
- *
724
785
  * for all process in enabledProcesses:
725
786
  * process.enabled == Process::ENABLED
726
- * process.pqHandle != NULL
727
787
  * process.isAlive()
728
788
  * process.oobwStatus == Process::OOBW_NOT_ACTIVE || process.oobwStatus == Process::OOBW_REQUESTED
729
789
  * for all processes in disablingProcesses:
730
790
  * process.enabled == Process::DISABLING
731
- * process.pqHandle == NULL
732
791
  * process.isAlive()
733
792
  * process.oobwStatus == Process::OOBW_NOT_ACTIVE || process.oobwStatus == Process::OOBW_IN_PROGRESS
734
793
  * for all process in disabledProcesses:
735
794
  * process.enabled == Process::DISABLED
736
- * process.pqHandle == NULL
737
795
  * process.isAlive()
738
796
  * process.oobwStatus == Process::OOBW_NOT_ACTIVE || process.oobwStatus == Process::OOBW_IN_PROGRESS
739
797
  */
740
798
  int enabledCount;
741
799
  int disablingCount;
742
800
  int disabledCount;
743
- PriorityQueue<Process> pqueue;
801
+ int nEnabledProcessesTotallyBusy;
744
802
  ProcessList enabledProcesses;
745
803
  ProcessList disablingProcesses;
746
804
  ProcessList disabledProcesses;
@@ -751,10 +809,16 @@ public:
751
809
  *
752
810
  * for all process in detachedProcesses:
753
811
  * process.enabled == Process::DETACHED
754
- * process.pqHandle == NULL
755
812
  */
756
813
  ProcessList detachedProcesses;
757
814
 
815
+ /**
816
+ * A cache of the processes' busyness. It's in a compact structure
817
+ * so that `findProcessWithLowestBusyness()` can work very quickly
818
+ * when there are a large number of processes.
819
+ */
820
+ boost::container::vector<int> enabledProcessBusynessLevels;
821
+
758
822
  /**
759
823
  * get() requests for this group that cannot be immediately satisfied are
760
824
  * put on this wait list, which must be processed as soon as the necessary
@@ -808,8 +872,9 @@ public:
808
872
  * Constructors and destructors
809
873
  ********************************************/
810
874
 
811
- Group(const SuperGroupPtr &superGroup, const Options &options, const ComponentInfo &info);
875
+ Group(SuperGroup *superGroup, const Options &options, const ComponentInfo &info);
812
876
  ~Group();
877
+ void initialize();
813
878
 
814
879
  /**
815
880
  * Must be called before destroying a Group. You can optionally provide a
@@ -820,7 +885,9 @@ public:
820
885
  * One of the post lock actions can potentially perform a long-running
821
886
  * operation, so running them in a thread is advised.
822
887
  */
823
- void shutdown(const Callback &callback, vector<Callback> &postLockActions) {
888
+ void shutdown(const Callback &callback,
889
+ boost::container::vector<Callback> &postLockActions)
890
+ {
824
891
  assert(isAlive());
825
892
 
826
893
  P_DEBUG("Begin shutting down group " << name);
@@ -832,10 +899,7 @@ public:
832
899
  spawner.reset();
833
900
  selfPointer = shared_from_this();
834
901
  assert(disableWaitlist.empty());
835
- {
836
- boost::lock_guard<boost::mutex> l(lifetimeSyncher);
837
- lifeStatus = SHUTTING_DOWN;
838
- }
902
+ lifeStatus.store(SHUTTING_DOWN, boost::memory_order_release);
839
903
  }
840
904
 
841
905
 
@@ -848,12 +912,12 @@ public:
848
912
  * @pre getLifeState() != SHUT_DOWN
849
913
  * @post result != NULL
850
914
  */
851
- SuperGroupPtr getSuperGroup() const {
852
- return superGroup.lock();
915
+ SuperGroup *getSuperGroup() const {
916
+ return superGroup;
853
917
  }
854
918
 
855
- void setSuperGroup(const SuperGroupPtr &superGroup) {
856
- assert(this->superGroup.lock() == NULL);
919
+ void setSuperGroup(SuperGroup *superGroup) {
920
+ assert(this->superGroup == NULL);
857
921
  this->superGroup = superGroup;
858
922
  }
859
923
 
@@ -862,18 +926,17 @@ public:
862
926
  * @pre getLifeState() != SHUT_DOWN
863
927
  * @post result != NULL
864
928
  */
865
- PoolPtr getPool() const;
929
+ OXT_FORCE_INLINE Pool *getPool() const;
866
930
 
867
931
  // Thread-safe.
868
932
  bool isAlive() const {
869
- boost::lock_guard<boost::mutex> lock(lifetimeSyncher);
870
- return lifeStatus == ALIVE;
933
+ return getLifeStatus() == ALIVE;
871
934
  }
872
935
 
873
936
  // Thread-safe.
937
+ OXT_FORCE_INLINE
874
938
  LifeStatus getLifeStatus() const {
875
- boost::lock_guard<boost::mutex> lock(lifetimeSyncher);
876
- return lifeStatus;
939
+ return (LifeStatus) lifeStatus.load(boost::memory_order_acquire);
877
940
  }
878
941
 
879
942
 
@@ -882,7 +945,7 @@ public:
882
945
  ********************************************/
883
946
 
884
947
  SessionPtr get(const Options &newOptions, const GetCallback &callback,
885
- vector<Callback> &postLockActions)
948
+ boost::container::vector<Callback> &postLockActions)
886
949
  {
887
950
  assert(isAlive());
888
951
 
@@ -913,14 +976,7 @@ public:
913
976
  }
914
977
 
915
978
  if (OXT_UNLIKELY(newOptions.noop)) {
916
- ProcessPtr process = boost::make_shared<Process>(
917
- 0, string(), string(),
918
- FileDescriptor(), FileDescriptor(),
919
- SocketListPtr(), 0, 0);
920
- process->dummy = true;
921
- process->requiresShutdown = false;
922
- process->setGroup(shared_from_this());
923
- return boost::make_shared<Session>(process, (Socket *) NULL);
979
+ return nullProcess->createSessionObject((Socket *) NULL);
924
980
  }
925
981
 
926
982
  if (OXT_UNLIKELY(enabledCount == 0)) {
@@ -943,11 +999,11 @@ public:
943
999
  disablingProcesses);
944
1000
  assert(process != NULL);
945
1001
  if (!process->isTotallyBusy()) {
946
- return newSession(process);
1002
+ return newSession(process, newOptions.currentTime);
947
1003
  }
948
1004
  }
949
1005
 
950
- if (pushGetWaiter(newOptions, callback)) {
1006
+ if (pushGetWaiter(newOptions, callback, postLockActions)) {
951
1007
  P_DEBUG("No session checked out yet: group is spawning or restarting");
952
1008
  }
953
1009
  return SessionPtr();
@@ -958,13 +1014,13 @@ public:
958
1014
  * Wait until a new one has been spawned or until
959
1015
  * resources have become free.
960
1016
  */
961
- if (pushGetWaiter(newOptions, callback)) {
1017
+ if (pushGetWaiter(newOptions, callback, postLockActions)) {
962
1018
  P_DEBUG("No session checked out yet: all processes are at full capacity");
963
1019
  }
964
1020
  return SessionPtr();
965
1021
  } else {
966
1022
  P_DEBUG("Session checked out from process " << result.process->inspect());
967
- return newSession(result.process);
1023
+ return newSession(result.process, newOptions.currentTime);
968
1024
  }
969
1025
  }
970
1026
  }
@@ -982,9 +1038,12 @@ public:
982
1038
  * function doesn't touch `getWaitlist` so be sure to fix its invariants
983
1039
  * afterwards if necessary, e.g. by calling `assignSessionsToGetWaiters()`.
984
1040
  */
985
- AttachResult attach(const ProcessPtr &process, vector<Callback> &postLockActions) {
1041
+ AttachResult attach(const SpawnObject &spawnObject,
1042
+ boost::container::vector<Callback> &postLockActions)
1043
+ {
986
1044
  TRACE_POINT();
987
- assert(process->getGroup() == NULL || process->getGroup().get() == this);
1045
+ const ProcessPtr &process = spawnObject.process;
1046
+ assert(process->getGroup() == NULL || process->getGroup() == this);
988
1047
  assert(process->isAlive());
989
1048
  assert(isAlive());
990
1049
 
@@ -996,11 +1055,15 @@ public:
996
1055
  return AR_ANOTHER_GROUP_IS_WAITING_FOR_CAPACITY;
997
1056
  }
998
1057
 
999
- process->setGroup(shared_from_this());
1058
+ process->setGroup(this);
1000
1059
  process->stickySessionId = generateStickySessionId();
1001
1060
  P_DEBUG("Attaching process " << process->inspect());
1002
1061
  addProcessToList(process, enabledProcesses);
1003
1062
 
1063
+ if (spawnObject.pool != getPallocPool()) {
1064
+ process->recreateStrings(getPallocPool());
1065
+ }
1066
+
1004
1067
  /* Now that there are enough resources, relevant processes in
1005
1068
  * 'disableWaitlist' can be disabled.
1006
1069
  */
@@ -1043,9 +1106,9 @@ public:
1043
1106
  * `pool->detachProcessUnlocked()` does that so you should usually use
1044
1107
  * that method over this one.
1045
1108
  */
1046
- void detach(const ProcessPtr &process, vector<Callback> &postLockActions) {
1109
+ void detach(const ProcessPtr &process, boost::container::vector<Callback> &postLockActions) {
1047
1110
  TRACE_POINT();
1048
- assert(process->getGroup().get() == this);
1111
+ assert(process->getGroup() == this);
1049
1112
  assert(process->isAlive());
1050
1113
  assert(isAlive());
1051
1114
 
@@ -1081,13 +1144,12 @@ public:
1081
1144
  * Detaches all processes from this Group. This function doesn't touch
1082
1145
  * getWaitlist so be sure to fix its invariants afterwards if necessary.
1083
1146
  */
1084
- void detachAll(vector<Callback> &postLockActions) {
1147
+ void detachAll(boost::container::vector<Callback> &postLockActions) {
1085
1148
  assert(isAlive());
1086
1149
  P_DEBUG("Detaching all processes in group " << name);
1087
1150
 
1088
1151
  foreach (ProcessPtr process, enabledProcesses) {
1089
1152
  addProcessToList(process, detachedProcesses);
1090
- process->pqHandle = NULL;
1091
1153
  }
1092
1154
  foreach (ProcessPtr process, disablingProcesses) {
1093
1155
  addProcessToList(process, detachedProcesses);
@@ -1099,10 +1161,11 @@ public:
1099
1161
  enabledProcesses.clear();
1100
1162
  disablingProcesses.clear();
1101
1163
  disabledProcesses.clear();
1102
- pqueue.clear();
1164
+ enabledProcessBusynessLevels.clear();
1103
1165
  enabledCount = 0;
1104
1166
  disablingCount = 0;
1105
1167
  disabledCount = 0;
1168
+ nEnabledProcessesTotallyBusy = 0;
1106
1169
  clearDisableWaitlist(DR_NOOP, postLockActions);
1107
1170
  startCheckingDetachedProcesses(false);
1108
1171
  }
@@ -1111,8 +1174,8 @@ public:
1111
1174
  * Marks the given process as enabled. This function doesn't touch getWaitlist
1112
1175
  * so be sure to fix its invariants afterwards if necessary.
1113
1176
  */
1114
- void enable(const ProcessPtr &process, vector<Callback> &postLockActions) {
1115
- assert(process->getGroup().get() == this);
1177
+ void enable(const ProcessPtr &process, boost::container::vector<Callback> &postLockActions) {
1178
+ assert(process->getGroup() == this);
1116
1179
  assert(process->isAlive());
1117
1180
  assert(isAlive());
1118
1181
 
@@ -1136,7 +1199,7 @@ public:
1136
1199
  * called later with the result of this action.
1137
1200
  */
1138
1201
  DisableResult disable(const ProcessPtr &process, const DisableCallback &callback) {
1139
- assert(process->getGroup().get() == this);
1202
+ assert(process->getGroup() == this);
1140
1203
  assert(process->isAlive());
1141
1204
  assert(isAlive());
1142
1205
 
@@ -1216,7 +1279,7 @@ public:
1216
1279
  }
1217
1280
  }
1218
1281
 
1219
- void cleanupSpawner(vector<Callback> &postLockActions) {
1282
+ void cleanupSpawner(boost::container::vector<Callback> &postLockActions) {
1220
1283
  assert(isAlive());
1221
1284
  postLockActions.push_back(boost::bind(doCleanupSpawner, spawner));
1222
1285
  }
@@ -1264,7 +1327,7 @@ public:
1264
1327
  * Returns false if there are no enabled processes.
1265
1328
  */
1266
1329
  bool allEnabledProcessesAreTotallyBusy() const {
1267
- return enabledCount > 0 && pqueue.top()->isTotallyBusy();
1330
+ return nEnabledProcessesTotallyBusy == enabledCount;
1268
1331
  }
1269
1332
 
1270
1333
  /**
@@ -1312,9 +1375,78 @@ public:
1312
1375
  if (m_restarting) {
1313
1376
  return false;
1314
1377
  } else {
1378
+ time_t now;
1315
1379
  struct stat buf;
1316
- return cstat.stat(alwaysRestartFile, &buf, options.statThrottleRate) == 0 ||
1317
- fileChangeChecker.changed(restartFile, options.statThrottleRate);
1380
+
1381
+ if (options.currentTime != 0) {
1382
+ now = options.currentTime / 1000000;
1383
+ } else {
1384
+ now = SystemTime::get();
1385
+ }
1386
+
1387
+ if (lastRestartFileCheckTime == 0) {
1388
+ // First time we call needsRestart() for this group.
1389
+ if (syscalls::stat(restartFile.c_str(), &buf) == 0) {
1390
+ lastRestartFileMtime = buf.st_mtime;
1391
+ } else {
1392
+ lastRestartFileMtime = 0;
1393
+ }
1394
+ lastRestartFileCheckTime = now;
1395
+ return false;
1396
+
1397
+ } else if (lastRestartFileCheckTime <= now - (time_t) options.statThrottleRate) {
1398
+ // Not first time we call needsRestart() for this group.
1399
+ // Stat throttle time has passed.
1400
+ bool restart;
1401
+
1402
+ lastRestartFileCheckTime = now;
1403
+
1404
+ if (lastRestartFileMtime > 0) {
1405
+ // restart.txt existed before
1406
+ if (syscalls::stat(restartFile.c_str(), &buf) == -1) {
1407
+ // restart.txt no longer exists
1408
+ lastRestartFileMtime = buf.st_mtime;
1409
+ restart = false;
1410
+ } else if (buf.st_mtime != lastRestartFileMtime) {
1411
+ // restart.txt's mtime has changed
1412
+ lastRestartFileMtime = buf.st_mtime;
1413
+ restart = true;
1414
+ } else {
1415
+ restart = false;
1416
+ }
1417
+ } else {
1418
+ // restart.txt didn't exist before
1419
+ if (syscalls::stat(restartFile.c_str(), &buf) == 0) {
1420
+ // restart.txt now exists
1421
+ lastRestartFileMtime = buf.st_mtime;
1422
+ restart = true;
1423
+ } else {
1424
+ // restart.txt still doesn't exist
1425
+ lastRestartFileMtime = 0;
1426
+ restart = false;
1427
+ }
1428
+ }
1429
+
1430
+ if (!restart) {
1431
+ alwaysRestartFileExists = restart =
1432
+ syscalls::stat(alwaysRestartFile.c_str(), &buf) == 0;
1433
+ }
1434
+
1435
+ return restart;
1436
+
1437
+ } else {
1438
+ // Not first time we call needsRestart() for this group.
1439
+ // Still within stat throttling window.
1440
+ if (alwaysRestartFileExists) {
1441
+ // always_restart.txt existed before
1442
+ alwaysRestartFileExists = syscalls::stat(
1443
+ alwaysRestartFile.c_str(), &buf) == 0;
1444
+ return alwaysRestartFileExists;
1445
+ } else {
1446
+ // Don't check until stat throttling window is over
1447
+ return false;
1448
+ }
1449
+ }
1318
1450
  }
1319
1451
  }
1320
1452
 
@@ -1350,8 +1482,9 @@ public:
1350
1482
  stream << "<restarting/>";
1351
1483
  }
1352
1484
  if (includeSecrets) {
1353
- stream << "<secret>" << escapeForXml(secret) << "</secret>";
1485
+ stream << "<secret>" << escapeForXml(StaticString(secret, SECRET_SIZE)) << "</secret>";
1354
1486
  }
1487
+ LifeStatus lifeStatus = (LifeStatus) this->lifeStatus.load(boost::memory_order_relaxed);
1355
1488
  switch (lifeStatus) {
1356
1489
  case ALIVE:
1357
1490
  stream << "<life_status>ALIVE</life_status>";
@@ -1363,7 +1496,7 @@ public:
1363
1496
  stream << "<life_status>SHUT_DOWN</life_status>";
1364
1497
  break;
1365
1498
  default:
1366
- P_BUG("Unknown 'lifeStatus' state " << (int) lifeStatus);
1499
+ P_BUG("Unknown 'lifeStatus' state " << lifeStatus);
1367
1500
  }
1368
1501
 
1369
1502
  stream << "<options>";