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
@@ -1,379 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html>
6
- <head>
7
- <title>Class: Passenger::SpawnManager</title>
8
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
-
11
- <script language="JavaScript" type="text/javascript">
12
- // <![CDATA[
13
-
14
- function toggleSource( id )
15
- {
16
- var elem
17
- var link
18
-
19
- if( document.getElementById )
20
- {
21
- elem = document.getElementById( id )
22
- link = document.getElementById( "l_" + id )
23
- }
24
- else if ( document.all )
25
- {
26
- elem = eval( "document.all." + id )
27
- link = eval( "document.all.l_" + id )
28
- }
29
- else
30
- return false;
31
-
32
- if( elem.style.display == "block" )
33
- {
34
- elem.style.display = "none"
35
- link.innerHTML = "show source"
36
- }
37
- else
38
- {
39
- elem.style.display = "block"
40
- link.innerHTML = "hide source"
41
- }
42
- }
43
-
44
- function openCode( url )
45
- {
46
- window.open( url, "SOURCE_CODE", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=480,width=750" ).focus();
47
- }
48
- // ]]>
49
- </script>
50
- </head>
51
-
52
- <body>
53
- <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
54
- <td class="file-title"><span class="file-title-prefix">Class</span><br />Passenger::SpawnManager</td>
55
- <td align="right">
56
- <table cellspacing="0" cellpadding="2">
57
- <tr valign="top">
58
- <td>In:</td>
59
- <td>
60
- <a href="../../files/lib/passenger/spawn_manager_rb.html">lib/passenger/spawn_manager.rb</a>
61
- </td>
62
- </tr>
63
- <tr>
64
- <td>Parent:</td>
65
- <td>
66
- <a href="AbstractServer.html">
67
- AbstractServer
68
- </a>
69
- </td>
70
- </tr>
71
- </table>
72
- </td>
73
- </tr>
74
- </table>
75
- <!-- banner header -->
76
-
77
- <div id="bodyContent">
78
- <div id="content">
79
-
80
- <div class="description"><p>
81
- The spawn manager is capable of spawning Ruby on Rails or Rack application
82
- instances. It acts like a simple fascade for the rest of the spawn manager
83
- system.
84
- </p>
85
- <p>
86
- <b>Note</b>: <a href="SpawnManager.html">SpawnManager</a> may only be
87
- started synchronously with <a
88
- href="AbstractServer.html#M000054">AbstractServer#start_synchronously</a>.
89
- Starting asynchronously has not been tested. Don&#8216;t forget to call <a
90
- href="SpawnManager.html#M000047">cleanup</a> after the server&#8216;s main
91
- loop has finished.
92
- </p>
93
- <h2>Ruby on Rails optimizations ===</h2>
94
- <p>
95
- Spawning a Ruby on Rails application is usually slow. But <a
96
- href="SpawnManager.html">SpawnManager</a> will preload and cache Ruby on
97
- Rails frameworks, as well as application code, so subsequent spawns will be
98
- very fast.
99
- </p>
100
- <p>
101
- Internally, <a href="SpawnManager.html">SpawnManager</a> uses
102
- Railz::FrameworkSpawner to preload and cache Ruby on Rails frameworks.
103
- Railz::FrameworkSpawner, in turn, uses Railz::ApplicationSpawner to preload
104
- and cache application code.
105
- </p>
106
- <p>
107
- In case you&#8216;re wondering why the namespace is &quot;Railz&quot; and
108
- not &quot;Rails&quot;: it&#8216;s to work around an obscure bug in
109
- ActiveSupport&#8216;s Dispatcher.
110
- </p>
111
- </div>
112
-
113
-
114
-
115
- <div class="sectiontitle">Methods</div>
116
- <ul>
117
- <li><a href="#M000047">cleanup</a></li>
118
- <li><a href="#M000044">new</a></li>
119
- <li><a href="#M000046">reload</a></li>
120
- <li><a href="#M000045">spawn_application</a></li>
121
- </ul>
122
-
123
- <div class="sectiontitle">Included Modules</div>
124
- <ul>
125
- <li><a href="Utils.html">Utils</a></li>
126
- </ul>
127
-
128
-
129
-
130
-
131
-
132
- <div class="sectiontitle">Public Class methods</div>
133
- <div class="method">
134
- <div class="title">
135
- <a name="M000044"></a><b>new</b>()
136
- </div>
137
- <div class="sourcecode">
138
- <p class="source-link">[ <a href="javascript:toggleSource('M000044_source')" id="l_M000044_source">show source</a> ]</p>
139
- <div id="M000044_source" class="dyn-source">
140
- <pre>
141
- <span class="ruby-comment cmt"># File lib/passenger/spawn_manager.rb, line 48</span>
142
- 48: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>
143
- 49: <span class="ruby-keyword kw">super</span>()
144
- 50: <span class="ruby-ivar">@spawners</span> = {}
145
- 51: <span class="ruby-ivar">@lock</span> = <span class="ruby-constant">Mutex</span>.<span class="ruby-identifier">new</span>
146
- 52: <span class="ruby-ivar">@cond</span> = <span class="ruby-constant">ConditionVariable</span>.<span class="ruby-identifier">new</span>
147
- 53: <span class="ruby-ivar">@cleaner_thread</span> = <span class="ruby-constant">Thread</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword kw">do</span>
148
- 54: <span class="ruby-identifier">cleaner_thread_main</span>
149
- 55: <span class="ruby-keyword kw">end</span>
150
- 56: <span class="ruby-identifier">define_message_handler</span>(<span class="ruby-identifier">:spawn_application</span>, <span class="ruby-identifier">:handle_spawn_application</span>)
151
- 57: <span class="ruby-identifier">define_message_handler</span>(<span class="ruby-identifier">:reload</span>, <span class="ruby-identifier">:handle_reload</span>)
152
- 58: <span class="ruby-identifier">define_signal_handler</span>(<span class="ruby-value str">'SIGHUP'</span>, <span class="ruby-identifier">:reload</span>)
153
- 59:
154
- 60: <span class="ruby-constant">GC</span>.<span class="ruby-identifier">start</span>
155
- 61: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">GC</span>.<span class="ruby-identifier">copy_on_write_friendly?</span>
156
- 62: <span class="ruby-comment cmt"># Preload libraries for copy-on-write semantics.</span>
157
- 63: <span class="ruby-identifier">require</span> <span class="ruby-value str">'base64'</span>
158
- 64: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/application'</span>
159
- 65: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/railz/framework_spawner'</span>
160
- 66: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/railz/application_spawner'</span>
161
- 67: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/rack/application_spawner'</span>
162
- 68: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/html_template'</span>
163
- 69: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/platform_info'</span>
164
- 70: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/exceptions'</span>
165
- 71:
166
- 72: <span class="ruby-comment cmt"># Commonly used libraries.</span>
167
- 73: [<span class="ruby-value str">'mysql'</span>, <span class="ruby-value str">'sqlite3'</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">lib</span><span class="ruby-operator">|</span>
168
- 74: <span class="ruby-keyword kw">begin</span>
169
- 75: <span class="ruby-identifier">require</span> <span class="ruby-identifier">lib</span>
170
- 76: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">LoadError</span>
171
- 77: <span class="ruby-comment cmt"># Do nothing; ignore if not present.</span>
172
- 78: <span class="ruby-keyword kw">end</span>
173
- 79: <span class="ruby-keyword kw">end</span>
174
- 80: <span class="ruby-keyword kw">end</span>
175
- 81: <span class="ruby-keyword kw">end</span>
176
- </pre>
177
- </div>
178
- </div>
179
- </div>
180
- <div class="sectiontitle">Public Instance methods</div>
181
- <div class="method">
182
- <div class="title">
183
- <a name="M000047"></a><b>cleanup</b>()
184
- </div>
185
- <div class="description">
186
- <p>
187
- Cleanup resources. Should be called when this <a
188
- href="SpawnManager.html">SpawnManager</a> is no longer needed.
189
- </p>
190
- </div>
191
- <div class="sourcecode">
192
- <p class="source-link">[ <a href="javascript:toggleSource('M000047_source')" id="l_M000047_source">show source</a> ]</p>
193
- <div id="M000047_source" class="dyn-source">
194
- <pre>
195
- <span class="ruby-comment cmt"># File lib/passenger/spawn_manager.rb, line 173</span>
196
- 173: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">cleanup</span>
197
- 174: <span class="ruby-ivar">@lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
198
- 175: <span class="ruby-ivar">@cond</span>.<span class="ruby-identifier">signal</span>
199
- 176: <span class="ruby-keyword kw">end</span>
200
- 177: <span class="ruby-ivar">@cleaner_thread</span>.<span class="ruby-identifier">join</span>
201
- 178: <span class="ruby-ivar">@lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
202
- 179: <span class="ruby-ivar">@spawners</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">spawner</span><span class="ruby-operator">|</span>
203
- 180: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">spawner</span>.<span class="ruby-identifier">started?</span>
204
- 181: <span class="ruby-identifier">spawner</span>.<span class="ruby-identifier">stop</span>
205
- 182: <span class="ruby-keyword kw">end</span>
206
- 183: <span class="ruby-keyword kw">end</span>
207
- 184: <span class="ruby-ivar">@spawners</span>.<span class="ruby-identifier">clear</span>
208
- 185: <span class="ruby-keyword kw">end</span>
209
- 186: <span class="ruby-keyword kw">end</span>
210
- </pre>
211
- </div>
212
- </div>
213
- </div>
214
- <div class="method">
215
- <div class="title">
216
- <a name="M000046"></a><b>reload</b>(app_root = nil)
217
- </div>
218
- <div class="description">
219
- <p>
220
- Remove the cached application instances at the given application root. If
221
- nil is specified as application root, then all cached application instances
222
- will be removed, no matter the application root.
223
- </p>
224
- <p>
225
- <b>Long description:</b> <a href="Application.html">Application</a> code
226
- might be cached in memory. But once it a while, it will be necessary to <a
227
- href="SpawnManager.html#M000046">reload</a> the code for an application,
228
- such as after deploying a <a href="SpawnManager.html#M000044">new</a>
229
- version of the application. This method makes sure that any cached
230
- application code is removed, so that the next time an application instance
231
- is spawned, the application code will be freshly loaded into memory.
232
- </p>
233
- <p>
234
- Raises AbstractServer::SpawnError if something went wrong.
235
- </p>
236
- </div>
237
- <div class="sourcecode">
238
- <p class="source-link">[ <a href="javascript:toggleSource('M000046_source')" id="l_M000046_source">show source</a> ]</p>
239
- <div id="M000046_source" class="dyn-source">
240
- <pre>
241
- <span class="ruby-comment cmt"># File lib/passenger/spawn_manager.rb, line 144</span>
242
- 144: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">reload</span>(<span class="ruby-identifier">app_root</span> = <span class="ruby-keyword kw">nil</span>)
243
- 145: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">app_root</span>
244
- 146: <span class="ruby-keyword kw">begin</span>
245
- 147: <span class="ruby-identifier">app_root</span> = <span class="ruby-identifier">normalize_path</span>(<span class="ruby-identifier">app_root</span>)
246
- 148: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">ArgumentError</span>
247
- 149: <span class="ruby-keyword kw">end</span>
248
- 150: <span class="ruby-keyword kw">end</span>
249
- 151: <span class="ruby-ivar">@lock</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
250
- 152: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">app_root</span>
251
- 153: <span class="ruby-comment cmt"># Delete associated ApplicationSpawner.</span>
252
- 154: <span class="ruby-identifier">key</span> = <span class="ruby-node">&quot;app:#{app_root}&quot;</span>
253
- 155: <span class="ruby-identifier">spawner</span> = <span class="ruby-ivar">@spawners</span>[<span class="ruby-identifier">key</span>]
254
- 156: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">spawner</span>
255
- 157: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">spawner</span>.<span class="ruby-identifier">started?</span>
256
- 158: <span class="ruby-identifier">spawner</span>.<span class="ruby-identifier">stop</span>
257
- 159: <span class="ruby-keyword kw">end</span>
258
- 160: <span class="ruby-ivar">@spawners</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>)
259
- 161: <span class="ruby-keyword kw">end</span>
260
- 162: <span class="ruby-keyword kw">end</span>
261
- 163: <span class="ruby-ivar">@spawners</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">spawner</span><span class="ruby-operator">|</span>
262
- 164: <span class="ruby-comment cmt"># Reload FrameworkSpawners.</span>
263
- 165: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">spawner</span>.<span class="ruby-identifier">respond_to?</span>(<span class="ruby-identifier">:reload</span>)
264
- 166: <span class="ruby-identifier">spawner</span>.<span class="ruby-identifier">reload</span>(<span class="ruby-identifier">app_root</span>)
265
- 167: <span class="ruby-keyword kw">end</span>
266
- 168: <span class="ruby-keyword kw">end</span>
267
- 169: <span class="ruby-keyword kw">end</span>
268
- 170: <span class="ruby-keyword kw">end</span>
269
- </pre>
270
- </div>
271
- </div>
272
- </div>
273
- <div class="method">
274
- <div class="title">
275
- <a name="M000045"></a><b>spawn_application</b>(app_root, lower_privilege = true, lowest_user = &quot;nobody&quot;, environment = &quot;production&quot;, spawn_method = &quot;smart&quot;, app_type = &quot;rails&quot;)
276
- </div>
277
- <div class="description">
278
- <p>
279
- Spawn a RoR application When successful, an <a
280
- href="Application.html">Application</a> object will be returned, which
281
- represents the spawned RoR application.
282
- </p>
283
- <p>
284
- See Railz::ApplicationSpawner.new for an explanation of the
285
- <tt>lower_privilege</tt>, <tt>lowest_user</tt> and <tt>environment</tt>
286
- parameters.
287
- </p>
288
- <p>
289
- The <tt>spawn_method</tt> argument may be one of &quot;smart&quot; or
290
- &quot;conservative&quot;. When &quot;smart&quot; is specified (the
291
- default), <a href="SpawnManager.html">SpawnManager</a> will internally
292
- cache the code of applications, in order to speed up future spawning
293
- attempts. This implies that, if you&#8216;ve changed the
294
- application&#8216;s code, you must do one of these things:
295
- </p>
296
- <ul>
297
- <li>Restart this <a href="SpawnManager.html">SpawnManager</a> by calling <a
298
- href="AbstractServer.html#M000055">AbstractServer#stop</a>, then <a
299
- href="AbstractServer.html#M000053">AbstractServer#start</a>.
300
-
301
- </li>
302
- <li>Reload the application by calling <a
303
- href="SpawnManager.html#M000046">reload</a> with the correct app_root
304
- argument.
305
-
306
- </li>
307
- </ul>
308
- <p>
309
- Caching however can be incompatible with some applications.
310
- </p>
311
- <p>
312
- The &quot;conservative&quot; spawning method does not involve any caching
313
- at all. Spawning will be slower, but is guaranteed to be compatible with
314
- all applications.
315
- </p>
316
- <p>
317
- Raises:
318
- </p>
319
- <ul>
320
- <li>ArgumentError: <tt>app_root</tt> doesn&#8216;t appear to be a valid Ruby on
321
- Rails application root.
322
-
323
- </li>
324
- <li><a href="VersionNotFound.html">VersionNotFound</a>: The Ruby on Rails
325
- framework version that the given application requires is not installed.
326
-
327
- </li>
328
- <li><a href="AbstractServer/ServerError.html">AbstractServer::ServerError</a>:
329
- One of the server processes exited unexpectedly.
330
-
331
- </li>
332
- <li><a href="FrameworkInitError.html">FrameworkInitError</a>: The Ruby on Rails
333
- framework that the application requires could not be loaded.
334
-
335
- </li>
336
- <li><a href="AppInitError.html">AppInitError</a>: The application raised an
337
- exception or called exit() during startup.
338
-
339
- </li>
340
- </ul>
341
- </div>
342
- <div class="sourcecode">
343
- <p class="source-link">[ <a href="javascript:toggleSource('M000045_source')" id="l_M000045_source">show source</a> ]</p>
344
- <div id="M000045_source" class="dyn-source">
345
- <pre>
346
- <span class="ruby-comment cmt"># File lib/passenger/spawn_manager.rb, line 107</span>
347
- 107: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">spawn_application</span>(<span class="ruby-identifier">app_root</span>, <span class="ruby-identifier">lower_privilege</span> = <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">lowest_user</span> = <span class="ruby-value str">&quot;nobody&quot;</span>,
348
- 108: <span class="ruby-identifier">environment</span> = <span class="ruby-value str">&quot;production&quot;</span>, <span class="ruby-identifier">spawn_method</span> = <span class="ruby-value str">&quot;smart&quot;</span>,
349
- 109: <span class="ruby-identifier">app_type</span> = <span class="ruby-value str">&quot;rails&quot;</span>)
350
- 110: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">app_type</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;rack&quot;</span>
351
- 111: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-keyword kw">defined?</span>(<span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">ApplicationSpawner</span>)
352
- 112: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/rack/application_spawner'</span>
353
- 113: <span class="ruby-keyword kw">end</span>
354
- 114: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">ApplicationSpawner</span>.<span class="ruby-identifier">spawn_application</span>(<span class="ruby-identifier">app_root</span>,
355
- 115: <span class="ruby-identifier">lower_privilege</span>, <span class="ruby-identifier">lowest_user</span>, <span class="ruby-identifier">environment</span>)
356
- 116: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">app_type</span> <span class="ruby-operator">==</span> <span class="ruby-value str">&quot;wsgi&quot;</span>
357
- 117: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/wsgi/application_spawner'</span>
358
- 118: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">WSGI</span><span class="ruby-operator">::</span><span class="ruby-constant">ApplicationSpawner</span>.<span class="ruby-identifier">spawn_application</span>(<span class="ruby-identifier">app_root</span>,
359
- 119: <span class="ruby-identifier">lower_privilege</span>, <span class="ruby-identifier">lowest_user</span>, <span class="ruby-identifier">environment</span>)
360
- 120: <span class="ruby-keyword kw">else</span>
361
- 121: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-keyword kw">defined?</span>(<span class="ruby-constant">Railz</span><span class="ruby-operator">::</span><span class="ruby-constant">FrameworkSpawner</span>)
362
- 122: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/application'</span>
363
- 123: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/railz/framework_spawner'</span>
364
- 124: <span class="ruby-identifier">require</span> <span class="ruby-value str">'passenger/railz/application_spawner'</span>
365
- 125: <span class="ruby-keyword kw">end</span>
366
- 126: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">spawn_rails_application</span>(<span class="ruby-identifier">app_root</span>, <span class="ruby-identifier">lower_privilege</span>, <span class="ruby-identifier">lowest_user</span>,
367
- 127: <span class="ruby-identifier">environment</span>, <span class="ruby-identifier">spawn_method</span>)
368
- 128: <span class="ruby-keyword kw">end</span>
369
- 129: <span class="ruby-keyword kw">end</span>
370
- </pre>
371
- </div>
372
- </div>
373
- </div>
374
- </div>
375
-
376
- </div>
377
-
378
- </body>
379
- </html>
@@ -1,578 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html>
6
- <head>
7
- <title>Module: Passenger::Utils</title>
8
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
9
- <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
10
-
11
- <script language="JavaScript" type="text/javascript">
12
- // <![CDATA[
13
-
14
- function toggleSource( id )
15
- {
16
- var elem
17
- var link
18
-
19
- if( document.getElementById )
20
- {
21
- elem = document.getElementById( id )
22
- link = document.getElementById( "l_" + id )
23
- }
24
- else if ( document.all )
25
- {
26
- elem = eval( "document.all." + id )
27
- link = eval( "document.all.l_" + id )
28
- }
29
- else
30
- return false;
31
-
32
- if( elem.style.display == "block" )
33
- {
34
- elem.style.display = "none"
35
- link.innerHTML = "show source"
36
- }
37
- else
38
- {
39
- elem.style.display = "block"
40
- link.innerHTML = "hide source"
41
- }
42
- }
43
-
44
- function openCode( url )
45
- {
46
- window.open( url, "SOURCE_CODE", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=480,width=750" ).focus();
47
- }
48
- // ]]>
49
- </script>
50
- </head>
51
-
52
- <body>
53
- <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
54
- <td class="file-title"><span class="file-title-prefix">Module</span><br />Passenger::Utils</td>
55
- <td align="right">
56
- <table cellspacing="0" cellpadding="2">
57
- <tr valign="top">
58
- <td>In:</td>
59
- <td>
60
- <a href="../../files/lib/passenger/utils_rb.html">lib/passenger/utils.rb</a>
61
- </td>
62
- </tr>
63
- </table>
64
- </td>
65
- </tr>
66
- </table>
67
- <!-- banner header -->
68
-
69
- <div id="bodyContent">
70
- <div id="content">
71
-
72
- <div class="description"><p>
73
- Utility functions.
74
- </p>
75
- </div>
76
-
77
-
78
-
79
- <div class="sectiontitle">Methods</div>
80
- <ul>
81
- <li><a href="#M000015">assert_valid_app_root</a></li>
82
- <li><a href="#M000016">assert_valid_directory</a></li>
83
- <li><a href="#M000017">assert_valid_file</a></li>
84
- <li><a href="#M000019">assert_valid_groupname</a></li>
85
- <li><a href="#M000018">assert_valid_username</a></li>
86
- <li><a href="#M000020">close_all_io_objects_for_fds</a></li>
87
- <li><a href="#M000027">lower_privilege</a></li>
88
- <li><a href="#M000021">marshal_exception</a></li>
89
- <li><a href="#M000014">normalize_path</a></li>
90
- <li><a href="#M000023">print_exception</a></li>
91
- <li><a href="#M000025">report_app_init_status</a></li>
92
- <li><a href="#M000024">safe_fork</a></li>
93
- <li><a href="#M000028">switch_to_user</a></li>
94
- <li><a href="#M000026">unmarshal_and_raise_errors</a></li>
95
- <li><a href="#M000022">unmarshal_exception</a></li>
96
- </ul>
97
-
98
-
99
-
100
-
101
-
102
-
103
- <div class="sectiontitle">Protected Instance methods</div>
104
- <div class="method">
105
- <div class="title">
106
- <a name="M000015"></a><b>assert_valid_app_root</b>(app_root)
107
- </div>
108
- <div class="description">
109
- <p>
110
- Assert that <tt>app_root</tt> is a valid Ruby on Rails application root.
111
- Raises ArgumentError if that is not the case.
112
- </p>
113
- </div>
114
- <div class="sourcecode">
115
- <p class="source-link">[ <a href="javascript:toggleSource('M000015_source')" id="l_M000015_source">show source</a> ]</p>
116
- <div id="M000015_source" class="dyn-source">
117
- <pre>
118
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 51</span>
119
- 51: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">assert_valid_app_root</span>(<span class="ruby-identifier">app_root</span>)
120
- 52: <span class="ruby-identifier">assert_valid_directory</span>(<span class="ruby-identifier">app_root</span>)
121
- 53: <span class="ruby-identifier">assert_valid_file</span>(<span class="ruby-node">&quot;#{app_root}/config/environment.rb&quot;</span>)
122
- 54: <span class="ruby-keyword kw">end</span>
123
- </pre>
124
- </div>
125
- </div>
126
- </div>
127
- <div class="method">
128
- <div class="title">
129
- <a name="M000016"></a><b>assert_valid_directory</b>(path)
130
- </div>
131
- <div class="description">
132
- <p>
133
- Assert that <tt>path</tt> is a directory. Raises <tt>ArgumentError</tt> if
134
- it isn&#8216;t.
135
- </p>
136
- </div>
137
- <div class="sourcecode">
138
- <p class="source-link">[ <a href="javascript:toggleSource('M000016_source')" id="l_M000016_source">show source</a> ]</p>
139
- <div id="M000016_source" class="dyn-source">
140
- <pre>
141
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 57</span>
142
- 57: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">assert_valid_directory</span>(<span class="ruby-identifier">path</span>)
143
- 58: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span>(<span class="ruby-identifier">path</span>)
144
- 59: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">&quot;'#{path}' is not a valid directory.&quot;</span>
145
- 60: <span class="ruby-keyword kw">end</span>
146
- 61: <span class="ruby-keyword kw">end</span>
147
- </pre>
148
- </div>
149
- </div>
150
- </div>
151
- <div class="method">
152
- <div class="title">
153
- <a name="M000017"></a><b>assert_valid_file</b>(path)
154
- </div>
155
- <div class="description">
156
- <p>
157
- Assert that <tt>path</tt> is a file. Raises <tt>ArgumentError</tt> if it
158
- isn&#8216;t.
159
- </p>
160
- </div>
161
- <div class="sourcecode">
162
- <p class="source-link">[ <a href="javascript:toggleSource('M000017_source')" id="l_M000017_source">show source</a> ]</p>
163
- <div id="M000017_source" class="dyn-source">
164
- <pre>
165
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 64</span>
166
- 64: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">assert_valid_file</span>(<span class="ruby-identifier">path</span>)
167
- 65: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-constant">File</span>.<span class="ruby-identifier">file?</span>(<span class="ruby-identifier">path</span>)
168
- 66: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">&quot;'#{path}' is not a valid file.&quot;</span>
169
- 67: <span class="ruby-keyword kw">end</span>
170
- 68: <span class="ruby-keyword kw">end</span>
171
- </pre>
172
- </div>
173
- </div>
174
- </div>
175
- <div class="method">
176
- <div class="title">
177
- <a name="M000019"></a><b>assert_valid_groupname</b>(groupname)
178
- </div>
179
- <div class="description">
180
- <p>
181
- Assert that <tt>groupname</tt> is a valid group name. Raises ArgumentError
182
- if that is not the case.
183
- </p>
184
- </div>
185
- <div class="sourcecode">
186
- <p class="source-link">[ <a href="javascript:toggleSource('M000019_source')" id="l_M000019_source">show source</a> ]</p>
187
- <div id="M000019_source" class="dyn-source">
188
- <pre>
189
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 79</span>
190
- 79: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">assert_valid_groupname</span>(<span class="ruby-identifier">groupname</span>)
191
- 80: <span class="ruby-comment cmt"># If groupname does not exist then getgrnam() will raise an ArgumentError.</span>
192
- 81: <span class="ruby-identifier">groupname</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">Etc</span>.<span class="ruby-identifier">getgrnam</span>(<span class="ruby-identifier">groupname</span>)
193
- 82: <span class="ruby-keyword kw">end</span>
194
- </pre>
195
- </div>
196
- </div>
197
- </div>
198
- <div class="method">
199
- <div class="title">
200
- <a name="M000018"></a><b>assert_valid_username</b>(username)
201
- </div>
202
- <div class="description">
203
- <p>
204
- Assert that <tt>username</tt> is a valid username. Raises ArgumentError if
205
- that is not the case.
206
- </p>
207
- </div>
208
- <div class="sourcecode">
209
- <p class="source-link">[ <a href="javascript:toggleSource('M000018_source')" id="l_M000018_source">show source</a> ]</p>
210
- <div id="M000018_source" class="dyn-source">
211
- <pre>
212
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 72</span>
213
- 72: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">assert_valid_username</span>(<span class="ruby-identifier">username</span>)
214
- 73: <span class="ruby-comment cmt"># If username does not exist then getpwnam() will raise an ArgumentError.</span>
215
- 74: <span class="ruby-identifier">username</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">Etc</span>.<span class="ruby-identifier">getpwnam</span>(<span class="ruby-identifier">username</span>)
216
- 75: <span class="ruby-keyword kw">end</span>
217
- </pre>
218
- </div>
219
- </div>
220
- </div>
221
- <div class="method">
222
- <div class="title">
223
- <a name="M000020"></a><b>close_all_io_objects_for_fds</b>(file_descriptors_to_leave_open)
224
- </div>
225
- <div class="sourcecode">
226
- <p class="source-link">[ <a href="javascript:toggleSource('M000020_source')" id="l_M000020_source">show source</a> ]</p>
227
- <div id="M000020_source" class="dyn-source">
228
- <pre>
229
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 84</span>
230
- 84: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">close_all_io_objects_for_fds</span>(<span class="ruby-identifier">file_descriptors_to_leave_open</span>)
231
- 85: <span class="ruby-constant">ObjectSpace</span>.<span class="ruby-identifier">each_object</span>(<span class="ruby-constant">IO</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">io</span><span class="ruby-operator">|</span>
232
- 86: <span class="ruby-keyword kw">begin</span>
233
- 87: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">file_descriptors_to_leave_open</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">io</span>.<span class="ruby-identifier">fileno</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">io</span>.<span class="ruby-identifier">closed?</span>
234
- 88: <span class="ruby-identifier">io</span>.<span class="ruby-identifier">close</span>
235
- 89: <span class="ruby-keyword kw">end</span>
236
- 90: <span class="ruby-keyword kw">rescue</span>
237
- 91: <span class="ruby-keyword kw">end</span>
238
- 92: <span class="ruby-keyword kw">end</span>
239
- 93: <span class="ruby-keyword kw">end</span>
240
- </pre>
241
- </div>
242
- </div>
243
- </div>
244
- <div class="method">
245
- <div class="title">
246
- <a name="M000027"></a><b>lower_privilege</b>(filename, lowest_user = &quot;nobody&quot;)
247
- </div>
248
- <div class="description">
249
- <p>
250
- Lower the current process&#8216;s privilege to the owner of the given file.
251
- No exceptions will be raised in the event that privilege lowering fails.
252
- </p>
253
- </div>
254
- <div class="sourcecode">
255
- <p class="source-link">[ <a href="javascript:toggleSource('M000027_source')" id="l_M000027_source">show source</a> ]</p>
256
- <div id="M000027_source" class="dyn-source">
257
- <pre>
258
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 225</span>
259
- 225: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">lower_privilege</span>(<span class="ruby-identifier">filename</span>, <span class="ruby-identifier">lowest_user</span> = <span class="ruby-value str">&quot;nobody&quot;</span>)
260
- 226: <span class="ruby-identifier">stat</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">lstat</span>(<span class="ruby-identifier">filename</span>)
261
- 227: <span class="ruby-keyword kw">begin</span>
262
- 228: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">switch_to_user</span>(<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">uid</span>)
263
- 229: <span class="ruby-identifier">switch_to_user</span>(<span class="ruby-identifier">lowest_user</span>)
264
- 230: <span class="ruby-keyword kw">end</span>
265
- 231: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EPERM</span>
266
- 232: <span class="ruby-comment cmt"># No problem if we were unable to switch user.</span>
267
- 233: <span class="ruby-keyword kw">end</span>
268
- 234: <span class="ruby-keyword kw">end</span>
269
- </pre>
270
- </div>
271
- </div>
272
- </div>
273
- <div class="method">
274
- <div class="title">
275
- <a name="M000021"></a><b>marshal_exception</b>(exception)
276
- </div>
277
- <div class="sourcecode">
278
- <p class="source-link">[ <a href="javascript:toggleSource('M000021_source')" id="l_M000021_source">show source</a> ]</p>
279
- <div id="M000021_source" class="dyn-source">
280
- <pre>
281
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 95</span>
282
- 95: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">marshal_exception</span>(<span class="ruby-identifier">exception</span>)
283
- 96: <span class="ruby-identifier">data</span> = {
284
- 97: <span class="ruby-identifier">:message</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">message</span>,
285
- 98: <span class="ruby-identifier">:class</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">to_s</span>,
286
- 99: <span class="ruby-identifier">:backtrace</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">backtrace</span>
287
- 100: }
288
- 101: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">InitializationError</span>)
289
- 102: <span class="ruby-identifier">data</span>[<span class="ruby-identifier">:is_initialization_error</span>] = <span class="ruby-keyword kw">true</span>
290
- 103: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">child_exception</span>
291
- 104: <span class="ruby-identifier">data</span>[<span class="ruby-identifier">:child_exception</span>] = <span class="ruby-identifier">marshal_exception</span>(<span class="ruby-identifier">exception</span>.<span class="ruby-identifier">child_exception</span>)
292
- 105: <span class="ruby-keyword kw">end</span>
293
- 106: <span class="ruby-keyword kw">else</span>
294
- 107: <span class="ruby-keyword kw">begin</span>
295
- 108: <span class="ruby-identifier">data</span>[<span class="ruby-identifier">:exception</span>] = <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">exception</span>)
296
- 109: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-constant">TypeError</span>
297
- 110: <span class="ruby-identifier">e</span> = <span class="ruby-constant">UnknownError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">exception</span>.<span class="ruby-identifier">message</span>, <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">to_s</span>,
298
- 111: <span class="ruby-identifier">exception</span>.<span class="ruby-identifier">backtrace</span>)
299
- 112: <span class="ruby-identifier">data</span>[<span class="ruby-identifier">:exception</span>] = <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">e</span>)
300
- 113: <span class="ruby-keyword kw">end</span>
301
- 114: <span class="ruby-keyword kw">end</span>
302
- 115: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">data</span>)
303
- 116: <span class="ruby-keyword kw">end</span>
304
- </pre>
305
- </div>
306
- </div>
307
- </div>
308
- <div class="method">
309
- <div class="title">
310
- <a name="M000014"></a><b>normalize_path</b>(path)
311
- </div>
312
- <div class="description">
313
- <p>
314
- Return the absolute version of <tt>path</tt>. This path is guaranteed to to
315
- be &quot;normal&quot;, i.e. it doesn&#8216;t contain stuff like
316
- &quot;..&quot; or &quot;/&quot;, and it correctly respects symbolic links.
317
- </p>
318
- <p>
319
- Raises SystemCallError if something went wrong. Raises ArgumentError if
320
- <tt>path</tt> is nil.
321
- </p>
322
- </div>
323
- <div class="sourcecode">
324
- <p class="source-link">[ <a href="javascript:toggleSource('M000014_source')" id="l_M000014_source">show source</a> ]</p>
325
- <div id="M000014_source" class="dyn-source">
326
- <pre>
327
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 42</span>
328
- 42: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">normalize_path</span>(<span class="ruby-identifier">path</span>)
329
- 43: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-value str">&quot;The 'path' argument may not be nil&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">nil?</span>
330
- 44: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">Pathname</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">path</span>).<span class="ruby-identifier">realpath</span>.<span class="ruby-identifier">to_s</span>
331
- 45: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ENOENT</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
332
- 46: <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-identifier">e</span>.<span class="ruby-identifier">message</span>
333
- 47: <span class="ruby-keyword kw">end</span>
334
- </pre>
335
- </div>
336
- </div>
337
- </div>
338
- <div class="method">
339
- <div class="title">
340
- <a name="M000023"></a><b>print_exception</b>(current_location, exception)
341
- </div>
342
- <div class="description">
343
- <p>
344
- Print the given exception, including the stack trace, to STDERR.
345
- </p>
346
- <p>
347
- <tt>current_location</tt> is a string which describes where the code is
348
- currently at. Usually the current class name will be enough.
349
- </p>
350
- </div>
351
- <div class="sourcecode">
352
- <p class="source-link">[ <a href="javascript:toggleSource('M000023_source')" id="l_M000023_source">show source</a> ]</p>
353
- <div id="M000023_source" class="dyn-source">
354
- <pre>
355
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 149</span>
356
- 149: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">print_exception</span>(<span class="ruby-identifier">current_location</span>, <span class="ruby-identifier">exception</span>)
357
- 150: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">exception</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">SystemExit</span>)
358
- 151: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span>(<span class="ruby-identifier">exception</span>.<span class="ruby-identifier">backtrace_string</span>(<span class="ruby-identifier">current_location</span>))
359
- 152: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">flush</span>
360
- 153: <span class="ruby-keyword kw">end</span>
361
- 154: <span class="ruby-keyword kw">end</span>
362
- </pre>
363
- </div>
364
- </div>
365
- </div>
366
- <div class="method">
367
- <div class="title">
368
- <a name="M000025"></a><b>report_app_init_status</b>(channel) {|| ...}
369
- </div>
370
- <div class="description">
371
- <p>
372
- Run the given block. A message will be sent through <tt>channel</tt> (a <a
373
- href="MessageChannel.html">MessageChannel</a> object), telling the remote
374
- side whether the block raised an exception, called exit(), or succeeded.
375
- Returns whether the block succeeded. Exceptions are not propagated, except
376
- for SystemExit.
377
- </p>
378
- </div>
379
- <div class="sourcecode">
380
- <p class="source-link">[ <a href="javascript:toggleSource('M000025_source')" id="l_M000025_source">show source</a> ]</p>
381
- <div id="M000025_source" class="dyn-source">
382
- <pre>
383
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 177</span>
384
- 177: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">report_app_init_status</span>(<span class="ruby-identifier">channel</span>)
385
- 178: <span class="ruby-keyword kw">begin</span>
386
- 179: <span class="ruby-keyword kw">yield</span>
387
- 180: <span class="ruby-identifier">channel</span>.<span class="ruby-identifier">write</span>(<span class="ruby-value str">'success'</span>)
388
- 181: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
389
- 182: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">StandardError</span>, <span class="ruby-constant">ScriptError</span>, <span class="ruby-constant">NoMemoryError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
390
- 183: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">ENV</span>[<span class="ruby-value str">'TESTING_PASSENGER'</span>] <span class="ruby-operator">==</span> <span class="ruby-value str">'1'</span>
391
- 184: <span class="ruby-identifier">print_exception</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">class</span>.<span class="ruby-identifier">to_s</span>, <span class="ruby-identifier">e</span>)
392
- 185: <span class="ruby-keyword kw">end</span>
393
- 186: <span class="ruby-identifier">channel</span>.<span class="ruby-identifier">write</span>(<span class="ruby-value str">'exception'</span>)
394
- 187: <span class="ruby-identifier">channel</span>.<span class="ruby-identifier">write_scalar</span>(<span class="ruby-identifier">marshal_exception</span>(<span class="ruby-identifier">e</span>))
395
- 188: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
396
- 189: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">SystemExit</span>
397
- 190: <span class="ruby-identifier">channel</span>.<span class="ruby-identifier">write</span>(<span class="ruby-value str">'exit'</span>)
398
- 191: <span class="ruby-identifier">raise</span>
399
- 192: <span class="ruby-keyword kw">end</span>
400
- 193: <span class="ruby-keyword kw">end</span>
401
- </pre>
402
- </div>
403
- </div>
404
- </div>
405
- <div class="method">
406
- <div class="title">
407
- <a name="M000024"></a><b>safe_fork</b>(current_location) {|| ...}
408
- </div>
409
- <div class="description">
410
- <p>
411
- Fork a new process and run the given block inside the child process, just
412
- like fork(). Unlike fork(), this method is safe, i.e. there&#8216;s no way
413
- for the child process to escape the block. Any uncaught exceptions in the
414
- child process will be printed to standard output, citing
415
- <em>current_location</em> as the source.
416
- </p>
417
- </div>
418
- <div class="sourcecode">
419
- <p class="source-link">[ <a href="javascript:toggleSource('M000024_source')" id="l_M000024_source">show source</a> ]</p>
420
- <div id="M000024_source" class="dyn-source">
421
- <pre>
422
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 160</span>
423
- 160: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">safe_fork</span>(<span class="ruby-identifier">current_location</span>)
424
- 161: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">fork</span> <span class="ruby-keyword kw">do</span>
425
- 162: <span class="ruby-keyword kw">begin</span>
426
- 163: <span class="ruby-keyword kw">yield</span>
427
- 164: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Exception</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
428
- 165: <span class="ruby-identifier">print_exception</span>(<span class="ruby-identifier">current_location</span>, <span class="ruby-identifier">e</span>)
429
- 166: <span class="ruby-keyword kw">ensure</span>
430
- 167: <span class="ruby-identifier">exit!</span>
431
- 168: <span class="ruby-keyword kw">end</span>
432
- 169: <span class="ruby-keyword kw">end</span>
433
- 170: <span class="ruby-keyword kw">end</span>
434
- </pre>
435
- </div>
436
- </div>
437
- </div>
438
- <div class="method">
439
- <div class="title">
440
- <a name="M000028"></a><b>switch_to_user</b>(user)
441
- </div>
442
- <div class="sourcecode">
443
- <p class="source-link">[ <a href="javascript:toggleSource('M000028_source')" id="l_M000028_source">show source</a> ]</p>
444
- <div id="M000028_source" class="dyn-source">
445
- <pre>
446
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 236</span>
447
- 236: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">switch_to_user</span>(<span class="ruby-identifier">user</span>)
448
- 237: <span class="ruby-keyword kw">begin</span>
449
- 238: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">user</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">String</span>)
450
- 239: <span class="ruby-identifier">pw</span> = <span class="ruby-constant">Etc</span>.<span class="ruby-identifier">getpwnam</span>(<span class="ruby-identifier">user</span>)
451
- 240: <span class="ruby-identifier">username</span> = <span class="ruby-identifier">user</span>
452
- 241: <span class="ruby-identifier">uid</span> = <span class="ruby-identifier">pw</span>.<span class="ruby-identifier">uid</span>
453
- 242: <span class="ruby-identifier">gid</span> = <span class="ruby-identifier">pw</span>.<span class="ruby-identifier">gid</span>
454
- 243: <span class="ruby-keyword kw">else</span>
455
- 244: <span class="ruby-identifier">pw</span> = <span class="ruby-constant">Etc</span>.<span class="ruby-identifier">getpwuid</span>(<span class="ruby-identifier">user</span>)
456
- 245: <span class="ruby-identifier">username</span> = <span class="ruby-identifier">pw</span>.<span class="ruby-identifier">name</span>
457
- 246: <span class="ruby-identifier">uid</span> = <span class="ruby-identifier">user</span>
458
- 247: <span class="ruby-identifier">gid</span> = <span class="ruby-identifier">pw</span>.<span class="ruby-identifier">gid</span>
459
- 248: <span class="ruby-keyword kw">end</span>
460
- 249: <span class="ruby-keyword kw">rescue</span>
461
- 250: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
462
- 251: <span class="ruby-keyword kw">end</span>
463
- 252: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">uid</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
464
- 253: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
465
- 254: <span class="ruby-keyword kw">else</span>
466
- 255: <span class="ruby-comment cmt"># Some systems are broken. initgroups can fail because of</span>
467
- 256: <span class="ruby-comment cmt"># all kinds of stupid reasons. So we ignore any errors</span>
468
- 257: <span class="ruby-comment cmt"># raised by initgroups.</span>
469
- 258: <span class="ruby-keyword kw">begin</span>
470
- 259: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">groups</span> = <span class="ruby-constant">Process</span>.<span class="ruby-identifier">initgroups</span>(<span class="ruby-identifier">username</span>, <span class="ruby-identifier">gid</span>)
471
- 260: <span class="ruby-keyword kw">rescue</span>
472
- 261: <span class="ruby-keyword kw">end</span>
473
- 262: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-constant">Sys</span>.<span class="ruby-identifier">setgid</span>(<span class="ruby-identifier">gid</span>)
474
- 263: <span class="ruby-constant">Process</span><span class="ruby-operator">::</span><span class="ruby-constant">Sys</span>.<span class="ruby-identifier">setuid</span>(<span class="ruby-identifier">uid</span>)
475
- 264: <span class="ruby-constant">ENV</span>[<span class="ruby-value str">'HOME'</span>] = <span class="ruby-identifier">pw</span>.<span class="ruby-identifier">dir</span>
476
- 265: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
477
- 266: <span class="ruby-keyword kw">end</span>
478
- 267: <span class="ruby-keyword kw">end</span>
479
- </pre>
480
- </div>
481
- </div>
482
- </div>
483
- <div class="method">
484
- <div class="title">
485
- <a name="M000026"></a><b>unmarshal_and_raise_errors</b>(channel, app_type = &quot;rails&quot;)
486
- </div>
487
- <div class="description">
488
- <p>
489
- Receive status information that was sent to <tt>channel</tt> by <a
490
- href="Utils.html#M000025">report_app_init_status</a>. If an error occured
491
- according to the received information, then an appropriate exception will
492
- be raised.
493
- </p>
494
- <p>
495
- Raises:
496
- </p>
497
- <ul>
498
- <li><a href="AppInitError.html">AppInitError</a>
499
-
500
- </li>
501
- <li>IOError, SystemCallError, SocketError
502
-
503
- </li>
504
- </ul>
505
- </div>
506
- <div class="sourcecode">
507
- <p class="source-link">[ <a href="javascript:toggleSource('M000026_source')" id="l_M000026_source">show source</a> ]</p>
508
- <div id="M000026_source" class="dyn-source">
509
- <pre>
510
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 203</span>
511
- 203: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unmarshal_and_raise_errors</span>(<span class="ruby-identifier">channel</span>, <span class="ruby-identifier">app_type</span> = <span class="ruby-value str">&quot;rails&quot;</span>)
512
- 204: <span class="ruby-identifier">args</span> = <span class="ruby-identifier">channel</span>.<span class="ruby-identifier">read</span>
513
- 205: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">nil?</span>
514
- 206: <span class="ruby-identifier">raise</span> <span class="ruby-constant">EOFError</span>, <span class="ruby-value str">&quot;Unexpected end-of-file detected.&quot;</span>
515
- 207: <span class="ruby-keyword kw">end</span>
516
- 208: <span class="ruby-identifier">status</span> = <span class="ruby-identifier">args</span>[<span class="ruby-value">0</span>]
517
- 209: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'exception'</span>
518
- 210: <span class="ruby-identifier">child_exception</span> = <span class="ruby-identifier">unmarshal_exception</span>(<span class="ruby-identifier">channel</span>.<span class="ruby-identifier">read_scalar</span>)
519
- 211: <span class="ruby-comment cmt">#print_exception(self.class.to_s, child_exception)</span>
520
- 212: <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppInitError</span>.<span class="ruby-identifier">new</span>(
521
- 213: <span class="ruby-node">&quot;Application '#{@app_root}' raised an exception: &quot;</span> <span class="ruby-operator">&lt;&lt;</span>
522
- 214: <span class="ruby-node">&quot;#{child_exception.class} (#{child_exception.message})&quot;</span>,
523
- 215: <span class="ruby-identifier">child_exception</span>,
524
- 216: <span class="ruby-identifier">app_type</span>)
525
- 217: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">status</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'exit'</span>
526
- 218: <span class="ruby-identifier">raise</span> <span class="ruby-constant">AppInitError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-node">&quot;Application '#{@app_root}' exited during startup&quot;</span>,
527
- 219: <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">app_type</span>)
528
- 220: <span class="ruby-keyword kw">end</span>
529
- 221: <span class="ruby-keyword kw">end</span>
530
- </pre>
531
- </div>
532
- </div>
533
- </div>
534
- <div class="method">
535
- <div class="title">
536
- <a name="M000022"></a><b>unmarshal_exception</b>(data)
537
- </div>
538
- <div class="sourcecode">
539
- <p class="source-link">[ <a href="javascript:toggleSource('M000022_source')" id="l_M000022_source">show source</a> ]</p>
540
- <div id="M000022_source" class="dyn-source">
541
- <pre>
542
- <span class="ruby-comment cmt"># File lib/passenger/utils.rb, line 118</span>
543
- 118: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">unmarshal_exception</span>(<span class="ruby-identifier">data</span>)
544
- 119: <span class="ruby-identifier">hash</span> = <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">data</span>)
545
- 120: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:is_initialization_error</span>]
546
- 121: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:child_exception</span>]
547
- 122: <span class="ruby-identifier">child_exception</span> = <span class="ruby-identifier">unmarshal_exception</span>(<span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:child_exception</span>])
548
- 123: <span class="ruby-keyword kw">else</span>
549
- 124: <span class="ruby-identifier">child_exception</span> = <span class="ruby-keyword kw">nil</span>
550
- 125: <span class="ruby-keyword kw">end</span>
551
- 126:
552
- 127: <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:class</span>]
553
- 128: <span class="ruby-keyword kw">when</span> <span class="ruby-constant">AppInitError</span>.<span class="ruby-identifier">to_s</span>
554
- 129: <span class="ruby-identifier">exception_class</span> = <span class="ruby-constant">AppInitError</span>
555
- 130: <span class="ruby-keyword kw">when</span> <span class="ruby-constant">FrameworkInitError</span>.<span class="ruby-identifier">to_s</span>
556
- 131: <span class="ruby-identifier">exception_class</span> = <span class="ruby-constant">FrameworkInitError</span>
557
- 132: <span class="ruby-keyword kw">else</span>
558
- 133: <span class="ruby-identifier">exception_class</span> = <span class="ruby-constant">InitializationError</span>
559
- 134: <span class="ruby-keyword kw">end</span>
560
- 135: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">exception_class</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:message</span>], <span class="ruby-identifier">child_exception</span>)
561
- 136: <span class="ruby-keyword kw">else</span>
562
- 137: <span class="ruby-keyword kw">begin</span>
563
- 138: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">Marshal</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:exception</span>])
564
- 139: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-constant">TypeError</span>
565
- 140: <span class="ruby-keyword kw">return</span> <span class="ruby-constant">UnknownError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:message</span>], <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:class</span>], <span class="ruby-identifier">hash</span>[<span class="ruby-identifier">:backtrace</span>])
566
- 141: <span class="ruby-keyword kw">end</span>
567
- 142: <span class="ruby-keyword kw">end</span>
568
- 143: <span class="ruby-keyword kw">end</span>
569
- </pre>
570
- </div>
571
- </div>
572
- </div>
573
- </div>
574
-
575
- </div>
576
-
577
- </body>
578
- </html>