passenger 2.0.6 → 2.1.2

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 (497) hide show
  1. data/DEVELOPERS.TXT +10 -4
  2. data/LICENSE +1 -1
  3. data/NEWS +0 -0
  4. data/Rakefile +183 -117
  5. data/benchmark/dispatcher.rb +5 -9
  6. data/bin/passenger-install-apache2-module +52 -18
  7. data/bin/passenger-memory-stats +67 -13
  8. data/bin/passenger-spawn-server +8 -4
  9. data/bin/passenger-status +21 -46
  10. data/bin/passenger-stress-test +5 -5
  11. data/debian/postinst +1 -1
  12. data/doc/ApplicationPool algorithm.txt +180 -128
  13. data/doc/Architectural overview.html +1 -778
  14. data/doc/Security of user switching support.html +1 -643
  15. data/doc/Users guide Apache.html +3127 -0
  16. data/doc/Users guide Nginx.html +1458 -0
  17. data/doc/Users guide.html +1404 -467
  18. data/doc/Users guide.txt +843 -105
  19. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
  20. data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
  21. data/doc/cxxapi/Application_8h-source.html +494 -394
  22. data/doc/cxxapi/Bucket_8h-source.html +21 -15
  23. data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
  24. data/doc/cxxapi/Configuration_8h-source.html +311 -149
  25. data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
  26. data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
  27. data/doc/cxxapi/Exceptions_8h-source.html +182 -165
  28. data/doc/cxxapi/FileChecker_8h-source.html +130 -0
  29. data/doc/cxxapi/Hooks_8h-source.html +2 -3
  30. data/doc/cxxapi/Logging_8h-source.html +92 -89
  31. data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
  32. data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
  33. data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
  34. data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
  35. data/doc/cxxapi/SystemTime_8h-source.html +104 -0
  36. data/doc/cxxapi/Utils_8h-source.html +331 -227
  37. data/doc/cxxapi/annotated.html +6 -7
  38. data/doc/cxxapi/classClient-members.html +1 -2
  39. data/doc/cxxapi/classClient.html +1 -2
  40. data/doc/cxxapi/classHooks-members.html +5 -2
  41. data/doc/cxxapi/classHooks.html +112 -2
  42. data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
  43. data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
  44. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
  45. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
  46. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
  47. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
  48. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  49. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
  50. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
  51. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
  52. data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
  53. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
  54. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
  55. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
  56. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
  57. data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
  58. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
  59. data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
  60. data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
  61. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
  62. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
  63. data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
  64. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
  65. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
  66. data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
  67. data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
  68. data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
  69. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  70. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
  71. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
  72. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
  73. data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
  74. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
  75. data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
  76. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
  77. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
  78. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
  79. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
  80. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  81. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
  82. data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
  83. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  84. data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
  85. data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
  86. data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
  87. data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
  88. data/doc/cxxapi/definitions_8h-source.html +1 -2
  89. data/doc/cxxapi/files.html +6 -3
  90. data/doc/cxxapi/functions.html +98 -35
  91. data/doc/cxxapi/functions_func.html +60 -32
  92. data/doc/cxxapi/functions_type.html +1 -2
  93. data/doc/cxxapi/functions_vars.html +27 -2
  94. data/doc/cxxapi/graph_legend.html +1 -2
  95. data/doc/cxxapi/graph_legend.png +0 -0
  96. data/doc/cxxapi/group__Configuration.html +3 -4
  97. data/doc/cxxapi/group__Configuration.png +0 -0
  98. data/doc/cxxapi/group__Core.html +3 -4
  99. data/doc/cxxapi/group__Core.png +0 -0
  100. data/doc/cxxapi/group__Exceptions.html +4 -2
  101. data/doc/cxxapi/group__Hooks.html +1 -6
  102. data/doc/cxxapi/group__Hooks.png +0 -0
  103. data/doc/cxxapi/group__Support.html +259 -36
  104. data/doc/cxxapi/hierarchy.html +6 -7
  105. data/doc/cxxapi/inherit__graph__0.map +1 -1
  106. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  107. data/doc/cxxapi/inherit__graph__0.png +0 -0
  108. data/doc/cxxapi/inherit__graph__1.map +1 -1
  109. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  110. data/doc/cxxapi/inherit__graph__1.png +0 -0
  111. data/doc/cxxapi/inherit__graph__10.map +1 -1
  112. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  113. data/doc/cxxapi/inherit__graph__10.png +0 -0
  114. data/doc/cxxapi/inherit__graph__11.map +1 -1
  115. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  116. data/doc/cxxapi/inherit__graph__11.png +0 -0
  117. data/doc/cxxapi/inherit__graph__12.map +2 -1
  118. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  119. data/doc/cxxapi/inherit__graph__12.png +0 -0
  120. data/doc/cxxapi/inherit__graph__13.map +1 -1
  121. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  122. data/doc/cxxapi/inherit__graph__13.png +0 -0
  123. data/doc/cxxapi/inherit__graph__14.map +1 -2
  124. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  125. data/doc/cxxapi/inherit__graph__14.png +0 -0
  126. data/doc/cxxapi/inherit__graph__15.map +1 -1
  127. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  128. data/doc/cxxapi/inherit__graph__15.png +0 -0
  129. data/doc/cxxapi/inherit__graph__16.map +1 -1
  130. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  131. data/doc/cxxapi/inherit__graph__16.png +0 -0
  132. data/doc/cxxapi/inherit__graph__17.png +0 -0
  133. data/doc/cxxapi/inherit__graph__18.png +0 -0
  134. data/doc/cxxapi/inherit__graph__19.png +0 -0
  135. data/doc/cxxapi/inherit__graph__2.map +1 -1
  136. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  137. data/doc/cxxapi/inherit__graph__2.png +0 -0
  138. data/doc/cxxapi/inherit__graph__20.map +1 -1
  139. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  140. data/doc/cxxapi/inherit__graph__20.png +0 -0
  141. data/doc/cxxapi/inherit__graph__21.map +1 -1
  142. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  143. data/doc/cxxapi/inherit__graph__21.png +0 -0
  144. data/doc/cxxapi/inherit__graph__3.map +1 -1
  145. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  146. data/doc/cxxapi/inherit__graph__3.png +0 -0
  147. data/doc/cxxapi/inherit__graph__4.map +1 -1
  148. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  149. data/doc/cxxapi/inherit__graph__4.png +0 -0
  150. data/doc/cxxapi/inherit__graph__5.map +2 -1
  151. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  152. data/doc/cxxapi/inherit__graph__5.png +0 -0
  153. data/doc/cxxapi/inherit__graph__6.map +1 -1
  154. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  155. data/doc/cxxapi/inherit__graph__6.png +0 -0
  156. data/doc/cxxapi/inherit__graph__7.map +1 -1
  157. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  158. data/doc/cxxapi/inherit__graph__7.png +0 -0
  159. data/doc/cxxapi/inherit__graph__8.map +1 -1
  160. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  161. data/doc/cxxapi/inherit__graph__8.png +0 -0
  162. data/doc/cxxapi/inherit__graph__9.map +1 -2
  163. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  164. data/doc/cxxapi/inherit__graph__9.png +0 -0
  165. data/doc/cxxapi/inherits.html +30 -31
  166. data/doc/cxxapi/main.html +1 -2
  167. data/doc/cxxapi/modules.html +1 -2
  168. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
  169. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
  170. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
  171. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
  172. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
  173. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
  174. data/doc/cxxapi/tree.html +18 -20
  175. data/doc/images/conservative_spawning.png +0 -0
  176. data/doc/images/conservative_spawning.svg +248 -0
  177. data/doc/images/smart-lv2.png +0 -0
  178. data/doc/images/smart-lv2.svg +320 -0
  179. data/doc/rdoc/classes/ConditionVariable.html +68 -34
  180. data/doc/rdoc/classes/Exception.html +16 -16
  181. data/doc/rdoc/classes/GC.html +9 -9
  182. data/doc/rdoc/classes/IO.html +36 -17
  183. data/doc/rdoc/classes/PhusionPassenger.html +183 -0
  184. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
  185. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
  186. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
  187. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
  188. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
  189. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
  190. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
  191. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
  193. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
  194. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
  195. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
  196. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
  197. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
  198. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
  199. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
  200. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  201. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
  202. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
  203. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  204. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
  205. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
  206. data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
  207. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
  208. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
  209. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
  210. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
  211. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
  212. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
  213. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
  214. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
  215. data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
  216. data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
  217. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  218. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
  219. data/doc/rdoc/classes/PlatformInfo.html +663 -159
  220. data/doc/rdoc/classes/RakeExtensions.html +4 -4
  221. data/doc/rdoc/classes/Signal.html +134 -0
  222. data/doc/rdoc/created.rid +1 -1
  223. data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
  224. data/doc/rdoc/files/README.html +5 -7
  225. data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
  226. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
  227. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
  228. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
  229. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
  231. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
  232. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
  233. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
  234. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
  235. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
  236. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
  237. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
  238. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
  239. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
  240. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
  242. data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
  243. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
  246. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
  247. data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
  248. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
  250. data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
  251. data/doc/rdoc/fr_class_index.html +37 -19
  252. data/doc/rdoc/fr_file_index.html +25 -14
  253. data/doc/rdoc/fr_method_index.html +145 -74
  254. data/ext/apache2/Application.h +145 -44
  255. data/ext/apache2/ApplicationPool.h +27 -29
  256. data/ext/apache2/ApplicationPoolServer.h +183 -72
  257. data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
  258. data/ext/apache2/Bucket.cpp +61 -9
  259. data/ext/apache2/Bucket.h +15 -8
  260. data/ext/apache2/CachedFileStat.cpp +114 -0
  261. data/ext/apache2/CachedFileStat.h +169 -0
  262. data/ext/apache2/Configuration.cpp +213 -22
  263. data/ext/apache2/Configuration.h +176 -13
  264. data/ext/apache2/DirectoryMapper.h +287 -0
  265. data/ext/apache2/Exceptions.h +30 -12
  266. data/ext/apache2/FileChecker.h +108 -0
  267. data/ext/apache2/Hooks.cpp +709 -493
  268. data/ext/apache2/LICENSE-CNRI.TXT +15 -0
  269. data/ext/apache2/Logging.h +26 -22
  270. data/ext/apache2/MessageChannel.h +124 -15
  271. data/ext/apache2/PoolOptions.h +283 -0
  272. data/ext/apache2/SpawnManager.h +75 -99
  273. data/ext/apache2/StandardApplicationPool.h +296 -195
  274. data/ext/apache2/SystemTime.cpp +28 -0
  275. data/ext/apache2/SystemTime.h +82 -0
  276. data/ext/apache2/Utils.cpp +172 -18
  277. data/ext/apache2/Utils.h +124 -19
  278. data/ext/boost/cstdint.hpp +4 -2
  279. data/ext/boost/current_function.hpp +67 -0
  280. data/ext/boost/detail/sp_counted_base.hpp +4 -4
  281. data/ext/boost/thread/exceptions.hpp +2 -1
  282. data/ext/boost/thread/pthread/thread.hpp +11 -3
  283. data/ext/boost/thread/pthread/thread_data.hpp +2 -1
  284. data/ext/oxt/backtrace.cpp +172 -0
  285. data/ext/oxt/backtrace.hpp +135 -0
  286. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  287. data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
  288. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
  289. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  290. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  291. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  292. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  293. data/ext/oxt/macros.hpp +58 -0
  294. data/ext/oxt/spin_lock.hpp +55 -0
  295. data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
  296. data/ext/oxt/system_calls.hpp +234 -0
  297. data/ext/oxt/thread.cpp +32 -0
  298. data/ext/oxt/thread.hpp +223 -0
  299. data/ext/oxt/tracable_exception.cpp +87 -0
  300. data/ext/oxt/tracable_exception.hpp +35 -0
  301. data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
  302. data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
  303. data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
  304. data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
  305. data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
  306. data/lib/phusion_passenger/admin_tools.rb +25 -0
  307. data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
  308. data/lib/{passenger → phusion_passenger}/application.rb +13 -16
  309. data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
  310. data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
  311. data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
  312. data/lib/phusion_passenger/events.rb +45 -0
  313. data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
  314. data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
  315. data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
  316. data/lib/phusion_passenger/platform_info.rb +500 -0
  317. data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
  318. data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
  319. data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
  320. data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
  321. data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
  322. data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
  323. data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
  324. data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
  325. data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
  326. data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  327. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  328. data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
  329. data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
  330. data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
  331. data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
  332. data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
  333. data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
  334. data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
  335. data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
  336. data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
  337. data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
  338. data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  339. data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
  340. data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
  341. data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
  342. data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
  343. data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
  344. data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
  345. data/man/passenger-memory-stats.8 +1 -1
  346. data/misc/render_error_pages.rb +1 -1
  347. data/test/ApplicationPoolServerTest.cpp +0 -28
  348. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
  349. data/test/ApplicationPoolTest.cpp +307 -69
  350. data/test/CachedFileStatTest.cpp +262 -0
  351. data/test/FileCheckerTest.cpp +79 -0
  352. data/test/MessageChannelTest.cpp +3 -3
  353. data/test/PoolOptionsTest.cpp +37 -0
  354. data/test/SpawnManagerTest.cpp +4 -4
  355. data/test/StandardApplicationPoolTest.cpp +4 -0
  356. data/test/SystemTimeTest.cpp +37 -0
  357. data/test/UtilsTest.cpp +137 -0
  358. data/test/integration_tests.rb +270 -23
  359. data/test/oxt/backtrace_test.cpp +128 -0
  360. data/test/oxt/oxt_test_main.cpp +25 -0
  361. data/test/oxt/syscall_interruption_test.cpp +50 -0
  362. data/test/ruby/abstract_request_handler_spec.rb +83 -0
  363. data/test/ruby/abstract_server_collection_spec.rb +246 -0
  364. data/test/ruby/application_spec.rb +3 -3
  365. data/test/ruby/message_channel_spec.rb +2 -2
  366. data/test/ruby/rack/application_spawner_spec.rb +3 -5
  367. data/test/ruby/rails/application_spawner_spec.rb +54 -15
  368. data/test/ruby/rails/framework_spawner_spec.rb +6 -8
  369. data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
  370. data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
  371. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
  372. data/test/ruby/spawn_manager_spec.rb +23 -12
  373. data/test/ruby/utils_spec.rb +36 -2
  374. data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
  375. data/test/stub/apache2/httpd.conf.erb +3 -5
  376. data/test/stub/message_channel.rb +2 -2
  377. data/test/stub/message_channel_2.rb +2 -2
  378. data/test/stub/message_channel_3.rb +3 -3
  379. data/test/stub/minimal-railsapp/README +0 -0
  380. data/test/stub/minimal-railsapp/config/application.rb +0 -0
  381. data/test/stub/minimal-railsapp/config/environment.rb +0 -0
  382. data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
  383. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
  384. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
  385. data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
  386. data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
  387. data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
  388. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
  389. data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
  390. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
  391. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
  392. data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
  393. data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
  394. data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
  395. data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
  396. data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
  397. data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
  398. data/test/stub/railsapp/app/controllers/application.rb +0 -0
  399. data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
  400. data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
  401. data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
  402. data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
  403. data/test/stub/railsapp/config/boot.rb +0 -0
  404. data/test/stub/railsapp/config/database.yml +0 -0
  405. data/test/stub/railsapp/config/environment.rb +0 -0
  406. data/test/stub/railsapp/config/environments/development.rb +0 -0
  407. data/test/stub/railsapp/config/environments/production.rb +0 -0
  408. data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
  409. data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
  410. data/test/stub/railsapp/config/routes.rb +0 -0
  411. data/test/stub/railsapp/public/useless.txt +0 -0
  412. data/test/stub/spawn_server.rb +3 -4
  413. data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
  414. data/test/support/apache2_controller.rb +57 -7
  415. data/test/support/tut.h +15 -0
  416. data/vendor/README +12 -0
  417. data/vendor/README_FOR_PACKAGERS +1 -0
  418. data/vendor/rack-0.9.1/AUTHORS +8 -0
  419. data/vendor/rack-0.9.1/COPYING +18 -0
  420. data/vendor/rack-0.9.1/ChangeLog +1423 -0
  421. data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
  422. data/vendor/rack-0.9.1/README +306 -0
  423. data/vendor/rack-0.9.1/Rakefile +188 -0
  424. data/vendor/rack-0.9.1/SPEC +129 -0
  425. data/vendor/rack-0.9.1/lib/rack.rb +86 -0
  426. data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
  427. data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
  428. data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
  429. data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
  430. data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
  431. data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
  432. data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
  433. data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
  434. data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
  435. data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
  436. data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
  437. data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
  438. data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
  439. data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
  440. data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
  441. data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
  442. data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
  443. data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
  444. data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
  445. data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
  446. data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
  447. data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
  448. data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
  449. data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
  450. data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  451. data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
  452. data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
  453. data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
  454. data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
  455. data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
  456. data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
  457. data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
  458. data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
  459. data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
  460. data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
  461. data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
  462. data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
  463. data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
  464. data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
  465. data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
  466. data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
  467. data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
  468. data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
  469. data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
  470. data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
  471. data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
  472. metadata +1197 -1055
  473. data/doc/cxxapi/System_8h-source.html +0 -251
  474. data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
  475. data/doc/cxxapi/classDirectoryMapper.html +0 -203
  476. data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
  477. data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
  478. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
  479. data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
  480. data/doc/cxxapi/namespacePassenger.html +0 -208
  481. data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
  482. data/doc/cxxapi/namespacemembers.html +0 -70
  483. data/doc/cxxapi/namespacemembers_func.html +0 -66
  484. data/doc/cxxapi/namespacemembers_type.html +0 -46
  485. data/doc/cxxapi/namespaces.html +0 -35
  486. data/doc/rdoc/classes/Passenger.html +0 -136
  487. data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
  488. data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
  489. data/doc/rdoc/classes/Passenger/Utils.html +0 -578
  490. data/ext/apache2/System.h +0 -228
  491. data/lib/passenger/platform_info.rb +0 -302
  492. data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
  493. data/test/stub/apache2/httpd.conf +0 -75
  494. data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
  495. data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
  496. data/test/stub/railsapp/config/environments/test.rb +0 -22
  497. data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -14,9 +14,9 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require 'passenger/abstract_request_handler'
18
- require 'passenger/railz/cgi_fixed'
19
- module Passenger
17
+ require 'phusion_passenger/abstract_request_handler'
18
+ require 'phusion_passenger/railz/cgi_fixed'
19
+ module PhusionPassenger
20
20
  module Railz
21
21
 
22
22
  # A request handler for Ruby on Rails applications.
@@ -24,8 +24,8 @@ class RequestHandler < AbstractRequestHandler
24
24
  NINJA_PATCHING_LOCK = Mutex.new
25
25
  @@ninja_patched_action_controller = false
26
26
 
27
- def initialize(owner_pipe)
28
- super(owner_pipe)
27
+ def initialize(owner_pipe, options = {})
28
+ super(owner_pipe, options)
29
29
  NINJA_PATCHING_LOCK.synchronize do
30
30
  ninja_patch_action_controller
31
31
  end
@@ -58,4 +58,4 @@ private
58
58
  end
59
59
 
60
60
  end # module Railz
61
- end # module Passenger
61
+ end # module PhusionPassenger
@@ -16,10 +16,17 @@
16
16
  # with this program; if not, write to the Free Software Foundation, Inc.,
17
17
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
18
 
19
- require 'passenger/abstract_server'
20
- require 'passenger/constants'
21
- require 'passenger/utils'
22
- module Passenger
19
+ require 'phusion_passenger/abstract_server'
20
+ require 'phusion_passenger/abstract_server_collection'
21
+ require 'phusion_passenger/constants'
22
+ require 'phusion_passenger/utils'
23
+
24
+ # Define a constant with a name that's unlikely to clash with anything the
25
+ # application defines, so that they can detect whether they're running under
26
+ # Phusion Passenger.
27
+ IN_PHUSION_PASSENGER = true
28
+
29
+ module PhusionPassenger
23
30
 
24
31
  # The spawn manager is capable of spawning Ruby on Rails or Rack application
25
32
  # instances. It acts like a simple fascade for the rest of the spawn manager
@@ -30,7 +37,7 @@ module Passenger
30
37
  # tested. Don't forget to call cleanup after the server's main loop has
31
38
  # finished.
32
39
  #
33
- # == Ruby on Rails optimizations ===
40
+ # == Ruby on Rails optimizations
34
41
  #
35
42
  # Spawning a Ruby on Rails application is usually slow. But SpawnManager
36
43
  # will preload and cache Ruby on Rails frameworks, as well as application
@@ -47,27 +54,25 @@ class SpawnManager < AbstractServer
47
54
 
48
55
  def initialize
49
56
  super()
50
- @spawners = {}
51
- @lock = Mutex.new
52
- @cond = ConditionVariable.new
53
- @cleaner_thread = Thread.new do
54
- cleaner_thread_main
55
- end
57
+ @spawners = AbstractServerCollection.new
56
58
  define_message_handler(:spawn_application, :handle_spawn_application)
57
59
  define_message_handler(:reload, :handle_reload)
58
60
  define_signal_handler('SIGHUP', :reload)
59
61
 
62
+ # Start garbage collector in order to free up some existing
63
+ # heap slots. This prevents the heap from growing unnecessarily
64
+ # during the startup phase.
60
65
  GC.start
61
66
  if GC.copy_on_write_friendly?
62
67
  # Preload libraries for copy-on-write semantics.
63
68
  require 'base64'
64
- require 'passenger/application'
65
- require 'passenger/railz/framework_spawner'
66
- require 'passenger/railz/application_spawner'
67
- require 'passenger/rack/application_spawner'
68
- require 'passenger/html_template'
69
- require 'passenger/platform_info'
70
- require 'passenger/exceptions'
69
+ require 'phusion_passenger/application'
70
+ require 'phusion_passenger/railz/framework_spawner'
71
+ require 'phusion_passenger/railz/application_spawner'
72
+ require 'phusion_passenger/rack/application_spawner'
73
+ require 'phusion_passenger/html_template'
74
+ require 'phusion_passenger/platform_info'
75
+ require 'phusion_passenger/exceptions'
71
76
 
72
77
  # Commonly used libraries.
73
78
  ['mysql', 'sqlite3'].each do |lib|
@@ -80,51 +85,84 @@ class SpawnManager < AbstractServer
80
85
  end
81
86
  end
82
87
 
83
- # Spawn a RoR application When successful, an Application object will be
84
- # returned, which represents the spawned RoR application.
85
- #
86
- # See Railz::ApplicationSpawner.new for an explanation of the +lower_privilege+,
87
- # +lowest_user+ and +environment+ parameters.
88
+ # Spawn an application with the given spawn options. When successful, an
89
+ # Application object will be returned, which represents the spawned application.
90
+ # At least one option must be given: +app_root+. This is the application's root
91
+ # folder.
88
92
  #
89
- # The +spawn_method+ argument may be one of "smart" or "conservative".
90
- # When "smart" is specified (the default), SpawnManager will internally cache the
91
- # code of applications, in order to speed up future spawning attempts. This implies
92
- # that, if you've changed the application's code, you must do one of these things:
93
- # - Restart this SpawnManager by calling AbstractServer#stop, then AbstractServer#start.
94
- # - Reload the application by calling reload with the correct app_root argument.
95
- # Caching however can be incompatible with some applications.
93
+ # Other options are:
96
94
  #
97
- # The "conservative" spawning method does not involve any caching at all.
98
- # Spawning will be slower, but is guaranteed to be compatible with all applications.
95
+ # ['lower_privilege', 'lowest_user' and 'environment']
96
+ # See Railz::ApplicationSpawner.new for an explanation of these options.
97
+ #
98
+ # ['app_type']
99
+ # What kind of application is being spawned. Either "rails" (default), "rack" or "wsgi".
100
+ #
101
+ # ['spawn_method']
102
+ # May be one of "smart", "smart-lv2" or "conservative". When "smart" is specified,
103
+ # SpawnManager will internally cache the code of Rails applications, in
104
+ # order to speed up future spawning attempts. This implies that, if you've changed
105
+ # the application's
106
+ # code, you must do one of these things:
107
+ # - Restart this SpawnManager by calling AbstractServer#stop, then AbstractServer#start.
108
+ # - Reload the application by calling reload with the correct app_root argument.
109
+ #
110
+ # "smart" caches the Rails framework code in a framework spawner server, and application
111
+ # code in an application spawner server. Sometimes it is desirable to skip the
112
+ # framework spawning and going directly for the application spawner instead. The
113
+ # "smart-lv2" method allows you to do that.
114
+ #
115
+ # Caching however can be incompatible with some applications. The "conservative"
116
+ # spawning method does not involve any caching at all. Spawning will be slower,
117
+ # but is guaranteed to be compatible with all applications.
118
+ #
119
+ # The default spawn method is "smart-lv2".
120
+ #
121
+ # ['framework_spawner_timeout' and 'app_spawner_timeout']
122
+ # These options allow you to specify the maximum idle timeout, in seconds, of the
123
+ # framework spawner servers and application spawner servers that will be started under
124
+ # the hood. These options are only used if +app_type+ equals "rails".
125
+ #
126
+ # A timeout of 0 means that the spawner server should never idle timeout. A timeout of
127
+ # -1 means that the default timeout value should be used. The default value is -1.
99
128
  #
100
- # Raises:
101
- # - ArgumentError: +app_root+ doesn't appear to be a valid Ruby on Rails application root.
129
+ # <b>Exceptions:</b>
130
+ # - InvalidPath: +app_root+ doesn't appear to be a valid Ruby on Rails application root.
102
131
  # - VersionNotFound: The Ruby on Rails framework version that the given application requires
103
132
  # is not installed.
104
133
  # - AbstractServer::ServerError: One of the server processes exited unexpectedly.
105
134
  # - FrameworkInitError: The Ruby on Rails framework that the application requires could not be loaded.
106
135
  # - AppInitError: The application raised an exception or called exit() during startup.
107
- def spawn_application(app_root, lower_privilege = true, lowest_user = "nobody",
108
- environment = "production", spawn_method = "smart",
109
- app_type = "rails")
110
- if app_type == "rack"
136
+ def spawn_application(options)
137
+ if !options["app_root"]
138
+ raise ArgumentError, "The 'app_root' option must be given."
139
+ end
140
+ options = sanitize_spawn_options(options)
141
+
142
+ if options["app_type"] == "rails"
143
+ if !defined?(Railz::FrameworkSpawner)
144
+ require 'phusion_passenger/application'
145
+ require 'phusion_passenger/railz/framework_spawner'
146
+ require 'phusion_passenger/railz/application_spawner'
147
+ end
148
+ return spawn_rails_application(options)
149
+ elsif options["app_type"] == "rack"
111
150
  if !defined?(Rack::ApplicationSpawner)
112
- require 'passenger/rack/application_spawner'
151
+ require 'phusion_passenger/rack/application_spawner'
113
152
  end
114
- return Rack::ApplicationSpawner.spawn_application(app_root,
115
- lower_privilege, lowest_user, environment)
116
- elsif app_type == "wsgi"
117
- require 'passenger/wsgi/application_spawner'
118
- return WSGI::ApplicationSpawner.spawn_application(app_root,
119
- lower_privilege, lowest_user, environment)
153
+ return Rack::ApplicationSpawner.spawn_application(
154
+ options["app_root"], options
155
+ )
156
+ elsif options["app_type"] == "wsgi"
157
+ require 'phusion_passenger/wsgi/application_spawner'
158
+ return WSGI::ApplicationSpawner.spawn_application(
159
+ options["app_root"],
160
+ options["lower_privilege"],
161
+ options["lowest_user"],
162
+ options["environment"]
163
+ )
120
164
  else
121
- if !defined?(Railz::FrameworkSpawner)
122
- require 'passenger/application'
123
- require 'passenger/railz/framework_spawner'
124
- require 'passenger/railz/application_spawner'
125
- end
126
- return spawn_rails_application(app_root, lower_privilege, lowest_user,
127
- environment, spawn_method)
165
+ raise ArgumentError, "Unknown 'app_type' value '#{options["app_type"]}'."
128
166
  end
129
167
  end
130
168
 
@@ -145,23 +183,27 @@ class SpawnManager < AbstractServer
145
183
  if app_root
146
184
  begin
147
185
  app_root = normalize_path(app_root)
148
- rescue ArgumentError
186
+ rescue InvalidPath
149
187
  end
150
188
  end
151
- @lock.synchronize do
189
+ @spawners.synchronize do
152
190
  if app_root
153
191
  # Delete associated ApplicationSpawner.
154
- key = "app:#{app_root}"
155
- spawner = @spawners[key]
156
- if spawner
157
- if spawner.started?
158
- spawner.stop
192
+ @spawners.delete("app:#{app_root}")
193
+ else
194
+ # Delete all ApplicationSpawners.
195
+ keys_to_delete = []
196
+ @spawners.each_pair do |key, spawner|
197
+ if spawner.is_a?(Railz::ApplicationSpawner)
198
+ keys_to_delete << key
159
199
  end
200
+ end
201
+ keys_to_delete.each do |key|
160
202
  @spawners.delete(key)
161
203
  end
162
204
  end
163
- @spawners.each_value do |spawner|
164
- # Reload FrameworkSpawners.
205
+ @spawners.each do |spawner|
206
+ # Reload all FrameworkSpawners.
165
207
  if spawner.respond_to?(:reload)
166
208
  spawner.reload(app_root)
167
209
  end
@@ -171,86 +213,77 @@ class SpawnManager < AbstractServer
171
213
 
172
214
  # Cleanup resources. Should be called when this SpawnManager is no longer needed.
173
215
  def cleanup
174
- @lock.synchronize do
175
- @cond.signal
176
- end
177
- @cleaner_thread.join
178
- @lock.synchronize do
179
- @spawners.each_value do |spawner|
180
- if spawner.started?
181
- spawner.stop
182
- end
183
- end
184
- @spawners.clear
185
- end
216
+ @spawners.cleanup
186
217
  end
187
218
 
188
219
  private
189
- def spawn_rails_application(app_root, lower_privilege, lowest_user,
190
- environment, spawn_method)
191
- if spawn_method == "smart"
220
+ def spawn_rails_application(options)
221
+ spawn_method = options["spawn_method"]
222
+ app_root = options["app_root"]
223
+
224
+ if [nil, "", "smart", "smart-lv2"].include?(spawn_method)
192
225
  spawner_must_be_started = true
193
- framework_version = Application.detect_framework_version(app_root)
226
+ if spawn_method != "smart-lv2"
227
+ framework_version = Application.detect_framework_version(app_root)
228
+ end
194
229
  if framework_version.nil? || framework_version == :vendor
195
230
  app_root = normalize_path(app_root)
196
231
  key = "app:#{app_root}"
197
232
  create_spawner = proc do
198
- Railz::ApplicationSpawner.new(app_root, lower_privilege,
199
- lowest_user, environment)
233
+ Railz::ApplicationSpawner.new(app_root, options)
200
234
  end
235
+ spawner_timeout = options["app_spawner_timeout"]
201
236
  else
202
237
  key = "version:#{framework_version}"
203
238
  create_spawner = proc do
204
239
  Railz::FrameworkSpawner.new(:version => framework_version)
205
240
  end
241
+ spawner_timeout = options["framework_spawner_timeout"]
206
242
  end
207
243
  else
208
244
  app_root = normalize_path(app_root)
209
245
  key = "app:#{app_root}"
210
246
  create_spawner = proc do
211
- Railz::ApplicationSpawner.new(app_root, lower_privilege, lowest_user, environment)
247
+ Railz::ApplicationSpawner.new(app_root, options)
212
248
  end
249
+ spawner_timeout = options["app_spawner_timeout"]
213
250
  spawner_must_be_started = false
214
251
  end
215
252
 
216
- spawner = nil
217
- @lock.synchronize do
218
- spawner = @spawners[key]
219
- if !spawner
253
+ @spawners.synchronize do
254
+ spawner = @spawners.lookup_or_add(key) do
220
255
  spawner = create_spawner.call
256
+ if spawner_timeout != -1
257
+ spawner.max_idle_time = spawner_timeout
258
+ end
221
259
  if spawner_must_be_started
222
260
  spawner.start
223
261
  end
224
- @spawners[key] = spawner
262
+ spawner
225
263
  end
226
- spawner.time = Time.now
227
264
  begin
228
265
  if spawner.is_a?(Railz::FrameworkSpawner)
229
- return spawner.spawn_application(app_root, lower_privilege,
230
- lowest_user, environment)
266
+ return spawner.spawn_application(app_root, options)
231
267
  elsif spawner.started?
232
268
  return spawner.spawn_application
233
269
  else
234
270
  return spawner.spawn_application!
235
271
  end
236
272
  rescue AbstractServer::ServerError
237
- if spawner.started?
238
- spawner.stop
239
- end
240
273
  @spawners.delete(key)
241
274
  raise
242
275
  end
243
276
  end
244
277
  end
245
278
 
246
- def handle_spawn_application(app_root, lower_privilege, lowest_user, environment,
247
- spawn_method, app_type)
248
- lower_privilege = lower_privilege == "true"
279
+ def handle_spawn_application(*options)
280
+ options = sanitize_spawn_options(Hash[*options])
249
281
  app = nil
282
+ app_root = options["app_root"]
283
+ app_type = options["app_type"]
250
284
  begin
251
- app = spawn_application(app_root, lower_privilege, lowest_user,
252
- environment, spawn_method, app_type)
253
- rescue ArgumentError => e
285
+ app = spawn_application(options)
286
+ rescue InvalidPath => e
254
287
  send_error_page(client, 'invalid_app_root', :error => e, :app_root => app_root)
255
288
  rescue AbstractServer::ServerError => e
256
289
  send_error_page(client, 'general_error', :error => e)
@@ -269,7 +302,7 @@ private
269
302
  Gem.clear_paths
270
303
  send_error_page(client, 'load_error', :error => e, :app_root => app_root,
271
304
  :app_name => app_name(app_type))
272
- elsif e.child_exception.nil?
305
+ elsif e.child_exception.is_a?(SystemExit)
273
306
  send_error_page(client, 'app_exited_during_initialization', :error => e,
274
307
  :app_root => app_root, :app_name => app_name(app_type))
275
308
  else
@@ -282,7 +315,8 @@ private
282
315
  if app
283
316
  begin
284
317
  client.write('ok')
285
- client.write(app.pid, app.listen_socket_name, app.using_abstract_namespace?)
318
+ client.write(app.pid, app.listen_socket_name,
319
+ app.listen_socket_type)
286
320
  client.send_io(app.owner_pipe)
287
321
  rescue Errno::EPIPE
288
322
  # The Apache module may be interrupted during a spawn command,
@@ -297,35 +331,9 @@ private
297
331
  reload(app_root)
298
332
  end
299
333
 
300
- def cleaner_thread_main
301
- @lock.synchronize do
302
- while true
303
- if @cond.timed_wait(@lock, SPAWNER_CLEAN_INTERVAL)
304
- break
305
- else
306
- current_time = Time.now
307
- @spawners.keys.each do |key|
308
- spawner = @spawners[key]
309
- if spawner.is_a?(Railz::FrameworkSpawner)
310
- max_idle_time = FRAMEWORK_SPAWNER_MAX_IDLE_TIME
311
- else
312
- max_idle_time = APP_SPAWNER_MAX_IDLE_TIME
313
- end
314
- if current_time - spawner.time > max_idle_time
315
- if spawner.started?
316
- spawner.stop
317
- end
318
- @spawners.delete(key)
319
- end
320
- end
321
- end
322
- end
323
- end
324
- end
325
-
326
334
  def send_error_page(channel, template_name, options = {})
327
- require 'passenger/html_template' unless defined?(HTMLTemplate)
328
- require 'passenger/platform_info' unless defined?(PlatformInfo)
335
+ require 'phusion_passenger/html_template' unless defined?(HTMLTemplate)
336
+ require 'phusion_passenger/platform_info' unless defined?(PlatformInfo)
329
337
  options["enterprisey"] = File.exist?("#{File.dirname(__FILE__)}/../../enterprisey.txt") ||
330
338
  File.exist?("/etc/passenger_enterprisey.txt")
331
339
  data = HTMLTemplate.new(template_name, options).result
@@ -359,4 +367,4 @@ private
359
367
  end
360
368
  end
361
369
 
362
- end # module Passenger
370
+ end # module PhusionPassenger
@@ -0,0 +1,38 @@
1
+ <% layout 'error_layout', :title => "#{@app_name} application could not be started" do %>
2
+ <h1 class="error_title"><%= @app_name %> application could not be started</h1>
3
+ <div id="content">
4
+
5
+ The application has exited during startup (i.e. during the evaluation of
6
+ <tt>config/environment.rb</tt>).
7
+ <% if @error.stderr %>
8
+ The error message can be found below. To solve this problem, please
9
+ follow any instructions in the error message.
10
+ <% else %>
11
+ The error message may have been written to the web server's log file.
12
+ Please check the <b>web server's</b> log file (i.e. <em>not</em> the
13
+ (Rails) application's log file) to find out why the application
14
+ exited.
15
+
16
+ <p>If that doesn't help, then please use the backtrace below to debug
17
+ the problem.</p>
18
+ <% end %>
19
+
20
+ <dl>
21
+ <% if @error.stderr %>
22
+ <dt>Error message:</dt>
23
+ <dd><%=h @error.stderr %></dd>
24
+ <% end %>
25
+
26
+ <dt>Application root:</dt>
27
+ <dd>
28
+ <tt class="filename"><%=h @app_root %></tt>
29
+ </dd>
30
+
31
+ <dt>Backtrace:</dt>
32
+ <dd>
33
+ <%= backtrace_html_for(@error.child_exception) %>
34
+ </dd>
35
+ </dl>
36
+
37
+ </div>
38
+ <% end %>