rockdog-passenger 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (805) hide show
  1. data/DEVELOPERS.TXT +89 -0
  2. data/INSTALL +4 -0
  3. data/LICENSE +355 -0
  4. data/README +38 -0
  5. data/Rakefile +627 -0
  6. data/benchmark/ApplicationPool.cpp +52 -0
  7. data/benchmark/DummyRequestHandler.cpp +101 -0
  8. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +126 -0
  9. data/benchmark/dispatcher.rb +42 -0
  10. data/benchmark/overhead_of_password_checking.rb +81 -0
  11. data/benchmark/socket_connections_vs_persistent_pipe.rb +99 -0
  12. data/benchmark/unix_sockets_vs_pipes.rb +83 -0
  13. data/bin/passenger-config +40 -0
  14. data/bin/passenger-install-apache2-module +352 -0
  15. data/bin/passenger-make-enterprisey +78 -0
  16. data/bin/passenger-memory-stats +291 -0
  17. data/bin/passenger-spawn-server +53 -0
  18. data/bin/passenger-status +71 -0
  19. data/bin/passenger-stress-test +339 -0
  20. data/debian/compat +1 -0
  21. data/debian/control +21 -0
  22. data/debian/postinst +24 -0
  23. data/debian/prerm +2 -0
  24. data/doc/ApplicationPool algorithm.txt +398 -0
  25. data/doc/Architectural overview.txt +339 -0
  26. data/doc/Doxyfile +241 -0
  27. data/doc/Security of user switching support.txt +197 -0
  28. data/doc/Users guide.txt +2237 -0
  29. data/doc/definitions.h +5 -0
  30. data/doc/images/by_sa.png +0 -0
  31. data/doc/images/icons/README +5 -0
  32. data/doc/images/icons/callouts/1.png +0 -0
  33. data/doc/images/icons/callouts/10.png +0 -0
  34. data/doc/images/icons/callouts/11.png +0 -0
  35. data/doc/images/icons/callouts/12.png +0 -0
  36. data/doc/images/icons/callouts/13.png +0 -0
  37. data/doc/images/icons/callouts/14.png +0 -0
  38. data/doc/images/icons/callouts/15.png +0 -0
  39. data/doc/images/icons/callouts/2.png +0 -0
  40. data/doc/images/icons/callouts/3.png +0 -0
  41. data/doc/images/icons/callouts/4.png +0 -0
  42. data/doc/images/icons/callouts/5.png +0 -0
  43. data/doc/images/icons/callouts/6.png +0 -0
  44. data/doc/images/icons/callouts/7.png +0 -0
  45. data/doc/images/icons/callouts/8.png +0 -0
  46. data/doc/images/icons/callouts/9.png +0 -0
  47. data/doc/images/icons/caution.png +0 -0
  48. data/doc/images/icons/example.png +0 -0
  49. data/doc/images/icons/home.png +0 -0
  50. data/doc/images/icons/important.png +0 -0
  51. data/doc/images/icons/next.png +0 -0
  52. data/doc/images/icons/note.png +0 -0
  53. data/doc/images/icons/prev.png +0 -0
  54. data/doc/images/icons/tip.png +0 -0
  55. data/doc/images/icons/up.png +0 -0
  56. data/doc/images/icons/warning.png +0 -0
  57. data/doc/images/passenger_architecture.png +0 -0
  58. data/doc/images/passenger_architecture.svg +401 -0
  59. data/doc/images/phusion_banner.png +0 -0
  60. data/doc/images/spawn_server_architecture.png +0 -0
  61. data/doc/images/spawn_server_architecture.svg +655 -0
  62. data/doc/images/typical_isolated_web_application.png +0 -0
  63. data/doc/images/typical_isolated_web_application.svg +213 -0
  64. data/doc/template/horo.rb +613 -0
  65. data/ext/apache2/Application.h +526 -0
  66. data/ext/apache2/ApplicationPool.h +199 -0
  67. data/ext/apache2/ApplicationPoolServer.h +777 -0
  68. data/ext/apache2/ApplicationPoolServerExecutable.cpp +627 -0
  69. data/ext/apache2/Bucket.cpp +150 -0
  70. data/ext/apache2/Bucket.h +45 -0
  71. data/ext/apache2/Configuration.cpp +720 -0
  72. data/ext/apache2/Configuration.h +327 -0
  73. data/ext/apache2/DummySpawnManager.h +103 -0
  74. data/ext/apache2/Exceptions.h +240 -0
  75. data/ext/apache2/Hooks.cpp +1195 -0
  76. data/ext/apache2/Hooks.h +40 -0
  77. data/ext/apache2/LICENSE-CNRI.TXT +79 -0
  78. data/ext/apache2/Logging.cpp +60 -0
  79. data/ext/apache2/Logging.h +117 -0
  80. data/ext/apache2/MessageChannel.h +604 -0
  81. data/ext/apache2/SpawnManager.h +546 -0
  82. data/ext/apache2/StandardApplicationPool.h +817 -0
  83. data/ext/apache2/Utils.cpp +322 -0
  84. data/ext/apache2/Utils.h +365 -0
  85. data/ext/apache2/mod_passenger.c +33 -0
  86. data/ext/boost/LICENSE.TXT +23 -0
  87. data/ext/boost/VERSION.TXT +1 -0
  88. data/ext/boost/algorithm/string/case_conv.hpp +176 -0
  89. data/ext/boost/algorithm/string/compare.hpp +199 -0
  90. data/ext/boost/algorithm/string/concept.hpp +83 -0
  91. data/ext/boost/algorithm/string/config.hpp +28 -0
  92. data/ext/boost/algorithm/string/constants.hpp +36 -0
  93. data/ext/boost/algorithm/string/detail/case_conv.hpp +112 -0
  94. data/ext/boost/algorithm/string/detail/find_format.hpp +193 -0
  95. data/ext/boost/algorithm/string/detail/find_format_all.hpp +263 -0
  96. data/ext/boost/algorithm/string/detail/find_format_store.hpp +71 -0
  97. data/ext/boost/algorithm/string/detail/finder.hpp +646 -0
  98. data/ext/boost/algorithm/string/detail/formatter.hpp +94 -0
  99. data/ext/boost/algorithm/string/detail/replace_storage.hpp +159 -0
  100. data/ext/boost/algorithm/string/detail/sequence.hpp +200 -0
  101. data/ext/boost/algorithm/string/detail/util.hpp +106 -0
  102. data/ext/boost/algorithm/string/erase.hpp +844 -0
  103. data/ext/boost/algorithm/string/find_format.hpp +269 -0
  104. data/ext/boost/algorithm/string/finder.hpp +270 -0
  105. data/ext/boost/algorithm/string/formatter.hpp +103 -0
  106. data/ext/boost/algorithm/string/replace.hpp +928 -0
  107. data/ext/boost/algorithm/string/sequence_traits.hpp +193 -0
  108. data/ext/boost/algorithm/string/yes_no_type.hpp +33 -0
  109. data/ext/boost/assert.hpp +50 -0
  110. data/ext/boost/bind.hpp +1689 -0
  111. data/ext/boost/bind/arg.hpp +62 -0
  112. data/ext/boost/bind/bind_cc.hpp +117 -0
  113. data/ext/boost/bind/bind_mf_cc.hpp +227 -0
  114. data/ext/boost/bind/bind_template.hpp +345 -0
  115. data/ext/boost/bind/mem_fn_cc.hpp +103 -0
  116. data/ext/boost/bind/mem_fn_template.hpp +1020 -0
  117. data/ext/boost/bind/placeholders.hpp +68 -0
  118. data/ext/boost/bind/storage.hpp +475 -0
  119. data/ext/boost/call_traits.hpp +24 -0
  120. data/ext/boost/checked_delete.hpp +69 -0
  121. data/ext/boost/concept/assert.hpp +46 -0
  122. data/ext/boost/concept/detail/concept_def.hpp +51 -0
  123. data/ext/boost/concept/detail/concept_undef.hpp +5 -0
  124. data/ext/boost/concept/detail/general.hpp +66 -0
  125. data/ext/boost/concept/detail/has_constraints.hpp +48 -0
  126. data/ext/boost/concept/usage.hpp +43 -0
  127. data/ext/boost/concept_check.hpp +988 -0
  128. data/ext/boost/config.hpp +70 -0
  129. data/ext/boost/config/abi/borland_prefix.hpp +27 -0
  130. data/ext/boost/config/abi/borland_suffix.hpp +12 -0
  131. data/ext/boost/config/abi/msvc_prefix.hpp +8 -0
  132. data/ext/boost/config/abi/msvc_suffix.hpp +8 -0
  133. data/ext/boost/config/abi_prefix.hpp +25 -0
  134. data/ext/boost/config/abi_suffix.hpp +26 -0
  135. data/ext/boost/config/auto_link.hpp +368 -0
  136. data/ext/boost/config/compiler/borland.hpp +209 -0
  137. data/ext/boost/config/compiler/comeau.hpp +59 -0
  138. data/ext/boost/config/compiler/common_edg.hpp +62 -0
  139. data/ext/boost/config/compiler/compaq_cxx.hpp +19 -0
  140. data/ext/boost/config/compiler/digitalmars.hpp +67 -0
  141. data/ext/boost/config/compiler/gcc.hpp +149 -0
  142. data/ext/boost/config/compiler/gcc_xml.hpp +30 -0
  143. data/ext/boost/config/compiler/greenhills.hpp +28 -0
  144. data/ext/boost/config/compiler/hp_acc.hpp +95 -0
  145. data/ext/boost/config/compiler/intel.hpp +162 -0
  146. data/ext/boost/config/compiler/kai.hpp +35 -0
  147. data/ext/boost/config/compiler/metrowerks.hpp +111 -0
  148. data/ext/boost/config/compiler/mpw.hpp +51 -0
  149. data/ext/boost/config/compiler/pgi.hpp +25 -0
  150. data/ext/boost/config/compiler/sgi_mipspro.hpp +28 -0
  151. data/ext/boost/config/compiler/sunpro_cc.hpp +98 -0
  152. data/ext/boost/config/compiler/vacpp.hpp +60 -0
  153. data/ext/boost/config/compiler/visualc.hpp +191 -0
  154. data/ext/boost/config/no_tr1/complex.hpp +28 -0
  155. data/ext/boost/config/no_tr1/functional.hpp +28 -0
  156. data/ext/boost/config/no_tr1/memory.hpp +28 -0
  157. data/ext/boost/config/no_tr1/utility.hpp +28 -0
  158. data/ext/boost/config/platform/aix.hpp +33 -0
  159. data/ext/boost/config/platform/amigaos.hpp +15 -0
  160. data/ext/boost/config/platform/beos.hpp +26 -0
  161. data/ext/boost/config/platform/bsd.hpp +73 -0
  162. data/ext/boost/config/platform/cygwin.hpp +51 -0
  163. data/ext/boost/config/platform/hpux.hpp +84 -0
  164. data/ext/boost/config/platform/irix.hpp +31 -0
  165. data/ext/boost/config/platform/linux.hpp +98 -0
  166. data/ext/boost/config/platform/macos.hpp +78 -0
  167. data/ext/boost/config/platform/qnxnto.hpp +31 -0
  168. data/ext/boost/config/platform/solaris.hpp +21 -0
  169. data/ext/boost/config/platform/win32.hpp +58 -0
  170. data/ext/boost/config/posix_features.hpp +95 -0
  171. data/ext/boost/config/requires_threads.hpp +92 -0
  172. data/ext/boost/config/select_compiler_config.hpp +115 -0
  173. data/ext/boost/config/select_platform_config.hpp +90 -0
  174. data/ext/boost/config/select_stdlib_config.hpp +68 -0
  175. data/ext/boost/config/stdlib/dinkumware.hpp +106 -0
  176. data/ext/boost/config/stdlib/libcomo.hpp +46 -0
  177. data/ext/boost/config/stdlib/libstdcpp3.hpp +73 -0
  178. data/ext/boost/config/stdlib/modena.hpp +30 -0
  179. data/ext/boost/config/stdlib/msl.hpp +59 -0
  180. data/ext/boost/config/stdlib/roguewave.hpp +153 -0
  181. data/ext/boost/config/stdlib/sgi.hpp +111 -0
  182. data/ext/boost/config/stdlib/stlport.hpp +201 -0
  183. data/ext/boost/config/stdlib/vacpp.hpp +18 -0
  184. data/ext/boost/config/suffix.hpp +566 -0
  185. data/ext/boost/config/user.hpp +124 -0
  186. data/ext/boost/cstdint.hpp +448 -0
  187. data/ext/boost/date_time/adjust_functors.hpp +178 -0
  188. data/ext/boost/date_time/c_time.hpp +91 -0
  189. data/ext/boost/date_time/compiler_config.hpp +149 -0
  190. data/ext/boost/date_time/constrained_value.hpp +98 -0
  191. data/ext/boost/date_time/date.hpp +197 -0
  192. data/ext/boost/date_time/date_clock_device.hpp +77 -0
  193. data/ext/boost/date_time/date_defs.hpp +26 -0
  194. data/ext/boost/date_time/date_duration.hpp +147 -0
  195. data/ext/boost/date_time/date_duration_types.hpp +269 -0
  196. data/ext/boost/date_time/date_facet.hpp +775 -0
  197. data/ext/boost/date_time/date_format_simple.hpp +159 -0
  198. data/ext/boost/date_time/date_formatting.hpp +127 -0
  199. data/ext/boost/date_time/date_formatting_limited.hpp +121 -0
  200. data/ext/boost/date_time/date_formatting_locales.hpp +233 -0
  201. data/ext/boost/date_time/date_generator_formatter.hpp +263 -0
  202. data/ext/boost/date_time/date_generator_parser.hpp +329 -0
  203. data/ext/boost/date_time/date_generators.hpp +509 -0
  204. data/ext/boost/date_time/date_iterator.hpp +101 -0
  205. data/ext/boost/date_time/date_names_put.hpp +320 -0
  206. data/ext/boost/date_time/date_parsing.hpp +299 -0
  207. data/ext/boost/date_time/dst_rules.hpp +391 -0
  208. data/ext/boost/date_time/filetime_functions.hpp +78 -0
  209. data/ext/boost/date_time/format_date_parser.hpp +731 -0
  210. data/ext/boost/date_time/gregorian/conversion.hpp +73 -0
  211. data/ext/boost/date_time/gregorian/formatters.hpp +162 -0
  212. data/ext/boost/date_time/gregorian/formatters_limited.hpp +81 -0
  213. data/ext/boost/date_time/gregorian/greg_calendar.hpp +47 -0
  214. data/ext/boost/date_time/gregorian/greg_date.hpp +135 -0
  215. data/ext/boost/date_time/gregorian/greg_day.hpp +57 -0
  216. data/ext/boost/date_time/gregorian/greg_day_of_year.hpp +38 -0
  217. data/ext/boost/date_time/gregorian/greg_duration.hpp +38 -0
  218. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +34 -0
  219. data/ext/boost/date_time/gregorian/greg_month.hpp +105 -0
  220. data/ext/boost/date_time/gregorian/greg_weekday.hpp +66 -0
  221. data/ext/boost/date_time/gregorian/greg_year.hpp +53 -0
  222. data/ext/boost/date_time/gregorian/greg_ymd.hpp +33 -0
  223. data/ext/boost/date_time/gregorian/gregorian.hpp +38 -0
  224. data/ext/boost/date_time/gregorian/gregorian_io.hpp +777 -0
  225. data/ext/boost/date_time/gregorian/gregorian_types.hpp +109 -0
  226. data/ext/boost/date_time/gregorian/parsers.hpp +91 -0
  227. data/ext/boost/date_time/gregorian_calendar.hpp +70 -0
  228. data/ext/boost/date_time/gregorian_calendar.ipp +219 -0
  229. data/ext/boost/date_time/int_adapter.hpp +507 -0
  230. data/ext/boost/date_time/iso_format.hpp +303 -0
  231. data/ext/boost/date_time/locale_config.hpp +31 -0
  232. data/ext/boost/date_time/microsec_time_clock.hpp +205 -0
  233. data/ext/boost/date_time/parse_format_base.hpp +29 -0
  234. data/ext/boost/date_time/period.hpp +377 -0
  235. data/ext/boost/date_time/period_formatter.hpp +196 -0
  236. data/ext/boost/date_time/period_parser.hpp +196 -0
  237. data/ext/boost/date_time/posix_time/conversion.hpp +93 -0
  238. data/ext/boost/date_time/posix_time/date_duration_operators.hpp +114 -0
  239. data/ext/boost/date_time/posix_time/posix_time.hpp +39 -0
  240. data/ext/boost/date_time/posix_time/posix_time_config.hpp +178 -0
  241. data/ext/boost/date_time/posix_time/posix_time_duration.hpp +82 -0
  242. data/ext/boost/date_time/posix_time/posix_time_io.hpp +246 -0
  243. data/ext/boost/date_time/posix_time/posix_time_system.hpp +68 -0
  244. data/ext/boost/date_time/posix_time/posix_time_types.hpp +55 -0
  245. data/ext/boost/date_time/posix_time/ptime.hpp +65 -0
  246. data/ext/boost/date_time/posix_time/time_formatters.hpp +289 -0
  247. data/ext/boost/date_time/posix_time/time_parsers.hpp +44 -0
  248. data/ext/boost/date_time/posix_time/time_period.hpp +29 -0
  249. data/ext/boost/date_time/special_defs.hpp +25 -0
  250. data/ext/boost/date_time/special_values_formatter.hpp +96 -0
  251. data/ext/boost/date_time/special_values_parser.hpp +159 -0
  252. data/ext/boost/date_time/string_convert.hpp +33 -0
  253. data/ext/boost/date_time/string_parse_tree.hpp +278 -0
  254. data/ext/boost/date_time/strings_from_facet.hpp +123 -0
  255. data/ext/boost/date_time/time.hpp +190 -0
  256. data/ext/boost/date_time/time_clock.hpp +83 -0
  257. data/ext/boost/date_time/time_defs.hpp +33 -0
  258. data/ext/boost/date_time/time_duration.hpp +281 -0
  259. data/ext/boost/date_time/time_facet.hpp +1263 -0
  260. data/ext/boost/date_time/time_formatting_streams.hpp +119 -0
  261. data/ext/boost/date_time/time_iterator.hpp +52 -0
  262. data/ext/boost/date_time/time_parsing.hpp +321 -0
  263. data/ext/boost/date_time/time_resolution_traits.hpp +140 -0
  264. data/ext/boost/date_time/time_system_counted.hpp +254 -0
  265. data/ext/boost/date_time/time_system_split.hpp +213 -0
  266. data/ext/boost/date_time/wrapping_int.hpp +163 -0
  267. data/ext/boost/date_time/year_month_day.hpp +45 -0
  268. data/ext/boost/detail/atomic_count.hpp +124 -0
  269. data/ext/boost/detail/atomic_count_gcc.hpp +68 -0
  270. data/ext/boost/detail/atomic_count_gcc_x86.hpp +84 -0
  271. data/ext/boost/detail/atomic_count_pthreads.hpp +96 -0
  272. data/ext/boost/detail/atomic_count_solaris.hpp +59 -0
  273. data/ext/boost/detail/atomic_count_sync.hpp +57 -0
  274. data/ext/boost/detail/atomic_count_win32.hpp +63 -0
  275. data/ext/boost/detail/bad_weak_ptr.hpp +59 -0
  276. data/ext/boost/detail/call_traits.hpp +164 -0
  277. data/ext/boost/detail/endian.hpp +73 -0
  278. data/ext/boost/detail/indirect_traits.hpp +487 -0
  279. data/ext/boost/detail/iterator.hpp +494 -0
  280. data/ext/boost/detail/lcast_precision.hpp +184 -0
  281. data/ext/boost/detail/limits.hpp +449 -0
  282. data/ext/boost/detail/reference_content.hpp +141 -0
  283. data/ext/boost/detail/shared_count.hpp +375 -0
  284. data/ext/boost/detail/sp_counted_base.hpp +81 -0
  285. data/ext/boost/detail/sp_counted_base_acc_ia64.hpp +150 -0
  286. data/ext/boost/detail/sp_counted_base_cw_ppc.hpp +170 -0
  287. data/ext/boost/detail/sp_counted_base_cw_x86.hpp +158 -0
  288. data/ext/boost/detail/sp_counted_base_gcc_ia64.hpp +157 -0
  289. data/ext/boost/detail/sp_counted_base_gcc_ppc.hpp +181 -0
  290. data/ext/boost/detail/sp_counted_base_gcc_sparc.hpp +166 -0
  291. data/ext/boost/detail/sp_counted_base_gcc_x86.hpp +173 -0
  292. data/ext/boost/detail/sp_counted_base_nt.hpp +107 -0
  293. data/ext/boost/detail/sp_counted_base_pt.hpp +135 -0
  294. data/ext/boost/detail/sp_counted_base_solaris.hpp +113 -0
  295. data/ext/boost/detail/sp_counted_base_sync.hpp +151 -0
  296. data/ext/boost/detail/sp_counted_base_w32.hpp +130 -0
  297. data/ext/boost/detail/sp_counted_impl.hpp +231 -0
  298. data/ext/boost/detail/sp_typeinfo.hpp +83 -0
  299. data/ext/boost/detail/workaround.hpp +202 -0
  300. data/ext/boost/enable_shared_from_this.hpp +73 -0
  301. data/ext/boost/function.hpp +66 -0
  302. data/ext/boost/function/detail/function_iterate.hpp +16 -0
  303. data/ext/boost/function/detail/maybe_include.hpp +267 -0
  304. data/ext/boost/function/detail/prologue.hpp +25 -0
  305. data/ext/boost/function/function_base.hpp +762 -0
  306. data/ext/boost/function/function_template.hpp +969 -0
  307. data/ext/boost/function_equal.hpp +28 -0
  308. data/ext/boost/get_pointer.hpp +29 -0
  309. data/ext/boost/implicit_cast.hpp +29 -0
  310. data/ext/boost/integer_traits.hpp +236 -0
  311. data/ext/boost/io/ios_state.hpp +431 -0
  312. data/ext/boost/io_fwd.hpp +67 -0
  313. data/ext/boost/is_placeholder.hpp +31 -0
  314. data/ext/boost/iterator.hpp +59 -0
  315. data/ext/boost/iterator/detail/config_def.hpp +135 -0
  316. data/ext/boost/iterator/detail/config_undef.hpp +25 -0
  317. data/ext/boost/iterator/detail/enable_if.hpp +86 -0
  318. data/ext/boost/iterator/detail/facade_iterator_category.hpp +200 -0
  319. data/ext/boost/iterator/detail/minimum_category.hpp +116 -0
  320. data/ext/boost/iterator/interoperable.hpp +50 -0
  321. data/ext/boost/iterator/iterator_adaptor.hpp +366 -0
  322. data/ext/boost/iterator/iterator_categories.hpp +188 -0
  323. data/ext/boost/iterator/iterator_facade.hpp +879 -0
  324. data/ext/boost/iterator/iterator_traits.hpp +92 -0
  325. data/ext/boost/iterator/reverse_iterator.hpp +69 -0
  326. data/ext/boost/iterator/transform_iterator.hpp +188 -0
  327. data/ext/boost/lexical_cast.hpp +1205 -0
  328. data/ext/boost/limits.hpp +146 -0
  329. data/ext/boost/mem_fn.hpp +389 -0
  330. data/ext/boost/mpl/always.hpp +39 -0
  331. data/ext/boost/mpl/and.hpp +60 -0
  332. data/ext/boost/mpl/apply.hpp +225 -0
  333. data/ext/boost/mpl/apply_fwd.hpp +107 -0
  334. data/ext/boost/mpl/apply_wrap.hpp +200 -0
  335. data/ext/boost/mpl/arg.hpp +131 -0
  336. data/ext/boost/mpl/arg_fwd.hpp +28 -0
  337. data/ext/boost/mpl/assert.hpp +370 -0
  338. data/ext/boost/mpl/aux_/adl_barrier.hpp +48 -0
  339. data/ext/boost/mpl/aux_/arg_typedef.hpp +31 -0
  340. data/ext/boost/mpl/aux_/arity.hpp +39 -0
  341. data/ext/boost/mpl/aux_/arity_spec.hpp +67 -0
  342. data/ext/boost/mpl/aux_/common_name_wknd.hpp +34 -0
  343. data/ext/boost/mpl/aux_/config/adl.hpp +40 -0
  344. data/ext/boost/mpl/aux_/config/arrays.hpp +30 -0
  345. data/ext/boost/mpl/aux_/config/bind.hpp +33 -0
  346. data/ext/boost/mpl/aux_/config/compiler.hpp +64 -0
  347. data/ext/boost/mpl/aux_/config/ctps.hpp +30 -0
  348. data/ext/boost/mpl/aux_/config/dtp.hpp +46 -0
  349. data/ext/boost/mpl/aux_/config/eti.hpp +47 -0
  350. data/ext/boost/mpl/aux_/config/gcc.hpp +23 -0
  351. data/ext/boost/mpl/aux_/config/has_apply.hpp +32 -0
  352. data/ext/boost/mpl/aux_/config/has_xxx.hpp +33 -0
  353. data/ext/boost/mpl/aux_/config/integral.hpp +38 -0
  354. data/ext/boost/mpl/aux_/config/intel.hpp +21 -0
  355. data/ext/boost/mpl/aux_/config/lambda.hpp +32 -0
  356. data/ext/boost/mpl/aux_/config/msvc.hpp +21 -0
  357. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +26 -0
  358. data/ext/boost/mpl/aux_/config/nttp.hpp +41 -0
  359. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +29 -0
  360. data/ext/boost/mpl/aux_/config/pp_counter.hpp +26 -0
  361. data/ext/boost/mpl/aux_/config/preprocessor.hpp +39 -0
  362. data/ext/boost/mpl/aux_/config/static_constant.hpp +25 -0
  363. data/ext/boost/mpl/aux_/config/ttp.hpp +41 -0
  364. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +19 -0
  365. data/ext/boost/mpl/aux_/config/workaround.hpp +19 -0
  366. data/ext/boost/mpl/aux_/full_lambda.hpp +350 -0
  367. data/ext/boost/mpl/aux_/has_apply.hpp +32 -0
  368. data/ext/boost/mpl/aux_/has_type.hpp +23 -0
  369. data/ext/boost/mpl/aux_/include_preprocessed.hpp +42 -0
  370. data/ext/boost/mpl/aux_/integral_wrapper.hpp +93 -0
  371. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +25 -0
  372. data/ext/boost/mpl/aux_/lambda_support.hpp +169 -0
  373. data/ext/boost/mpl/aux_/msvc_never_true.hpp +34 -0
  374. data/ext/boost/mpl/aux_/na.hpp +95 -0
  375. data/ext/boost/mpl/aux_/na_assert.hpp +34 -0
  376. data/ext/boost/mpl/aux_/na_fwd.hpp +31 -0
  377. data/ext/boost/mpl/aux_/na_spec.hpp +175 -0
  378. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +48 -0
  379. data/ext/boost/mpl/aux_/nttp_decl.hpp +35 -0
  380. data/ext/boost/mpl/aux_/preprocessed/gcc/and.hpp +69 -0
  381. data/ext/boost/mpl/aux_/preprocessed/gcc/apply.hpp +169 -0
  382. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp +52 -0
  383. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp +84 -0
  384. data/ext/boost/mpl/aux_/preprocessed/gcc/arg.hpp +123 -0
  385. data/ext/boost/mpl/aux_/preprocessed/gcc/bind.hpp +561 -0
  386. data/ext/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp +52 -0
  387. data/ext/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp +558 -0
  388. data/ext/boost/mpl/aux_/preprocessed/gcc/or.hpp +69 -0
  389. data/ext/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp +105 -0
  390. data/ext/boost/mpl/aux_/preprocessed/gcc/quote.hpp +123 -0
  391. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +101 -0
  392. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +105 -0
  393. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +62 -0
  394. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +28 -0
  395. data/ext/boost/mpl/aux_/preprocessor/params.hpp +65 -0
  396. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +65 -0
  397. data/ext/boost/mpl/aux_/static_cast.hpp +27 -0
  398. data/ext/boost/mpl/aux_/template_arity.hpp +189 -0
  399. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +23 -0
  400. data/ext/boost/mpl/aux_/type_wrapper.hpp +47 -0
  401. data/ext/boost/mpl/aux_/value_wknd.hpp +89 -0
  402. data/ext/boost/mpl/aux_/yes_no.hpp +58 -0
  403. data/ext/boost/mpl/bind.hpp +547 -0
  404. data/ext/boost/mpl/bind_fwd.hpp +99 -0
  405. data/ext/boost/mpl/bool.hpp +39 -0
  406. data/ext/boost/mpl/bool_fwd.hpp +33 -0
  407. data/ext/boost/mpl/eval_if.hpp +71 -0
  408. data/ext/boost/mpl/has_xxx.hpp +272 -0
  409. data/ext/boost/mpl/identity.hpp +45 -0
  410. data/ext/boost/mpl/if.hpp +135 -0
  411. data/ext/boost/mpl/int.hpp +22 -0
  412. data/ext/boost/mpl/int_fwd.hpp +27 -0
  413. data/ext/boost/mpl/integral_c.hpp +51 -0
  414. data/ext/boost/mpl/integral_c_fwd.hpp +32 -0
  415. data/ext/boost/mpl/integral_c_tag.hpp +26 -0
  416. data/ext/boost/mpl/lambda.hpp +29 -0
  417. data/ext/boost/mpl/lambda_fwd.hpp +57 -0
  418. data/ext/boost/mpl/limits/arity.hpp +21 -0
  419. data/ext/boost/mpl/logical.hpp +21 -0
  420. data/ext/boost/mpl/next.hpp +19 -0
  421. data/ext/boost/mpl/next_prior.hpp +49 -0
  422. data/ext/boost/mpl/not.hpp +51 -0
  423. data/ext/boost/mpl/or.hpp +61 -0
  424. data/ext/boost/mpl/placeholders.hpp +100 -0
  425. data/ext/boost/mpl/protect.hpp +55 -0
  426. data/ext/boost/mpl/quote.hpp +140 -0
  427. data/ext/boost/mpl/size_t.hpp +25 -0
  428. data/ext/boost/mpl/size_t_fwd.hpp +28 -0
  429. data/ext/boost/mpl/void.hpp +76 -0
  430. data/ext/boost/mpl/void_fwd.hpp +26 -0
  431. data/ext/boost/next_prior.hpp +51 -0
  432. data/ext/boost/non_type.hpp +27 -0
  433. data/ext/boost/noncopyable.hpp +36 -0
  434. data/ext/boost/none.hpp +28 -0
  435. data/ext/boost/none_t.hpp +24 -0
  436. data/ext/boost/operators.hpp +943 -0
  437. data/ext/boost/optional.hpp +18 -0
  438. data/ext/boost/optional/optional.hpp +922 -0
  439. data/ext/boost/optional/optional_fwd.hpp +22 -0
  440. data/ext/boost/preprocessor/arithmetic/add.hpp +51 -0
  441. data/ext/boost/preprocessor/arithmetic/dec.hpp +288 -0
  442. data/ext/boost/preprocessor/arithmetic/inc.hpp +288 -0
  443. data/ext/boost/preprocessor/arithmetic/sub.hpp +50 -0
  444. data/ext/boost/preprocessor/array/data.hpp +28 -0
  445. data/ext/boost/preprocessor/array/elem.hpp +29 -0
  446. data/ext/boost/preprocessor/array/size.hpp +28 -0
  447. data/ext/boost/preprocessor/cat.hpp +35 -0
  448. data/ext/boost/preprocessor/comma_if.hpp +17 -0
  449. data/ext/boost/preprocessor/config/config.hpp +70 -0
  450. data/ext/boost/preprocessor/control/detail/while.hpp +536 -0
  451. data/ext/boost/preprocessor/control/expr_iif.hpp +31 -0
  452. data/ext/boost/preprocessor/control/if.hpp +30 -0
  453. data/ext/boost/preprocessor/control/iif.hpp +34 -0
  454. data/ext/boost/preprocessor/control/while.hpp +312 -0
  455. data/ext/boost/preprocessor/debug/error.hpp +33 -0
  456. data/ext/boost/preprocessor/detail/auto_rec.hpp +293 -0
  457. data/ext/boost/preprocessor/detail/check.hpp +48 -0
  458. data/ext/boost/preprocessor/detail/is_binary.hpp +30 -0
  459. data/ext/boost/preprocessor/empty.hpp +17 -0
  460. data/ext/boost/preprocessor/enum.hpp +17 -0
  461. data/ext/boost/preprocessor/enum_params.hpp +17 -0
  462. data/ext/boost/preprocessor/facilities/empty.hpp +21 -0
  463. data/ext/boost/preprocessor/facilities/identity.hpp +23 -0
  464. data/ext/boost/preprocessor/identity.hpp +17 -0
  465. data/ext/boost/preprocessor/inc.hpp +17 -0
  466. data/ext/boost/preprocessor/iterate.hpp +17 -0
  467. data/ext/boost/preprocessor/iteration/detail/bounds/lower1.hpp +99 -0
  468. data/ext/boost/preprocessor/iteration/detail/bounds/upper1.hpp +99 -0
  469. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +1342 -0
  470. data/ext/boost/preprocessor/iteration/iterate.hpp +82 -0
  471. data/ext/boost/preprocessor/list/adt.hpp +73 -0
  472. data/ext/boost/preprocessor/list/append.hpp +40 -0
  473. data/ext/boost/preprocessor/list/detail/fold_left.hpp +279 -0
  474. data/ext/boost/preprocessor/list/detail/fold_right.hpp +277 -0
  475. data/ext/boost/preprocessor/list/fold_left.hpp +303 -0
  476. data/ext/boost/preprocessor/list/fold_right.hpp +40 -0
  477. data/ext/boost/preprocessor/list/for_each_i.hpp +65 -0
  478. data/ext/boost/preprocessor/list/reverse.hpp +40 -0
  479. data/ext/boost/preprocessor/list/transform.hpp +49 -0
  480. data/ext/boost/preprocessor/logical/and.hpp +30 -0
  481. data/ext/boost/preprocessor/logical/bitand.hpp +38 -0
  482. data/ext/boost/preprocessor/logical/bool.hpp +288 -0
  483. data/ext/boost/preprocessor/logical/compl.hpp +36 -0
  484. data/ext/boost/preprocessor/punctuation/comma.hpp +21 -0
  485. data/ext/boost/preprocessor/punctuation/comma_if.hpp +31 -0
  486. data/ext/boost/preprocessor/repeat.hpp +17 -0
  487. data/ext/boost/preprocessor/repetition/detail/for.hpp +536 -0
  488. data/ext/boost/preprocessor/repetition/enum.hpp +66 -0
  489. data/ext/boost/preprocessor/repetition/enum_binary_params.hpp +54 -0
  490. data/ext/boost/preprocessor/repetition/enum_params.hpp +41 -0
  491. data/ext/boost/preprocessor/repetition/for.hpp +306 -0
  492. data/ext/boost/preprocessor/repetition/repeat.hpp +825 -0
  493. data/ext/boost/preprocessor/repetition/repeat_from_to.hpp +87 -0
  494. data/ext/boost/preprocessor/seq/elem.hpp +304 -0
  495. data/ext/boost/preprocessor/seq/enum.hpp +288 -0
  496. data/ext/boost/preprocessor/seq/for_each_i.hpp +61 -0
  497. data/ext/boost/preprocessor/seq/seq.hpp +44 -0
  498. data/ext/boost/preprocessor/seq/size.hpp +548 -0
  499. data/ext/boost/preprocessor/slot/detail/def.hpp +49 -0
  500. data/ext/boost/preprocessor/slot/detail/shared.hpp +247 -0
  501. data/ext/boost/preprocessor/slot/slot.hpp +32 -0
  502. data/ext/boost/preprocessor/stringize.hpp +33 -0
  503. data/ext/boost/preprocessor/tuple/eat.hpp +57 -0
  504. data/ext/boost/preprocessor/tuple/elem.hpp +385 -0
  505. data/ext/boost/preprocessor/tuple/rem.hpp +72 -0
  506. data/ext/boost/preprocessor/tuple/to_list.hpp +62 -0
  507. data/ext/boost/range/as_literal.hpp +131 -0
  508. data/ext/boost/range/begin.hpp +132 -0
  509. data/ext/boost/range/config.hpp +54 -0
  510. data/ext/boost/range/const_iterator.hpp +64 -0
  511. data/ext/boost/range/detail/common.hpp +117 -0
  512. data/ext/boost/range/detail/implementation_help.hpp +99 -0
  513. data/ext/boost/range/detail/sfinae.hpp +77 -0
  514. data/ext/boost/range/detail/str_types.hpp +38 -0
  515. data/ext/boost/range/difference_type.hpp +29 -0
  516. data/ext/boost/range/distance.hpp +34 -0
  517. data/ext/boost/range/empty.hpp +34 -0
  518. data/ext/boost/range/end.hpp +131 -0
  519. data/ext/boost/range/functions.hpp +27 -0
  520. data/ext/boost/range/iterator.hpp +72 -0
  521. data/ext/boost/range/iterator_range.hpp +643 -0
  522. data/ext/boost/range/mutable_iterator.hpp +64 -0
  523. data/ext/boost/range/rbegin.hpp +65 -0
  524. data/ext/boost/range/rend.hpp +65 -0
  525. data/ext/boost/range/reverse_iterator.hpp +40 -0
  526. data/ext/boost/range/size.hpp +36 -0
  527. data/ext/boost/range/size_type.hpp +78 -0
  528. data/ext/boost/range/value_type.hpp +34 -0
  529. data/ext/boost/ref.hpp +178 -0
  530. data/ext/boost/shared_ptr.hpp +619 -0
  531. data/ext/boost/src/pthread/exceptions.cpp +146 -0
  532. data/ext/boost/src/pthread/once.cpp +51 -0
  533. data/ext/boost/src/pthread/thread.cpp +709 -0
  534. data/ext/boost/src/pthread/timeconv.inl +130 -0
  535. data/ext/boost/src/tss_null.cpp +34 -0
  536. data/ext/boost/src/win32/exceptions.cpp +124 -0
  537. data/ext/boost/src/win32/thread.cpp +629 -0
  538. data/ext/boost/src/win32/timeconv.inl +130 -0
  539. data/ext/boost/src/win32/tss_dll.cpp +72 -0
  540. data/ext/boost/src/win32/tss_pe.cpp +269 -0
  541. data/ext/boost/static_assert.hpp +122 -0
  542. data/ext/boost/thread.hpp +21 -0
  543. data/ext/boost/thread/condition.hpp +16 -0
  544. data/ext/boost/thread/condition_variable.hpp +21 -0
  545. data/ext/boost/thread/detail/config.hpp +94 -0
  546. data/ext/boost/thread/detail/move.hpp +33 -0
  547. data/ext/boost/thread/detail/platform.hpp +71 -0
  548. data/ext/boost/thread/exceptions.hpp +109 -0
  549. data/ext/boost/thread/locks.hpp +589 -0
  550. data/ext/boost/thread/mutex.hpp +21 -0
  551. data/ext/boost/thread/once.hpp +29 -0
  552. data/ext/boost/thread/pthread/condition_variable.hpp +184 -0
  553. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +66 -0
  554. data/ext/boost/thread/pthread/mutex.hpp +211 -0
  555. data/ext/boost/thread/pthread/once.hpp +85 -0
  556. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +50 -0
  557. data/ext/boost/thread/pthread/recursive_mutex.hpp +249 -0
  558. data/ext/boost/thread/pthread/thread.hpp +339 -0
  559. data/ext/boost/thread/pthread/thread_data.hpp +102 -0
  560. data/ext/boost/thread/pthread/timespec.hpp +28 -0
  561. data/ext/boost/thread/pthread/tss.hpp +103 -0
  562. data/ext/boost/thread/recursive_mutex.hpp +21 -0
  563. data/ext/boost/thread/thread.hpp +22 -0
  564. data/ext/boost/thread/thread_time.hpp +46 -0
  565. data/ext/boost/thread/tss.hpp +18 -0
  566. data/ext/boost/thread/xtime.hpp +88 -0
  567. data/ext/boost/throw_exception.hpp +46 -0
  568. data/ext/boost/token_functions.hpp +621 -0
  569. data/ext/boost/token_iterator.hpp +128 -0
  570. data/ext/boost/tokenizer.hpp +98 -0
  571. data/ext/boost/type.hpp +18 -0
  572. data/ext/boost/type_traits/add_const.hpp +47 -0
  573. data/ext/boost/type_traits/add_pointer.hpp +72 -0
  574. data/ext/boost/type_traits/add_reference.hpp +89 -0
  575. data/ext/boost/type_traits/alignment_of.hpp +100 -0
  576. data/ext/boost/type_traits/broken_compiler_spec.hpp +117 -0
  577. data/ext/boost/type_traits/composite_traits.hpp +29 -0
  578. data/ext/boost/type_traits/config.hpp +76 -0
  579. data/ext/boost/type_traits/conversion_traits.hpp +17 -0
  580. data/ext/boost/type_traits/detail/bool_trait_def.hpp +173 -0
  581. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +27 -0
  582. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +97 -0
  583. data/ext/boost/type_traits/detail/false_result.hpp +28 -0
  584. data/ext/boost/type_traits/detail/ice_and.hpp +35 -0
  585. data/ext/boost/type_traits/detail/ice_eq.hpp +36 -0
  586. data/ext/boost/type_traits/detail/ice_not.hpp +31 -0
  587. data/ext/boost/type_traits/detail/ice_or.hpp +34 -0
  588. data/ext/boost/type_traits/detail/is_function_ptr_helper.hpp +220 -0
  589. data/ext/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +817 -0
  590. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +58 -0
  591. data/ext/boost/type_traits/detail/size_t_trait_undef.hpp +16 -0
  592. data/ext/boost/type_traits/detail/template_arity_spec.hpp +31 -0
  593. data/ext/boost/type_traits/detail/type_trait_def.hpp +61 -0
  594. data/ext/boost/type_traits/detail/type_trait_undef.hpp +19 -0
  595. data/ext/boost/type_traits/detail/yes_no_type.hpp +26 -0
  596. data/ext/boost/type_traits/function_traits.hpp +236 -0
  597. data/ext/boost/type_traits/has_nothrow_copy.hpp +39 -0
  598. data/ext/boost/type_traits/has_trivial_copy.hpp +49 -0
  599. data/ext/boost/type_traits/ice.hpp +20 -0
  600. data/ext/boost/type_traits/integral_constant.hpp +53 -0
  601. data/ext/boost/type_traits/intrinsics.hpp +153 -0
  602. data/ext/boost/type_traits/is_abstract.hpp +144 -0
  603. data/ext/boost/type_traits/is_arithmetic.hpp +43 -0
  604. data/ext/boost/type_traits/is_array.hpp +90 -0
  605. data/ext/boost/type_traits/is_class.hpp +128 -0
  606. data/ext/boost/type_traits/is_const.hpp +142 -0
  607. data/ext/boost/type_traits/is_convertible.hpp +418 -0
  608. data/ext/boost/type_traits/is_enum.hpp +180 -0
  609. data/ext/boost/type_traits/is_float.hpp +27 -0
  610. data/ext/boost/type_traits/is_function.hpp +95 -0
  611. data/ext/boost/type_traits/is_integral.hpp +73 -0
  612. data/ext/boost/type_traits/is_member_function_pointer.hpp +134 -0
  613. data/ext/boost/type_traits/is_member_pointer.hpp +114 -0
  614. data/ext/boost/type_traits/is_pod.hpp +135 -0
  615. data/ext/boost/type_traits/is_pointer.hpp +160 -0
  616. data/ext/boost/type_traits/is_reference.hpp +116 -0
  617. data/ext/boost/type_traits/is_same.hpp +103 -0
  618. data/ext/boost/type_traits/is_scalar.hpp +55 -0
  619. data/ext/boost/type_traits/is_union.hpp +49 -0
  620. data/ext/boost/type_traits/is_void.hpp +33 -0
  621. data/ext/boost/type_traits/is_volatile.hpp +131 -0
  622. data/ext/boost/type_traits/remove_const.hpp +78 -0
  623. data/ext/boost/type_traits/remove_cv.hpp +61 -0
  624. data/ext/boost/type_traits/remove_pointer.hpp +43 -0
  625. data/ext/boost/type_traits/remove_reference.hpp +50 -0
  626. data/ext/boost/type_traits/type_with_alignment.hpp +288 -0
  627. data/ext/boost/utility.hpp +19 -0
  628. data/ext/boost/utility/addressof.hpp +58 -0
  629. data/ext/boost/utility/base_from_member.hpp +87 -0
  630. data/ext/boost/utility/compare_pointees.hpp +68 -0
  631. data/ext/boost/utility/enable_if.hpp +119 -0
  632. data/ext/boost/visit_each.hpp +29 -0
  633. data/ext/boost/weak_ptr.hpp +188 -0
  634. data/lib/rake/cplusplus.rb +43 -0
  635. data/lib/rake/extensions.rb +175 -0
  636. data/lib/rake/gempackagetask.rb +99 -0
  637. data/lib/rake/packagetask.rb +186 -0
  638. data/lib/rake/rdoctask.rb +209 -0
  639. data/man/passenger-config.1 +29 -0
  640. data/man/passenger-make-enterprisey.8 +23 -0
  641. data/man/passenger-memory-stats.8 +33 -0
  642. data/man/passenger-status.8 +43 -0
  643. data/man/passenger-stress-test.1 +43 -0
  644. data/misc/copy_boost_headers.rb +102 -0
  645. data/misc/find_owner_pipe_leaks.rb +121 -0
  646. data/misc/render_error_pages.rb +108 -0
  647. data/test/ApplicationPoolServerTest.cpp +74 -0
  648. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +31 -0
  649. data/test/ApplicationPoolTest.cpp +634 -0
  650. data/test/CxxTestMain.cpp +25 -0
  651. data/test/MessageChannelTest.cpp +312 -0
  652. data/test/SpawnManagerTest.cpp +64 -0
  653. data/test/StandardApplicationPoolTest.cpp +25 -0
  654. data/test/UtilsTest.cpp +238 -0
  655. data/test/config.yml.example +21 -0
  656. data/test/integration_tests.rb +791 -0
  657. data/test/ruby/abstract_server_spec.rb +17 -0
  658. data/test/ruby/application_spec.rb +43 -0
  659. data/test/ruby/message_channel_spec.rb +170 -0
  660. data/test/ruby/rack/application_spawner_spec.rb +41 -0
  661. data/test/ruby/rails/application_spawner_spec.rb +148 -0
  662. data/test/ruby/rails/framework_spawner_spec.rb +130 -0
  663. data/test/ruby/rails/minimal_spawner_spec.rb +74 -0
  664. data/test/ruby/rails/spawner_error_handling_spec.rb +52 -0
  665. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +97 -0
  666. data/test/ruby/spawn_manager_spec.rb +189 -0
  667. data/test/ruby/spawn_server_spec.rb +26 -0
  668. data/test/ruby/utils_spec.rb +67 -0
  669. data/test/stub/apache2/httpd.conf.erb +79 -0
  670. data/test/stub/apache2/mime.types +748 -0
  671. data/test/stub/garbage1.dat +0 -0
  672. data/test/stub/garbage2.dat +0 -0
  673. data/test/stub/garbage3.dat +0 -0
  674. data/test/stub/http_request.yml +23 -0
  675. data/test/stub/message_channel.rb +9 -0
  676. data/test/stub/message_channel_2.rb +10 -0
  677. data/test/stub/message_channel_3.rb +17 -0
  678. data/test/stub/minimal-railsapp/README +3 -0
  679. data/test/stub/minimal-railsapp/config/application.rb +0 -0
  680. data/test/stub/minimal-railsapp/config/environment.rb +3 -0
  681. data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
  682. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +10 -0
  683. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
  684. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
  685. data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +7 -0
  686. data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
  687. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +17 -0
  688. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
  689. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
  690. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +8 -0
  691. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +1 -0
  692. data/test/stub/rack/config.ru +4 -0
  693. data/test/stub/rack/public/rack.jpg +0 -0
  694. data/test/stub/rails_apps/foobar/app/controllers/application.rb +12 -0
  695. data/test/stub/rails_apps/foobar/app/controllers/bar_controller_1.rb +5 -0
  696. data/test/stub/rails_apps/foobar/app/controllers/bar_controller_2.rb +5 -0
  697. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +21 -0
  698. data/test/stub/rails_apps/foobar/app/helpers/application_helper.rb +3 -0
  699. data/test/stub/rails_apps/foobar/config/boot.rb +108 -0
  700. data/test/stub/rails_apps/foobar/config/database.yml +19 -0
  701. data/test/stub/rails_apps/foobar/config/environment.rb +59 -0
  702. data/test/stub/rails_apps/foobar/config/environments/development.rb +17 -0
  703. data/test/stub/rails_apps/foobar/config/environments/production.rb +18 -0
  704. data/test/stub/rails_apps/foobar/config/initializers/inflections.rb +10 -0
  705. data/test/stub/rails_apps/foobar/config/initializers/mime_types.rb +5 -0
  706. data/test/stub/rails_apps/foobar/config/routes.rb +35 -0
  707. data/test/stub/rails_apps/mycook/app/controllers/application.rb +12 -0
  708. data/test/stub/rails_apps/mycook/app/controllers/recipes_controller.rb +5 -0
  709. data/test/stub/rails_apps/mycook/app/controllers/uploads_controller.rb +11 -0
  710. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +55 -0
  711. data/test/stub/rails_apps/mycook/app/helpers/application_helper.rb +3 -0
  712. data/test/stub/rails_apps/mycook/app/views/layouts/default.rhtml +26 -0
  713. data/test/stub/rails_apps/mycook/app/views/recipes/create.rhtml +13 -0
  714. data/test/stub/rails_apps/mycook/app/views/recipes/index.rhtml +3 -0
  715. data/test/stub/rails_apps/mycook/app/views/recipes/new.rhtml +8 -0
  716. data/test/stub/rails_apps/mycook/app/views/uploads/index.rhtml +1 -0
  717. data/test/stub/rails_apps/mycook/app/views/uploads/new.html.erb +8 -0
  718. data/test/stub/rails_apps/mycook/app/views/welcome/cached.rhtml +1 -0
  719. data/test/stub/rails_apps/mycook/app/views/welcome/index.rhtml +20 -0
  720. data/test/stub/rails_apps/mycook/config/boot.rb +108 -0
  721. data/test/stub/rails_apps/mycook/config/database.yml +19 -0
  722. data/test/stub/rails_apps/mycook/config/environment.rb +61 -0
  723. data/test/stub/rails_apps/mycook/config/environments/development.rb +18 -0
  724. data/test/stub/rails_apps/mycook/config/environments/production.rb +19 -0
  725. data/test/stub/rails_apps/mycook/config/initializers/inflections.rb +10 -0
  726. data/test/stub/rails_apps/mycook/config/initializers/mime_types.rb +5 -0
  727. data/test/stub/rails_apps/mycook/config/routes.rb +38 -0
  728. data/test/stub/rails_apps/mycook/log/useless.txt +1 -0
  729. data/test/stub/rails_apps/mycook/public/404.html +30 -0
  730. data/test/stub/rails_apps/mycook/public/422.html +30 -0
  731. data/test/stub/rails_apps/mycook/public/500.html +30 -0
  732. data/test/stub/rails_apps/mycook/public/dispatch.cgi +10 -0
  733. data/test/stub/rails_apps/mycook/public/dispatch.fcgi +24 -0
  734. data/test/stub/rails_apps/mycook/public/dispatch.rb +10 -0
  735. data/test/stub/rails_apps/mycook/public/favicon.ico +0 -0
  736. data/test/stub/rails_apps/mycook/public/images/angrywizard.gif +0 -0
  737. data/test/stub/rails_apps/mycook/public/images/cookbook.gif +0 -0
  738. data/test/stub/rails_apps/mycook/public/images/header.png +0 -0
  739. data/test/stub/rails_apps/mycook/public/images/rails.png +0 -0
  740. data/test/stub/rails_apps/mycook/public/javascripts/application.js +2 -0
  741. data/test/stub/rails_apps/mycook/public/javascripts/controls.js +963 -0
  742. data/test/stub/rails_apps/mycook/public/javascripts/dragdrop.js +972 -0
  743. data/test/stub/rails_apps/mycook/public/javascripts/effects.js +1120 -0
  744. data/test/stub/rails_apps/mycook/public/javascripts/prototype.js +4225 -0
  745. data/test/stub/rails_apps/mycook/public/robots.txt +5 -0
  746. data/test/stub/rails_apps/mycook/public/uploads.html +26 -0
  747. data/test/stub/rails_apps/mycook/public/welcome/cached.html +26 -0
  748. data/test/stub/rails_apps/mycook/tmp/cache/useless.txt +1 -0
  749. data/test/stub/rails_apps/mycook/tmp/pids/useless.txt +1 -0
  750. data/test/stub/rails_apps/mycook/tmp/sessions/useless.txt +1 -0
  751. data/test/stub/rails_apps/mycook/tmp/sockets/useless.txt +1 -0
  752. data/test/stub/railsapp/app/controllers/application.rb +12 -0
  753. data/test/stub/railsapp/app/controllers/bar_controller_1.rb +5 -0
  754. data/test/stub/railsapp/app/controllers/bar_controller_2.rb +5 -0
  755. data/test/stub/railsapp/app/controllers/foo_controller.rb +9 -0
  756. data/test/stub/railsapp/app/helpers/application_helper.rb +3 -0
  757. data/test/stub/railsapp/config/boot.rb +108 -0
  758. data/test/stub/railsapp/config/database.yml +19 -0
  759. data/test/stub/railsapp/config/environment.rb +59 -0
  760. data/test/stub/railsapp/config/environments/development.rb +18 -0
  761. data/test/stub/railsapp/config/environments/production.rb +19 -0
  762. data/test/stub/railsapp/config/initializers/inflections.rb +10 -0
  763. data/test/stub/railsapp/config/initializers/mime_types.rb +5 -0
  764. data/test/stub/railsapp/config/routes.rb +35 -0
  765. data/test/stub/railsapp/public/useless.txt +1 -0
  766. data/test/stub/railsapp2/app/controllers/application.rb +12 -0
  767. data/test/stub/railsapp2/app/controllers/foo_controller.rb +5 -0
  768. data/test/stub/railsapp2/app/helpers/application_helper.rb +3 -0
  769. data/test/stub/railsapp2/config/boot.rb +108 -0
  770. data/test/stub/railsapp2/config/database.yml +19 -0
  771. data/test/stub/railsapp2/config/environment.rb +59 -0
  772. data/test/stub/railsapp2/config/environments/development.rb +18 -0
  773. data/test/stub/railsapp2/config/environments/production.rb +19 -0
  774. data/test/stub/railsapp2/config/initializers/inflections.rb +10 -0
  775. data/test/stub/railsapp2/config/initializers/mime_types.rb +5 -0
  776. data/test/stub/railsapp2/config/routes.rb +35 -0
  777. data/test/stub/railsapp2/public/useless.txt +1 -0
  778. data/test/stub/spawn_server.rb +20 -0
  779. data/test/stub/upload_data.txt +494 -0
  780. data/test/stub/vendor_rails/minimal/README +1 -0
  781. data/test/stub/vendor_rails/minimal/actionmailer/lib/action_mailer.rb +0 -0
  782. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +19 -0
  783. data/test/stub/vendor_rails/minimal/actionpack/lib/action_pack.rb +0 -0
  784. data/test/stub/vendor_rails/minimal/actionpack/lib/action_view.rb +0 -0
  785. data/test/stub/vendor_rails/minimal/activerecord/lib/active_record.rb +7 -0
  786. data/test/stub/vendor_rails/minimal/activeresource/lib/active_resource.rb +0 -0
  787. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support.rb +17 -0
  788. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support/whiny_nil.rb +0 -0
  789. data/test/stub/vendor_rails/minimal/railties/lib/dispatcher.rb +0 -0
  790. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +52 -0
  791. data/test/stub/vendor_rails/minimal/railties/lib/ruby_version_check.rb +1 -0
  792. data/test/stub/wsgi/passenger_wsgi.py +3 -0
  793. data/test/stub/wsgi/public/wsgi-snake.jpg +0 -0
  794. data/test/stub/zsfa/header.png +0 -0
  795. data/test/stub/zsfa/index.html +14 -0
  796. data/test/stub/zsfa/zsfa.png +0 -0
  797. data/test/support/apache2_controller.rb +246 -0
  798. data/test/support/config.rb +13 -0
  799. data/test/support/multipart.rb +62 -0
  800. data/test/support/run_rspec_tests.rb +10 -0
  801. data/test/support/test_helper.rb +94 -0
  802. data/test/support/tut.h +1234 -0
  803. data/test/support/tut_reporter.h +256 -0
  804. data/test/support/valgrind.h +2539 -0
  805. metadata +1342 -0
@@ -0,0 +1,339 @@
1
+ #!/usr/bin/env ruby
2
+ # Phusion Passenger - http://www.modrails.com/
3
+ # Copyright (C) 2008 Phusion
4
+ #
5
+ # Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation; version 2 of the License.
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License along
17
+ # with this program; if not, write to the Free Software Foundation, Inc.,
18
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
+
20
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + "/../lib")
21
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + "/../ext")
22
+ require 'rubygems'
23
+ require 'optparse'
24
+ require 'socket'
25
+ require 'thread'
26
+ require 'phusion_passenger/platform_info'
27
+ require 'phusion_passenger/message_channel'
28
+ require 'phusion_passenger/utils'
29
+
30
+ include PhusionPassenger
31
+ include PhusionPassenger::Utils
32
+ include PlatformInfo
33
+
34
+ # A thread or a process, depending on the Ruby VM implementation.
35
+ class Subprocess
36
+ attr_accessor :channel
37
+
38
+ def initialize(name, &block)
39
+ if RUBY_PLATFORM == "java"
40
+ a, b = UNIXSocket.pair
41
+ @thread = Thread.new do
42
+ block.call(true, MessageChannel.new(b))
43
+ end
44
+ @channel = MessageChannel.new(a)
45
+ @thread_channel = b
46
+ else
47
+ a, b = UNIXSocket.pair
48
+ @pid = safe_fork(name) do
49
+ a.close
50
+ $0 = name
51
+ Process.setsid
52
+ block.call(false, MessageChannel.new(b))
53
+ end
54
+ b.close
55
+ @channel = MessageChannel.new(a)
56
+ end
57
+ end
58
+
59
+ def stop
60
+ if RUBY_PLATFORM == "java"
61
+ @thread.terminate
62
+ @channel.close
63
+ @thread_channel.close
64
+ else
65
+ Process.kill('SIGKILL', @pid) rescue nil
66
+ Process.waitpid(@pid) rescue nil
67
+ @channel.close
68
+ end
69
+ end
70
+ end
71
+
72
+ class StressTester
73
+ def start
74
+ @options = parse_options
75
+ load_hawler
76
+
77
+ Thread.abort_on_exception = true
78
+ if GC.respond_to?(:copy_on_write_friendly=)
79
+ GC.copy_on_write_friendly = true
80
+ end
81
+ @terminal_height = ENV['LINES'] ? ENV['LINES'].to_i : 24
82
+ @terminal_width = ENV['COLUMNS'] ? ENV['COLUMNS'].to_i : 80
83
+
84
+ if Process.euid != 0
85
+ puts "*** WARNING: This program might not be able to restart " <<
86
+ "Apache because it's not running as root. Please run " <<
87
+ "this tool as root."
88
+ puts
89
+ puts "Press Enter to continue..."
90
+ begin
91
+ STDIN.readline
92
+ rescue Interrupt
93
+ exit 1
94
+ end
95
+ end
96
+
97
+ run_crawlers
98
+ end
99
+
100
+ def parse_options
101
+ options = {
102
+ :concurrency => 20,
103
+ :depth => 20,
104
+ :nice => true,
105
+ :apache_restart_interval => 24 * 60,
106
+ :app_restart_interval => 55
107
+ }
108
+ parser = OptionParser.new do |opts|
109
+ opts.banner = "Usage: passenger-stress-test <hostname> <app_root> [options]\n\n" <<
110
+ "Stress test the given (Passenger-powered) website by:\n" <<
111
+ " * crawling it with multiple concurrently running crawlers.\n" <<
112
+ " * gracefully restarting Apache at random times (please point the 'APXS2'\n" <<
113
+ " variable to your Apache's 'apxs' binary).\n" <<
114
+ " * restarting the target (Passenger-powered) application at random time.\n" <<
115
+ "\n" <<
116
+ "Example:\n" <<
117
+ " passenger-stress-test mywebsite.com /webapps/mywebsite\n" <<
118
+ "\n"
119
+
120
+ opts.separator "Options:"
121
+ opts.on("-c", "--concurrency N", Integer,
122
+ "Number of crawlers to start (default = #{options[:concurrency]})") do |v|
123
+ options[:concurrency] = v
124
+ end
125
+ opts.on("-p", "--apache-restart-interval N", Integer,
126
+ "Gracefully restart Apache after N minutes\n" <<
127
+ (" " * 37) << "(default = #{options[:apache_restart_interval]})") do |v|
128
+ options[:apache_restart_interval] = v
129
+ end
130
+ opts.on("-a", "--app-restart-interval N", Integer,
131
+ "Restart the application after N minutes\n" <<
132
+ (" " * 37) << "(default = #{options[:app_restart_interval]})") do |v|
133
+ options[:app_restart_interval] = v
134
+ end
135
+ opts.on("-h", "--help", "Show this message") do
136
+ puts opts
137
+ exit
138
+ end
139
+ end
140
+ parser.parse!
141
+
142
+ options[:host] = ARGV[0]
143
+ options[:app_root] = ARGV[1]
144
+ if !options[:host] || !options[:app_root]
145
+ puts parser
146
+ exit 1
147
+ end
148
+ return options
149
+ end
150
+
151
+ def load_hawler
152
+ begin
153
+ require 'hawler'
154
+ rescue LoadError
155
+ STDERR.puts "This tool requires Hawler (http://tinyurl.com/ywgk6x). Please install it with:"
156
+ STDERR.puts
157
+ STDERR.puts " gem install --source http://spoofed.org/files/hawler/ hawler"
158
+ exit 1
159
+ end
160
+ end
161
+
162
+ def run_crawlers
163
+ @started = false
164
+ @crawlers = []
165
+
166
+ # Start crawler processes.
167
+ GC.start if GC.copy_on_write_friendly?
168
+ @options[:concurrency].times do |i|
169
+ STDOUT.write("Starting crawler #{i + 1} of #{@options[:concurrency]}...\n")
170
+ STDOUT.flush
171
+ process = Subprocess.new("crawler #{i + 1}") do |is_thread, channel|
172
+ if !is_thread && @options[:nice]
173
+ system("renice 1 #{Process.pid} >/dev/null 2>/dev/null")
174
+ end
175
+ while true
176
+ crawl!(i + 1, channel)
177
+ end
178
+ end
179
+ @crawlers << {
180
+ :id => i + 1,
181
+ :process => process,
182
+ :channel => process.channel,
183
+ :mutex => Mutex.new,
184
+ :current_uri => nil,
185
+ :crawled => 0
186
+ }
187
+ end
188
+
189
+ puts
190
+ if RUBY_PLATFORM != "java"
191
+ # 'sleep' b0rks when running in JRuby?
192
+ sleep 1
193
+ end
194
+ begin
195
+ $0 = "Passenger Crawler: control process"
196
+ io_to_crawler = {}
197
+ ios = []
198
+ @crawlers.each do |crawler|
199
+ io_to_crawler[crawler[:channel].io] = crawler
200
+ ios << crawler[:channel].io
201
+ end
202
+
203
+ # Tell each crawler to start crawling.
204
+ @crawlers.each do |crawler|
205
+ crawler[:channel].write("start")
206
+ end
207
+
208
+ # Show progress periodically.
209
+ @start_time = Time.now
210
+ progress_reporter = Thread.new(&method(:report_progress))
211
+ @next_apache_restart = Time.now + @options[:apache_restart_interval] * 60
212
+ apache_restarter = Thread.new(&method(:restart_apache))
213
+ @next_app_restart = Time.now + @options[:app_restart_interval] * 60
214
+ app_restarter = Thread.new(&method(:restart_app))
215
+
216
+ while true
217
+ note_progress(ios, io_to_crawler)
218
+ end
219
+ rescue Interrupt
220
+ trap('SIGINT') {}
221
+ puts "Shutting down..."
222
+ @done = true
223
+ @crawlers.each do |crawler|
224
+ STDOUT.write("Stopping crawler #{crawler[:id]} of #{@options[:concurrency]}...\r")
225
+ STDOUT.flush
226
+ crawler[:process].stop
227
+ end
228
+ progress_reporter.join if progress_reporter
229
+ apache_restarter.join if apache_restarter
230
+ app_restarter.join if app_restarter
231
+ puts
232
+ end
233
+ end
234
+
235
+ def note_progress(ios, io_to_crawler)
236
+ select(ios)[0].each do |io|
237
+ crawler = io_to_crawler[io]
238
+ uri = crawler[:channel].read[0]
239
+ crawler[:mutex].synchronize do
240
+ crawler[:current_uri] = uri
241
+ crawler[:crawled] += 1
242
+ end
243
+ end
244
+ end
245
+
246
+ def report_progress
247
+ while !@done
248
+ output = "\n" * @terminal_height
249
+ output << "### Running for #{duration(Time.now.to_i - @start_time.to_i)}\n"
250
+ @crawlers.each do |crawler|
251
+ crawler[:mutex].synchronize do
252
+ line = sprintf("Crawler %-2d: %-3d -> %s",
253
+ crawler[:id],
254
+ crawler[:crawled],
255
+ crawler[:current_uri])
256
+ output << sprintf("%-#{@terminal_width}s\n", line)
257
+ end
258
+ end
259
+ output << "Next Apache restart: in #{duration(@next_apache_restart.to_i - Time.now.to_i)}\n"
260
+ output << "Next app restart : in #{duration(@next_app_restart.to_i - Time.now.to_i)}\n"
261
+ STDOUT.write(output)
262
+ sleep 0.5
263
+ end
264
+ end
265
+
266
+ def restart_apache
267
+ while !@done
268
+ if Time.now > @next_apache_restart
269
+ @next_apache_restart = Time.now + @options[:apache_restart_interval] * 60
270
+ system("#{HTTPD} -k graceful")
271
+ end
272
+ end
273
+ end
274
+
275
+ def restart_app
276
+ while !@done
277
+ if Time.now > @next_app_restart
278
+ @next_app_restart = Time.now + @options[:app_restart_interval] * 60
279
+ system("touch #{@options[:app_root]}/tmp/restart.txt")
280
+ end
281
+ end
282
+ end
283
+
284
+ def duration(seconds)
285
+ result = ""
286
+ if seconds >= 60
287
+ minutes = (seconds / 60)
288
+ if minutes >= 60
289
+ hours = minutes / 60
290
+ minutes = minutes % 60
291
+ if hours == 1
292
+ result << "#{hours} hour "
293
+ else
294
+ result << "#{hours} hours "
295
+ end
296
+ end
297
+
298
+ seconds = seconds % 60
299
+ if minutes == 1
300
+ result << "#{minutes} minute "
301
+ else
302
+ result << "#{minutes} minutes "
303
+ end
304
+ end
305
+ result << "#{seconds} seconds"
306
+ return result
307
+ end
308
+
309
+ def crawl!(id, channel)
310
+ progress_reporter = lambda do |uri, referer, response|
311
+ begin
312
+ if !@started
313
+ # At the beginning, wait until the control process
314
+ # tells us to start.
315
+ @started = true
316
+ channel.read
317
+ end
318
+ channel.write(uri, referer, response)
319
+ rescue
320
+ if RUBY_PLATFORM == "java"
321
+ Thread.current.terminate
322
+ else
323
+ Process.kill('SIGKILL', Process.pid)
324
+ end
325
+ end
326
+ end
327
+ crawler = Hawler.new(@options[:host], progress_reporter)
328
+ if RUBY_PLATFORM == "java"
329
+ trap('SIGINT') do
330
+ raise Interrupt, "Interrupted"
331
+ end
332
+ end
333
+ crawler.recurse = true
334
+ crawler.depth = @options[:depth]
335
+ crawler.start
336
+ end
337
+ end
338
+
339
+ StressTester.new.start
@@ -0,0 +1 @@
1
+ 5
@@ -0,0 +1,21 @@
1
+ Package: passenger
2
+ Version: 1.1.0
3
+ Section: net
4
+ Priority: optional
5
+ Architecture: any
6
+ Essential: no
7
+ Depends:
8
+ Pre-Depends:
9
+ XSB-Comment: We put dependencies in Recommends because a lot of people
10
+ have Ruby/RubyGems/Apache installed from source instead of from apt.
11
+ Recommends: ruby1.8, rubygems, apache2
12
+ Suggests:
13
+ Maintainer: Hongli Lai <hongli@phusion.nl>
14
+ Conflicts:
15
+ Replaces:
16
+ Provides:
17
+ Installed-Size: 1741
18
+ Description: Phusion Passenger, Ruby web application deployment module for Apache.
19
+ Phusion Passenger makes deploying Ruby and Ruby on Rails web applications on Apache
20
+ a breeze. Please don't forget to run 'passenger-install-apache2-module' after the
21
+ installation.
@@ -0,0 +1,24 @@
1
+ #!/bin/sh
2
+ if ruby -e ''; then
3
+ if ! ruby -rpassenger/native_support -e '' 2>/dev/null; then
4
+ export RUBYLIB=/usr/lib/ruby/1.8
5
+ fi
6
+ passenger-install-apache2-module
7
+ if ! ruby -rubygems -rfastthread -e '' 2>/dev/null; then
8
+ echo
9
+ echo
10
+ echo "****** WARNING WARNING WARNING WARNING WARNING WARNING WARNING ******"
11
+ echo
12
+ echo "Passenger requires the Ruby library 'fastthread', which does not seem to be installed. Since there's no native package for it in the Debian repository, you must install it via RubyGems:"
13
+ echo
14
+ echo " gem install fastthread"
15
+ echo
16
+ echo "Please install fastthread, otherwise Passenger won't work."
17
+ echo
18
+ echo "****** WARNING WARNING WARNING WARNING WARNING WARNING WARNING ******"
19
+ fi
20
+ else
21
+ echo "********* NOTE ***********"
22
+ echo "Ruby doesn't seem to be installed. Please install Ruby and RubyGems, because Passenger needs them."
23
+ fi
24
+ exit 0
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+
@@ -0,0 +1,398 @@
1
+ = ApplicationPool algorithm
2
+
3
+
4
+ == Introduction
5
+
6
+ For efficiency reasons, Passenger keeps a pool spawned Rails/Ruby applications.
7
+ Please read the C++ API documentation for the ApplicationPool class for a full
8
+ introduction. This document describes an algorithm for managing the pool, in a
9
+ high-level way.
10
+
11
+ The algorithm should strive to keep spawning to a minimum.
12
+
13
+
14
+ == Definitions
15
+
16
+ === Vocabulary
17
+
18
+ - "Application root":
19
+ The toplevel directory in which an application is contained. For Rails
20
+ application, this is the same as RAILS_ROOT, i.e. the directory that contains
21
+ "app/", "public/", etc. For a Rack application, this is the directory that
22
+ contains "config.ru".
23
+
24
+ - "Active application instance":
25
+ An application instance that has more than 0 active sessions.
26
+
27
+ === Types
28
+
29
+ Most of the types that we use in this document are pretty standard. But we
30
+ explicitly define some special types:
31
+
32
+ - list<SomeType>
33
+ A doubly linked list which contains elements of type SomeType. It supports
34
+ all the usual list operations that one can expect from a linked list, like
35
+ add_to_back(), etc.
36
+
37
+ The following operations deserve special mention:
38
+ * remove(iterator)
39
+ Removes the specified element from the list. _iterator_ is a linked list
40
+ iterator: it probably contains the links and a reference to the actual
41
+ list element, depending on the list implementation. This operation can be
42
+ done in O(1) time.
43
+
44
+ * move_to_front(iterator)
45
+ Moves the specified element to the front of the list. _iterator_ is an
46
+ iterator, as described earlier.
47
+
48
+ - Domain
49
+ A compound type (class) which contains information about an application root,
50
+ such as the application instances that have been spawned for this application
51
+ root.
52
+
53
+ A Domain has the following members:
54
+ * instances (list<AppContainer>) - a list of AppContainer objects.
55
+
56
+ Invariant:
57
+ containers is non-empty.
58
+ for all 0 <= i < containers.size() - 1:
59
+ if containers[i].app is active:
60
+ containers[i + 1].app is active
61
+
62
+ * size (unsigned integer): The number of items in _instances_.
63
+
64
+ * max_requests (unsigned integer): The maximum number of requests that each
65
+ application instance in this domain may process. After having processed this
66
+ many requests, the application instance will be shut down.
67
+ A value of 0 indicates that there is no maximum.
68
+
69
+ * restart_file_checker
70
+ An object which monitors the restart.txt file, which belongs to this
71
+ application root, for changes. This object has the method changed(),
72
+ which rteurns whether restart.txt's timestamp has changed since the last
73
+ check.
74
+
75
+ - AppContainer
76
+ A compound type (class) which contains an application instance, as well as
77
+ iterators for various linked lists. These iterators make it possible to
78
+ perform actions on the linked list in O(1) time.
79
+
80
+ An AppContainer has the following members:
81
+ * app - An Application object, representing an application instance.
82
+ * start_time (time) - The time at which this application instance was
83
+ started. It's set to the current time by AppContainer's constructor.
84
+ * processed_requests (integer) - The number of requests processed by this
85
+ application instance so far.
86
+ * last_used (time) - The last time a session for this application instance
87
+ was opened or closed.
88
+ * sessions (integer) - The number of open sessions for this application
89
+ instance.
90
+ Invariant:
91
+ (sessions == 0) == (This AppContainer is in inactive_apps.)
92
+ * iterator - The iterator for this AppContainer in the linked list
93
+ domains[app.app_root].instances
94
+ * ia_iterator - The iterator for this AppContainer in the linked list
95
+ inactive_apps. This iterator is only valid if this AppContainer really is
96
+ in that list.
97
+
98
+ - PoolOptions
99
+ A structure containing additional information used by the spawn manager's
100
+ spawning process, as well as by the get() function.
101
+
102
+ A PoolOptions has the following members:
103
+ * max_requests (unsigned integer) - The maximum number of requests that the
104
+ application instance may process. After having processed this many requests,
105
+ the application instance will be shut down. A value of 0 indicates that there
106
+ is no maximum.
107
+ * use_global_queue (boolean) - Whether to use a global queue for all
108
+ application instances, or a queue that's private to the application instance.
109
+ The users guide explains this feature in more detail.
110
+
111
+ === Special functions
112
+
113
+ - spawn(app_root)
114
+ Spawns a new instance of the application at the given application root.
115
+ Throws an exception if something went wrong. This function is thread-safe.
116
+ Note that application initialization can take an arbitrary amount of time.
117
+
118
+ === Instance variables
119
+
120
+ The algorithm requires the following instance variables for storing state
121
+ information:
122
+
123
+ - lock: mutex
124
+ This lock is used for implementing thread-safetiness. We assume that it
125
+ is non-recursive, i.e. if a thread locks a mutex that it has already locked,
126
+ then it will result in a deadlock.
127
+
128
+ - domains: map[string => Domain]
129
+ Maps an application root to its Domain object. This map contains all
130
+ application instances in the pool.
131
+
132
+ Invariant:
133
+ for all values d in domains:
134
+ d.size <= count
135
+ (sum of all d.size in domains) == count
136
+
137
+ - max: integer
138
+ The maximum number of AppContainer objects that may exist in the pool.
139
+
140
+ - max_per_app: integer
141
+ The maximum number of AppContainer objects that may be simultaneously alive
142
+ for a single Domain.
143
+
144
+ - count: integer
145
+ The current number of AppContainer objects in the pool.
146
+ Since 'max' can be set dynamically during the life time of an application
147
+ pool, 'count > max' is possible.
148
+
149
+ - active: integer
150
+ The number of application instances in the pool that are active.
151
+ Invariant:
152
+ active <= count
153
+
154
+ - inactive_apps: list<AppContainer>
155
+ A linked list of AppContainer objects. All application instances in this list
156
+ are inactive.
157
+
158
+ Invariant:
159
+ inactive_apps.size() == count - active
160
+ for all c in inactive_apps:
161
+ c can be found in _domains_.
162
+ c.sessions == 0
163
+
164
+ - waiting_on_global_queue: integer
165
+ If global queuing mode is enabled, then when get() is waiting for a backend
166
+ process to become idle, this variable will be incremented. When get() is done
167
+ waiting, this variable will be decremented.
168
+
169
+
170
+ == Class relations
171
+
172
+ Here's an UML diagram in ASCII art:
173
+
174
+ [AppContainer] 1..* -------+
175
+ |
176
+ |
177
+
178
+ 1
179
+ [ApplicationPool] [Domain]
180
+ 1 0..*
181
+
182
+ | |
183
+ +-------------------+
184
+
185
+
186
+ == Algorithm in pseudo code
187
+
188
+ # Thread-safetiness notes:
189
+ # - All wait commands are to unlock the lock during waiting.
190
+
191
+ # Connect to an existing application instance or to a newly spawned application instance.
192
+ # 'app_root' specifies the application root folder of the application. 'options' is an
193
+ # object of type 'PoolOptions', which contains additional information which may be
194
+ # relevant for spawning.
195
+ function get(app_root, options):
196
+ MAX_ATTEMPTS = 10
197
+ attempt = 0
198
+ time_limit = now() + 5 seconds
199
+ lock.synchronize:
200
+ while (true):
201
+ attempt++
202
+ container, domain = spawn_or_use_existing(app_root, options)
203
+ container.last_used = current_time()
204
+ container.sessions++
205
+ try:
206
+ return container.app.connect()
207
+ on exception:
208
+ # The app instance seems to have crashed.
209
+ # So we remove this instance from our data
210
+ # structures.
211
+ container.sessions--
212
+ instances = domain.instances
213
+ instances.remove(container.iterator)
214
+ domain.size--
215
+ if instances.empty():
216
+ domains.remove(app_root)
217
+ count--
218
+ active--
219
+ if (attempt == MAX_ATTEMPTS):
220
+ propagate exception
221
+
222
+
223
+ # Returns a pair of [AppContainer, Domain] that matches the given application
224
+ # root. If no such AppContainer exists, then it is created and a new
225
+ # application instance is spawned. All exceptions that occur are propagated.
226
+ function spawn_or_use_existing(app_root, options):
227
+ domain = domains[app_root]
228
+
229
+ if (domain != nil) and (needs_restart(app_root, domain)):
230
+ for all container in domain.instances:
231
+ if container.sessions == 0:
232
+ inactive_apps.remove(container.ia_iterator)
233
+ else:
234
+ active--
235
+ domain.instances.remove(container.iterator)
236
+ count--
237
+ domains.remove(app_root)
238
+ list = nil
239
+ Tell spawn server to reload code for app_root.
240
+
241
+ if domain != nil:
242
+ # There are apps for this app root.
243
+ instances = domain.instances
244
+
245
+ if (instances.front.sessions == 0):
246
+ # There is an inactive app, so we use it.
247
+ container = instances.front
248
+ instances.move_to_back(container.iterator)
249
+ inactive_apps.remove(container.ia_iterator)
250
+ active++
251
+ else if (count >= max) or (
252
+ (max_per_app != 0) and (domain.size >= max_per_app)
253
+ ):
254
+ # All apps are active, and the pool is full.
255
+ # -OR-
256
+ # All apps are active and the number of max instances
257
+ # spawned for this application domain has been reached.
258
+ #
259
+ # We're not allowed to spawn a new application instance.
260
+ if options.use_global_queue:
261
+ # So we wait until _active_ has changed, then
262
+ # we restart this function and try again.
263
+ waiting_on_global_queue++
264
+ wait until _active_ has changed
265
+ waiting_on_global_queue--
266
+ goto beginning of function
267
+ else:
268
+ # So we connect to an already active application.
269
+ # This connection will be put into that
270
+ # application's private queue.
271
+ container = a container in _instances_ with the smallest _session_ value
272
+ instances.move_to_back(container.iterator)
273
+ else:
274
+ # All apps are active, but the pool hasn't reached its
275
+ # maximum yet. So we spawn a new app.
276
+ container = new AppContainer
277
+ # TODO: we should add some kind of timeout check for spawning.
278
+ container.app = spawn(app_root)
279
+ container.sessions = 0
280
+ iterator = instances.add_to_back(container)
281
+ container.iterator = iterator
282
+ domain.size++
283
+ count++
284
+ active++
285
+ else:
286
+ # There are no apps for this app root. Wait until there's at
287
+ # least 1 idle instance, or until there's an empty slot in the
288
+ # pool, then restart this function. Restarting is necessary,
289
+ # because after waiting and reacquiring the lack, some other
290
+ # thread might already have spawned instances for this app root.
291
+ if (active >= max):
292
+ wait until _active_ has changed
293
+ goto beginning of function
294
+ elsif count == max:
295
+ # Here we are in a though situation. There are several
296
+ # apps which are inactive, and none of them have
297
+ # application root _app_root_, so we must kill one of
298
+ # them in order to free a spot in the pool. But which
299
+ # one do we kill? We want to minimize spawning.
300
+ #
301
+ # It's probably a good idea to keep some kind of
302
+ # statistics in order to decide this. We want the
303
+ # application root that gets the least traffic to be
304
+ # killed. But for now, we kill a random application
305
+ # instance.
306
+ container = inactive_apps.pop_front
307
+ domain = domains[container.app.app_root]
308
+ instances = domain.instances
309
+ instances.remove(container.iterator)
310
+ if instances.empty():
311
+ domains.remove(container.app.app_root)
312
+ else:
313
+ domain.size--
314
+ count--
315
+ container = new AppContainer
316
+ # TODO: we should add some kind of timeout check for spawning.
317
+ container.app = spawn(app_root)
318
+ container.sessions = 0
319
+ domain = domains[app_root]
320
+ if domain == nil:
321
+ domain = new Domain
322
+ initialize domain.instances
323
+ initialize domain.restart_file_checker with "$app_root/tmp/restart.txt"
324
+ domain.size = 1
325
+ domain.max_requests = options.max_requests
326
+ domains[app_root] = domain
327
+ else:
328
+ domain.size++
329
+ iterator = domain.instances.add_to_back(container)
330
+ container.iterator = iterator
331
+ count++
332
+ active++
333
+ return [container, domain]
334
+
335
+
336
+ # The following function is to be called when a session has been closed.
337
+ # _container_ is the AppContainer that contains the application for which a
338
+ # session has been closed.
339
+ function session_has_been_closed(container):
340
+ lock.synchronize:
341
+ domain = domains[container.app.app_root]
342
+ if domain != nil:
343
+ instances = domain.instances
344
+ container.processed++
345
+
346
+ if (domain.max_requests) > 0 and (container.processed >= domain.max_requests):
347
+ # The application instance has processed its maximum allowed
348
+ # number of requests, so we shut it down.
349
+ instances.remove(container.iterator)
350
+ domain.size--
351
+ if instances.empty():
352
+ domains.remove(app_root)
353
+ count--
354
+ active--
355
+ else:
356
+ container.last_used = current_time()
357
+ container.sessions--
358
+ container.processed++
359
+ if container.sessions == 0:
360
+ instances.move_to_front(container.iterator)
361
+ container.ia_iterator = inactive_apps.add_to_back(container.app)
362
+ active--
363
+
364
+
365
+ function needs_restart(app_root, domain):
366
+ always_restart_file = "$app_root/tmp/always_restart.txt"
367
+ return (file_exists(always_restart_file)) or
368
+ (domain.restart_file_checker.changed())
369
+
370
+
371
+ # The following thread will be responsible for cleaning up idle application
372
+ # instances, i.e. instances that haven't been used for a while.
373
+ # This can be disabled per app when setting it's maxIdleTime to 0.
374
+ thread cleaner:
375
+ lock.synchronize:
376
+ done = false
377
+ while !done:
378
+ Wait until CLEAN_INTERVAL seconds have expired, or until the thread has been signalled to quit.
379
+ if thread has been signalled to quit:
380
+ done = true
381
+ break
382
+
383
+ now = current_time()
384
+ for all container in inactive_apps:
385
+ app = container.app
386
+ domain = domains[app.app_root]
387
+ instances = domain.instances
388
+ # If MAX_IDLE_TIME is 0 we don't clean up the instance,
389
+ # giving us the option to persist the app container
390
+ # forever unless it's killed by another app.
391
+ if (MAX_IDLE_TIME > 0) and (now - container.last_used > MAX_IDLE_TIME):
392
+ instances.remove(container.iterator)
393
+ inactive_apps.remove(container.iterator)
394
+ domain.size--
395
+ count--
396
+ if instances.empty():
397
+ domains.remove(app.app_root)
398
+