passenger 2.2.15 → 3.0.0.pre1

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 (1338) hide show
  1. data/DEVELOPERS.TXT +21 -12
  2. data/LICENSE +1 -1
  3. data/NEWS +8 -1
  4. data/PACKAGING.TXT +25 -0
  5. data/Rakefile +28 -891
  6. data/bin/passenger +32 -0
  7. data/bin/passenger-config +5 -5
  8. data/bin/passenger-install-apache2-module +37 -24
  9. data/bin/passenger-install-nginx-module +48 -46
  10. data/bin/passenger-make-enterprisey +8 -9
  11. data/bin/passenger-memory-stats +20 -150
  12. data/bin/passenger-status +130 -44
  13. data/bin/passenger-stress-test +5 -4
  14. data/build/agents.rb +73 -0
  15. data/build/apache2.rb +165 -0
  16. data/build/basics.rb +81 -0
  17. data/build/common_library.rb +198 -0
  18. data/build/config.rb +35 -0
  19. data/{misc/rake/cplusplus.rb → build/cplusplus_support.rb} +1 -1
  20. data/build/cxx_tests.rb +205 -0
  21. data/build/documentation.rb +77 -0
  22. data/{misc/rake → build}/gempackagetask.rb +1 -1
  23. data/build/integration_tests.rb +57 -0
  24. data/build/misc.rb +146 -0
  25. data/build/nginx.rb +64 -0
  26. data/build/oxt_tests.rb +52 -0
  27. data/{misc/rake → build}/packagetask.rb +0 -0
  28. data/build/packaging.rb +189 -0
  29. data/{misc/rake/extensions.rb → build/rake_extensions.rb} +1 -1
  30. data/{misc/rake → build}/rdoctask.rb +0 -0
  31. data/build/ruby_extension.rb +46 -0
  32. data/build/ruby_tests.rb +42 -0
  33. data/build/test_basics.rb +31 -0
  34. data/doc/ApplicationPool algorithm.txt +447 -234
  35. data/doc/Architectural overview.html +47 -56
  36. data/doc/Doxyfile +1 -1
  37. data/doc/Security of user switching support.html +46 -57
  38. data/doc/Users guide Apache.html +1033 -306
  39. data/doc/Users guide Apache.txt +419 -99
  40. data/doc/Users guide Nginx.html +1252 -253
  41. data/doc/Users guide Nginx.txt +711 -87
  42. data/doc/Users guide Standalone.html +603 -0
  43. data/doc/Users guide Standalone.txt +40 -0
  44. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
  45. data/doc/cxxapi/Account_8h_source.html +206 -0
  46. data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
  47. data/doc/cxxapi/AgentBase_8h_source.html +70 -0
  48. data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
  49. data/doc/cxxapi/BCrypt_8h_source.html +104 -0
  50. data/doc/cxxapi/Blowfish_8h_source.html +134 -0
  51. data/doc/cxxapi/Bucket_8h_source.html +4 -3
  52. data/doc/cxxapi/Constants_8h_source.html +79 -0
  53. data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
  54. data/doc/cxxapi/DirectoryMapper_8h_source.html +9 -8
  55. data/doc/cxxapi/EventedClient_8h_source.html +629 -0
  56. data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
  57. data/doc/cxxapi/EventedServer_8h_source.html +326 -0
  58. data/doc/cxxapi/Exceptions_8h_source.html +366 -0
  59. data/doc/cxxapi/FileDescriptor_8h_source.html +260 -0
  60. data/doc/cxxapi/Hooks_8h_source.html +2 -1
  61. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
  62. data/doc/cxxapi/Logging_8h_source.html +726 -0
  63. data/doc/cxxapi/MessageChannel_8h_source.html +852 -0
  64. data/doc/cxxapi/MessageClient_8h_source.html +328 -0
  65. data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
  66. data/doc/cxxapi/MessageServer_8h_source.html +606 -0
  67. data/doc/cxxapi/PoolOptions_8h_source.html +548 -0
  68. data/doc/cxxapi/Process_8h_source.html +286 -0
  69. data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
  70. data/doc/cxxapi/ResourceLocator_8h_source.html +115 -0
  71. data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
  72. data/doc/cxxapi/ServerInstanceDir_8h_source.html +374 -0
  73. data/doc/cxxapi/Session_8h_source.html +501 -0
  74. data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
  75. data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
  76. data/doc/cxxapi/StaticString_8h_source.html +254 -0
  77. data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
  78. data/doc/cxxapi/Utils_8h_source.html +442 -0
  79. data/doc/cxxapi/annotated.html +46 -0
  80. data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
  81. data/doc/cxxapi/classAgentWatcher-members.html +30 -26
  82. data/doc/cxxapi/classAgentWatcher.html +168 -194
  83. data/doc/cxxapi/classClient-members.html +14 -11
  84. data/doc/cxxapi/classClient.html +35 -35
  85. data/doc/cxxapi/classHooks-members.html +2 -0
  86. data/doc/cxxapi/classHooks.html +2 -0
  87. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +16 -13
  88. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +78 -82
  89. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +12 -9
  90. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +26 -22
  91. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
  92. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
  93. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +14 -11
  94. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +41 -42
  95. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +12 -9
  96. data/doc/cxxapi/classPassenger_1_1BusyException.html +24 -20
  97. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +12 -9
  98. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +23 -19
  99. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +2 -0
  100. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +8 -6
  101. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +12 -9
  102. data/doc/cxxapi/classPassenger_1_1EOFException.html +27 -23
  103. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +12 -9
  104. data/doc/cxxapi/classPassenger_1_1EventFd.html +24 -21
  105. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +54 -0
  106. data/doc/cxxapi/classPassenger_1_1EventedClient.html +436 -0
  107. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
  108. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
  109. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
  110. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
  111. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  112. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
  113. data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
  114. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
  115. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
  116. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  117. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +16 -13
  118. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +63 -70
  119. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +12 -9
  120. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +26 -22
  121. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +17 -14
  122. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +32 -30
  123. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +15 -12
  124. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +59 -59
  125. data/doc/cxxapi/classPassenger_1_1IOException-members.html +12 -9
  126. data/doc/cxxapi/classPassenger_1_1IOException.html +27 -23
  127. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +36 -33
  128. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +326 -344
  129. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +25 -22
  130. data/doc/cxxapi/classPassenger_1_1MessageServer.html +160 -191
  131. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +12 -9
  132. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +29 -27
  133. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -1
  134. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -1
  135. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  136. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +17 -14
  137. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +69 -79
  138. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -1
  139. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -1
  140. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  141. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +15 -12
  142. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +60 -63
  143. data/doc/cxxapi/classPassenger_1_1Process-members.html +20 -17
  144. data/doc/cxxapi/classPassenger_1_1Process.html +88 -95
  145. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +13 -10
  146. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +36 -35
  147. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +12 -9
  148. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +24 -20
  149. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
  150. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
  151. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +26 -23
  152. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +121 -138
  153. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +12 -9
  154. data/doc/cxxapi/classPassenger_1_1SecurityException.html +26 -22
  155. data/doc/cxxapi/classPassenger_1_1Session-members.html +29 -26
  156. data/doc/cxxapi/classPassenger_1_1Session.html +219 -240
  157. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +14 -11
  158. data/doc/cxxapi/classPassenger_1_1SpawnException.html +36 -37
  159. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +18 -15
  160. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +115 -110
  161. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +30 -27
  162. data/doc/cxxapi/classPassenger_1_1StandardSession.html +163 -184
  163. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +12 -9
  164. data/doc/cxxapi/classPassenger_1_1StaticString.html +27 -25
  165. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +16 -13
  166. data/doc/cxxapi/classPassenger_1_1SystemException.html +65 -67
  167. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +16 -13
  168. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +27 -23
  169. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +12 -9
  170. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +24 -20
  171. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +36 -0
  172. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +51 -0
  173. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +36 -0
  174. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +51 -0
  175. data/doc/cxxapi/classServer-members.html +12 -9
  176. data/doc/cxxapi/classServer.html +23 -20
  177. data/doc/cxxapi/classServerInstanceDirToucher-members.html +12 -9
  178. data/doc/cxxapi/classServerInstanceDirToucher.html +21 -17
  179. data/doc/cxxapi/classes.html +18 -4
  180. data/doc/cxxapi/definitions_8h_source.html +1 -0
  181. data/doc/cxxapi/files.html +36 -1
  182. data/doc/cxxapi/functions.html +53 -21
  183. data/doc/cxxapi/functions_0x62.html +82 -0
  184. data/doc/cxxapi/functions_0x63.html +99 -0
  185. data/doc/cxxapi/functions_0x64.html +95 -0
  186. data/doc/cxxapi/functions_0x65.html +88 -0
  187. data/doc/cxxapi/functions_0x66.html +100 -0
  188. data/doc/cxxapi/functions_0x67.html +170 -0
  189. data/doc/cxxapi/functions_0x68.html +88 -0
  190. data/doc/cxxapi/functions_0x69.html +93 -0
  191. data/doc/cxxapi/functions_0x6b.html +80 -0
  192. data/doc/cxxapi/functions_0x6c.html +88 -0
  193. data/doc/cxxapi/functions_0x6d.html +88 -0
  194. data/doc/cxxapi/functions_0x6e.html +86 -0
  195. data/doc/cxxapi/functions_0x6f.html +94 -0
  196. data/doc/cxxapi/functions_0x70.html +94 -0
  197. data/doc/cxxapi/functions_0x72.html +110 -0
  198. data/doc/cxxapi/functions_0x73.html +171 -0
  199. data/doc/cxxapi/functions_0x74.html +85 -0
  200. data/doc/cxxapi/functions_0x75.html +85 -0
  201. data/doc/cxxapi/functions_0x77.html +92 -0
  202. data/doc/cxxapi/functions_0x7e.html +79 -0
  203. data/doc/cxxapi/functions_enum.html +14 -12
  204. data/doc/cxxapi/functions_eval.html +22 -16
  205. data/doc/cxxapi/functions_func.html +460 -1
  206. data/doc/cxxapi/functions_vars.html +163 -63
  207. data/doc/cxxapi/graph_legend.html +1 -0
  208. data/doc/cxxapi/graph_legend.png +0 -0
  209. data/doc/cxxapi/group__Core.html +2 -2
  210. data/doc/cxxapi/group__Core.map +1 -2
  211. data/doc/cxxapi/group__Core.png +0 -0
  212. data/doc/cxxapi/group__Exceptions.html +32 -40
  213. data/doc/cxxapi/group__Hooks.html +2 -1
  214. data/doc/cxxapi/group__Hooks.map +1 -1
  215. data/doc/cxxapi/group__Hooks.png +0 -0
  216. data/doc/cxxapi/group__Support.html +509 -0
  217. data/doc/cxxapi/hierarchy.html +66 -62
  218. data/doc/cxxapi/inherit__graph__10.map +3 -1
  219. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  220. data/doc/cxxapi/inherit__graph__10.png +0 -0
  221. data/doc/cxxapi/inherit__graph__11.map +4 -1
  222. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  223. data/doc/cxxapi/inherit__graph__11.png +0 -0
  224. data/doc/cxxapi/inherit__graph__12.map +3 -1
  225. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  226. data/doc/cxxapi/inherit__graph__12.png +0 -0
  227. data/doc/cxxapi/inherit__graph__13.map +3 -1
  228. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  229. data/doc/cxxapi/inherit__graph__13.png +0 -0
  230. data/doc/cxxapi/inherit__graph__14.map +3 -1
  231. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  232. data/doc/cxxapi/inherit__graph__14.png +0 -0
  233. data/doc/cxxapi/inherit__graph__15.map +5 -1
  234. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  235. data/doc/cxxapi/inherit__graph__15.png +0 -0
  236. data/doc/cxxapi/inherit__graph__16.map +3 -3
  237. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  238. data/doc/cxxapi/inherit__graph__16.png +0 -0
  239. data/doc/cxxapi/inherit__graph__17.map +3 -1
  240. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  241. data/doc/cxxapi/inherit__graph__17.png +0 -0
  242. data/doc/cxxapi/inherit__graph__18.map +4 -1
  243. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  244. data/doc/cxxapi/inherit__graph__18.png +0 -0
  245. data/doc/cxxapi/inherit__graph__19.map +3 -1
  246. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  247. data/doc/cxxapi/inherit__graph__19.png +0 -0
  248. data/doc/cxxapi/inherit__graph__20.map +3 -2
  249. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  250. data/doc/cxxapi/inherit__graph__20.png +0 -0
  251. data/doc/cxxapi/inherit__graph__21.map +3 -1
  252. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  253. data/doc/cxxapi/inherit__graph__21.png +0 -0
  254. data/doc/cxxapi/inherit__graph__22.map +3 -1
  255. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  256. data/doc/cxxapi/inherit__graph__22.png +0 -0
  257. data/doc/cxxapi/inherit__graph__23.map +3 -1
  258. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  259. data/doc/cxxapi/inherit__graph__23.png +0 -0
  260. data/doc/cxxapi/inherit__graph__24.map +3 -1
  261. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  262. data/doc/cxxapi/inherit__graph__24.png +0 -0
  263. data/doc/cxxapi/inherit__graph__25.map +3 -1
  264. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  265. data/doc/cxxapi/inherit__graph__25.png +0 -0
  266. data/doc/cxxapi/inherit__graph__26.map +3 -1
  267. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  268. data/doc/cxxapi/inherit__graph__26.png +0 -0
  269. data/doc/cxxapi/inherit__graph__27.map +3 -1
  270. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  271. data/doc/cxxapi/inherit__graph__27.png +0 -0
  272. data/doc/cxxapi/inherit__graph__28.map +4 -1
  273. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  274. data/doc/cxxapi/inherit__graph__28.png +0 -0
  275. data/doc/cxxapi/inherit__graph__29.map +3 -1
  276. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  277. data/doc/cxxapi/inherit__graph__29.png +0 -0
  278. data/doc/cxxapi/inherit__graph__30.map +3 -2
  279. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  280. data/doc/cxxapi/inherit__graph__30.png +0 -0
  281. data/doc/cxxapi/inherit__graph__31.map +3 -1
  282. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  283. data/doc/cxxapi/inherit__graph__31.png +0 -0
  284. data/doc/cxxapi/inherit__graph__32.map +5 -1
  285. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  286. data/doc/cxxapi/inherit__graph__32.png +0 -0
  287. data/doc/cxxapi/inherit__graph__33.map +3 -1
  288. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  289. data/doc/cxxapi/inherit__graph__33.png +0 -0
  290. data/doc/cxxapi/inherit__graph__34.map +3 -3
  291. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  292. data/doc/cxxapi/inherit__graph__34.png +0 -0
  293. data/doc/cxxapi/inherit__graph__35.map +3 -1
  294. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  295. data/doc/cxxapi/inherit__graph__35.png +0 -0
  296. data/doc/cxxapi/inherit__graph__36.map +3 -1
  297. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  298. data/doc/cxxapi/inherit__graph__36.png +0 -0
  299. data/doc/cxxapi/inherit__graph__37.map +3 -1
  300. data/doc/cxxapi/inherit__graph__37.md5 +1 -1
  301. data/doc/cxxapi/inherit__graph__37.png +0 -0
  302. data/doc/cxxapi/inherit__graph__4.map +3 -1
  303. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  304. data/doc/cxxapi/inherit__graph__4.png +0 -0
  305. data/doc/cxxapi/inherit__graph__5.map +3 -1
  306. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  307. data/doc/cxxapi/inherit__graph__5.png +0 -0
  308. data/doc/cxxapi/inherit__graph__6.map +3 -1
  309. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  310. data/doc/cxxapi/inherit__graph__6.png +0 -0
  311. data/doc/cxxapi/inherit__graph__7.map +3 -1
  312. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  313. data/doc/cxxapi/inherit__graph__7.png +0 -0
  314. data/doc/cxxapi/inherit__graph__8.map +3 -1
  315. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  316. data/doc/cxxapi/inherit__graph__8.png +0 -0
  317. data/doc/cxxapi/inherit__graph__9.map +3 -1
  318. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  319. data/doc/cxxapi/inherit__graph__9.png +0 -0
  320. data/doc/cxxapi/inherits.html +123 -126
  321. data/doc/cxxapi/main.html +1 -0
  322. data/doc/cxxapi/modules.html +2 -1
  323. data/doc/cxxapi/namespacePassenger.html +263 -492
  324. data/doc/cxxapi/namespacemembers.html +68 -96
  325. data/doc/cxxapi/namespacemembers_enum.html +14 -12
  326. data/doc/cxxapi/namespacemembers_eval.html +20 -15
  327. data/doc/cxxapi/namespacemembers_func.html +52 -88
  328. data/doc/cxxapi/namespacemembers_type.html +18 -14
  329. data/doc/cxxapi/namespaces.html +12 -9
  330. data/doc/cxxapi/nginx_2Configuration_8h_source.html +125 -0
  331. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
  332. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +12 -9
  333. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +24 -22
  334. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +43 -38
  335. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +275 -325
  336. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +12 -9
  337. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +24 -22
  338. data/doc/cxxapi/tree.html +152 -7
  339. data/doc/users_guide_snippets/{analysis_and_system_maintenance_tools.txt → analysis_and_system_maintenance.txt} +58 -1
  340. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +1 -2
  341. data/doc/users_guide_snippets/global_queueing_explained.txt +1 -5
  342. data/doc/users_guide_snippets/{rails_spawn_method.txt → passenger_spawn_method.txt} +9 -8
  343. data/doc/users_guide_snippets/tips.txt +12 -6
  344. data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
  345. data/ext/apache2/Bucket.cpp +4 -4
  346. data/ext/apache2/Bucket.h +3 -3
  347. data/ext/apache2/Configuration.cpp +278 -381
  348. data/ext/apache2/Configuration.h +3 -357
  349. data/ext/apache2/Configuration.hpp +461 -0
  350. data/ext/apache2/DirectoryMapper.h +3 -3
  351. data/ext/apache2/HelperAgent.cpp +359 -0
  352. data/ext/apache2/Hooks.cpp +339 -226
  353. data/ext/apache2/Hooks.h +1 -1
  354. data/ext/apache2/mod_passenger.c +10 -4
  355. data/ext/boost/algorithm/string/case_conv.hpp +4 -4
  356. data/ext/boost/algorithm/string/concept.hpp +2 -2
  357. data/ext/boost/algorithm/string/detail/case_conv.hpp +18 -9
  358. data/ext/boost/algorithm/string/detail/find_format.hpp +44 -43
  359. data/ext/boost/algorithm/string/detail/find_format_all.hpp +56 -56
  360. data/ext/boost/algorithm/string/detail/find_format_store.hpp +7 -0
  361. data/ext/boost/algorithm/string/detail/finder.hpp +14 -14
  362. data/ext/boost/algorithm/string/detail/formatter.hpp +2 -2
  363. data/ext/boost/algorithm/string/detail/replace_storage.hpp +3 -3
  364. data/ext/boost/algorithm/string/detail/sequence.hpp +3 -3
  365. data/ext/boost/algorithm/string/erase.hpp +98 -98
  366. data/ext/boost/algorithm/string/find_format.hpp +56 -38
  367. data/ext/boost/algorithm/string/finder.hpp +6 -6
  368. data/ext/boost/algorithm/string/formatter.hpp +1 -1
  369. data/ext/boost/algorithm/string/replace.hpp +99 -99
  370. data/ext/boost/bind.hpp +5 -1670
  371. data/ext/boost/bind/bind.hpp +1751 -0
  372. data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
  373. data/ext/boost/bind/mem_fn.hpp +389 -0
  374. data/ext/boost/bind/mem_fn_template.hpp +54 -27
  375. data/ext/boost/bind/placeholders.hpp +3 -2
  376. data/ext/boost/concept_check.hpp +10 -0
  377. data/ext/boost/config/abi/msvc_prefix.hpp +15 -1
  378. data/ext/boost/config/abi_prefix.hpp +1 -1
  379. data/ext/boost/config/abi_suffix.hpp +3 -2
  380. data/ext/boost/config/auto_link.hpp +6 -1
  381. data/ext/boost/config/compiler/borland.hpp +75 -17
  382. data/ext/boost/config/compiler/codegear.hpp +163 -0
  383. data/ext/boost/config/compiler/common_edg.hpp +35 -0
  384. data/ext/boost/config/compiler/digitalmars.hpp +26 -0
  385. data/ext/boost/config/compiler/gcc.hpp +69 -14
  386. data/ext/boost/config/compiler/hp_acc.hpp +32 -0
  387. data/ext/boost/config/compiler/intel.hpp +13 -2
  388. data/ext/boost/config/compiler/kai.hpp +0 -2
  389. data/ext/boost/config/compiler/metrowerks.hpp +29 -1
  390. data/ext/boost/config/compiler/mpw.hpp +30 -0
  391. data/ext/boost/config/compiler/pgi.hpp +37 -0
  392. data/ext/boost/config/compiler/sgi_mipspro.hpp +1 -0
  393. data/ext/boost/config/compiler/sunpro_cc.hpp +39 -7
  394. data/ext/boost/config/compiler/vacpp.hpp +31 -3
  395. data/ext/boost/config/compiler/visualc.hpp +72 -5
  396. data/ext/boost/config/no_tr1/cmath.hpp +28 -0
  397. data/ext/boost/config/platform/bsd.hpp +16 -3
  398. data/ext/boost/config/platform/hpux.hpp +3 -0
  399. data/ext/boost/config/platform/macos.hpp +8 -0
  400. data/ext/boost/config/platform/solaris.hpp +7 -0
  401. data/ext/boost/config/platform/vxworks.hpp +31 -0
  402. data/ext/boost/config/select_compiler_config.hpp +4 -0
  403. data/ext/boost/config/select_platform_config.hpp +6 -2
  404. data/ext/boost/config/select_stdlib_config.hpp +17 -8
  405. data/ext/boost/config/stdlib/dinkumware.hpp +34 -2
  406. data/ext/boost/config/stdlib/libcomo.hpp +25 -0
  407. data/ext/boost/config/stdlib/libstdcpp3.hpp +56 -2
  408. data/ext/boost/config/stdlib/modena.hpp +25 -0
  409. data/ext/boost/config/stdlib/msl.hpp +24 -0
  410. data/ext/boost/config/stdlib/roguewave.hpp +26 -0
  411. data/ext/boost/config/stdlib/sgi.hpp +25 -0
  412. data/ext/boost/config/stdlib/stlport.hpp +36 -1
  413. data/ext/boost/config/stdlib/vacpp.hpp +25 -0
  414. data/ext/boost/config/suffix.hpp +67 -32
  415. data/ext/boost/config/warning_disable.hpp +47 -0
  416. data/ext/boost/cstdint.hpp +62 -36
  417. data/ext/boost/date_time/c_time.hpp +28 -12
  418. data/ext/boost/date_time/compiler_config.hpp +27 -5
  419. data/ext/boost/date_time/constrained_value.hpp +36 -13
  420. data/ext/boost/date_time/date.hpp +44 -33
  421. data/ext/boost/date_time/date_duration.hpp +13 -14
  422. data/ext/boost/date_time/date_facet.hpp +215 -226
  423. data/ext/boost/date_time/date_generator_formatter.hpp +22 -20
  424. data/ext/boost/date_time/date_generator_parser.hpp +52 -51
  425. data/ext/boost/date_time/date_generators.hpp +16 -16
  426. data/ext/boost/date_time/date_parsing.hpp +115 -98
  427. data/ext/boost/date_time/filetime_functions.hpp +133 -41
  428. data/ext/boost/date_time/format_date_parser.hpp +22 -10
  429. data/ext/boost/date_time/gregorian/conversion.hpp +32 -39
  430. data/ext/boost/date_time/gregorian/greg_calendar.hpp +15 -14
  431. data/ext/boost/date_time/gregorian/greg_date.hpp +19 -18
  432. data/ext/boost/date_time/gregorian/greg_duration.hpp +106 -10
  433. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +16 -7
  434. data/ext/boost/date_time/gregorian/greg_weekday.hpp +2 -2
  435. data/ext/boost/date_time/gregorian/gregorian_io.hpp +11 -4
  436. data/ext/boost/date_time/gregorian_calendar.hpp +8 -8
  437. data/ext/boost/date_time/gregorian_calendar.ipp +30 -30
  438. data/ext/boost/date_time/int_adapter.hpp +4 -2
  439. data/ext/boost/date_time/microsec_time_clock.hpp +39 -117
  440. data/ext/boost/date_time/period_parser.hpp +17 -15
  441. data/ext/boost/date_time/posix_time/conversion.hpp +28 -29
  442. data/ext/boost/date_time/posix_time/posix_time_config.hpp +19 -19
  443. data/ext/boost/date_time/posix_time/posix_time_io.hpp +31 -38
  444. data/ext/boost/date_time/posix_time/time_formatters.hpp +32 -32
  445. data/ext/boost/date_time/string_parse_tree.hpp +46 -46
  446. data/ext/boost/date_time/strings_from_facet.hpp +7 -5
  447. data/ext/boost/date_time/time.hpp +7 -6
  448. data/ext/boost/date_time/time_defs.hpp +12 -2
  449. data/ext/boost/date_time/time_duration.hpp +27 -26
  450. data/ext/boost/date_time/time_facet.hpp +386 -321
  451. data/ext/boost/date_time/time_formatting_streams.hpp +8 -5
  452. data/ext/boost/date_time/time_resolution_traits.hpp +29 -25
  453. data/ext/boost/date_time/time_system_split.hpp +7 -13
  454. data/ext/boost/date_time/wrapping_int.hpp +21 -15
  455. data/ext/boost/detail/call_traits.hpp +1 -1
  456. data/ext/boost/detail/endian.hpp +4 -4
  457. data/ext/boost/detail/no_exceptions_support.hpp +87 -0
  458. data/ext/boost/detail/sp_typeinfo.hpp +50 -4
  459. data/ext/boost/detail/workaround.hpp +63 -3
  460. data/ext/boost/enable_shared_from_this.hpp +4 -59
  461. data/ext/boost/exception/current_exception_cast.hpp +43 -0
  462. data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
  463. data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
  464. data/ext/boost/exception/detail/exception_ptr.hpp +490 -0
  465. data/ext/boost/exception/detail/is_output_streamable.hpp +47 -0
  466. data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
  467. data/ext/boost/exception/detail/type_info.hpp +79 -0
  468. data/ext/boost/exception/diagnostic_information.hpp +182 -0
  469. data/ext/boost/exception/exception.hpp +422 -0
  470. data/ext/boost/exception/get_error_info.hpp +130 -0
  471. data/ext/boost/exception/info.hpp +167 -0
  472. data/ext/boost/exception/to_string.hpp +83 -0
  473. data/ext/boost/exception/to_string_stub.hpp +109 -0
  474. data/ext/boost/exception_ptr.hpp +11 -0
  475. data/ext/boost/function/detail/prologue.hpp +2 -1
  476. data/ext/boost/function/function_base.hpp +270 -128
  477. data/ext/boost/function/function_fwd.hpp +70 -0
  478. data/ext/boost/function/function_template.hpp +319 -130
  479. data/ext/boost/get_pointer.hpp +5 -1
  480. data/ext/boost/integer.hpp +253 -0
  481. data/ext/boost/integer_fwd.hpp +174 -0
  482. data/ext/boost/integer_traits.hpp +26 -1
  483. data/ext/boost/io/ios_state.hpp +8 -0
  484. data/ext/boost/iterator/detail/config_def.hpp +4 -2
  485. data/ext/boost/iterator/iterator_adaptor.hpp +7 -2
  486. data/ext/boost/iterator/iterator_facade.hpp +1 -2
  487. data/ext/boost/lexical_cast.hpp +113 -105
  488. data/ext/boost/limits.hpp +1 -1
  489. data/ext/boost/mem_fn.hpp +5 -370
  490. data/ext/boost/memory_order.hpp +53 -0
  491. data/ext/boost/mpl/always.hpp +3 -3
  492. data/ext/boost/mpl/and.hpp +3 -3
  493. data/ext/boost/mpl/apply.hpp +3 -3
  494. data/ext/boost/mpl/apply_fwd.hpp +3 -3
  495. data/ext/boost/mpl/apply_wrap.hpp +37 -6
  496. data/ext/boost/mpl/arg.hpp +3 -3
  497. data/ext/boost/mpl/arg_fwd.hpp +3 -3
  498. data/ext/boost/mpl/assert.hpp +6 -6
  499. data/ext/boost/mpl/aux_/adl_barrier.hpp +3 -3
  500. data/ext/boost/mpl/aux_/arg_typedef.hpp +3 -3
  501. data/ext/boost/mpl/aux_/arity.hpp +3 -3
  502. data/ext/boost/mpl/aux_/arity_spec.hpp +3 -3
  503. data/ext/boost/mpl/aux_/common_name_wknd.hpp +3 -3
  504. data/ext/boost/mpl/aux_/config/adl.hpp +4 -4
  505. data/ext/boost/mpl/aux_/config/arrays.hpp +4 -4
  506. data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
  507. data/ext/boost/mpl/aux_/config/bind.hpp +4 -4
  508. data/ext/boost/mpl/aux_/config/compiler.hpp +8 -6
  509. data/ext/boost/mpl/aux_/config/ctps.hpp +3 -3
  510. data/ext/boost/mpl/aux_/config/dtp.hpp +5 -5
  511. data/ext/boost/mpl/aux_/config/eti.hpp +3 -3
  512. data/ext/boost/mpl/aux_/config/gcc.hpp +3 -3
  513. data/ext/boost/mpl/aux_/config/has_apply.hpp +3 -3
  514. data/ext/boost/mpl/aux_/config/has_xxx.hpp +3 -3
  515. data/ext/boost/mpl/aux_/config/integral.hpp +4 -4
  516. data/ext/boost/mpl/aux_/config/intel.hpp +3 -3
  517. data/ext/boost/mpl/aux_/config/lambda.hpp +3 -3
  518. data/ext/boost/mpl/aux_/config/msvc.hpp +3 -3
  519. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +3 -3
  520. data/ext/boost/mpl/aux_/config/nttp.hpp +3 -3
  521. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +3 -3
  522. data/ext/boost/mpl/aux_/config/pp_counter.hpp +3 -3
  523. data/ext/boost/mpl/aux_/config/preprocessor.hpp +4 -4
  524. data/ext/boost/mpl/aux_/config/static_constant.hpp +3 -3
  525. data/ext/boost/mpl/aux_/config/ttp.hpp +4 -4
  526. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +3 -3
  527. data/ext/boost/mpl/aux_/config/workaround.hpp +3 -3
  528. data/ext/boost/mpl/aux_/full_lambda.hpp +3 -3
  529. data/ext/boost/mpl/aux_/has_apply.hpp +3 -3
  530. data/ext/boost/mpl/aux_/has_type.hpp +3 -3
  531. data/ext/boost/mpl/aux_/include_preprocessed.hpp +3 -3
  532. data/ext/boost/mpl/aux_/integral_wrapper.hpp +3 -3
  533. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +3 -3
  534. data/ext/boost/mpl/aux_/lambda_support.hpp +4 -4
  535. data/ext/boost/mpl/aux_/msvc_never_true.hpp +3 -3
  536. data/ext/boost/mpl/aux_/na.hpp +3 -3
  537. data/ext/boost/mpl/aux_/na_assert.hpp +3 -3
  538. data/ext/boost/mpl/aux_/na_fwd.hpp +3 -3
  539. data/ext/boost/mpl/aux_/na_spec.hpp +3 -3
  540. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +3 -3
  541. data/ext/boost/mpl/aux_/nttp_decl.hpp +3 -3
  542. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +3 -3
  543. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +3 -3
  544. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +3 -3
  545. data/ext/boost/mpl/aux_/preprocessor/params.hpp +3 -3
  546. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +3 -3
  547. data/ext/boost/mpl/aux_/static_cast.hpp +3 -3
  548. data/ext/boost/mpl/aux_/template_arity.hpp +3 -3
  549. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +3 -3
  550. data/ext/boost/mpl/aux_/type_wrapper.hpp +3 -3
  551. data/ext/boost/mpl/aux_/value_wknd.hpp +3 -3
  552. data/ext/boost/mpl/aux_/yes_no.hpp +3 -3
  553. data/ext/boost/mpl/bind.hpp +3 -3
  554. data/ext/boost/mpl/bind_fwd.hpp +3 -3
  555. data/ext/boost/mpl/bool.hpp +3 -3
  556. data/ext/boost/mpl/bool_fwd.hpp +3 -3
  557. data/ext/boost/mpl/eval_if.hpp +3 -3
  558. data/ext/boost/mpl/has_xxx.hpp +10 -8
  559. data/ext/boost/mpl/identity.hpp +3 -3
  560. data/ext/boost/mpl/if.hpp +3 -3
  561. data/ext/boost/mpl/int.hpp +3 -3
  562. data/ext/boost/mpl/int_fwd.hpp +3 -3
  563. data/ext/boost/mpl/integral_c.hpp +3 -3
  564. data/ext/boost/mpl/integral_c_fwd.hpp +3 -3
  565. data/ext/boost/mpl/integral_c_tag.hpp +3 -3
  566. data/ext/boost/mpl/lambda.hpp +3 -3
  567. data/ext/boost/mpl/lambda_fwd.hpp +3 -3
  568. data/ext/boost/mpl/limits/arity.hpp +3 -3
  569. data/ext/boost/mpl/logical.hpp +3 -3
  570. data/ext/boost/mpl/next.hpp +3 -3
  571. data/ext/boost/mpl/next_prior.hpp +3 -3
  572. data/ext/boost/mpl/not.hpp +3 -3
  573. data/ext/boost/mpl/or.hpp +3 -3
  574. data/ext/boost/mpl/placeholders.hpp +3 -3
  575. data/ext/boost/mpl/protect.hpp +3 -3
  576. data/ext/boost/mpl/quote.hpp +18 -7
  577. data/ext/boost/mpl/size_t.hpp +3 -3
  578. data/ext/boost/mpl/size_t_fwd.hpp +3 -3
  579. data/ext/boost/mpl/void.hpp +3 -3
  580. data/ext/boost/mpl/void_fwd.hpp +3 -3
  581. data/ext/boost/non_type.hpp +27 -27
  582. data/ext/boost/operators.hpp +51 -18
  583. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  584. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  585. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  586. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  587. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  588. data/ext/boost/preprocessor/seq/cat.hpp +48 -0
  589. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  590. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  591. data/ext/boost/range/as_literal.hpp +10 -14
  592. data/ext/boost/range/begin.hpp +4 -4
  593. data/ext/boost/range/detail/implementation_help.hpp +4 -0
  594. data/ext/boost/range/end.hpp +4 -4
  595. data/ext/boost/range/iterator_range.hpp +31 -15
  596. data/ext/boost/ref.hpp +12 -1
  597. data/ext/boost/scoped_array.hpp +16 -0
  598. data/ext/boost/scoped_ptr.hpp +16 -0
  599. data/ext/boost/shared_ptr.hpp +2 -602
  600. data/ext/boost/{detail → smart_ptr}/bad_weak_ptr.hpp +4 -4
  601. data/ext/boost/{detail → smart_ptr/detail}/atomic_count.hpp +14 -19
  602. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc.hpp +13 -9
  603. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc_x86.hpp +5 -12
  604. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_pthreads.hpp +5 -5
  605. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_solaris.hpp +3 -3
  606. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_sync.hpp +9 -5
  607. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_win32.hpp +3 -3
  608. data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
  609. data/ext/boost/{detail → smart_ptr/detail}/shared_count.hpp +86 -17
  610. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
  611. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
  612. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_acc_ia64.hpp +4 -4
  613. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_ppc.hpp +4 -4
  614. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_x86.hpp +4 -4
  615. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ia64.hpp +4 -4
  616. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
  617. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ppc.hpp +4 -4
  618. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_sparc.hpp +7 -7
  619. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_x86.hpp +4 -4
  620. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_nt.hpp +4 -4
  621. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_pt.hpp +4 -4
  622. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_solaris.hpp +4 -4
  623. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
  624. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_sync.hpp +8 -4
  625. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_w32.hpp +4 -4
  626. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_impl.hpp +5 -5
  627. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
  628. data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
  629. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
  630. data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
  631. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
  632. data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
  633. data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
  634. data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
  635. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
  636. data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
  637. data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
  638. data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
  639. data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
  640. data/ext/boost/src/pthread/thread.cpp +115 -203
  641. data/ext/boost/src/tss_null.cpp +1 -1
  642. data/ext/boost/static_assert.hpp +14 -4
  643. data/ext/boost/thread.hpp +7 -2
  644. data/ext/boost/thread/barrier.hpp +63 -0
  645. data/ext/boost/thread/detail/force_cast.hpp +39 -0
  646. data/ext/boost/thread/detail/move.hpp +29 -2
  647. data/ext/boost/thread/detail/platform.hpp +3 -3
  648. data/ext/boost/thread/detail/singleton.hpp +59 -0
  649. data/ext/boost/thread/detail/thread.hpp +496 -0
  650. data/ext/boost/thread/detail/thread_group.hpp +105 -0
  651. data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
  652. data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
  653. data/ext/boost/thread/detail/tss_hooks.hpp +82 -0
  654. data/ext/boost/thread/exceptions.hpp +174 -60
  655. data/ext/boost/thread/future.hpp +1364 -0
  656. data/ext/boost/thread/locks.hpp +899 -32
  657. data/ext/boost/thread/once.hpp +4 -0
  658. data/ext/boost/thread/pthread/condition_variable.hpp +16 -21
  659. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +37 -3
  660. data/ext/boost/thread/pthread/mutex.hpp +20 -7
  661. data/ext/boost/thread/pthread/once.hpp +7 -2
  662. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +5 -1
  663. data/ext/boost/thread/pthread/recursive_mutex.hpp +22 -5
  664. data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
  665. data/ext/boost/thread/pthread/thread_data.hpp +37 -10
  666. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
  667. data/ext/boost/thread/pthread/timespec.hpp +11 -3
  668. data/ext/boost/thread/shared_mutex.hpp +21 -0
  669. data/ext/boost/thread/thread.hpp +8 -3
  670. data/ext/boost/thread/thread_time.hpp +4 -0
  671. data/ext/boost/thread/tss.hpp +106 -13
  672. data/ext/boost/thread/xtime.hpp +6 -2
  673. data/ext/boost/throw_exception.hpp +36 -7
  674. data/ext/boost/token_functions.hpp +1 -1
  675. data/ext/boost/tokenizer.hpp +1 -1
  676. data/ext/boost/type_traits/add_pointer.hpp +1 -1
  677. data/ext/boost/type_traits/add_volatile.hpp +47 -0
  678. data/ext/boost/type_traits/alignment_of.hpp +29 -1
  679. data/ext/boost/type_traits/config.hpp +1 -1
  680. data/ext/boost/type_traits/conversion_traits.hpp +1 -1
  681. data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
  682. data/ext/boost/type_traits/intrinsics.hpp +88 -1
  683. data/ext/boost/type_traits/is_abstract.hpp +14 -5
  684. data/ext/boost/type_traits/is_arithmetic.hpp +8 -0
  685. data/ext/boost/type_traits/is_array.hpp +3 -2
  686. data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
  687. data/ext/boost/type_traits/is_base_of.hpp +51 -0
  688. data/ext/boost/type_traits/is_class.hpp +12 -0
  689. data/ext/boost/type_traits/is_const.hpp +6 -2
  690. data/ext/boost/type_traits/is_convertible.hpp +14 -2
  691. data/ext/boost/type_traits/is_enum.hpp +10 -1
  692. data/ext/boost/type_traits/is_function.hpp +11 -3
  693. data/ext/boost/type_traits/is_fundamental.hpp +45 -0
  694. data/ext/boost/type_traits/is_integral.hpp +5 -0
  695. data/ext/boost/type_traits/is_member_function_pointer.hpp +5 -3
  696. data/ext/boost/type_traits/is_member_pointer.hpp +4 -2
  697. data/ext/boost/type_traits/is_pointer.hpp +3 -1
  698. data/ext/boost/type_traits/is_reference.hpp +4 -2
  699. data/ext/boost/type_traits/is_signed.hpp +135 -0
  700. data/ext/boost/type_traits/is_unsigned.hpp +130 -0
  701. data/ext/boost/type_traits/is_void.hpp +5 -0
  702. data/ext/boost/type_traits/is_volatile.hpp +4 -2
  703. data/ext/boost/type_traits/make_unsigned.hpp +137 -0
  704. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  705. data/ext/boost/type_traits/type_with_alignment.hpp +106 -1
  706. data/ext/boost/utility.hpp +2 -1
  707. data/ext/boost/utility/addressof.hpp +61 -17
  708. data/ext/boost/utility/binary.hpp +708 -0
  709. data/ext/boost/utility/enable_if.hpp +2 -2
  710. data/ext/boost/weak_ptr.hpp +4 -174
  711. data/ext/common/AbstractSpawnManager.h +110 -0
  712. data/ext/common/Account.h +175 -0
  713. data/ext/common/AccountsDatabase.cpp +81 -0
  714. data/ext/common/AccountsDatabase.h +130 -0
  715. data/ext/common/AgentBase.cpp +323 -0
  716. data/ext/common/{Version.h → AgentBase.h} +14 -6
  717. data/ext/common/AgentsStarter.cpp +154 -0
  718. data/ext/common/AgentsStarter.h +81 -0
  719. data/ext/common/AgentsStarter.hpp +619 -0
  720. data/ext/common/ApplicationPool/Client.h +796 -0
  721. data/ext/common/{ApplicationPool.h → ApplicationPool/Interface.h} +108 -18
  722. data/ext/common/ApplicationPool/Pool.h +1315 -0
  723. data/ext/common/ApplicationPool/Server.h +475 -0
  724. data/ext/common/BCrypt.cpp +343 -0
  725. data/ext/common/BCrypt.h +73 -0
  726. data/ext/common/Blowfish.c +685 -0
  727. data/ext/common/Blowfish.h +103 -0
  728. data/ext/common/Constants.h +48 -0
  729. data/ext/common/EventedClient.h +598 -0
  730. data/ext/common/EventedMessageServer.h +327 -0
  731. data/ext/common/EventedServer.h +295 -0
  732. data/ext/common/Exceptions.h +78 -1
  733. data/ext/common/FileDescriptor.h +229 -0
  734. data/ext/common/HelperAgent/BacktracesServer.h +59 -0
  735. data/ext/common/Logging.cpp +8 -9
  736. data/ext/common/Logging.h +593 -21
  737. data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
  738. data/ext/common/LoggingAgent/DataStoreId.h +177 -0
  739. data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
  740. data/ext/common/LoggingAgent/Main.cpp +278 -0
  741. data/ext/common/LoggingAgent/RemoteSender.h +457 -0
  742. data/ext/common/MessageChannel.h +196 -34
  743. data/ext/common/MessageClient.h +297 -0
  744. data/ext/common/MessageReadersWriters.h +508 -0
  745. data/ext/common/MessageServer.h +575 -0
  746. data/ext/common/PoolOptions.h +279 -117
  747. data/ext/common/Process.h +255 -0
  748. data/ext/common/RandomGenerator.h +160 -0
  749. data/ext/common/ResourceLocator.h +84 -0
  750. data/ext/common/ServerInstanceDir.h +343 -0
  751. data/ext/common/Session.h +470 -0
  752. data/ext/common/SpawnManager.h +256 -201
  753. data/ext/common/StaticString.h +79 -4
  754. data/ext/common/StringListCreator.h +2 -2
  755. data/ext/common/Utils.cpp +385 -397
  756. data/ext/common/Utils.h +79 -165
  757. data/ext/common/{Base64.cpp → Utils/Base64.cpp} +0 -0
  758. data/ext/common/{Base64.h → Utils/Base64.h} +27 -1
  759. data/ext/common/Utils/BlockingQueue.h +136 -0
  760. data/ext/common/Utils/BlockingScalar.h +50 -0
  761. data/ext/common/{CachedFileStat.cpp → Utils/CachedFileStat.cpp} +1 -1
  762. data/ext/common/{CachedFileStat.h → Utils/CachedFileStat.h} +1 -1
  763. data/ext/common/{CachedFileStat.hpp → Utils/CachedFileStat.hpp} +1 -1
  764. data/ext/common/{FileChangeChecker.h → Utils/FileChangeChecker.h} +1 -1
  765. data/ext/common/Utils/FileHandleGuard.h +81 -0
  766. data/ext/common/Utils/IOUtils.cpp +754 -0
  767. data/ext/common/Utils/IOUtils.h +253 -0
  768. data/ext/common/Utils/MD5.cpp +406 -0
  769. data/ext/common/Utils/MD5.h +98 -0
  770. data/ext/common/Utils/MemZeroGuard.h +103 -0
  771. data/ext/common/Utils/ProcessMetricsCollector.h +462 -0
  772. data/ext/common/Utils/ScopeGuard.h +72 -0
  773. data/ext/common/Utils/StrIntUtils.cpp +329 -0
  774. data/ext/common/Utils/StrIntUtils.h +228 -0
  775. data/ext/common/{SystemTime.cpp → Utils/SystemTime.cpp} +5 -1
  776. data/ext/common/Utils/SystemTime.h +201 -0
  777. data/ext/common/{Timer.h → Utils/Timer.h} +58 -18
  778. data/ext/common/Utils/VariantMap.h +363 -0
  779. data/ext/common/Utils/foo.cpp +10 -0
  780. data/ext/common/Watchdog.cpp +1034 -0
  781. data/ext/google/COPYING +28 -0
  782. data/ext/google/ChangeLog +167 -0
  783. data/ext/google/dense_hash_map +310 -0
  784. data/ext/google/dense_hash_set +287 -0
  785. data/ext/google/sparse_hash_map +294 -0
  786. data/ext/google/sparse_hash_set +275 -0
  787. data/ext/google/sparsehash/densehashtable.h +1062 -0
  788. data/ext/google/sparsehash/sparseconfig.h +55 -0
  789. data/ext/google/sparsehash/sparsehashtable.h +1015 -0
  790. data/ext/google/sparsetable +1468 -0
  791. data/ext/google/type_traits.h +250 -0
  792. data/ext/libev/Changes +302 -0
  793. data/ext/libev/LICENSE +36 -0
  794. data/ext/libev/Makefile.am +18 -0
  795. data/ext/libev/Makefile.in +685 -0
  796. data/ext/libev/README +58 -0
  797. data/ext/libev/aclocal.m4 +7549 -0
  798. data/ext/libev/autogen.sh +6 -0
  799. data/ext/libev/config.guess +1526 -0
  800. data/ext/libev/config.h +122 -0
  801. data/ext/libev/config.h.in +121 -0
  802. data/ext/libev/config.sub +1658 -0
  803. data/ext/libev/configure +22156 -0
  804. data/ext/libev/configure.ac +18 -0
  805. data/ext/libev/ev++.h +800 -0
  806. data/ext/libev/ev.c +3694 -0
  807. data/ext/libev/ev.h +705 -0
  808. data/ext/libev/ev_epoll.c +228 -0
  809. data/ext/libev/ev_kqueue.c +196 -0
  810. data/ext/libev/ev_poll.c +144 -0
  811. data/ext/libev/ev_port.c +165 -0
  812. data/ext/libev/ev_select.c +308 -0
  813. data/ext/libev/ev_vars.h +187 -0
  814. data/ext/libev/ev_win32.c +153 -0
  815. data/ext/libev/ev_wrap.h +178 -0
  816. data/ext/libev/event.c +401 -0
  817. data/ext/libev/event.h +158 -0
  818. data/ext/libev/install-sh +294 -0
  819. data/ext/libev/libev.m4 +38 -0
  820. data/ext/libev/ltmain.sh +6871 -0
  821. data/ext/libev/missing +336 -0
  822. data/ext/libev/mkinstalldirs +111 -0
  823. data/ext/nginx/Configuration.c +532 -182
  824. data/ext/nginx/Configuration.h +33 -10
  825. data/ext/nginx/ContentHandler.c +188 -53
  826. data/ext/nginx/ContentHandler.h +1 -1
  827. data/ext/nginx/{HelperServer.cpp → HelperAgent.cpp} +433 -299
  828. data/ext/nginx/HttpStatusExtractor.h +1 -1
  829. data/ext/nginx/ScgiRequestParser.h +68 -11
  830. data/ext/nginx/StaticContentHandler.c +4 -1
  831. data/ext/nginx/StaticContentHandler.h +1 -1
  832. data/ext/nginx/config +5 -5
  833. data/ext/nginx/ngx_http_passenger_module.c +315 -469
  834. data/ext/nginx/ngx_http_passenger_module.h +8 -17
  835. data/ext/oxt/backtrace.cpp +49 -41
  836. data/ext/oxt/backtrace.hpp +1 -1
  837. data/ext/oxt/detail/backtrace_disabled.hpp +1 -1
  838. data/ext/oxt/detail/backtrace_enabled.hpp +16 -15
  839. data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
  840. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +3 -4
  841. data/ext/oxt/detail/spin_lock_portable.hpp +1 -1
  842. data/ext/oxt/detail/spin_lock_pthreads.hpp +1 -1
  843. data/ext/oxt/detail/tracable_exception_disabled.hpp +1 -1
  844. data/ext/oxt/detail/tracable_exception_enabled.hpp +1 -1
  845. data/ext/oxt/dynamic_thread_group.hpp +195 -0
  846. data/ext/oxt/macros.hpp +1 -1
  847. data/ext/oxt/spin_lock.hpp +4 -2
  848. data/ext/oxt/system_calls.cpp +129 -13
  849. data/ext/oxt/system_calls.hpp +16 -2
  850. data/ext/oxt/thread.cpp +1 -1
  851. data/ext/oxt/thread.hpp +49 -14
  852. data/ext/oxt/tracable_exception.cpp +5 -5
  853. data/ext/oxt/tracable_exception.hpp +1 -1
  854. data/ext/phusion_passenger/extconf.rb +7 -2
  855. data/ext/phusion_passenger/native_support.c +733 -33
  856. data/{bin → helper-scripts}/passenger-spawn-server +50 -12
  857. data/helper-scripts/prespawn +63 -0
  858. data/lib/phusion_passenger.rb +113 -0
  859. data/lib/phusion_passenger/abstract_installer.rb +50 -12
  860. data/lib/phusion_passenger/abstract_request_handler.rb +432 -171
  861. data/lib/phusion_passenger/abstract_server.rb +125 -122
  862. data/lib/phusion_passenger/abstract_server_collection.rb +51 -22
  863. data/lib/phusion_passenger/admin_tools.rb +1 -1
  864. data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
  865. data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
  866. data/lib/phusion_passenger/analytics_logger.rb +342 -0
  867. data/lib/phusion_passenger/{application.rb → app_process.rb} +73 -24
  868. data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
  869. data/lib/phusion_passenger/{railz → classic_rails}/cgi_fixed.rb +2 -2
  870. data/lib/phusion_passenger/{railz → classic_rails}/framework_spawner.rb +75 -98
  871. data/lib/phusion_passenger/{railz → classic_rails}/request_handler.rb +8 -6
  872. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
  873. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
  874. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
  875. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
  876. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
  877. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
  878. data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
  879. data/lib/phusion_passenger/console_text_template.rb +1 -1
  880. data/lib/phusion_passenger/constants.rb +9 -5
  881. data/lib/phusion_passenger/debug_logging.rb +104 -0
  882. data/lib/phusion_passenger/dependencies.rb +187 -4
  883. data/lib/phusion_passenger/exceptions.rb +4 -4
  884. data/lib/phusion_passenger/html_template.rb +6 -8
  885. data/lib/phusion_passenger/message_channel.rb +137 -21
  886. data/lib/phusion_passenger/message_client.rb +173 -0
  887. data/lib/phusion_passenger/native_support.rb +108 -0
  888. data/lib/phusion_passenger/packaging.rb +82 -13
  889. data/lib/phusion_passenger/platform_info.rb +84 -475
  890. data/lib/phusion_passenger/platform_info/apache.rb +329 -0
  891. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +187 -0
  892. data/lib/phusion_passenger/platform_info/compiler.rb +154 -0
  893. data/lib/phusion_passenger/{events.rb → platform_info/curl.rb} +26 -23
  894. data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
  895. data/lib/phusion_passenger/platform_info/linux.rb +77 -0
  896. data/lib/phusion_passenger/platform_info/operating_system.rb +51 -0
  897. data/lib/phusion_passenger/platform_info/ruby.rb +198 -0
  898. data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
  899. data/lib/phusion_passenger/plugin.rb +96 -0
  900. data/lib/phusion_passenger/public_api.rb +112 -0
  901. data/lib/phusion_passenger/rack/application_spawner.rb +146 -71
  902. data/lib/phusion_passenger/rack/request_handler.rb +36 -13
  903. data/lib/phusion_passenger/rails3_extensions/init.rb +204 -0
  904. data/lib/phusion_passenger/simple_benchmarking.rb +1 -1
  905. data/lib/phusion_passenger/spawn_manager.rb +137 -141
  906. data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
  907. data/lib/phusion_passenger/standalone/command.rb +237 -0
  908. data/lib/phusion_passenger/standalone/config_file.rb +119 -0
  909. data/lib/phusion_passenger/standalone/help_command.rb +57 -0
  910. data/lib/phusion_passenger/standalone/main.rb +101 -0
  911. data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
  912. data/lib/phusion_passenger/standalone/runtime_installer.rb +466 -0
  913. data/lib/phusion_passenger/standalone/start_command.rb +510 -0
  914. data/lib/phusion_passenger/standalone/status_command.rb +62 -0
  915. data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
  916. data/lib/phusion_passenger/standalone/utils.rb +42 -0
  917. data/lib/phusion_passenger/standalone/version_command.rb +42 -0
  918. data/lib/phusion_passenger/templates/framework_init_error.html.erb +1 -1
  919. data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
  920. data/lib/phusion_passenger/templates/standalone/config.erb +69 -0
  921. data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
  922. data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
  923. data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
  924. data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
  925. data/lib/phusion_passenger/templates/version_not_found.html.erb +2 -2
  926. data/lib/phusion_passenger/utils.rb +476 -125
  927. data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
  928. data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
  929. data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
  930. data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
  931. data/lib/phusion_passenger/wsgi/application_spawner.rb +24 -20
  932. data/lib/phusion_passenger/wsgi/request_handler.py +1 -1
  933. data/misc/copy_boost_headers.rb +36 -9
  934. data/misc/find_owner_pipe_leaks.rb +1 -1
  935. data/misc/render_error_pages.rb +1 -1
  936. data/misc/union_station_gateway.crt +32 -0
  937. data/test/config.yml.example +24 -13
  938. data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
  939. data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
  940. data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
  941. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
  942. data/test/{Base64Test.cpp → cxx/Base64Test.cpp} +4 -2
  943. data/test/{CachedFileStatTest.cpp → cxx/CachedFileStatTest.cpp} +3 -3
  944. data/test/{CxxTestMain.cpp → cxx/CxxTestMain.cpp} +6 -27
  945. data/test/cxx/EventedClientTest.cpp +386 -0
  946. data/test/{FileChangeCheckerTest.cpp → cxx/FileChangeCheckerTest.cpp} +3 -5
  947. data/test/cxx/FileDescriptorTest.cpp +69 -0
  948. data/test/{HttpStatusExtractorTest.cpp → cxx/HttpStatusExtractorTest.cpp} +1 -1
  949. data/test/cxx/IOUtilsTest.cpp +398 -0
  950. data/test/cxx/LoggingTest.cpp +914 -0
  951. data/test/cxx/MessageChannelTest.cpp +672 -0
  952. data/test/cxx/MessageReadersWritersTest.cpp +574 -0
  953. data/test/cxx/MessageServerTest.cpp +383 -0
  954. data/test/{PoolOptionsTest.cpp → cxx/PoolOptionsTest.cpp} +2 -3
  955. data/test/{ScgiRequestParserTest.cpp → cxx/ScgiRequestParserTest.cpp} +53 -1
  956. data/test/cxx/ServerInstanceDirTest.cpp +186 -0
  957. data/test/cxx/SpawnManagerTest.cpp +161 -0
  958. data/test/cxx/StaticStringTest.cpp +86 -0
  959. data/test/{SystemTimeTest.cpp → cxx/SystemTimeTest.cpp} +2 -2
  960. data/test/cxx/TestSupport.cpp +166 -0
  961. data/test/cxx/TestSupport.h +254 -0
  962. data/test/cxx/UtilsTest.cpp +521 -0
  963. data/test/cxx/VariantMapTest.cpp +179 -0
  964. data/test/integration_tests/apache2_tests.rb +198 -127
  965. data/test/integration_tests/cgi_environment_spec.rb +26 -0
  966. data/test/integration_tests/mycook_spec.rb +2 -28
  967. data/test/integration_tests/nginx_tests.rb +125 -16
  968. data/test/integration_tests/spec_helper.rb +19 -0
  969. data/test/oxt/backtrace_test.cpp +19 -59
  970. data/test/oxt/counter.hpp +55 -0
  971. data/test/oxt/dynamic_thread_group_test.cpp +131 -0
  972. data/test/oxt/oxt_test_main.cpp +2 -2
  973. data/test/oxt/spin_lock_test.cpp +59 -0
  974. data/test/oxt/syscall_interruption_test.cpp +1 -1
  975. data/test/ruby/abstract_request_handler_spec.rb +346 -25
  976. data/test/ruby/abstract_server_collection_spec.rb +4 -3
  977. data/test/ruby/abstract_server_spec.rb +37 -27
  978. data/test/ruby/admin_tools_spec.rb +362 -0
  979. data/test/ruby/analytics_logger_spec.rb +253 -0
  980. data/test/ruby/{application_spec.rb → app_process_spec.rb} +14 -14
  981. data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
  982. data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
  983. data/test/ruby/debug_logging_spec.rb +141 -0
  984. data/test/ruby/message_channel_spec.rb +51 -25
  985. data/test/ruby/rack/application_spawner_spec.rb +99 -82
  986. data/test/ruby/shared/abstract_server_spec.rb +23 -0
  987. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
  988. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
  989. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
  990. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
  991. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
  992. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
  993. data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
  994. data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
  995. data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
  996. data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
  997. data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
  998. data/test/ruby/spawn_manager_spec.rb +104 -175
  999. data/test/ruby/spec_helper.rb +104 -0
  1000. data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
  1001. data/test/ruby/utils/hosts_file_parser.rb +258 -0
  1002. data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
  1003. data/test/ruby/utils_spec.rb +410 -59
  1004. data/test/ruby/wsgi/application_spawner_spec.rb +16 -20
  1005. data/test/stub/apache2/httpd.conf.erb +11 -6
  1006. data/test/stub/message_channel.rb +3 -1
  1007. data/test/stub/message_channel_2.rb +3 -1
  1008. data/test/stub/message_channel_3.rb +5 -3
  1009. data/test/stub/nginx/nginx.conf.erb +3 -2
  1010. data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
  1011. data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
  1012. data/test/stub/rails_apps/{foobar → 1.2/empty}/app/helpers/application_helper.rb +0 -0
  1013. data/test/stub/rails_apps/{mycook → 1.2/empty}/config/boot.rb +3 -3
  1014. data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
  1015. data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
  1016. data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
  1017. data/test/stub/rails_apps/{foobar → 1.2/empty}/config/environments/production.rb +0 -0
  1018. data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
  1019. data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
  1020. data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
  1021. data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
  1022. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/404.html +0 -0
  1023. data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
  1024. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
  1025. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
  1026. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
  1027. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/favicon.ico +0 -0
  1028. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/images/rails.png +0 -0
  1029. data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
  1030. data/test/stub/rails_apps/1.2/empty/script/about +3 -0
  1031. data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
  1032. data/test/stub/rails_apps/1.2/empty/script/console +3 -0
  1033. data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
  1034. data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
  1035. data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
  1036. data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
  1037. data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
  1038. data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
  1039. data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
  1040. data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
  1041. data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
  1042. data/test/stub/rails_apps/1.2/empty/script/server +3 -0
  1043. data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
  1044. data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
  1045. data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
  1046. data/test/stub/rails_apps/{mycook → 2.0/empty}/app/helpers/application_helper.rb +0 -0
  1047. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/boot.rb +3 -3
  1048. data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
  1049. data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
  1050. data/test/stub/rails_apps/{mycook → 2.0/empty}/config/environments/development.rb +1 -1
  1051. data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
  1052. data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
  1053. data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
  1054. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/inflections.rb +0 -0
  1055. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/mime_types.rb +0 -0
  1056. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/routes.rb +0 -0
  1057. data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
  1058. data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
  1059. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/422.html +0 -0
  1060. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/500.html +0 -0
  1061. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
  1062. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
  1063. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
  1064. data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
  1065. data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
  1066. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/robots.txt +0 -0
  1067. data/test/stub/rails_apps/2.0/empty/script/about +3 -0
  1068. data/test/stub/rails_apps/2.0/empty/script/console +3 -0
  1069. data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
  1070. data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
  1071. data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
  1072. data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
  1073. data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
  1074. data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
  1075. data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
  1076. data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
  1077. data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
  1078. data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
  1079. data/test/stub/rails_apps/2.0/empty/script/server +3 -0
  1080. data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
  1081. data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
  1082. data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
  1083. data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
  1084. data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
  1085. data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
  1086. data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
  1087. data/test/stub/rails_apps/{foobar → 2.2/empty}/config/environments/development.rb +0 -0
  1088. data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
  1089. data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
  1090. data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
  1091. data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
  1092. data/test/stub/rails_apps/{mycook → 2.2/empty}/config/initializers/mime_types.rb +0 -0
  1093. data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
  1094. data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
  1095. data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
  1096. data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
  1097. data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
  1098. data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
  1099. data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
  1100. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
  1101. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
  1102. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
  1103. data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
  1104. data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
  1105. data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
  1106. data/test/stub/rails_apps/2.2/empty/script/about +4 -0
  1107. data/test/stub/rails_apps/2.2/empty/script/console +3 -0
  1108. data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
  1109. data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
  1110. data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
  1111. data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
  1112. data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
  1113. data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
  1114. data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
  1115. data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
  1116. data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
  1117. data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
  1118. data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
  1119. data/test/stub/rails_apps/2.2/empty/script/server +3 -0
  1120. data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
  1121. data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
  1122. data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
  1123. data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
  1124. data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
  1125. data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
  1126. data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
  1127. data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
  1128. data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
  1129. data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
  1130. data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
  1131. data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
  1132. data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
  1133. data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
  1134. data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
  1135. data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
  1136. data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
  1137. data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
  1138. data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
  1139. data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
  1140. data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
  1141. data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
  1142. data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
  1143. data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
  1144. data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
  1145. data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
  1146. data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
  1147. data/test/stub/rails_apps/2.3/empty/script/about +4 -0
  1148. data/test/stub/rails_apps/2.3/empty/script/console +3 -0
  1149. data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
  1150. data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
  1151. data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
  1152. data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
  1153. data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
  1154. data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
  1155. data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
  1156. data/test/stub/rails_apps/2.3/empty/script/server +3 -0
  1157. data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
  1158. data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
  1159. data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
  1160. data/test/stub/rails_apps/{foobar/app/controllers/application.rb → 2.3/foobar/app/controllers/application_controller.rb} +0 -0
  1161. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_1.rb +0 -0
  1162. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_2.rb +0 -0
  1163. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/foo_controller.rb +0 -0
  1164. data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
  1165. data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
  1166. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/database.yml +0 -0
  1167. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/environment.rb +1 -1
  1168. data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
  1169. data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
  1170. data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
  1171. data/test/stub/rails_apps/{mycook → 2.3/foobar}/config/initializers/inflections.rb +0 -0
  1172. data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
  1173. data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
  1174. data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
  1175. data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
  1176. data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
  1177. data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
  1178. data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
  1179. data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
  1180. data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
  1181. data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
  1182. data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
  1183. data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
  1184. data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
  1185. data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
  1186. data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
  1187. data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
  1188. data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
  1189. data/test/stub/rails_apps/{mycook/app/controllers/application.rb → 2.3/mycook/app/controllers/application_controller.rb} +0 -0
  1190. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/recipes_controller.rb +0 -0
  1191. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/uploads_controller.rb +0 -0
  1192. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/welcome_controller.rb +0 -0
  1193. data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
  1194. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/layouts/default.rhtml +0 -0
  1195. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/create.rhtml +0 -0
  1196. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/index.rhtml +0 -0
  1197. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/new.rhtml +0 -0
  1198. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/index.rhtml +0 -0
  1199. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/new.html.erb +0 -0
  1200. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/cached.rhtml +0 -0
  1201. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/index.rhtml +0 -0
  1202. data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
  1203. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/database.yml +0 -0
  1204. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environment.rb +1 -1
  1205. data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
  1206. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environments/production.rb +0 -0
  1207. data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
  1208. data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
  1209. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/routes.rb +0 -0
  1210. data/test/stub/rails_apps/{mycook → 2.3/mycook}/log/useless.txt +0 -0
  1211. data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
  1212. data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
  1213. data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
  1214. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.cgi +0 -0
  1215. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.fcgi +0 -0
  1216. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.rb +1 -1
  1217. data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
  1218. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/angrywizard.gif +0 -0
  1219. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/cookbook.gif +0 -0
  1220. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/header.png +0 -0
  1221. data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
  1222. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/application.js +0 -0
  1223. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/controls.js +73 -73
  1224. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/dragdrop.js +166 -165
  1225. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/effects.js +174 -166
  1226. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/prototype.js +362 -267
  1227. data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
  1228. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/uploads.html +0 -0
  1229. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/welcome/cached.html +0 -0
  1230. data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
  1231. data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
  1232. data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
  1233. data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
  1234. data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
  1235. data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
  1236. data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
  1237. data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
  1238. data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
  1239. data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
  1240. data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
  1241. data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
  1242. data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
  1243. data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
  1244. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/uploads.html +0 -0
  1245. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/welcome/cached.html +0 -0
  1246. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/cache/useless.txt +0 -0
  1247. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/pids/useless.txt +0 -0
  1248. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sessions/useless.txt +0 -0
  1249. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sockets/useless.txt +0 -0
  1250. data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
  1251. data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
  1252. data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
  1253. data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
  1254. data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
  1255. data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
  1256. data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
  1257. data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
  1258. data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
  1259. data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
  1260. data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
  1261. data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
  1262. data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
  1263. data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
  1264. data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
  1265. data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
  1266. data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
  1267. data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
  1268. data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
  1269. data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
  1270. data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
  1271. data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
  1272. data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
  1273. data/test/stub/rails_apps/3.0/empty/log/development.log +3 -0
  1274. data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
  1275. data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
  1276. data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
  1277. data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
  1278. data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
  1279. data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
  1280. data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
  1281. data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
  1282. data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
  1283. data/test/stub/spawn_server.rb +4 -2
  1284. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +3 -0
  1285. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +7 -2
  1286. data/test/support/apache2_controller.rb +10 -2
  1287. data/test/support/nginx_controller.rb +3 -2
  1288. data/test/support/test_helper.rb +282 -46
  1289. data/test/{support → tut}/tut.h +6 -0
  1290. data/test/{support → tut}/tut_reporter.h +0 -0
  1291. metadata +824 -266
  1292. data/benchmark/ApplicationPool.cpp +0 -52
  1293. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +0 -126
  1294. data/benchmark/dispatcher.rb +0 -42
  1295. data/benchmark/overhead_of_password_checking.rb +0 -81
  1296. data/benchmark/socket_connections_vs_persistent_pipe.rb +0 -99
  1297. data/benchmark/unix_sockets_vs_pipes.rb +0 -83
  1298. data/ext/boost/LICENSE.TXT +0 -23
  1299. data/ext/boost/VERSION.TXT +0 -1
  1300. data/ext/boost/detail/sp_counted_base.hpp +0 -81
  1301. data/ext/boost/src/pthread/exceptions.cpp +0 -146
  1302. data/ext/boost/src/win32/exceptions.cpp +0 -124
  1303. data/ext/boost/src/win32/thread.cpp +0 -629
  1304. data/ext/boost/src/win32/timeconv.inl +0 -130
  1305. data/ext/boost/src/win32/tss_dll.cpp +0 -72
  1306. data/ext/boost/src/win32/tss_pe.cpp +0 -269
  1307. data/ext/boost/thread/pthread/thread.hpp +0 -339
  1308. data/ext/boost/thread/pthread/tss.hpp +0 -103
  1309. data/ext/common/Application.h +0 -511
  1310. data/ext/common/ApplicationPoolServer.h +0 -794
  1311. data/ext/common/ApplicationPoolServerExecutable.cpp +0 -743
  1312. data/ext/common/ApplicationPoolStatusReporter.h +0 -336
  1313. data/ext/common/DummySpawnManager.h +0 -108
  1314. data/ext/common/StandardApplicationPool.h +0 -821
  1315. data/ext/common/SystemTime.h +0 -88
  1316. data/lib/phusion_passenger/admin_tools/control_process.rb +0 -150
  1317. data/lib/phusion_passenger/railz/application_spawner.rb +0 -463
  1318. data/lib/phusion_passenger/templates/invalid_app_root.html.erb +0 -9
  1319. data/test/ApplicationPoolServerTest.cpp +0 -114
  1320. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +0 -33
  1321. data/test/ApplicationPoolTest.cpp +0 -599
  1322. data/test/MessageChannelTest.cpp +0 -320
  1323. data/test/SpawnManagerTest.cpp +0 -64
  1324. data/test/StandardApplicationPoolTest.cpp +0 -27
  1325. data/test/StaticStringTest.cpp +0 -51
  1326. data/test/UtilsTest.cpp +0 -257
  1327. data/test/ruby/rails/application_spawner_spec.rb +0 -159
  1328. data/test/ruby/rails/framework_spawner_spec.rb +0 -133
  1329. data/test/ruby/rails/minimal_spawner_spec.rb +0 -93
  1330. data/test/ruby/rails/spawner_error_handling_spec.rb +0 -107
  1331. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +0 -97
  1332. data/test/ruby/spawn_server_spec.rb +0 -26
  1333. data/test/stub/MessageServer.dSYM/Contents/Info.plist +0 -25
  1334. data/test/stub/MessageServer.dSYM/Contents/Resources/DWARF/MessageServer +0 -0
  1335. data/test/support/Support.cpp +0 -84
  1336. data/test/support/Support.h +0 -118
  1337. data/test/support/config.rb +0 -38
  1338. data/test/support/run_rspec_tests.rb +0 -10
@@ -1,5 +1,5 @@
1
1
  # Phusion Passenger - http://www.modrails.com/
2
- # Copyright (c) 2008, 2009 Phusion
2
+ # Copyright (c) 2010 Phusion
3
3
  #
4
4
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
5
5
  #
@@ -22,9 +22,13 @@
22
22
  # THE SOFTWARE.
23
23
 
24
24
  require 'socket'
25
- require 'phusion_passenger/application'
25
+ require 'phusion_passenger/app_process'
26
26
  require 'phusion_passenger/message_channel'
27
+ require 'phusion_passenger/public_api'
27
28
  require 'phusion_passenger/utils'
29
+ require 'phusion_passenger/utils/tmpdir'
30
+ require 'phusion_passenger/native_support'
31
+
28
32
  module PhusionPassenger
29
33
  module WSGI
30
34
 
@@ -46,7 +50,7 @@ class ApplicationSpawner
46
50
  # - AppInitError: The WSGI application raised an exception or called
47
51
  # exit() during startup.
48
52
  # - SystemCallError, IOError, SocketError: Something went wrong.
49
- def spawn_application(app_root, lower_privilege = true, lowest_user = "nobody", environment = "production")
53
+ def spawn_application(options)
50
54
  a, b = UNIXSocket.pair
51
55
  pid = safe_fork(self.class.to_s, true) do
52
56
  a.close
@@ -55,36 +59,36 @@ class ApplicationSpawner
55
59
  NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open)
56
60
  close_all_io_objects_for_fds(file_descriptors_to_leave_open)
57
61
 
58
- run(MessageChannel.new(b), app_root, lower_privilege, lowest_user, environment)
62
+ run(MessageChannel.new(b), options)
59
63
  end
60
64
  b.close
61
65
  Process.waitpid(pid) rescue nil
62
66
 
63
67
  channel = MessageChannel.new(a)
64
- pid, socket_name, socket_type = channel.read
65
- if pid.nil?
66
- raise IOError, "Connection closed"
67
- end
68
- owner_pipe = channel.recv_io
69
- return Application.new(@app_root, pid, socket_name,
70
- socket_type, owner_pipe)
68
+ return AppProcess.read_from_channel(channel)
71
69
  end
72
70
 
73
71
  private
74
- def run(channel, app_root, lower_privilege, lowest_user, environment)
75
- $0 = "WSGI: #{app_root}"
76
- ENV['WSGI_ENV'] = environment
77
- Dir.chdir(app_root)
78
- if lower_privilege
79
- lower_privilege('passenger_wsgi.py', lowest_user)
72
+ def run(channel, options)
73
+ $0 = "WSGI: #{options['app_root']}"
74
+ prepare_app_process("passenger_wsgi.py", options)
75
+ ENV['WSGI_ENV'] = options['environment']
76
+
77
+ if defined?(NativeSupport)
78
+ unix_path_max = NativeSupport::UNIX_PATH_MAX
79
+ else
80
+ unix_path_max = 100
80
81
  end
81
82
 
82
- socket_file = "#{passenger_tmpdir}/backends/wsgi_backend.#{Process.pid}.#{rand 10000000}"
83
+ socket_file = "#{passenger_tmpdir}/backends/wsgi.#{Process.pid}.#{rand 10000000}"
84
+ socket_file = socket_file.slice(0, unix_path_max - 1)
83
85
  server = UNIXServer.new(socket_file)
84
86
  begin
87
+ File.chmod(0666, socket_file)
85
88
  reader, writer = IO.pipe
86
- channel.write(Process.pid, socket_file, "unix")
87
- channel.send_io(writer)
89
+ app_process = AppProcess.new(options["app_root"], Process.pid, writer,
90
+ :main => [socket_file, 'unix'])
91
+ app_process.write_to_channel(channel)
88
92
  writer.close
89
93
  channel.close
90
94
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python
2
2
  # Phusion Passenger - http://www.modrails.com/
3
- # Copyright (c) 2008, 2009 Phusion
3
+ # Copyright (c) 2010 Phusion
4
4
  #
5
5
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  #
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Phusion Passenger - http://www.modrails.com/
3
- # Copyright (c) 2008, 2009 Phusion
3
+ # Copyright (c) 2010 Phusion
4
4
  #
5
5
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  #
@@ -25,17 +25,30 @@
25
25
  ESSENTIALS = [
26
26
  "boost/detail/{limits,endian}.hpp",
27
27
  "boost/config/*",
28
- "boost/detail/sp_counted_*",
29
- "boost/detail/atomic_count*",
30
- "libs/thread/src/*"
28
+ "boost/smart_ptr/detail/sp_counted_*",
29
+ "boost/smart_ptr/detail/atomic_count*",
30
+ "boost/smart_ptr/detail/spinlock*",
31
+ "boost/thread/*",
32
+ "boost/thread/*/*",
33
+ "libs/thread/src/*",
34
+ "boost/date_time/gregorian/formatters_limited.hpp",
35
+ "boost/date_time/date_formatting_limited.hpp",
36
+ "boost/non_type.hpp"
37
+ ]
38
+ EXCLUDE = [
39
+ "libs/thread/src/win32/*"
31
40
  ]
32
41
  PROGRAM_SOURCE = %q{
33
42
  #include <boost/shared_ptr.hpp>
43
+ #include <boost/weak_ptr.hpp>
34
44
  #include <boost/thread.hpp>
45
+ #include <boost/noncopyable.hpp>
35
46
  #include <boost/function.hpp>
36
47
  #include <boost/bind.hpp>
37
48
  #include <boost/date_time/posix_time/posix_time.hpp>
38
49
  }
50
+
51
+ require 'fileutils'
39
52
  BOOST_DIR = ARGV[0]
40
53
  Dir.chdir(File.dirname(__FILE__) + "/../ext")
41
54
 
@@ -49,16 +62,22 @@ def sh(*command)
49
62
  end
50
63
 
51
64
  def install(source_filename, target_filename)
52
- command = ["install", "-D", "--mode=u+rw,g+r,o+r", source_filename, target_filename]
65
+ dir = File.dirname(target_filename)
66
+ if !File.exist?(dir)
67
+ sh "mkdir", "-p", dir
68
+ end
69
+ command = ["install", "-m", "u+rw,g+r,o+r", source_filename, target_filename]
53
70
  sh(*command)
54
71
  end
55
72
 
56
- def copy_boost_files(*patterns)
73
+ def copy_boost_files(patterns, exclude = nil)
57
74
  patterns.each do |pattern|
58
- Dir["#{BOOST_DIR}/#{pattern}"].each do |source|
75
+ files = Dir["#{BOOST_DIR}/#{pattern}"]
76
+ files -= exclude if exclude
77
+ files.each do |source|
59
78
  if File.directory?(source)
60
79
  source.slice!(0 .. BOOST_DIR.size)
61
- copy_boost_files("#{source}/*")
80
+ copy_boost_files(["#{source}/*"], exclude)
62
81
  else
63
82
  target = source.slice(BOOST_DIR.size + 1 .. source.size - 1)
64
83
  target.sub!(%r{^libs/thread/}, 'boost/')
@@ -71,7 +90,11 @@ def copy_boost_files(*patterns)
71
90
  end
72
91
 
73
92
  def copy_essential_files
74
- copy_boost_files(*ESSENTIALS)
93
+ exclude = []
94
+ EXCLUDE.each do |pattern|
95
+ exclude.concat(Dir["#{BOOST_DIR}/#{pattern}"])
96
+ end
97
+ copy_boost_files(ESSENTIALS, exclude)
75
98
  end
76
99
 
77
100
  def prepare
@@ -81,6 +104,10 @@ def prepare
81
104
  end
82
105
 
83
106
  def cleanup
107
+ FileUtils.rm_rf("boost/thread/win32")
108
+ FileUtils.rm_rf("boost/src/win32")
109
+ FileUtils.rm_rf("boost/asio/win32")
110
+ FileUtils.rm_rf("boost/smart_ptr/detail/spinlock_w32.hpp")
84
111
  File.unlink("test.cpp") rescue nil
85
112
  end
86
113
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Phusion Passenger - http://www.modrails.com/
3
- # Copyright (c) 2008, 2009 Phusion
3
+ # Copyright (c) 2010 Phusion
4
4
  #
5
5
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  #
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # Phusion Passenger - http://www.modrails.com/
3
- # Copyright (c) 2008, 2009 Phusion
3
+ # Copyright (c) 2010 Phusion
4
4
  #
5
5
  # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  #
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFbjCCA1YCCQCd2BBmpGM9zDANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJO
3
+ TDESMBAGA1UECBMJTmVkZXJsYW5kMRAwDgYDVQQKEwdQaHVzaW9uMSQwIgYDVQQD
4
+ ExtnYXRld2F5LnVuaW9uc3RhdGlvbmFwcC5jb20xHjAcBgkqhkiG9w0BCQEWD2lu
5
+ Zm9AcGh1c2lvbi5ubDAeFw0xMDA4MDkwOTU2MzVaFw0zNzEyMjQwOTU2MzVaMHkx
6
+ CzAJBgNVBAYTAk5MMRIwEAYDVQQIEwlOZWRlcmxhbmQxEDAOBgNVBAoTB1BodXNp
7
+ b24xJDAiBgNVBAMTG2dhdGV3YXkudW5pb25zdGF0aW9uYXBwLmNvbTEeMBwGCSqG
8
+ SIb3DQEJARYPaW5mb0BwaHVzaW9uLm5sMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
9
+ MIICCgKCAgEAvUjNLupLtz8IIQINJ1XaLmR+ttTOvrGx/Y++BggI3LqAHwMsWjG4
10
+ KIFhIpLfURViotthfbIYin3sPhC3WwvMfIoxezjAOnsXVcYB8ynxopu8WM4QSYLC
11
+ 64uAKyYlaHckxmppqGCBHtA+hHBLEDM/GO8hyJUn+Tjf0LEoranpfTLnZex9eMEo
12
+ Ggx08saKZ6A2JLQbMEPOf62DQciwI8ToK8eV1WSrg6O7fVuLe9YPXVeqT3hFGhYX
13
+ UXEFBFQs8EZDtEZvNCGyD3W3wnanQL/IGTm5BAiVVJoXnvXZoHMgX8ar2xQk1+t6
14
+ Wvd0nMF/3tWVPW3mQTDYErRpXx7m+ySwYp72yidk7IlFkFW/OIJIiHLMUnwlu9fv
15
+ PWlmNLVuubR5eu1/8Qb3hVPlqYFS/2nQRs4bYoO3r0enGY9V7deWtEeUuDlY5Y5C
16
+ Bf/bSf0Kt6vSt0Y9obu2xQDIwl6OBnIXpuxSSVinh+31ECymolUFUbWEuEqkRKPY
17
+ 6UYjyex6az2dIMnrr9WF1lfT+GTq4rZa4wmymT00sVofceI/TPFoglhkq93rnLix
18
+ TdUMnrywk3JUpGj1fsOI+PzGReUaJfR+4Gbau5Kab3ZKURQnY6toCQafaSGYJnO8
19
+ rdpWbhJOTLO82K71W7+Dqw4bzpWyU2PJAiEO5w6mD3G/es+iAPrt64ECAwEAATAN
20
+ BgkqhkiG9w0BAQUFAAOCAgEAQ2lkVAHv5SjCTeuKl93wSanxLL8zrvyh2DVYQc/b
21
+ v/PSCL3Afoidlvjc1qVCB93WfIHTPGG/xOI0EVi8W96Zg9D6P8Kjc79Vfs6MM8h/
22
+ vuHh4pS/PFTzmFd9nRI26iWMZl2DMQnXflSNJbxqWr0AtGZTnT9w/MR+2Kxu74AD
23
+ E0r3P11WoYpfWVc6SiEBJ9WnMlSoAT+xShIiXAsLuzoXQOMGfg5M3JIsXwQZtRGN
24
+ n58bq+prHroI1cU96xbmCw0fRgLuJYhdoU3uWE7usSutYaW7LT4T2oGR5x2ZPzy/
25
+ vr7jX8AbUJDWK3FbZ0//Zpkt9ldF60NJ/l42U6F5frQ+FSCDTX1k32RcG1vRIfM5
26
+ TZgBgT0D3AJoNPbNaEGWsBrxG3wZGxxvnamPM0S01WmxwL2PNM1UnUKG+y/ALfoc
27
+ JJeXyuY3HFt3DyYE4odyPOHye/fP1qLl1ZrJIzyAT0pUo38UB8uQ4HZUWD/LljJm
28
+ V0fUFWKWk6OawwIM4sYc90WezYgDfAT1RUDy0TnvKlG4FC1Oodnnm2rQFu+zDOWH
29
+ Fj0lBkzVUOlt2nWhLIW/uN3bjM9TsXaw8qUGWhvn4z3FHGHEdnLy3wMzwCSVq1tg
30
+ QilKaQe+8Y4SePo110Tmkfls6vyEhcN6KpRWdpQSXUXmMY7IxjfNJnKTeGvWd1Y9
31
+ CaY=
32
+ -----END CERTIFICATE-----
@@ -1,27 +1,38 @@
1
1
  ### This file contains system-specific configuration options that the test suite needs.
2
2
  ### Please customize it for your system.
3
3
 
4
- # These are the user names of two normal, non-administrator users.
5
- # Preferably, these are user accounts that are normally not used.
4
+ # These are the usernames and group names of normal, non-administrator
5
+ # users and groups. Preferably, these are user and group accounts that
6
+ # are normally not used.
6
7
  #
7
- # NOTE: these users MUST be able to access this 'test' directory,
8
+ # These users and groups MUST be able to access this 'test' directory,
8
9
  # otherwise the tests will fail.
10
+
11
+ ### Good values for Linux and FreeBSD:
9
12
  normal_user_1: games
10
13
  normal_user_2: daemon
14
+ # Must not be "nobody".
15
+ default_user: man
16
+ # Must not be normal_user_1's primary group.
17
+ normal_group_1: daemon
18
+ # Must not be normal_user_2's primary group.
19
+ normal_group_2: man
20
+ # Must not be default_user's primary group. Must not be "nobody".
21
+ default_group: games
11
22
 
12
- # The username of a user that has less privileges than a normal user.
13
- #
14
- # NOTES:
15
- # - this user MUST be able to access this 'test' directory, otherwise
16
- # the tests will fail.
17
- # - this user MUST NOT have a negative UID value. So on OS X, this may
18
- # not be the 'nobody' user.
19
- lowest_user: nobody
23
+ ### Good values for OS X. Same restrictions apply.
24
+ # normal_user_1: _www
25
+ # normal_user_2: daemon
26
+ # default_user: _sandbox
27
+ # normal_group_1: daemon
28
+ # normal_group_2: _sandbox
29
+ # default_group: _www
20
30
 
21
- # A nonexistant username.
31
+ # A nonexistant username, group name, user ID and group ID.
22
32
  nonexistant_user: xxxxxxxxxxxxxxxxxxx
23
- # A nonexistant user ID.
33
+ nonexistant_group: xxxxxxxxxxxxxxxxxxx
24
34
  nonexistant_uid: 9999
35
+ nonexistant_gid: 9999
25
36
 
26
37
 
27
38
  # If you want to run the Nginx integration tests, then set the following
@@ -0,0 +1,33 @@
1
+ #include "TestSupport.h"
2
+ #include "ApplicationPool/Pool.h"
3
+ #include "Utils.h"
4
+
5
+ using namespace Passenger;
6
+
7
+ namespace tut {
8
+ struct ApplicationPool_PoolTest {
9
+ ServerInstanceDirPtr serverInstanceDir;
10
+ ServerInstanceDir::GenerationPtr generation;
11
+ ApplicationPool::Ptr pool, pool2;
12
+
13
+ ApplicationPool_PoolTest() {
14
+ createServerInstanceDirAndGeneration(serverInstanceDir, generation);
15
+ pool = ptr(new ApplicationPool::Pool("../helper-scripts/passenger-spawn-server", generation));
16
+ pool2 = pool;
17
+ }
18
+
19
+ ApplicationPool::Ptr newPoolConnection() {
20
+ return pool;
21
+ }
22
+
23
+ void reinitializeWithSpawnManager(AbstractSpawnManagerPtr spawnManager) {
24
+ pool = ptr(new ApplicationPool::Pool(spawnManager));
25
+ pool2 = pool;
26
+ }
27
+ };
28
+
29
+ DEFINE_TEST_GROUP(ApplicationPool_PoolTest);
30
+
31
+ #define USE_TEMPLATE
32
+ #include "ApplicationPool_PoolTestCases.cpp"
33
+ }
@@ -0,0 +1,1029 @@
1
+ #include <sys/types.h>
2
+ #include <sys/stat.h>
3
+ #include <unistd.h>
4
+ #include <cstring>
5
+ #include <cstdlib>
6
+ #include <cerrno>
7
+ #include <sys/types.h>
8
+ #include <signal.h>
9
+ #include <utime.h>
10
+
11
+ /**
12
+ * This file is used as a template to test the different ApplicationPool::Interface implementations.
13
+ * It is #included in ApplicationPool_PoolTest.cpp and ApplicationPool_Server_PoolTest.cpp
14
+ */
15
+ #ifdef USE_TEMPLATE
16
+ static void sendTestRequest(SessionPtr &session, const char *uri = "/foo/new") {
17
+ string headers;
18
+ #define ADD_HEADER(name, value) \
19
+ headers.append(name); \
20
+ headers.append(1, '\0'); \
21
+ headers.append(value); \
22
+ headers.append(1, '\0')
23
+ ADD_HEADER("HTTP_HOST", "www.test.com");
24
+ ADD_HEADER("QUERY_STRING", "");
25
+ ADD_HEADER("REQUEST_URI", uri);
26
+ ADD_HEADER("REQUEST_METHOD", "GET");
27
+ ADD_HEADER("REMOTE_ADDR", "localhost");
28
+ ADD_HEADER("SCRIPT_NAME", "");
29
+ ADD_HEADER("PATH_INFO", uri);
30
+ ADD_HEADER("PASSENGER_CONNECT_PASSWORD", session->getConnectPassword());
31
+ session->sendHeaders(headers);
32
+ }
33
+
34
+ static SessionPtr spawnRackApp(ApplicationPool::Ptr pool, const char *appRoot) {
35
+ PoolOptions options;
36
+ options.appRoot = appRoot;
37
+ options.appType = "rack";
38
+ return pool->get(options);
39
+ }
40
+
41
+ static SessionPtr spawnWsgiApp(ApplicationPool::Ptr pool, const char *appRoot) {
42
+ PoolOptions options;
43
+ options.appRoot = appRoot;
44
+ options.appType = "wsgi";
45
+ return pool->get(options);
46
+ }
47
+
48
+ namespace {
49
+ class ReloadLoggingSpawnManager: public SpawnManager {
50
+ public:
51
+ vector<string> reloadLog;
52
+
53
+ ReloadLoggingSpawnManager(const string &spawnServerCommand,
54
+ const ServerInstanceDir::GenerationPtr &generation,
55
+ const AccountsDatabasePtr &accountsDatabase = AccountsDatabasePtr(),
56
+ const string &rubyCommand = "ruby")
57
+ : SpawnManager(spawnServerCommand, generation, accountsDatabase, rubyCommand)
58
+ { }
59
+
60
+ virtual void reload(const string &appRoot) {
61
+ reloadLog.push_back(appRoot);
62
+ SpawnManager::reload(appRoot);
63
+ }
64
+ };
65
+
66
+ struct SpawnRackAppFunction {
67
+ ApplicationPool::Ptr pool;
68
+ bool *done;
69
+ SessionPtr *session;
70
+
71
+ SpawnRackAppFunction() {
72
+ done = NULL;
73
+ session = NULL;
74
+ }
75
+
76
+ void operator()() {
77
+ PoolOptions options;
78
+ options.appRoot = "stub/rack";
79
+ options.appType = "rack";
80
+ options.useGlobalQueue = true;
81
+ SessionPtr session = pool->get(options);
82
+ *done = true;
83
+ if (this->session != NULL) {
84
+ *this->session = session;
85
+ }
86
+ }
87
+ };
88
+ }
89
+
90
+ TEST_METHOD(1) {
91
+ // Calling ApplicationPool.get() once should return a valid Session.
92
+ SessionPtr session(spawnRackApp(pool, "stub/rack"));
93
+ sendTestRequest(session);
94
+ session->shutdownWriter();
95
+
96
+ int reader = session->getStream();
97
+ string result(readAll(reader));
98
+ session->closeStream();
99
+ ensure(result.find("hello <b>world</b>") != string::npos);
100
+ }
101
+
102
+ TEST_METHOD(2) {
103
+ // Verify that the pool spawns a new app, and that
104
+ // after the session is closed, the app is kept around.
105
+ SessionPtr session(spawnRackApp(pool, "stub/rack"));
106
+ ensure_equals("Before the session was closed, the app was busy", pool->getActive(), 1u);
107
+ ensure_equals("Before the session was closed, the app was in the pool", pool->getCount(), 1u);
108
+ session.reset();
109
+ ensure_equals("After the session is closed, the app is no longer busy", pool->getActive(), 0u);
110
+ ensure_equals("After the session is closed, the app is kept around", pool->getCount(), 1u);
111
+ }
112
+
113
+ TEST_METHOD(3) {
114
+ // If we call get() with an application root, then we close the session,
115
+ // and then we call get() again with the same app group name,
116
+ // then the pool should not have spawned more than 1 app in total.
117
+ SessionPtr session(spawnRackApp(pool, "stub/rack"));
118
+ session.reset();
119
+ session = spawnRackApp(pool, "stub/rack");
120
+ ensure_equals(pool->getCount(), 1u);
121
+ }
122
+
123
+ TEST_METHOD(4) {
124
+ // If we call get() with an app group name, then we call get() again before closing
125
+ // the session, then the pool will eventually have spawned 2 apps in total.
126
+ SessionPtr session(spawnRackApp(pool, "stub/rack"));
127
+ SessionPtr session2(spawnRackApp(pool2, "stub/rack"));
128
+ EVENTUALLY(5,
129
+ result = pool->getCount() == 2u;
130
+ );
131
+ }
132
+
133
+ TEST_METHOD(5) {
134
+ // If we call get() twice with different app group names,
135
+ // then the pool should spawn two different apps.
136
+ TempDirCopy c1("stub/rack", "rackapp1.tmp");
137
+ TempDirCopy c2("stub/rack", "rackapp2.tmp");
138
+ replaceStringInFile("rackapp2.tmp/config.ru", "world", "world 2");
139
+ SessionPtr session = spawnRackApp(pool, "rackapp1.tmp");
140
+ SessionPtr session2 = spawnRackApp(pool2, "rackapp2.tmp");
141
+ ensure_equals("Before the sessions were closed, both apps were busy", pool->getActive(), 2u);
142
+ ensure_equals("Before the sessions were closed, both apps were in the pool", pool->getCount(), 2u);
143
+
144
+ sendTestRequest(session);
145
+ string result = readAll(session->getStream());
146
+ ensure("Session 1 belongs to the correct app", result.find("hello <b>world</b>") != string::npos);
147
+ session.reset();
148
+
149
+ sendTestRequest(session2);
150
+ result = readAll(session2->getStream());
151
+ ensure("Session 2 belongs to the correct app", result.find("hello <b>world 2</b>") != string::npos);
152
+ session2.reset();
153
+ }
154
+
155
+ TEST_METHOD(6) {
156
+ // If we call get() twice with different app group names,
157
+ // and we close both sessions, then both 2 apps should still
158
+ // be in the pool.
159
+ TempDirCopy c1("stub/rack", "rackapp1.tmp");
160
+ TempDirCopy c2("stub/rack", "rackapp2.tmp");
161
+ SessionPtr session(spawnRackApp(pool, "rackapp1.tmp"));
162
+ SessionPtr session2(spawnRackApp(pool, "rackapp2.tmp"));
163
+ session.reset();
164
+ session2.reset();
165
+ ensure_equals("There are 0 active apps", pool->getActive(), 0u);
166
+ ensure_equals("There are 2 apps in total", pool->getCount(), 2u);
167
+ }
168
+
169
+ TEST_METHOD(7) {
170
+ // If we call get() even though the pool is already full
171
+ // (active == max), and the app group name is already
172
+ // in the pool, then the pool must wait until there's an
173
+ // inactive application.
174
+ pool->setMax(1);
175
+ // TODO: How do we test this?
176
+ }
177
+
178
+ TEST_METHOD(8) {
179
+ // If ApplicationPool spawns a new instance,
180
+ // and we kill it, then the next get() with the
181
+ // same application root should not throw an exception:
182
+ // ApplicationPool should spawn a new instance
183
+ // after detecting that the original one died.
184
+ SessionPtr session = spawnRackApp(pool, "stub/rack");
185
+ kill(session->getPid(), SIGKILL);
186
+ session.reset();
187
+ usleep(20000); // Give the process some time to exit.
188
+ spawnRackApp(pool, "stub/rack"); // should not throw
189
+ }
190
+
191
+ struct PoolWaitTestThread {
192
+ ApplicationPool::Ptr pool;
193
+ SessionPtr &m_session;
194
+ bool &m_done;
195
+
196
+ PoolWaitTestThread(const ApplicationPool::Ptr &pool,
197
+ SessionPtr &session,
198
+ bool &done)
199
+ : m_session(session), m_done(done) {
200
+ this->pool = pool;
201
+ done = false;
202
+ }
203
+
204
+ void operator()() {
205
+ m_session = spawnWsgiApp(pool, "stub/wsgi");
206
+ m_done = true;
207
+ }
208
+ };
209
+
210
+ TEST_METHOD(9) {
211
+ // If we call get() even though the pool is already full
212
+ // (active == max), and the app group name is *not* already
213
+ // in the pool, then the pool will wait until enough sessions
214
+ // have been closed.
215
+
216
+ // Make the pool full.
217
+ pool->setMax(2);
218
+ SessionPtr session1 = spawnRackApp(pool, "stub/rack");
219
+ SessionPtr session2 = spawnRackApp(pool2, "stub/rack");
220
+ EVENTUALLY(5,
221
+ result = pool->getCount() == 2u;
222
+ );
223
+ session1.reset();
224
+ session2.reset();
225
+ EVENTUALLY(5,
226
+ result = pool->getActive() == 0u;
227
+ );
228
+ session1 = spawnRackApp(pool, "stub/rack");
229
+ session2 = spawnRackApp(pool2, "stub/rack");
230
+ ensure_equals(pool->getActive(), 2u);
231
+
232
+ // Now spawn an app with a different app root.
233
+ SessionPtr session3;
234
+ bool done;
235
+ TempThread thr(PoolWaitTestThread(pool2, session3, done));
236
+ usleep(500000);
237
+ ensure("ApplicationPool is still waiting", !done);
238
+ ensure_equals(pool->getActive(), 2u);
239
+ ensure_equals(pool->getCount(), 2u);
240
+
241
+ // Now release one slot from the pool.
242
+ session1.reset();
243
+
244
+ // Session 3 should eventually be opened.
245
+ EVENTUALLY(10,
246
+ result = done;
247
+ );
248
+ ensure_equals(pool->getActive(), 2u);
249
+ ensure_equals(pool->getCount(), 2u);
250
+ }
251
+
252
+ TEST_METHOD(10) {
253
+ // If we call get(), and:
254
+ // * the pool is already full, but there are inactive apps
255
+ // (active < count && count == max)
256
+ // and
257
+ // * the app group name for this get() is *not* already in the pool
258
+ // then the an inactive app should be killed in order to
259
+ // satisfy this get() command.
260
+ TempDirCopy c1("stub/rack", "rackapp1.tmp");
261
+ TempDirCopy c2("stub/rack", "rackapp2.tmp");
262
+
263
+ // Make the pool full.
264
+ pool->setMax(2);
265
+ SessionPtr session1 = spawnRackApp(pool, "rackapp1.tmp");
266
+ SessionPtr session2 = spawnRackApp(pool2, "rackapp1.tmp");
267
+ EVENTUALLY(5,
268
+ result = pool->getCount() == 2u;
269
+ );
270
+ session1.reset();
271
+ session2.reset();
272
+ EVENTUALLY(5,
273
+ result = pool->getActive() == 0u;
274
+ );
275
+
276
+ // Now spawn a different app.
277
+ session1 = spawnRackApp(pool, "rackapp2.tmp");
278
+ ensure_equals(pool->getActive(), 1u);
279
+ ensure_equals(pool->getCount(), 2u);
280
+ }
281
+
282
+ TEST_METHOD(11) {
283
+ // A Session should still be usable after the pool has been destroyed.
284
+ SessionPtr session = spawnRackApp(pool, "stub/rack");
285
+ pool->clear();
286
+ pool.reset();
287
+ pool2.reset();
288
+
289
+ sendTestRequest(session);
290
+ session->shutdownWriter();
291
+
292
+ int reader = session->getStream();
293
+ string result = readAll(reader);
294
+ session->closeStream();
295
+ ensure(result.find("hello <b>world</b>") != string::npos);
296
+ }
297
+
298
+ TEST_METHOD(12) {
299
+ // If tmp/restart.txt didn't exist but has now been created,
300
+ // then the applications under app_root should be restarted.
301
+ struct stat buf;
302
+ TempDirCopy c("stub/rack", "rackapp.tmp");
303
+ SessionPtr session1 = spawnRackApp(pool, "rackapp.tmp");
304
+ SessionPtr session2 = spawnRackApp(pool2, "rackapp.tmp");
305
+ session1.reset();
306
+ session2.reset();
307
+ EVENTUALLY(5,
308
+ result = pool->getCount() == 2u;
309
+ );
310
+
311
+ touchFile("rackapp.tmp/tmp/restart.txt");
312
+ spawnRackApp(pool, "rackapp.tmp");
313
+
314
+ ensure_equals("No apps are active", pool->getActive(), 0u);
315
+ ensure_equals("Both apps are killed, and a new one was spawned",
316
+ pool->getCount(), 1u);
317
+ ensure("Restart file still exists",
318
+ stat("rackapp.tmp/tmp/restart.txt", &buf) == 0);
319
+ }
320
+
321
+ TEST_METHOD(13) {
322
+ // If tmp/restart.txt was present, and its timestamp changed
323
+ // since the last check, then the applications under the app group name
324
+ // should still be restarted. However, a subsequent get()
325
+ // should not result in a restart.
326
+ pid_t old_pid;
327
+ TempDirCopy c("stub/rack", "rackapp.tmp");
328
+ TempDir d("rackapp.tmp/tmp/restart.txt");
329
+ SessionPtr session = spawnRackApp(pool, "rackapp.tmp");
330
+ old_pid = session->getPid();
331
+ session.reset();
332
+ EVENTUALLY(5,
333
+ result = pool->getActive() == 0u;
334
+ );
335
+
336
+ touchFile("rackapp.tmp/tmp/restart.txt", 10);
337
+
338
+ session = spawnRackApp(pool, "rackapp.tmp");
339
+ ensure("The app was restarted", session->getPid() != old_pid);
340
+ old_pid = session->getPid();
341
+ session.reset();
342
+ EVENTUALLY(5,
343
+ result = pool->getActive() == 0u;
344
+ );
345
+
346
+ session = spawnRackApp(pool, "rackapp.tmp");
347
+ ensure_equals("The app was not restarted",
348
+ old_pid, session->getPid());
349
+ }
350
+
351
+ TEST_METHOD(15) {
352
+ // Test whether restarting with restart.txt really results in code reload.
353
+ TempDirCopy c("stub/rack", "rackapp.tmp");
354
+ SessionPtr session = spawnRackApp(pool, "rackapp.tmp");
355
+ sendTestRequest(session);
356
+ string result = readAll(session->getStream());
357
+ ensure(result.find("hello <b>world</b>") != string::npos);
358
+ session.reset();
359
+ EVENTUALLY(5,
360
+ result = pool->getActive() == 0u;
361
+ );
362
+
363
+ touchFile("rackapp.tmp/tmp/restart.txt");
364
+ replaceStringInFile("rackapp.tmp/config.ru", "world", "world 2");
365
+
366
+ session = spawnRackApp(pool, "rackapp.tmp");
367
+ sendTestRequest(session);
368
+ result = readAll(session->getStream());
369
+ ensure("App code has been reloaded", result.find("hello <b>world 2</b>") != string::npos);
370
+ }
371
+
372
+ TEST_METHOD(16) {
373
+ // If tmp/always_restart.txt is present and is a file,
374
+ // then the application under app_root should be always restarted.
375
+ struct stat buf;
376
+ pid_t old_pid;
377
+ TempDirCopy c("stub/rack", "rackapp.tmp");
378
+ SessionPtr session1 = spawnRackApp(pool, "rackapp.tmp");
379
+ SessionPtr session2 = spawnRackApp(pool2, "rackapp.tmp");
380
+ session1.reset();
381
+ session2.reset();
382
+ EVENTUALLY(5,
383
+ result = pool->getActive() == 0u && pool->getCount() == 2u;
384
+ );
385
+
386
+ touchFile("rackapp.tmp/tmp/always_restart.txt");
387
+
388
+ // This get() results in a restart.
389
+ session1 = spawnRackApp(pool, "rackapp.tmp");
390
+ old_pid = session1->getPid();
391
+ session1.reset();
392
+ EVENTUALLY(5,
393
+ // First restart: no apps are active
394
+ result = pool->getActive() == 0u;
395
+ );
396
+ ensure_equals("First restart: the first 2 apps were killed, and a new one was spawned",
397
+ pool->getCount(), 1u);
398
+ ensure("always_restart file has not been deleted",
399
+ stat("rackapp.tmp/tmp/always_restart.txt", &buf) == 0);
400
+
401
+ // This get() results in a restart as well.
402
+ session1 = spawnRackApp(pool, "rackapp.tmp");
403
+ ensure(old_pid != session1->getPid());
404
+ session1.reset();
405
+ EVENTUALLY(5,
406
+ // Second restart: no apps are active
407
+ result = pool->getActive() == 0u;
408
+ );
409
+ ensure_equals("Second restart: the last app was killed, and a new one was spawned",
410
+ pool->getCount(), 1u);
411
+ ensure("always_restart file has not been deleted",
412
+ stat("rackapp.tmp/tmp/always_restart.txt", &buf) == 0);
413
+ }
414
+
415
+ TEST_METHOD(17) {
416
+ // If tmp/always_restart.txt is present and is a directory,
417
+ // then the application under app_root should be always restarted.
418
+ struct stat buf;
419
+ pid_t old_pid;
420
+ TempDirCopy c("stub/rack", "rackapp.tmp");
421
+ SessionPtr session1 = spawnRackApp(pool, "rackapp.tmp");
422
+ SessionPtr session2 = spawnRackApp(pool2, "rackapp.tmp");
423
+ session1.reset();
424
+ session2.reset();
425
+ EVENTUALLY(5,
426
+ result = pool->getActive() == 0u && pool->getCount() == 2u;
427
+ );
428
+
429
+ TempDir d("rackapp.tmp/tmp/always_restart.txt");
430
+
431
+ // This get() results in a restart.
432
+ session1 = spawnRackApp(pool, "rackapp.tmp");
433
+ old_pid = session1->getPid();
434
+ session1.reset();
435
+ EVENTUALLY(5,
436
+ // First restart: no apps are active
437
+ result = pool->getActive() == 0u;
438
+ );
439
+ ensure_equals("First restart: the first 2 apps were killed, and a new one was spawned",
440
+ pool->getCount(), 1u);
441
+ ensure("always_restart directory has not been deleted",
442
+ stat("rackapp.tmp/tmp/always_restart.txt", &buf) == 0);
443
+
444
+ // This get() results in a restart as well.
445
+ session1 = spawnRackApp(pool, "rackapp.tmp");
446
+ ensure(old_pid != session1->getPid());
447
+ session1.reset();
448
+ EVENTUALLY(5,
449
+ // Second restart: no apps are active
450
+ result = pool->getActive() == 0u;
451
+ );
452
+ ensure_equals("Second restart: the last app was killed, and a new one was spawned",
453
+ pool->getCount(), 1u);
454
+ ensure("always_restart directory has not been deleted",
455
+ stat("rackapp.tmp/tmp/always_restart.txt", &buf) == 0);
456
+ }
457
+
458
+ TEST_METHOD(18) {
459
+ // Test whether restarting with tmp/always_restart.txt really results in code reload.
460
+ TempDirCopy c("stub/rack", "rackapp.tmp");
461
+ SessionPtr session = spawnRackApp(pool, "rackapp.tmp");
462
+ sendTestRequest(session);
463
+ string result = readAll(session->getStream());
464
+ ensure(result.find("hello <b>world</b>") != string::npos);
465
+ session.reset();
466
+
467
+ touchFile("rackapp.tmp/tmp/always_restart.txt");
468
+ replaceStringInFile("rackapp.tmp/config.ru", "world", "world 2");
469
+
470
+ session = spawnRackApp(pool, "rackapp.tmp");
471
+ sendTestRequest(session);
472
+ result = readAll(session->getStream());
473
+ ensure("App code has been reloaded (1)", result.find("hello <b>world 2</b>") != string::npos);
474
+ session.reset();
475
+ EVENTUALLY(5,
476
+ result = pool->getActive() == 0u;
477
+ );
478
+
479
+ replaceStringInFile("rackapp.tmp/config.ru", "world 2", "world 3");
480
+ session = spawnRackApp(pool, "rackapp.tmp");
481
+ sendTestRequest(session);
482
+ result = readAll(session->getStream());
483
+ ensure("App code has been reloaded (2)", result.find("hello <b>world 3</b>") != string::npos);
484
+ session.reset();
485
+ }
486
+
487
+ TEST_METHOD(19) {
488
+ // If tmp/restart.txt and tmp/always_restart.txt are present,
489
+ // the application under app_root should still be restarted and
490
+ // both files must be kept.
491
+ pid_t old_pid, pid;
492
+ struct stat buf;
493
+ TempDirCopy c("stub/rack", "rackapp.tmp");
494
+ SessionPtr session1 = spawnRackApp(pool, "rackapp.tmp");
495
+ SessionPtr session2 = spawnRackApp(pool2, "rackapp.tmp");
496
+ session1.reset();
497
+ session2.reset();
498
+ EVENTUALLY(5,
499
+ result = pool->getActive() == 0u && pool->getCount() == 2u;
500
+ );
501
+
502
+ touchFile("rackapp.tmp/tmp/restart.txt");
503
+ touchFile("rackapp.tmp/tmp/always_restart.txt");
504
+
505
+ old_pid = spawnRackApp(pool, "rackapp.tmp")->getPid();
506
+ ensure("always_restart.txt file has not been deleted",
507
+ stat("rackapp.tmp/tmp/always_restart.txt", &buf) == 0);
508
+ ensure("restart.txt file has not been deleted",
509
+ stat("rackapp.tmp/tmp/restart.txt", &buf) == 0);
510
+ EVENTUALLY(5,
511
+ result = pool->getActive() == 0u;
512
+ );
513
+
514
+ pid = spawnRackApp(pool, "rackapp.tmp")->getPid();
515
+ ensure("The app was restarted", pid != old_pid);
516
+ }
517
+
518
+ TEST_METHOD(20) {
519
+ // It should look for restart.txt in the directory given by
520
+ // the restartDir option, if available.
521
+ struct stat buf;
522
+ char path[1024];
523
+ PoolOptions options("stub/rack");
524
+ options.appType = "rack";
525
+ options.restartDir = string(getcwd(path, sizeof(path))) + "/stub/rack";
526
+
527
+ SessionPtr session1 = pool->get(options);
528
+ SessionPtr session2 = pool2->get(options);
529
+ session1.reset();
530
+ session2.reset();
531
+ EVENTUALLY(5,
532
+ result = pool->getActive() == 0u && pool->getCount() == 2u;
533
+ );
534
+
535
+ DeleteFileEventually f("stub/rack/restart.txt");
536
+ touchFile("stub/rack/restart.txt");
537
+
538
+ pool->get(options);
539
+
540
+ ensure_equals("No apps are active", pool->getActive(), 0u);
541
+ ensure_equals("Both apps are killed, and a new one was spawned",
542
+ pool->getCount(), 1u);
543
+ ensure("Restart file still exists",
544
+ stat("stub/rack/restart.txt", &buf) == 0);
545
+ }
546
+
547
+ TEST_METHOD(21) {
548
+ // restartDir may also be a directory relative to the
549
+ // application root.
550
+ struct stat buf;
551
+ PoolOptions options("stub/rack");
552
+ options.appType = "rack";
553
+ options.restartDir = "public";
554
+
555
+ SessionPtr session1 = pool->get(options);
556
+ SessionPtr session2 = pool2->get(options);
557
+ session1.reset();
558
+ session2.reset();
559
+ EVENTUALLY(5,
560
+ result = pool->getActive() == 0u && pool->getCount() == 2u;
561
+ );
562
+
563
+ DeleteFileEventually f("stub/rack/public/restart.txt");
564
+ touchFile("stub/rack/public/restart.txt");
565
+
566
+ pool->get(options);
567
+
568
+ ensure_equals("No apps are active", pool->getActive(), 0u);
569
+ ensure_equals("Both apps are killed, and a new one was spawned",
570
+ pool->getCount(), 1u);
571
+ ensure("Restart file still exists",
572
+ stat("stub/rack/public/restart.txt", &buf) == 0);
573
+ }
574
+
575
+ TEST_METHOD(22) {
576
+ // The cleaner thread should clean idle applications.
577
+ pool->setMaxIdleTime(1);
578
+ spawnRackApp(pool, "stub/rack");
579
+ EVENTUALLY(10,
580
+ result = pool->getCount() == 0u;
581
+ );
582
+
583
+ time_t begin = time(NULL);
584
+ while (pool->getCount() == 1u && time(NULL) - begin < 10) {
585
+ usleep(100000);
586
+ }
587
+ ensure_equals("App should have been cleaned up", pool->getCount(), 0u);
588
+ }
589
+
590
+ TEST_METHOD(23) {
591
+ // MaxPerApp is respected.
592
+ pool->setMax(3);
593
+ pool->setMaxPerApp(1);
594
+
595
+ // We connect to stub/rack while it already has an instance with
596
+ // 1 request in its queue. Assert that the pool doesn't spawn
597
+ // another instance.
598
+ SessionPtr session1 = spawnRackApp(pool, "stub/rack");
599
+ SessionPtr session2 = spawnRackApp(pool2, "stub/rack");
600
+
601
+ // We connect to stub/wsgi. Assert that the pool spawns a new
602
+ // instance for this app.
603
+ TempDirCopy c("stub/wsgi", "wsgiapp.tmp");
604
+ ApplicationPool::Ptr pool3 = newPoolConnection();
605
+ SessionPtr session3 = spawnWsgiApp(pool3, "wsgiapp.tmp");
606
+ ensure_equals(pool->getCount(), 2u);
607
+ }
608
+
609
+ TEST_METHOD(24) {
610
+ // Application instance is shutdown after 'maxRequests' requests.
611
+ PoolOptions options("stub/rack");
612
+ int reader;
613
+ pid_t originalPid;
614
+ SessionPtr session;
615
+
616
+ options.appType = "rack";
617
+ options.maxRequests = 4;
618
+ pool->setMax(1);
619
+ session = pool->get(options);
620
+ originalPid = session->getPid();
621
+ session.reset();
622
+ EVENTUALLY(5,
623
+ result = pool->getActive() == 0u;
624
+ );
625
+
626
+ for (unsigned int i = 0; i < 4; i++) {
627
+ session = pool->get(options);
628
+ sendTestRequest(session);
629
+ session->shutdownWriter();
630
+ reader = session->getStream();
631
+ readAll(reader);
632
+ // Must explicitly call reset() here because we
633
+ // want to close the session right now.
634
+ session.reset();
635
+ EVENTUALLY(5,
636
+ result = pool->getActive() == 0u;
637
+ );
638
+ }
639
+
640
+ session = pool->get(options);
641
+ ensure(session->getPid() != originalPid);
642
+ }
643
+
644
+ TEST_METHOD(25) {
645
+ // If global queueing mode is enabled, then get() waits until
646
+ // there's at least one idle backend process for this application
647
+ // domain.
648
+ pool->setMax(1);
649
+
650
+ PoolOptions options;
651
+ options.appRoot = "stub/rack";
652
+ options.appType = "rack";
653
+ options.useGlobalQueue = true;
654
+ SessionPtr session = pool->get(options);
655
+
656
+ bool done = false;
657
+ SpawnRackAppFunction func;
658
+ func.pool = pool2;
659
+ func.done = &done;
660
+ TempThread thr(func);
661
+
662
+ // Previous session hasn't been closed yet, so pool should still
663
+ // be waiting.
664
+ usleep(100000);
665
+ ensure("(1)", !done);
666
+ ensure_equals("(2)", pool->getGlobalQueueSize(), 1u);
667
+ ensure_equals("(3)", pool->getActive(), 1u);
668
+ ensure_equals("(4)", pool->getCount(), 1u);
669
+
670
+ // Close the previous session. The thread should now finish.
671
+ session.reset();
672
+ EVENTUALLY(5,
673
+ result = done;
674
+ );
675
+ }
676
+
677
+ TEST_METHOD(26) {
678
+ // When a previous application group spinned down, and we touched
679
+ // restart.txt and try to spin up a new process for this domain,
680
+ // then any ApplicationSpawner/FrameworkSpawner processes should be
681
+ // killed first.
682
+ SessionPtr session;
683
+ TempDirCopy c1("stub/rack", "rackapp1.tmp");
684
+ TempDirCopy c2("stub/rack", "rackapp2.tmp");
685
+ shared_ptr<ReloadLoggingSpawnManager> spawnManager(
686
+ new ReloadLoggingSpawnManager("../helper-scripts/passenger-spawn-server", generation)
687
+ );
688
+ reinitializeWithSpawnManager(spawnManager);
689
+
690
+ pool->setMax(1);
691
+ session = spawnRackApp(pool, "rackapp1.tmp");
692
+ session.reset();
693
+ session = spawnRackApp(pool, "rackapp2.tmp");
694
+ ensure_equals("rackapp2.tmp is not reloaded because restart.txt is not touched",
695
+ spawnManager->reloadLog.size(), 0u);
696
+ session.reset();
697
+ EVENTUALLY(5,
698
+ result = pool->getActive() == 0u;
699
+ );
700
+
701
+ touchFile("rackapp1.tmp/tmp/restart.txt");
702
+ session = spawnRackApp(pool, "rackapp1.tmp");
703
+ ensure_equals("rackapp1.tmp is reloaded because restart.txt is touched (1)",
704
+ spawnManager->reloadLog.size(), 1u);
705
+ ensure_equals("rackapp1.tmp is reloaded because restart.txt is touched (2)",
706
+ spawnManager->reloadLog[0], "rackapp1.tmp");
707
+ }
708
+
709
+ TEST_METHOD(27) {
710
+ // Test inspect()
711
+ SessionPtr session1 = spawnRackApp(pool, "stub/rack");
712
+ string str = pool->inspect();
713
+ ensure("Contains 'max = '", str.find("max ") != string::npos);
714
+ ensure("Contains PID", str.find("PID: " + toString(session1->getPid())) != string::npos);
715
+ }
716
+
717
+ TEST_METHOD(28) {
718
+ // Test toXml(true)
719
+ SessionPtr session1 = spawnRackApp(pool, "stub/rack");
720
+ string xml = pool->toXml();
721
+ ensure("Contains <process>", xml.find("<process>") != string::npos);
722
+ ensure("Contains PID", xml.find("<pid>" + toString(session1->getPid()) + "</pid>") != string::npos);
723
+ ensure("Contains sensitive information", xml.find("<server_sockets>") != string::npos);
724
+ }
725
+
726
+ TEST_METHOD(29) {
727
+ // Test toXml(false)
728
+ SessionPtr session1 = spawnRackApp(pool, "stub/rack");
729
+ string xml = pool->toXml(false);
730
+ ensure("Contains <process>", xml.find("<process>") != string::npos);
731
+ ensure("Contains PID", xml.find("<pid>" + toString(session1->getPid()) + "</pid>") != string::npos);
732
+ ensure("Does not contain sensitive information", xml.find("<server_sockets>") == string::npos);
733
+ }
734
+
735
+ TEST_METHOD(30) {
736
+ // Test detach().
737
+
738
+ // Create 2 processes, where only the first one is active.
739
+ SessionPtr session1 = spawnRackApp(pool, "stub/rack");
740
+ SessionPtr session2 = spawnRackApp(pool2, "stub/rack");
741
+ session2.reset();
742
+ EVENTUALLY(5,
743
+ result = pool->getActive() == 1u && pool->getCount() == 2u;
744
+ );
745
+
746
+ // Make sure session2 refers to a different process than session1.
747
+ session2 = spawnRackApp(pool2, "stub/rack");
748
+ string session2dk = session2->getDetachKey();
749
+ session2.reset();
750
+ EVENTUALLY(5,
751
+ result = pool->getActive() == 1u;
752
+ );
753
+
754
+ // First detach works. It was active so the 'active' property
755
+ // is decremented.
756
+ ensure("(10)", pool->detach(session1->getDetachKey()));
757
+ ensure_equals("(11)", pool->getActive(), 0u);
758
+ ensure_equals("(12)", pool->getCount(), 1u);
759
+
760
+ // Second detach with the same identifier doesn't do anything.
761
+ ensure("(20)", !pool->detach(session1->getDetachKey()));
762
+ ensure_equals("(21)", pool->getActive(), 0u);
763
+ ensure_equals("(22)", pool->getCount(), 1u);
764
+
765
+ // Detaching an inactive process works too.
766
+ ensure("(30)", pool->detach(session2dk));
767
+ ensure_equals("(31)", pool->getActive(), 0u);
768
+ ensure_equals("(32)", pool->getCount(), 0u);
769
+ }
770
+
771
+ TEST_METHOD(31) {
772
+ // If the app group does not yet exist, and options.minProcesses > 0,
773
+ // then get() will spawn 1 process immediately, return its session,
774
+ // and spawn more processes in the background until options.minProcesses
775
+ // is satisfied.
776
+ TempDirCopy c1("stub/rack", "rackapp.tmp");
777
+ PoolOptions options;
778
+ options.appRoot = "rackapp.tmp";
779
+ options.appType = "rack";
780
+ options.minProcesses = 3;
781
+ options.spawnMethod = "conservative";
782
+
783
+ writeFile("rackapp.tmp/config.ru",
784
+ "sleep 0.1\n"
785
+ "run lambda {}\n");
786
+
787
+ SessionPtr session1 = pool->get(options);
788
+ ensure_equals(pool->getActive(), 1u);
789
+ ensure_equals(pool->getCount(), 1u);
790
+
791
+ EVENTUALLY(5,
792
+ result = pool->getCount() == 3u;
793
+ );
794
+ }
795
+
796
+ TEST_METHOD(32) {
797
+ // If the app group already exists, all processes are active,
798
+ // count < max, options.minProcesses > 0 and global queuing turned off,
799
+ // then get() will check out an existing process immediately
800
+ // and spawn new ones in the background until options.minProcesses
801
+ // is satisfied.
802
+ TempDirCopy c1("stub/rack", "rackapp.tmp");
803
+ PoolOptions options;
804
+ options.appRoot = "rackapp.tmp";
805
+ options.appType = "rack";
806
+ options.spawnMethod = "conservative";
807
+ options.minProcesses = 3;
808
+ pool->setMax(3);
809
+
810
+ // Spawn a single process.
811
+ SessionPtr session1 = pool->get(options);
812
+ ensure_equals(pool->getActive(), 1u);
813
+ ensure_equals(pool->getCount(), 1u);
814
+
815
+ writeFile("rackapp.tmp/config.ru",
816
+ "sleep 0.1\n"
817
+ "run lambda {}\n");
818
+
819
+ // Now call get(); this one will use the previous process
820
+ // and spawn a new one in the background.
821
+ SessionPtr session2 = pool2->get(options);
822
+ ensure_equals(pool->getActive(), 1u);
823
+ ensure_equals(pool->getCount(), 1u);
824
+ ensure_equals(session1->getPid(), session2->getPid());
825
+
826
+ EVENTUALLY(5,
827
+ result = pool->getCount() == 3u;
828
+ );
829
+ }
830
+
831
+ /* If the app group already exists, all processes are active,
832
+ * count < max, options.minProcesses > 0 and global queuing turned on,
833
+ * then get() will wait until either
834
+ * (1) an existing process becomes inactive.
835
+ * or until
836
+ * (2) a new process has been spawned.
837
+ */
838
+
839
+ TEST_METHOD(33) {
840
+ // Here we test scenario (1).
841
+ PoolOptions options;
842
+ options.appRoot = "stub/rack";
843
+ options.appType = "rack";
844
+ options.minProcesses = 3;
845
+ options.useGlobalQueue = true;
846
+ pool->setMax(3);
847
+
848
+ ApplicationPool::Ptr pool3 = newPoolConnection();
849
+ ApplicationPool::Ptr pool4 = newPoolConnection();
850
+
851
+ // Spawn 3 processes.
852
+ SessionPtr session1 = pool->get(options);
853
+ SessionPtr session2 = pool2->get(options);
854
+ session2.reset();
855
+ EVENTUALLY(5,
856
+ result = pool->getCount() == 3u;
857
+ );
858
+
859
+ // Make sure all of them are active.
860
+ session2 = pool2->get(options);
861
+ SessionPtr session3 = pool3->get(options);
862
+ ensure_equals(pool->getActive(), 3u);
863
+ ensure_equals(pool->getCount(), 3u);
864
+
865
+ // Now call get() in a thread.
866
+ SpawnRackAppFunction func;
867
+ bool done = false;
868
+ func.pool = pool4;
869
+ func.done = &done;
870
+ TempThread thr(func);
871
+
872
+ usleep(20000);
873
+ ensure("Still waiting on global queue", !done);
874
+ ensure_equals(pool->getGlobalQueueSize(), 1u);
875
+
876
+ // Make 1 process available.
877
+ session1.reset();
878
+ EVENTUALLY(5,
879
+ result = done;
880
+ );
881
+ }
882
+
883
+ TEST_METHOD(34) {
884
+ // Here we test scenario (2).
885
+ PoolOptions options;
886
+ options.appRoot = "stub/rack";
887
+ options.appType = "rack";
888
+ options.minProcesses = 3;
889
+ options.useGlobalQueue = true;
890
+ pool->setMax(3);
891
+
892
+ ApplicationPool::Ptr pool3 = newPoolConnection();
893
+ ApplicationPool::Ptr pool4 = newPoolConnection();
894
+ ApplicationPool::Ptr pool5 = newPoolConnection();
895
+
896
+ // Spawn 3 processes.
897
+ SessionPtr session1 = pool->get(options);
898
+ SessionPtr session2 = pool2->get(options);
899
+ session2.reset();
900
+ EVENTUALLY(5,
901
+ result = pool->getCount() == 3u;
902
+ );
903
+
904
+ // Make sure all of them are active.
905
+ session2 = pool2->get(options);
906
+ SessionPtr session3 = pool3->get(options);
907
+ ensure_equals(pool->getActive(), 3u);
908
+ ensure_equals(pool->getCount(), 3u);
909
+
910
+ // Now call get() in a thread.
911
+ SpawnRackAppFunction func1;
912
+ SessionPtr session4;
913
+ bool done1 = false;
914
+ func1.pool = pool4;
915
+ func1.done = &done1;
916
+ func1.session = &session4;
917
+ TempThread thr1(func1);
918
+
919
+ // And again.
920
+ SpawnRackAppFunction func2;
921
+ SessionPtr session5;
922
+ bool done2 = false;
923
+ func2.pool = pool5;
924
+ func2.done = &done2;
925
+ func2.session = &session5;
926
+ TempThread thr2(func2);
927
+
928
+ // We should now arrive at a state where there are 3 processes, all
929
+ // busy, and 2 threads waiting on the global queue.
930
+ usleep(20000);
931
+ ensure("Still waiting on global queue", !done1 && !done2);
932
+ ensure_equals(pool->getGlobalQueueSize(), 2u);
933
+
934
+ // Increasing the max will cause one of the threads to wake
935
+ // up, start a spawn action in the background, and go to sleep
936
+ // again. Eventually the new process will be done spawning,
937
+ // causing one of the threads to wake up. The other one will
938
+ // continue to wait.
939
+ pool->setMax(4);
940
+ EVENTUALLY(5,
941
+ result = (done1 && !done2) || (!done1 && done2);
942
+ );
943
+ }
944
+
945
+ TEST_METHOD(35) {
946
+ // When spawning an app in the background, if it encountered an error
947
+ // it will remove the whole app group.
948
+ TempDirCopy c1("stub/rack", "rackapp.tmp");
949
+ PoolOptions options;
950
+ options.appRoot = "rackapp.tmp";
951
+ options.appType = "rack";
952
+ options.spawnMethod = "conservative";
953
+ options.printExceptions = false;
954
+
955
+ SessionPtr session1 = pool->get(options);
956
+
957
+ writeFile("rackapp.tmp/config.ru",
958
+ "raise 'foo'\n");
959
+ pool2->get(options);
960
+
961
+ EVENTUALLY(5,
962
+ result = pool->getCount() == 0u;
963
+ );
964
+ }
965
+
966
+ TEST_METHOD(36) {
967
+ // When cleaning, at least options.minProcesses processes should be kept around.
968
+ pool->setMaxIdleTime(0);
969
+ ApplicationPool::Ptr pool3 = newPoolConnection();
970
+ PoolOptions options;
971
+ options.appRoot = "stub/rack";
972
+ options.appType = "rack";
973
+ options.minProcesses = 2;
974
+
975
+ // Spawn 2 processes.
976
+ SessionPtr session1 = pool->get(options);
977
+ SessionPtr session2 = pool2->get(options);
978
+ session1.reset();
979
+ session2.reset();
980
+ EVENTUALLY(5,
981
+ result = pool->getActive() == 0u && pool->getCount() == 2u;
982
+ );
983
+
984
+ // Spawn another process, so we get 3.
985
+ session1 = pool->get(options);
986
+ session2 = pool2->get(options);
987
+ SessionPtr session3 = pool3->get(options);
988
+ session3.reset();
989
+ EVENTUALLY(5,
990
+ result = pool->getActive() == 2u && pool->getCount() == 3u;
991
+ );
992
+
993
+ // Now wait until one process is idle cleaned.
994
+ pool->setMaxIdleTime(1);
995
+ EVENTUALLY(10,
996
+ result = pool->getCount() == 2u;
997
+ );
998
+ }
999
+
1000
+ TEST_METHOD(37) {
1001
+ // Test whether processes are grouped together by appGroupName.
1002
+ TempDirCopy c1("stub/rack", "rackapp.tmp");
1003
+ PoolOptions options1;
1004
+ options1.appRoot = "rackapp.tmp";
1005
+ options1.appType = "rack";
1006
+ options1.appGroupName = "group A";
1007
+ SessionPtr session1 = pool->get(options1);
1008
+
1009
+ TempDirCopy c2("stub/rack", "rackapp2.tmp");
1010
+ PoolOptions options2;
1011
+ options2.appRoot = "rackapp2.tmp";
1012
+ options2.appType = "rack";
1013
+ options2.appGroupName = "group A";
1014
+ SessionPtr session2 = pool2->get(options2);
1015
+
1016
+ session1.reset();
1017
+ session2.reset();
1018
+ EVENTUALLY(5,
1019
+ result = pool->getCount() == 2u;
1020
+ );
1021
+
1022
+ touchFile("rackapp.tmp/tmp/restart.txt");
1023
+ session1 = pool->get(options1);
1024
+ ensure_equals(pool->getCount(), 1u);
1025
+ }
1026
+
1027
+ /*************************************/
1028
+
1029
+ #endif /* USE_TEMPLATE */