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
@@ -17,12 +17,16 @@
17
17
  * with this program; if not, write to the Free Software Foundation, Inc.,
18
18
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
19
  */
20
- #include <apr_strings.h>
21
20
  #include <algorithm>
22
21
  #include <cstdlib>
23
22
  #include "Configuration.h"
24
23
  #include "Utils.h"
25
24
 
25
+ /* The APR headers must come after the Passenger headers. See Hooks.cpp
26
+ * to learn why.
27
+ */
28
+ #include <apr_strings.h>
29
+
26
30
  using namespace Passenger;
27
31
 
28
32
  extern "C" module AP_MODULE_DECLARE_DATA passenger_module;
@@ -58,13 +62,27 @@ extern "C" {
58
62
  void *
59
63
  passenger_config_create_dir(apr_pool_t *p, char *dirspec) {
60
64
  DirConfig *config = create_dir_config_struct(p);
65
+ config->enabled = DirConfig::UNSET;
61
66
  config->autoDetectRails = DirConfig::UNSET;
62
67
  config->autoDetectRack = DirConfig::UNSET;
63
68
  config->autoDetectWSGI = DirConfig::UNSET;
64
69
  config->allowModRewrite = DirConfig::UNSET;
65
70
  config->railsEnv = NULL;
71
+ config->appRoot = NULL;
66
72
  config->rackEnv = NULL;
67
73
  config->spawnMethod = DirConfig::SM_UNSET;
74
+ config->frameworkSpawnerTimeout = -1;
75
+ config->appSpawnerTimeout = -1;
76
+ config->maxRequests = 0;
77
+ config->maxRequestsSpecified = false;
78
+ config->memoryLimit = 0;
79
+ config->memoryLimitSpecified = false;
80
+ config->highPerformance = DirConfig::UNSET;
81
+ config->useGlobalQueue = DirConfig::UNSET;
82
+ config->statThrottleRate = 0;
83
+ config->statThrottleRateSpecified = false;
84
+ config->restartDir = NULL;
85
+ /*************************************/
68
86
  return config;
69
87
  }
70
88
 
@@ -74,6 +92,8 @@ passenger_config_merge_dir(apr_pool_t *p, void *basev, void *addv) {
74
92
  DirConfig *base = (DirConfig *) basev;
75
93
  DirConfig *add = (DirConfig *) addv;
76
94
 
95
+ config->enabled = (add->enabled == DirConfig::UNSET) ? base->enabled : add->enabled;
96
+
77
97
  config->railsBaseURIs = base->railsBaseURIs;
78
98
  for (set<string>::const_iterator it(add->railsBaseURIs.begin()); it != add->railsBaseURIs.end(); it++) {
79
99
  config->railsBaseURIs.insert(*it);
@@ -88,8 +108,21 @@ passenger_config_merge_dir(apr_pool_t *p, void *basev, void *addv) {
88
108
  config->autoDetectWSGI = (add->autoDetectWSGI == DirConfig::UNSET) ? base->autoDetectWSGI : add->autoDetectWSGI;
89
109
  config->allowModRewrite = (add->allowModRewrite == DirConfig::UNSET) ? base->allowModRewrite : add->allowModRewrite;
90
110
  config->railsEnv = (add->railsEnv == NULL) ? base->railsEnv : add->railsEnv;
111
+ config->appRoot = (add->appRoot == NULL) ? base->appRoot : add->appRoot;
91
112
  config->rackEnv = (add->rackEnv == NULL) ? base->rackEnv : add->rackEnv;
92
113
  config->spawnMethod = (add->spawnMethod == DirConfig::SM_UNSET) ? base->spawnMethod : add->spawnMethod;
114
+ config->frameworkSpawnerTimeout = (add->frameworkSpawnerTimeout == -1) ? base->frameworkSpawnerTimeout : add->frameworkSpawnerTimeout;
115
+ config->appSpawnerTimeout = (add->appSpawnerTimeout == -1) ? base->appSpawnerTimeout : add->appSpawnerTimeout;
116
+ config->maxRequests = (add->maxRequestsSpecified) ? add->maxRequests : base->maxRequests;
117
+ config->maxRequestsSpecified = base->maxRequestsSpecified || add->maxRequestsSpecified;
118
+ config->memoryLimit = (add->memoryLimitSpecified) ? add->memoryLimit : base->memoryLimit;
119
+ config->memoryLimitSpecified = base->memoryLimitSpecified || add->memoryLimitSpecified;
120
+ config->highPerformance = (add->highPerformance == DirConfig::UNSET) ? base->highPerformance : add->highPerformance;
121
+ config->useGlobalQueue = (add->useGlobalQueue == DirConfig::UNSET) ? base->useGlobalQueue : add->useGlobalQueue;
122
+ config->statThrottleRate = (add->statThrottleRateSpecified) ? add->statThrottleRate : base->statThrottleRate;
123
+ config->statThrottleRateSpecified = base->statThrottleRateSpecified || add->statThrottleRateSpecified;
124
+ config->restartDir = (add->restartDir == NULL) ? base->restartDir : add->restartDir;
125
+ /*************************************/
93
126
  return config;
94
127
  }
95
128
 
@@ -105,11 +138,10 @@ passenger_config_create_server(apr_pool_t *p, server_rec *s) {
105
138
  config->maxInstancesPerAppSpecified = false;
106
139
  config->poolIdleTime = DEFAULT_POOL_IDLE_TIME;
107
140
  config->poolIdleTimeSpecified = false;
108
- config->useGlobalQueue = false;
109
- config->useGlobalQueueSpecified = false;
110
141
  config->userSwitching = true;
111
142
  config->userSwitchingSpecified = false;
112
143
  config->defaultUser = NULL;
144
+ config->tempDir = NULL;
113
145
  return config;
114
146
  }
115
147
 
@@ -128,11 +160,10 @@ passenger_config_merge_server(apr_pool_t *p, void *basev, void *addv) {
128
160
  config->maxInstancesPerAppSpecified = base->maxInstancesPerAppSpecified || add->maxInstancesPerAppSpecified;
129
161
  config->poolIdleTime = (add->poolIdleTime) ? base->poolIdleTime : add->poolIdleTime;
130
162
  config->poolIdleTimeSpecified = base->poolIdleTimeSpecified || add->poolIdleTimeSpecified;
131
- config->useGlobalQueue = (add->useGlobalQueue) ? base->useGlobalQueue : add->useGlobalQueue;
132
- config->useGlobalQueueSpecified = base->useGlobalQueueSpecified || add->useGlobalQueueSpecified;
133
163
  config->userSwitching = (add->userSwitchingSpecified) ? add->userSwitching : base->userSwitching;
134
164
  config->userSwitchingSpecified = base->userSwitchingSpecified || add->userSwitchingSpecified;
135
165
  config->defaultUser = (add->defaultUser == NULL) ? base->defaultUser : add->defaultUser;
166
+ config->tempDir = (add->tempDir == NULL) ? base->tempDir : add->tempDir;
136
167
  return config;
137
168
  }
138
169
 
@@ -152,11 +183,10 @@ passenger_config_merge_all_servers(apr_pool_t *pool, server_rec *main_server) {
152
183
  final->maxInstancesPerAppSpecified = final->maxInstancesPerAppSpecified || config->maxInstancesPerAppSpecified;
153
184
  final->poolIdleTime = (final->poolIdleTimeSpecified) ? final->poolIdleTime : config->poolIdleTime;
154
185
  final->poolIdleTimeSpecified = final->poolIdleTimeSpecified || config->poolIdleTimeSpecified;
155
- final->useGlobalQueue = (final->useGlobalQueue) ? final->useGlobalQueue : config->useGlobalQueue;
156
- final->useGlobalQueueSpecified = final->useGlobalQueueSpecified || config->useGlobalQueueSpecified;
157
186
  final->userSwitching = (config->userSwitchingSpecified) ? config->userSwitching : final->userSwitching;
158
187
  final->userSwitchingSpecified = final->userSwitchingSpecified || config->userSwitchingSpecified;
159
188
  final->defaultUser = (final->defaultUser != NULL) ? final->defaultUser : config->defaultUser;
189
+ final->tempDir = (final->tempDir != NULL) ? final->tempDir : config->tempDir;
160
190
  }
161
191
  for (s = main_server; s != NULL; s = s->next) {
162
192
  ServerConfig *config = (ServerConfig *) ap_get_module_config(s->module_config, &passenger_module);
@@ -249,8 +279,8 @@ cmd_passenger_pool_idle_time(cmd_parms *cmd, void *pcfg, const char *arg) {
249
279
  result = strtol(arg, &end, 10);
250
280
  if (*end != '\0') {
251
281
  return "Invalid number specified for PassengerPoolIdleTime.";
252
- } else if (result <= 0) {
253
- return "Value for PassengerPoolIdleTime must be greater than 0.";
282
+ } else if (result < 0) {
283
+ return "Value for PassengerPoolIdleTime must be greater than or equal to 0.";
254
284
  } else {
255
285
  config->poolIdleTime = (unsigned int) result;
256
286
  config->poolIdleTimeSpecified = true;
@@ -260,14 +290,12 @@ cmd_passenger_pool_idle_time(cmd_parms *cmd, void *pcfg, const char *arg) {
260
290
 
261
291
  static const char *
262
292
  cmd_passenger_use_global_queue(cmd_parms *cmd, void *pcfg, int arg) {
263
- ServerConfig *config = (ServerConfig *) ap_get_module_config(
264
- cmd->server->module_config, &passenger_module);
293
+ DirConfig *config = (DirConfig *) pcfg;
265
294
  if (arg) {
266
- config->useGlobalQueue = true;
295
+ config->useGlobalQueue = DirConfig::ENABLED;
267
296
  } else {
268
- config->useGlobalQueue = false;
297
+ config->useGlobalQueue = DirConfig::DISABLED;
269
298
  }
270
- config->useGlobalQueueSpecified = true;
271
299
  return NULL;
272
300
  }
273
301
 
@@ -288,6 +316,86 @@ cmd_passenger_default_user(cmd_parms *cmd, void *dummy, const char *arg) {
288
316
  return NULL;
289
317
  }
290
318
 
319
+ static const char *
320
+ cmd_passenger_temp_dir(cmd_parms *cmd, void *dummy, const char *arg) {
321
+ ServerConfig *config = (ServerConfig *) ap_get_module_config(
322
+ cmd->server->module_config, &passenger_module);
323
+ config->tempDir = arg;
324
+ return NULL;
325
+ }
326
+
327
+ static const char *
328
+ cmd_passenger_max_requests(cmd_parms *cmd, void *pcfg, const char *arg) {
329
+ DirConfig *config = (DirConfig *) pcfg;
330
+ char *end;
331
+ long int result;
332
+
333
+ result = strtol(arg, &end, 10);
334
+ if (*end != '\0') {
335
+ return "Invalid number specified for PassengerMaxRequests.";
336
+ } else if (result < 0) {
337
+ return "Value for PassengerMaxRequests must be greater than or equal to 0.";
338
+ } else {
339
+ config->maxRequests = (unsigned long) result;
340
+ config->maxRequestsSpecified = true;
341
+ return NULL;
342
+ }
343
+ }
344
+
345
+ static const char *
346
+ cmd_passenger_high_performance(cmd_parms *cmd, void *pcfg, int arg) {
347
+ DirConfig *config = (DirConfig *) pcfg;
348
+ if (arg) {
349
+ config->highPerformance = DirConfig::ENABLED;
350
+ } else {
351
+ config->highPerformance = DirConfig::DISABLED;
352
+ }
353
+ return NULL;
354
+ }
355
+
356
+ static const char *
357
+ cmd_passenger_enabled(cmd_parms *cmd, void *pcfg, int arg) {
358
+ DirConfig *config = (DirConfig *) pcfg;
359
+ if (arg) {
360
+ config->enabled = DirConfig::ENABLED;
361
+ } else {
362
+ config->enabled = DirConfig::DISABLED;
363
+ }
364
+ return NULL;
365
+ }
366
+
367
+ static const char *
368
+ cmd_passenger_stat_throttle_rate(cmd_parms *cmd, void *pcfg, const char *arg) {
369
+ DirConfig *config = (DirConfig *) pcfg;
370
+ char *end;
371
+ long int result;
372
+
373
+ result = strtol(arg, &end, 10);
374
+ if (*end != '\0') {
375
+ return "Invalid number specified for PassengerStatThrottleRate.";
376
+ } else if (result < 0) {
377
+ return "Value for PassengerStatThrottleRate must be greater than or equal to 0.";
378
+ } else {
379
+ config->statThrottleRate = (unsigned long) result;
380
+ config->statThrottleRateSpecified = true;
381
+ return NULL;
382
+ }
383
+ }
384
+
385
+ static const char *
386
+ cmd_passenger_restart_dir(cmd_parms *cmd, void *pcfg, const char *arg) {
387
+ DirConfig *config = (DirConfig *) pcfg;
388
+ config->restartDir = arg;
389
+ return NULL;
390
+ }
391
+
392
+ static const char *
393
+ cmd_passenger_app_root(cmd_parms *cmd, void *pcfg, const char *arg) {
394
+ DirConfig *config = (DirConfig *) pcfg;
395
+ config->appRoot = arg;
396
+ return NULL;
397
+ }
398
+
291
399
 
292
400
  /*************************************************
293
401
  * Rails-specific settings
@@ -326,14 +434,50 @@ cmd_rails_spawn_method(cmd_parms *cmd, void *pcfg, const char *arg) {
326
434
  DirConfig *config = (DirConfig *) pcfg;
327
435
  if (strcmp(arg, "smart") == 0) {
328
436
  config->spawnMethod = DirConfig::SM_SMART;
437
+ } else if (strcmp(arg, "smart-lv2") == 0) {
438
+ config->spawnMethod = DirConfig::SM_SMART_LV2;
329
439
  } else if (strcmp(arg, "conservative") == 0) {
330
440
  config->spawnMethod = DirConfig::SM_CONSERVATIVE;
331
441
  } else {
332
- return "RailsSpawnMethod may only be 'smart' or 'conservative'.";
442
+ return "RailsSpawnMethod may only be 'smart', 'smart-lv2' or 'conservative'.";
333
443
  }
334
444
  return NULL;
335
445
  }
336
446
 
447
+ static const char *
448
+ cmd_rails_framework_spawner_idle_time(cmd_parms *cmd, void *pcfg, const char *arg) {
449
+ DirConfig *config = (DirConfig *) pcfg;
450
+ char *end;
451
+ long int result;
452
+
453
+ result = strtol(arg, &end, 10);
454
+ if (*end != '\0') {
455
+ return "Invalid number specified for RailsFrameworkSpawnerIdleTime.";
456
+ } else if (result < 0) {
457
+ return "Value for RailsFrameworkSpawnerIdleTime must be at least 0.";
458
+ } else {
459
+ config->frameworkSpawnerTimeout = result;
460
+ return NULL;
461
+ }
462
+ }
463
+
464
+ static const char *
465
+ cmd_rails_app_spawner_idle_time(cmd_parms *cmd, void *pcfg, const char *arg) {
466
+ DirConfig *config = (DirConfig *) pcfg;
467
+ char *end;
468
+ long int result;
469
+
470
+ result = strtol(arg, &end, 10);
471
+ if (*end != '\0') {
472
+ return "Invalid number specified for RailsAppSpawnerIdleTime.";
473
+ } else if (result < 0) {
474
+ return "Value for RailsAppSpawnerIdleTime must be at least 0.";
475
+ } else {
476
+ config->appSpawnerTimeout = result;
477
+ return NULL;
478
+ }
479
+ }
480
+
337
481
 
338
482
  /*************************************************
339
483
  * Rack-specific settings
@@ -387,7 +531,9 @@ cmd_rails_spawn_server(cmd_parms *cmd, void *pcfg, const char *arg) {
387
531
  }
388
532
 
389
533
 
390
- typedef const char * (*Take1Func)(); // Workaround for some weird C++-specific compiler error.
534
+ // Workaround for some weird C++-specific compiler error.
535
+ typedef const char * (*Take0Func)();
536
+ typedef const char * (*Take1Func)();
391
537
 
392
538
  const command_rec passenger_commands[] = {
393
539
  // Passenger settings.
@@ -424,7 +570,7 @@ const command_rec passenger_commands[] = {
424
570
  AP_INIT_FLAG("PassengerUseGlobalQueue",
425
571
  (Take1Func) cmd_passenger_use_global_queue,
426
572
  NULL,
427
- ACCESS_CONF | RSRC_CONF,
573
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
428
574
  "Enable or disable Passenger's global queuing mode mode."),
429
575
  AP_INIT_FLAG("PassengerUserSwitching",
430
576
  (Take1Func) cmd_passenger_user_switching,
@@ -436,12 +582,47 @@ const command_rec passenger_commands[] = {
436
582
  NULL,
437
583
  RSRC_CONF,
438
584
  "The user that Rails/Rack applications must run as when user switching fails or is disabled."),
585
+ AP_INIT_TAKE1("PassengerTempDir",
586
+ (Take1Func) cmd_passenger_temp_dir,
587
+ NULL,
588
+ RSRC_CONF,
589
+ "The temp directory that Passenger should use."),
590
+ AP_INIT_TAKE1("PassengerMaxRequests",
591
+ (Take1Func) cmd_passenger_max_requests,
592
+ NULL,
593
+ OR_LIMIT | ACCESS_CONF | RSRC_CONF,
594
+ "The maximum number of requests that an application instance may process."),
595
+ AP_INIT_FLAG("PassengerHighPerformance",
596
+ (Take1Func) cmd_passenger_high_performance,
597
+ NULL,
598
+ OR_ALL,
599
+ "Enable or disable Passenger's high performance mode."),
600
+ AP_INIT_FLAG("PassengerEnabled",
601
+ (Take1Func) cmd_passenger_enabled,
602
+ NULL,
603
+ OR_ALL,
604
+ "Enable or disable Phusion Passenger."),
605
+ AP_INIT_TAKE1("PassengerStatThrottleRate",
606
+ (Take1Func) cmd_passenger_stat_throttle_rate,
607
+ NULL,
608
+ OR_LIMIT | ACCESS_CONF | RSRC_CONF,
609
+ "Limit the number of stat calls to once per given seconds."),
610
+ AP_INIT_TAKE1("PassengerRestartDir",
611
+ (Take1Func) cmd_passenger_restart_dir,
612
+ NULL,
613
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
614
+ "The directory in which Passenger should look for restart.txt."),
615
+ AP_INIT_TAKE1("PassengerAppRoot",
616
+ (Take1Func) cmd_passenger_app_root,
617
+ NULL,
618
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
619
+ "The application's root directory."),
439
620
 
440
621
  // Rails-specific settings.
441
622
  AP_INIT_TAKE1("RailsBaseURI",
442
623
  (Take1Func) cmd_rails_base_uri,
443
624
  NULL,
444
- RSRC_CONF,
625
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
445
626
  "Reserve the given URI to a Rails application."),
446
627
  AP_INIT_FLAG("RailsAutoDetect",
447
628
  (Take1Func) cmd_rails_auto_detect,
@@ -456,19 +637,29 @@ const command_rec passenger_commands[] = {
456
637
  AP_INIT_TAKE1("RailsEnv",
457
638
  (Take1Func) cmd_rails_env,
458
639
  NULL,
459
- RSRC_CONF,
640
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
460
641
  "The environment under which a Rails app must run."),
461
642
  AP_INIT_TAKE1("RailsSpawnMethod",
462
643
  (Take1Func) cmd_rails_spawn_method,
463
644
  NULL,
464
645
  RSRC_CONF,
465
646
  "The spawn method to use."),
647
+ AP_INIT_TAKE1("RailsFrameworkSpawnerIdleTime", // TODO: document this
648
+ (Take1Func) cmd_rails_framework_spawner_idle_time,
649
+ NULL,
650
+ RSRC_CONF,
651
+ "The maximum number of seconds that a framework spawner may be idle before it is shutdown."),
652
+ AP_INIT_TAKE1("RailsAppSpawnerIdleTime", // TODO: document this
653
+ (Take1Func) cmd_rails_app_spawner_idle_time,
654
+ NULL,
655
+ RSRC_CONF,
656
+ "The maximum number of seconds that an application spawner may be idle before it is shutdown."),
466
657
 
467
658
  // Rack-specific settings.
468
659
  AP_INIT_TAKE1("RackBaseURI",
469
660
  (Take1Func) cmd_rack_base_uri,
470
661
  NULL,
471
- RSRC_CONF,
662
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
472
663
  "Reserve the given URI to a Rack application."),
473
664
  AP_INIT_FLAG("RackAutoDetect",
474
665
  (Take1Func) cmd_rack_auto_detect,
@@ -478,10 +669,10 @@ const command_rec passenger_commands[] = {
478
669
  AP_INIT_TAKE1("RackEnv",
479
670
  (Take1Func) cmd_rack_env,
480
671
  NULL,
481
- RSRC_CONF,
672
+ OR_OPTIONS | ACCESS_CONF | RSRC_CONF,
482
673
  "The environment under which a Rack app must run."),
483
674
 
484
- // Rack-specific settings.
675
+ // WSGI-specific settings.
485
676
  AP_INIT_FLAG("PassengerWSGIAutoDetect",
486
677
  (Take1Func) cmd_wsgi_auto_detect,
487
678
  NULL,
@@ -20,6 +20,16 @@
20
20
  #ifndef _PASSENGER_CONFIGURATION_H_
21
21
  #define _PASSENGER_CONFIGURATION_H_
22
22
 
23
+ #include "Utils.h"
24
+ #include "MessageChannel.h"
25
+
26
+ /* The APR headers must come after the Passenger headers. See Hooks.cpp
27
+ * to learn why.
28
+ *
29
+ * MessageChannel.h must be included -- even though we don't actually use
30
+ * MessageChannel.h in here, it's necessary to make sure that apr_want.h
31
+ * doesn't b0rk on 'struct iovec'.
32
+ */
23
33
  #include <apr_pools.h>
24
34
  #include <httpd.h>
25
35
  #include <http_config.h>
@@ -31,7 +41,7 @@
31
41
  */
32
42
 
33
43
  /** Module version number. */
34
- #define PASSENGER_VERSION "2.0.6"
44
+ #define PASSENGER_VERSION "2.1.2"
35
45
 
36
46
  #ifdef __cplusplus
37
47
  #include <set>
@@ -43,9 +53,15 @@
43
53
 
44
54
  /**
45
55
  * Per-directory configuration information.
56
+ *
57
+ * Use the getter methods to query information, because those will return
58
+ * the default value if the value is not specified.
46
59
  */
47
60
  struct DirConfig {
48
61
  enum Threeway { ENABLED, DISABLED, UNSET };
62
+ enum SpawnMethod { SM_UNSET, SM_SMART, SM_SMART_LV2, SM_CONSERVATIVE };
63
+
64
+ Threeway enabled;
49
65
 
50
66
  std::set<std::string> railsBaseURIs;
51
67
  std::set<std::string> rackBaseURIs;
@@ -66,17 +82,166 @@
66
82
  * Rails applications should operate. */
67
83
  const char *railsEnv;
68
84
 
85
+ /** The path to the application's root (for example: RAILS_ROOT
86
+ * for Rails applications, directory containing 'config.ru'
87
+ * for Rack applications). If this value is NULL, the default
88
+ * autodetected path will be used.
89
+ */
90
+ const char *appRoot;
91
+
69
92
  /** The environment (i.e. value for RACK_ENV) under which
70
93
  * Rack applications should operate. */
71
94
  const char *rackEnv;
72
95
 
73
- enum SpawnMethod { SM_UNSET, SM_SMART, SM_CONSERVATIVE };
74
96
  /** The Rails spawn method to use. */
75
97
  SpawnMethod spawnMethod;
98
+
99
+ /**
100
+ * The idle timeout, in seconds, of Rails framework spawners.
101
+ * May also be 0 (which indicates that the framework spawner should
102
+ * never idle timeout) or -1 (which means that the value is not specified).
103
+ */
104
+ long frameworkSpawnerTimeout;
105
+
106
+ /**
107
+ * The idle timeout, in seconds, of Rails application spawners.
108
+ * May also be 0 (which indicates that the application spawner should
109
+ * never idle timeout) or -1 (which means that the value is not specified).
110
+ */
111
+ long appSpawnerTimeout;
112
+
113
+ /**
114
+ * The maximum number of requests that the spawned application may process
115
+ * before exiting. A value of 0 means unlimited.
116
+ */
117
+ unsigned long maxRequests;
118
+
119
+ /** Indicates whether the maxRequests option was explicitly specified
120
+ * in the directory configuration. */
121
+ bool maxRequestsSpecified;
122
+
123
+ /**
124
+ * The maximum amount of memory (in MB) the spawned application may use.
125
+ * A value of 0 means unlimited.
126
+ */
127
+ unsigned long memoryLimit;
128
+
129
+ /** Indicates whether the memoryLimit option was explicitly specified
130
+ * in the directory configuration. */
131
+ bool memoryLimitSpecified;
132
+
133
+ Threeway highPerformance;
134
+
135
+ /** Whether global queuing should be used. */
136
+ Threeway useGlobalQueue;
137
+
138
+ /**
139
+ * Throttle the number of stat() calls on files like
140
+ * restart.txt to the once per given number of seconds.
141
+ */
142
+ unsigned long statThrottleRate;
143
+
144
+ /** Indicates whether the statThrottleRate option was
145
+ * explicitly specified in the directory configuration. */
146
+ bool statThrottleRateSpecified;
147
+
148
+ /** The directory in which Passenger should look for
149
+ * restart.txt. NULL means that the default directory
150
+ * should be used.
151
+ */
152
+ const char *restartDir;
153
+
154
+ /*************************************/
155
+
156
+ bool isEnabled() const {
157
+ return enabled != DISABLED;
158
+ }
159
+
160
+ string getAppRoot(const char *documentRoot) const {
161
+ if (appRoot == NULL) {
162
+ return string(documentRoot).append("/..");
163
+ } else {
164
+ return appRoot;
165
+ }
166
+ }
167
+
168
+ const char *getRailsEnv() const {
169
+ if (railsEnv != NULL) {
170
+ return railsEnv;
171
+ } else {
172
+ return "production";
173
+ }
174
+ }
175
+
176
+ const char *getRackEnv() const {
177
+ if (rackEnv != NULL) {
178
+ return rackEnv;
179
+ } else {
180
+ return "production";
181
+ }
182
+ }
183
+
184
+ const char *getSpawnMethodString() {
185
+ switch (spawnMethod) {
186
+ case SM_SMART:
187
+ return "smart";
188
+ case SM_SMART_LV2:
189
+ return "smart-lv2";
190
+ case SM_CONSERVATIVE:
191
+ return "conservative";
192
+ default:
193
+ return "smart-lv2";
194
+ }
195
+ }
196
+
197
+ unsigned long getMaxRequests() {
198
+ if (maxRequestsSpecified) {
199
+ return maxRequests;
200
+ } else {
201
+ return 0;
202
+ }
203
+ }
204
+
205
+ unsigned long getMemoryLimit() {
206
+ if (memoryLimitSpecified) {
207
+ return memoryLimit;
208
+ } else {
209
+ return 200;
210
+ }
211
+ }
212
+
213
+ bool highPerformanceMode() const {
214
+ return highPerformance == ENABLED;
215
+ }
216
+
217
+ bool usingGlobalQueue() const {
218
+ return useGlobalQueue == ENABLED;
219
+ }
220
+
221
+ unsigned long getStatThrottleRate() const {
222
+ if (statThrottleRateSpecified) {
223
+ return statThrottleRate;
224
+ } else {
225
+ return 0;
226
+ }
227
+ }
228
+
229
+ const char *getRestartDir() const {
230
+ if (restartDir != NULL) {
231
+ return restartDir;
232
+ } else {
233
+ return "";
234
+ }
235
+ }
236
+
237
+ /*************************************/
76
238
  };
77
239
 
78
240
  /**
79
241
  * Server-wide (global, not per-virtual host) configuration information.
242
+ *
243
+ * Use the getter methods to query information, because those will return
244
+ * the default value if the value is not specified.
80
245
  */
81
246
  struct ServerConfig {
82
247
  /** The filename of the Ruby interpreter to use. */
@@ -112,13 +277,6 @@
112
277
  * this server config. */
113
278
  bool poolIdleTimeSpecified;
114
279
 
115
- /** Whether global queuing should be used. */
116
- bool useGlobalQueue;
117
-
118
- /** Whether the useGlobalQueue option was explicitly specified
119
- * in this server config. */
120
- bool useGlobalQueueSpecified;
121
-
122
280
  /** Whether user switching support is enabled. */
123
281
  bool userSwitching;
124
282
 
@@ -131,11 +289,16 @@
131
289
  */
132
290
  const char *defaultUser;
133
291
 
134
- bool getUseGlobalQueue() const {
135
- if (useGlobalQueueSpecified) {
136
- return useGlobalQueue;
292
+ /** The temp directory that Passenger should use. NULL
293
+ * means unspecified.
294
+ */
295
+ const char *tempDir;
296
+
297
+ const char *getDefaultUser() const {
298
+ if (defaultUser != NULL) {
299
+ return defaultUser;
137
300
  } else {
138
- return false;
301
+ return "nobody";
139
302
  }
140
303
  }
141
304
  };