passenger 2.2.9 → 2.2.10

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 (435) hide show
  1. data/NEWS +10 -0
  2. data/doc/Architectural overview.html +202 -65
  3. data/doc/Security of user switching support.html +200 -63
  4. data/doc/Users guide Apache.html +266 -129
  5. data/doc/Users guide Nginx.html +234 -97
  6. data/doc/cxxapi/AbstractSpawnManager_8h-source.html +138 -0
  7. data/doc/cxxapi/Account_8h-source.html +202 -0
  8. data/doc/cxxapi/AccountsDatabase_8h-source.html +158 -0
  9. data/doc/cxxapi/AgentsStarter_8h-source.html +79 -0
  10. data/doc/cxxapi/BCrypt_8h-source.html +101 -0
  11. data/doc/cxxapi/BacktracesServer_8h-source.html +87 -0
  12. data/doc/cxxapi/Base64_8h-source.html +85 -0
  13. data/doc/cxxapi/Blowfish_8h-source.html +131 -0
  14. data/doc/cxxapi/Bucket_8h-source.html +1 -1
  15. data/doc/cxxapi/CachedFileStat_8h-source.html +49 -157
  16. data/doc/cxxapi/Configuration_8h-source.html +1 -1
  17. data/doc/cxxapi/Constants_8h-source.html +71 -0
  18. data/doc/cxxapi/ContentHandler_8h-source.html +92 -0
  19. data/doc/cxxapi/DirectoryMapper_8h-source.html +1 -1
  20. data/doc/cxxapi/Exceptions_8h-source.html +332 -236
  21. data/doc/cxxapi/FileChangeChecker_8h-source.html +237 -0
  22. data/doc/cxxapi/FileDescriptor_8h-source.html +206 -0
  23. data/doc/cxxapi/Hooks_8h-source.html +1 -1
  24. data/doc/cxxapi/HttpStatusExtractor_8h-source.html +378 -0
  25. data/doc/cxxapi/LoggingServer_8h-source.html +165 -0
  26. data/doc/cxxapi/Logging_8h-source.html +580 -112
  27. data/doc/cxxapi/MessageChannel_8h-source.html +789 -599
  28. data/doc/cxxapi/MessageClient_8h-source.html +297 -0
  29. data/doc/cxxapi/MessageServer_8h-source.html +607 -0
  30. data/doc/cxxapi/PoolOptions_8h-source.html +471 -278
  31. data/doc/cxxapi/Process_8h-source.html +272 -0
  32. data/doc/cxxapi/RandomGenerator_8h-source.html +156 -0
  33. data/doc/cxxapi/ResourceLocator_8h-source.html +104 -0
  34. data/doc/cxxapi/ScgiRequestParser_8h-source.html +399 -0
  35. data/doc/cxxapi/ServerInstanceDir_8h-source.html +356 -0
  36. data/doc/cxxapi/Session_8h-source.html +483 -0
  37. data/doc/cxxapi/SpawnManager_8h-source.html +590 -546
  38. data/doc/cxxapi/StaticContentHandler_8h-source.html +65 -0
  39. data/doc/cxxapi/StaticString_8h-source.html +214 -0
  40. data/doc/cxxapi/StringListCreator_8h-source.html +111 -0
  41. data/doc/cxxapi/SystemTime_8h-source.html +191 -78
  42. data/doc/cxxapi/Timer_8h-source.html +157 -0
  43. data/doc/cxxapi/Utils_8h-source.html +621 -434
  44. data/doc/cxxapi/Version_8h-source.html +59 -0
  45. data/doc/cxxapi/annotated.html +1 -1
  46. data/doc/cxxapi/apache2_2Configuration_8h-source.html +79 -0
  47. data/doc/cxxapi/classAgentWatcher-members.html +50 -0
  48. data/doc/cxxapi/classAgentWatcher.html +445 -0
  49. data/doc/cxxapi/classClient-members.html +4 -3
  50. data/doc/cxxapi/classClient.html +50 -46
  51. data/doc/cxxapi/classHooks-members.html +1 -1
  52. data/doc/cxxapi/classHooks.html +1 -1
  53. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +37 -0
  54. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +191 -0
  55. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +1 -0
  56. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +1 -0
  57. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
  58. data/doc/cxxapi/{classPassenger_1_1DummySpawnManager-members.html → classPassenger_1_1ArgumentException-members.html} +3 -2
  59. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +52 -0
  60. data/doc/cxxapi/classPassenger_1_1BacktracesServer-members.html +36 -0
  61. data/doc/cxxapi/classPassenger_1_1BacktracesServer.html +107 -0
  62. data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.map +1 -0
  63. data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.md5 +1 -0
  64. data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.png +0 -0
  65. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +3 -3
  66. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +18 -34
  67. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +2 -1
  68. data/doc/cxxapi/classPassenger_1_1BusyException.html +3 -2
  69. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +2 -1
  70. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +3 -2
  71. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +1 -1
  72. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +1 -1
  73. data/doc/cxxapi/{classPassenger_1_1FileChecker-members.html → classPassenger_1_1EOFException-members.html} +3 -4
  74. data/doc/cxxapi/classPassenger_1_1EOFException.html +57 -0
  75. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +1 -0
  76. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +1 -0
  77. data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
  78. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +33 -0
  79. data/doc/cxxapi/classPassenger_1_1EventFd.html +49 -0
  80. data/doc/cxxapi/classPassenger_1_1FileChangeChecker-members.html +37 -0
  81. data/doc/cxxapi/classPassenger_1_1FileChangeChecker.html +166 -0
  82. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +37 -0
  83. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +159 -0
  84. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +2 -1
  85. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +3 -2
  86. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -1
  87. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +3 -2
  88. data/doc/cxxapi/{classPassenger_1_1ApplicationPoolServer-members.html → classPassenger_1_1HttpStatusExtractor-members.html} +6 -5
  89. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +128 -0
  90. data/doc/cxxapi/classPassenger_1_1IOException-members.html +2 -1
  91. data/doc/cxxapi/classPassenger_1_1IOException.html +4 -3
  92. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +2 -1
  93. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +1 -1
  94. data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
  95. data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +36 -0
  96. data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +147 -0
  97. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +12 -5
  98. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +267 -34
  99. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +46 -0
  100. data/doc/cxxapi/classPassenger_1_1MessageServer.html +438 -0
  101. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +33 -0
  102. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +56 -0
  103. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +1 -0
  104. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -0
  105. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  106. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +38 -0
  107. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +175 -0
  108. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +1 -0
  109. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -0
  110. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  111. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +36 -0
  112. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +176 -0
  113. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.map +1 -0
  114. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.md5 +1 -0
  115. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.png +0 -0
  116. data/doc/cxxapi/classPassenger_1_1Process-members.html +40 -0
  117. data/doc/cxxapi/classPassenger_1_1Process.html +266 -0
  118. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +33 -0
  119. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +51 -0
  120. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +2 -1
  121. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +3 -2
  122. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +47 -0
  123. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +302 -0
  124. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +33 -0
  125. data/doc/cxxapi/classPassenger_1_1SecurityException.html +52 -0
  126. data/doc/cxxapi/classPassenger_1_1Session-members.html +50 -0
  127. data/doc/cxxapi/classPassenger_1_1Session.html +577 -0
  128. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +1 -0
  129. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +1 -0
  130. data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
  131. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +2 -1
  132. data/doc/cxxapi/classPassenger_1_1SpawnException.html +5 -4
  133. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +8 -5
  134. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +127 -45
  135. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +1 -0
  136. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +1 -0
  137. data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
  138. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +51 -0
  139. data/doc/cxxapi/classPassenger_1_1StandardSession.html +415 -0
  140. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +1 -0
  141. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +1 -0
  142. data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
  143. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +33 -0
  144. data/doc/cxxapi/classPassenger_1_1StaticString.html +54 -0
  145. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -1
  146. data/doc/cxxapi/classPassenger_1_1SystemException.html +4 -3
  147. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +1 -0
  148. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +1 -1
  149. data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
  150. data/doc/cxxapi/classPassenger_1_1SystemTime-members.html +9 -1
  151. data/doc/cxxapi/classPassenger_1_1SystemTime.html +92 -8
  152. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +37 -0
  153. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +57 -0
  154. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +1 -0
  155. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +1 -0
  156. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
  157. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +33 -0
  158. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +50 -0
  159. data/doc/cxxapi/{classPassenger_1_1Application-members.html → classPassenger_1_1Timer-members.html} +8 -7
  160. data/doc/cxxapi/classPassenger_1_1Timer.html +163 -0
  161. data/doc/cxxapi/classServer-members.html +33 -0
  162. data/doc/cxxapi/classServer.html +46 -0
  163. data/doc/cxxapi/classServerInstanceDirToucher-members.html +33 -0
  164. data/doc/cxxapi/classServerInstanceDirToucher.html +43 -0
  165. data/doc/cxxapi/classes.html +1 -1
  166. data/doc/cxxapi/definitions_8h-source.html +1 -1
  167. data/doc/cxxapi/files.html +1 -1
  168. data/doc/cxxapi/functions.html +1 -1
  169. data/doc/cxxapi/{functions_type.html → functions_enum.html} +7 -5
  170. data/doc/cxxapi/functions_eval.html +55 -0
  171. data/doc/cxxapi/functions_func.html +1 -1
  172. data/doc/cxxapi/functions_vars.html +106 -9
  173. data/doc/cxxapi/graph_legend.html +1 -1
  174. data/doc/cxxapi/group__Configuration.html +1 -1
  175. data/doc/cxxapi/group__Core.html +1 -1
  176. data/doc/cxxapi/group__Exceptions.html +17 -1
  177. data/doc/cxxapi/group__Hooks.html +1 -1
  178. data/doc/cxxapi/group__Support.html +1 -1
  179. data/doc/cxxapi/hierarchy.html +34 -12
  180. data/doc/cxxapi/inherit__graph__0.map +1 -1
  181. data/doc/cxxapi/inherit__graph__0.md5 +1 -1
  182. data/doc/cxxapi/inherit__graph__0.png +0 -0
  183. data/doc/cxxapi/inherit__graph__1.map +1 -1
  184. data/doc/cxxapi/inherit__graph__1.md5 +1 -1
  185. data/doc/cxxapi/inherit__graph__1.png +0 -0
  186. data/doc/cxxapi/inherit__graph__10.map +1 -1
  187. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  188. data/doc/cxxapi/inherit__graph__10.png +0 -0
  189. data/doc/cxxapi/inherit__graph__11.map +1 -1
  190. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  191. data/doc/cxxapi/inherit__graph__11.png +0 -0
  192. data/doc/cxxapi/inherit__graph__12.map +1 -1
  193. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  194. data/doc/cxxapi/inherit__graph__12.png +0 -0
  195. data/doc/cxxapi/inherit__graph__13.map +1 -1
  196. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  197. data/doc/cxxapi/inherit__graph__13.png +0 -0
  198. data/doc/cxxapi/inherit__graph__14.map +3 -2
  199. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  200. data/doc/cxxapi/inherit__graph__14.png +0 -0
  201. data/doc/cxxapi/inherit__graph__15.map +1 -1
  202. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  203. data/doc/cxxapi/inherit__graph__15.png +0 -0
  204. data/doc/cxxapi/inherit__graph__16.map +1 -1
  205. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  206. data/doc/cxxapi/inherit__graph__16.png +0 -0
  207. data/doc/cxxapi/inherit__graph__17.map +1 -1
  208. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  209. data/doc/cxxapi/inherit__graph__17.png +0 -0
  210. data/doc/cxxapi/inherit__graph__18.map +2 -1
  211. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  212. data/doc/cxxapi/inherit__graph__18.png +0 -0
  213. data/doc/cxxapi/inherit__graph__19.map +1 -1
  214. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  215. data/doc/cxxapi/inherit__graph__19.png +0 -0
  216. data/doc/cxxapi/inherit__graph__2.map +1 -1
  217. data/doc/cxxapi/inherit__graph__2.md5 +1 -1
  218. data/doc/cxxapi/inherit__graph__2.png +0 -0
  219. data/doc/cxxapi/inherit__graph__20.map +1 -2
  220. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  221. data/doc/cxxapi/inherit__graph__20.png +0 -0
  222. data/doc/cxxapi/inherit__graph__21.map +1 -1
  223. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  224. data/doc/cxxapi/inherit__graph__21.png +0 -0
  225. data/doc/cxxapi/inherit__graph__22.map +1 -0
  226. data/doc/cxxapi/inherit__graph__22.md5 +1 -0
  227. data/doc/cxxapi/inherit__graph__22.png +0 -0
  228. data/doc/cxxapi/inherit__graph__23.map +1 -0
  229. data/doc/cxxapi/inherit__graph__23.md5 +1 -0
  230. data/doc/cxxapi/inherit__graph__23.png +0 -0
  231. data/doc/cxxapi/inherit__graph__24.map +1 -0
  232. data/doc/cxxapi/inherit__graph__24.md5 +1 -0
  233. data/doc/cxxapi/inherit__graph__24.png +0 -0
  234. data/doc/cxxapi/inherit__graph__25.map +1 -0
  235. data/doc/cxxapi/inherit__graph__25.md5 +1 -0
  236. data/doc/cxxapi/inherit__graph__25.png +0 -0
  237. data/doc/cxxapi/inherit__graph__26.map +1 -0
  238. data/doc/cxxapi/inherit__graph__26.md5 +1 -0
  239. data/doc/cxxapi/inherit__graph__26.png +0 -0
  240. data/doc/cxxapi/inherit__graph__27.map +2 -0
  241. data/doc/cxxapi/inherit__graph__27.md5 +1 -0
  242. data/doc/cxxapi/inherit__graph__27.png +0 -0
  243. data/doc/cxxapi/inherit__graph__28.map +1 -0
  244. data/doc/cxxapi/inherit__graph__28.md5 +1 -0
  245. data/doc/cxxapi/inherit__graph__28.png +0 -0
  246. data/doc/cxxapi/inherit__graph__29.map +1 -0
  247. data/doc/cxxapi/inherit__graph__29.md5 +1 -0
  248. data/doc/cxxapi/inherit__graph__29.png +0 -0
  249. data/doc/cxxapi/inherit__graph__3.map +2 -1
  250. data/doc/cxxapi/inherit__graph__3.md5 +1 -1
  251. data/doc/cxxapi/inherit__graph__3.png +0 -0
  252. data/doc/cxxapi/inherit__graph__30.map +1 -0
  253. data/doc/cxxapi/inherit__graph__30.md5 +1 -0
  254. data/doc/cxxapi/inherit__graph__30.png +0 -0
  255. data/doc/cxxapi/inherit__graph__31.map +3 -0
  256. data/doc/cxxapi/inherit__graph__31.md5 +1 -0
  257. data/doc/cxxapi/inherit__graph__31.png +0 -0
  258. data/doc/cxxapi/inherit__graph__32.map +1 -0
  259. data/doc/cxxapi/inherit__graph__32.md5 +1 -0
  260. data/doc/cxxapi/inherit__graph__32.png +0 -0
  261. data/doc/cxxapi/inherit__graph__33.map +1 -0
  262. data/doc/cxxapi/inherit__graph__33.md5 +1 -0
  263. data/doc/cxxapi/inherit__graph__33.png +0 -0
  264. data/doc/cxxapi/inherit__graph__34.map +1 -0
  265. data/doc/cxxapi/inherit__graph__34.md5 +1 -0
  266. data/doc/cxxapi/inherit__graph__34.png +0 -0
  267. data/doc/cxxapi/inherit__graph__35.map +1 -0
  268. data/doc/cxxapi/inherit__graph__35.md5 +1 -0
  269. data/doc/cxxapi/inherit__graph__35.png +0 -0
  270. data/doc/cxxapi/inherit__graph__36.map +1 -0
  271. data/doc/cxxapi/inherit__graph__36.md5 +1 -0
  272. data/doc/cxxapi/inherit__graph__36.png +0 -0
  273. data/doc/cxxapi/inherit__graph__4.map +1 -1
  274. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  275. data/doc/cxxapi/inherit__graph__4.png +0 -0
  276. data/doc/cxxapi/inherit__graph__5.map +1 -1
  277. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  278. data/doc/cxxapi/inherit__graph__5.png +0 -0
  279. data/doc/cxxapi/inherit__graph__6.map +1 -2
  280. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  281. data/doc/cxxapi/inherit__graph__6.png +0 -0
  282. data/doc/cxxapi/inherit__graph__7.map +1 -1
  283. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  284. data/doc/cxxapi/inherit__graph__7.png +0 -0
  285. data/doc/cxxapi/inherit__graph__8.map +1 -1
  286. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  287. data/doc/cxxapi/inherit__graph__8.png +0 -0
  288. data/doc/cxxapi/inherit__graph__9.map +1 -1
  289. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  290. data/doc/cxxapi/inherit__graph__9.png +0 -0
  291. data/doc/cxxapi/inherits.html +81 -41
  292. data/doc/cxxapi/main.html +1 -1
  293. data/doc/cxxapi/md5_8h-source.html +121 -0
  294. data/doc/cxxapi/modules.html +1 -1
  295. data/doc/cxxapi/namespacePassenger.html +651 -0
  296. data/doc/cxxapi/namespacemembers.html +155 -0
  297. data/doc/cxxapi/namespacemembers_enum.html +46 -0
  298. data/doc/cxxapi/namespacemembers_eval.html +52 -0
  299. data/doc/cxxapi/namespacemembers_func.html +139 -0
  300. data/doc/cxxapi/namespacemembers_type.html +50 -0
  301. data/doc/cxxapi/namespaces.html +34 -0
  302. data/doc/cxxapi/nginx_2Configuration_8h-source.html +114 -0
  303. data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +91 -0
  304. data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +2 -1
  305. data/doc/cxxapi/structPassenger_1_1AnythingToString.html +3 -2
  306. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +2 -1
  307. data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +3 -2
  308. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +33 -0
  309. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +49 -0
  310. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +19 -7
  311. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +323 -53
  312. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +33 -0
  313. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +49 -0
  314. data/ext/common/MessageChannel.h +48 -4
  315. data/ext/common/Version.h +1 -1
  316. data/ext/nginx/HttpStatusExtractor.h +1 -0
  317. data/ext/nginx/ScgiRequestParser.h +1 -0
  318. data/ext/phusion_passenger/native_support.c +5 -1
  319. data/lib/phusion_passenger/constants.rb +1 -1
  320. data/lib/phusion_passenger/message_channel.rb +45 -3
  321. data/lib/phusion_passenger/rack/application_spawner.rb +4 -0
  322. data/lib/phusion_passenger/railz/application_spawner.rb +19 -1
  323. data/lib/phusion_passenger/utils.rb +3 -3
  324. data/lib/phusion_passenger/utils/rewindable_input.rb +5 -0
  325. data/test/MessageChannelTest.cpp +9 -1
  326. data/test/stub/message_channel.rb +1 -1
  327. data/test/stub/message_channel_2.rb +1 -1
  328. data/test/stub/message_channel_3.rb +2 -2
  329. metadata +173 -113
  330. data/doc/cxxapi/ApplicationPoolServer_8h-source.html +0 -833
  331. data/doc/cxxapi/ApplicationPool_8h-source.html +0 -226
  332. data/doc/cxxapi/Application_8h-source.html +0 -553
  333. data/doc/cxxapi/DummySpawnManager_8h-source.html +0 -130
  334. data/doc/cxxapi/FileChecker_8h-source.html +0 -134
  335. data/doc/cxxapi/StandardApplicationPool_8h-source.html +0 -842
  336. data/doc/cxxapi/classPassenger_1_1Application.html +0 -231
  337. data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +0 -41
  338. data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +0 -323
  339. data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +0 -227
  340. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.map +0 -1
  341. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.md5 +0 -1
  342. data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
  343. data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +0 -44
  344. data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +0 -403
  345. data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +0 -53
  346. data/doc/cxxapi/classPassenger_1_1FileChecker.html +0 -124
  347. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +0 -44
  348. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +0 -342
  349. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.map +0 -1
  350. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.md5 +0 -1
  351. data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
  352. data/doc/rdoc/classes/ConditionVariable.html +0 -194
  353. data/doc/rdoc/classes/Exception.html +0 -120
  354. data/doc/rdoc/classes/GC.html +0 -113
  355. data/doc/rdoc/classes/IO.html +0 -169
  356. data/doc/rdoc/classes/PhusionPassenger.html +0 -239
  357. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -153
  358. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -517
  359. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -719
  360. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
  361. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
  362. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
  363. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
  364. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -598
  365. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -140
  366. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +0 -317
  367. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +0 -138
  368. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -154
  369. data/doc/rdoc/classes/PhusionPassenger/Application.html +0 -283
  370. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
  371. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
  372. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -175
  373. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
  374. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
  375. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -489
  376. data/doc/rdoc/classes/PhusionPassenger/NativeSupport.html +0 -350
  377. data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
  378. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -188
  379. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -199
  380. data/doc/rdoc/classes/PhusionPassenger/Railz.html +0 -95
  381. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +0 -438
  382. data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +0 -98
  383. data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +0 -200
  384. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +0 -436
  385. data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +0 -98
  386. data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +0 -155
  387. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -402
  388. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
  389. data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -805
  390. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
  391. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -247
  392. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
  393. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
  394. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
  395. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -188
  396. data/doc/rdoc/classes/PlatformInfo.html +0 -866
  397. data/doc/rdoc/classes/RakeExtensions.html +0 -197
  398. data/doc/rdoc/classes/Signal.html +0 -139
  399. data/doc/rdoc/created.rid +0 -1
  400. data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -255
  401. data/doc/rdoc/files/README.html +0 -157
  402. data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +0 -92
  403. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -129
  404. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -129
  405. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
  406. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
  407. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +0 -130
  408. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
  409. data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +0 -127
  410. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
  411. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
  412. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -134
  413. data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +0 -122
  414. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
  415. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -126
  416. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
  417. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
  418. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -127
  419. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -133
  420. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
  421. data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +0 -140
  422. data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +0 -126
  423. data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +0 -145
  424. data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +0 -125
  425. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
  426. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -159
  427. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
  428. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -174
  429. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -129
  430. data/doc/rdoc/files/misc/rake/extensions_rb.html +0 -130
  431. data/doc/rdoc/fr_class_index.html +0 -93
  432. data/doc/rdoc/fr_file_index.html +0 -77
  433. data/doc/rdoc/fr_method_index.html +0 -212
  434. data/doc/rdoc/index.html +0 -26
  435. data/doc/rdoc/rdoc-style.css +0 -187
@@ -1,130 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
- <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
- <title>Passenger: DummySpawnManager.h Source File</title>
4
- <link href="tabs.css" rel="stylesheet" type="text/css">
5
- <link href="doxygen.css" rel="stylesheet" type="text/css">
6
- </head><body>
7
- <!-- Generated by Doxygen 1.5.8 -->
8
- <div class="navigation" id="top">
9
- <div class="tabs">
10
- <ul>
11
- <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
- <li><a href="modules.html"><span>Modules</span></a></li>
13
- <li><a href="annotated.html"><span>Classes</span></a></li>
14
- <li class="current"><a href="files.html"><span>Files</span></a></li>
15
- </ul>
16
- </div>
17
- <div class="tabs">
18
- <ul>
19
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
20
- </ul>
21
- </div>
22
- <h1>DummySpawnManager.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
23
- <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
24
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
25
- <a name="l00004"></a>00004 <span class="comment"> *</span>
26
- <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
27
- <a name="l00006"></a>00006 <span class="comment"> *</span>
28
- <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
29
- <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
30
- <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
31
- <a name="l00010"></a>00010 <span class="comment"> *</span>
32
- <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
33
- <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
34
- <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
35
- <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
36
- <a name="l00015"></a>00015 <span class="comment"> *</span>
37
- <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
38
- <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
39
- <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
40
- <a name="l00019"></a>00019 <span class="comment"> */</span>
41
- <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_DUMMY_SPAWN_MANAGER_H_</span>
42
- <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_DUMMY_SPAWN_MANAGER_H_</span>
43
- <a name="l00022"></a>00022 <span class="preprocessor"></span>
44
- <a name="l00023"></a>00023 <span class="comment">// TODO: make this path not hardcoded</span>
45
- <a name="l00024"></a>00024 <span class="preprocessor">#define DUMMY_REQUEST_HANDLER_EXECUTABLE "/home/hongli/Projects/passenger/benchmark/DummyRequestHandler"</span>
46
- <a name="l00025"></a>00025 <span class="preprocessor"></span>
47
- <a name="l00026"></a>00026 <span class="preprocessor">#include &lt;string&gt;</span>
48
- <a name="l00027"></a>00027
49
- <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
50
- <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;sys/wait.h&gt;</span>
51
- <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;cstdio&gt;</span>
52
- <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
53
- <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;errno.h&gt;</span>
54
- <a name="l00033"></a>00033
55
- <a name="l00034"></a>00034 <span class="preprocessor">#include "Application.h"</span>
56
- <a name="l00035"></a>00035 <span class="preprocessor">#include "Exceptions.h"</span>
57
- <a name="l00036"></a>00036
58
- <a name="l00037"></a>00037 <span class="keyword">namespace </span>Passenger {
59
- <a name="l00038"></a>00038
60
- <a name="l00039"></a>00039 <span class="keyword">using namespace </span>std;
61
- <a name="l00040"></a>00040 <span class="comment"></span>
62
- <a name="l00041"></a>00041 <span class="comment">/**</span>
63
- <a name="l00042"></a>00042 <span class="comment"> * A dummy SpawnManager replacement for testing/debugging purposes.</span>
64
- <a name="l00043"></a>00043 <span class="comment"> *</span>
65
- <a name="l00044"></a>00044 <span class="comment"> * This class implements a dummy spawn manager, and is 100% interface-compatible with</span>
66
- <a name="l00045"></a>00045 <span class="comment"> * SpawnManager. This spawn manager will spawn &lt;tt&gt;benchmark/DummyRequestHandler&lt;/tt&gt;,</span>
67
- <a name="l00046"></a>00046 <span class="comment"> * which is probably the fastest possible implementation of a request handler. The purpose</span>
68
- <a name="l00047"></a>00047 <span class="comment"> * of this class to benchmark the performance of the Apache module (i.e. not benchmarking</span>
69
- <a name="l00048"></a>00048 <span class="comment"> * the Ruby request handler or Rails itself).</span>
70
- <a name="l00049"></a>00049 <span class="comment"> *</span>
71
- <a name="l00050"></a>00050 <span class="comment"> * This header file is not used by default. Define the macro &lt;tt&gt;PASSENGER_USE_DUMMY_SPAWN_MANAGER&lt;/tt&gt;</span>
72
- <a name="l00051"></a>00051 <span class="comment"> * to make ApplicationPool use DummySpawnManager instead of SpawnManager.</span>
73
- <a name="l00052"></a>00052 <span class="comment"> *</span>
74
- <a name="l00053"></a>00053 <span class="comment"> * Of course, don't forget to compile benchmark/DummyRequestHandler!</span>
75
- <a name="l00054"></a>00054 <span class="comment"> *</span>
76
- <a name="l00055"></a>00055 <span class="comment"> * @ingroup Support</span>
77
- <a name="l00056"></a>00056 <span class="comment"> */</span>
78
- <a name="l00057"></a><a class="code" href="classPassenger_1_1DummySpawnManager.html">00057</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1DummySpawnManager.html" title="A dummy SpawnManager replacement for testing/debugging purposes.">DummySpawnManager</a> {
79
- <a name="l00058"></a>00058 <span class="keyword">public</span>:
80
- <a name="l00059"></a>00059 ApplicationPtr spawn(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;appRoot, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;user = <span class="stringliteral">""</span>, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;group = <span class="stringliteral">""</span>) {
81
- <a name="l00060"></a>00060 <span class="keywordtype">int</span> fds[2];
82
- <a name="l00061"></a>00061 pid_t pid;
83
- <a name="l00062"></a>00062
84
- <a name="l00063"></a>00063 <span class="keywordflow">if</span>(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
85
- <a name="l00064"></a>00064 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Cannot create a Unix socket"</span>, errno);
86
- <a name="l00065"></a>00065 }
87
- <a name="l00066"></a>00066 pid = fork();
88
- <a name="l00067"></a>00067 <span class="keywordflow">if</span> (pid == 0) {
89
- <a name="l00068"></a>00068 pid = fork();
90
- <a name="l00069"></a>00069 <span class="keywordflow">if</span> (pid == 0) {
91
- <a name="l00070"></a>00070 dup2(fds[0], STDIN_FILENO);
92
- <a name="l00071"></a>00071 close(fds[0]);
93
- <a name="l00072"></a>00072 close(fds[1]);
94
- <a name="l00073"></a>00073 execlp(DUMMY_REQUEST_HANDLER_EXECUTABLE, DUMMY_REQUEST_HANDLER_EXECUTABLE, NULL);
95
- <a name="l00074"></a>00074 <span class="keywordtype">int</span> e = errno;
96
- <a name="l00075"></a>00075 fprintf(stderr, <span class="stringliteral">"Unable to run %s: %s\n"</span>, DUMMY_REQUEST_HANDLER_EXECUTABLE, strerror(e));
97
- <a name="l00076"></a>00076 fflush(stderr);
98
- <a name="l00077"></a>00077 _exit(1);
99
- <a name="l00078"></a>00078 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pid == -1) {
100
- <a name="l00079"></a>00079 perror(<span class="stringliteral">"Cannot fork a new process"</span>);
101
- <a name="l00080"></a>00080 fflush(stderr);
102
- <a name="l00081"></a>00081 _exit(1);
103
- <a name="l00082"></a>00082 } <span class="keywordflow">else</span> {
104
- <a name="l00083"></a>00083 _exit(0);
105
- <a name="l00084"></a>00084 }
106
- <a name="l00085"></a>00085 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pid == -1) {
107
- <a name="l00086"></a>00086 close(fds[0]);
108
- <a name="l00087"></a>00087 close(fds[1]);
109
- <a name="l00088"></a>00088 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Cannot fork a new process"</span>, errno);
110
- <a name="l00089"></a>00089 } <span class="keywordflow">else</span> {
111
- <a name="l00090"></a>00090 close(fds[0]);
112
- <a name="l00091"></a>00091 waitpid(pid, NULL, 0);
113
- <a name="l00092"></a>00092 <span class="keywordflow">return</span> ApplicationPtr(<span class="keyword">new</span> <a class="code" href="classPassenger_1_1Application.html" title="Represents a single Ruby on Rails or Rack application instance.">Application</a>(appRoot, pid, fds[1]));
114
- <a name="l00093"></a>00093 }
115
- <a name="l00094"></a>00094 }
116
- <a name="l00095"></a>00095
117
- <a name="l00096"></a>00096 pid_t getServerPid()<span class="keyword"> const </span>{
118
- <a name="l00097"></a>00097 <span class="keywordflow">return</span> 0;
119
- <a name="l00098"></a>00098 }
120
- <a name="l00099"></a>00099 };
121
- <a name="l00100"></a>00100
122
- <a name="l00101"></a>00101 } <span class="comment">// namespace Passenger</span>
123
- <a name="l00102"></a>00102
124
- <a name="l00103"></a>00103 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_DUMMY_SPAWN_MANAGER_H_ */</span>
125
- </pre></div></div>
126
- <hr size="1"><address style="text-align: right;"><small>Generated on Wed Apr 8 22:35:10 2009 for Passenger by&nbsp;
127
- <a href="http://www.doxygen.org/index.html">
128
- <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
129
- </body>
130
- </html>
@@ -1,134 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
- <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
- <title>Passenger: FileChecker.h Source File</title>
4
- <link href="tabs.css" rel="stylesheet" type="text/css">
5
- <link href="doxygen.css" rel="stylesheet" type="text/css">
6
- </head><body>
7
- <!-- Generated by Doxygen 1.5.8 -->
8
- <div class="navigation" id="top">
9
- <div class="tabs">
10
- <ul>
11
- <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
- <li><a href="modules.html"><span>Modules</span></a></li>
13
- <li><a href="annotated.html"><span>Classes</span></a></li>
14
- <li class="current"><a href="files.html"><span>Files</span></a></li>
15
- </ul>
16
- </div>
17
- <div class="tabs">
18
- <ul>
19
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
20
- </ul>
21
- </div>
22
- <h1>FileChecker.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
23
- <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
24
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2009 Phusion</span>
25
- <a name="l00004"></a>00004 <span class="comment"> *</span>
26
- <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
27
- <a name="l00006"></a>00006 <span class="comment"> *</span>
28
- <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
29
- <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
30
- <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
31
- <a name="l00010"></a>00010 <span class="comment"> *</span>
32
- <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
33
- <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
34
- <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
35
- <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
36
- <a name="l00015"></a>00015 <span class="comment"> *</span>
37
- <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
38
- <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
39
- <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
40
- <a name="l00019"></a>00019 <span class="comment"> */</span>
41
- <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_FILE_CHECKER_H_</span>
42
- <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_FILE_CHECKER_H_</span>
43
- <a name="l00022"></a>00022 <span class="preprocessor"></span>
44
- <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;string&gt;</span>
45
- <a name="l00024"></a>00024
46
- <a name="l00025"></a>00025 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
47
- <a name="l00026"></a>00026
48
- <a name="l00027"></a>00027 <span class="preprocessor">#include &lt;sys/stat.h&gt;</span>
49
- <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;errno.h&gt;</span>
50
- <a name="l00029"></a>00029
51
- <a name="l00030"></a>00030 <span class="preprocessor">#include "CachedFileStat.h"</span>
52
- <a name="l00031"></a>00031 <span class="preprocessor">#include "SystemTime.h"</span>
53
- <a name="l00032"></a>00032
54
- <a name="l00033"></a>00033 <span class="keyword">namespace </span>Passenger {
55
- <a name="l00034"></a>00034
56
- <a name="l00035"></a>00035 <span class="keyword">using namespace </span>std;
57
- <a name="l00036"></a>00036 <span class="keyword">using namespace </span>oxt;
58
- <a name="l00037"></a>00037 <span class="comment"></span>
59
- <a name="l00038"></a>00038 <span class="comment">/**</span>
60
- <a name="l00039"></a>00039 <span class="comment"> * Utility class for checking for file changes. Example:</span>
61
- <a name="l00040"></a>00040 <span class="comment"> *</span>
62
- <a name="l00041"></a>00041 <span class="comment"> * @code</span>
63
- <a name="l00042"></a>00042 <span class="comment"> * FileChecker checker("foo.txt");</span>
64
- <a name="l00043"></a>00043 <span class="comment"> * checker.changed(); // false</span>
65
- <a name="l00044"></a>00044 <span class="comment"> * writeToFile("foo.txt");</span>
66
- <a name="l00045"></a>00045 <span class="comment"> * checker.changed(); // true</span>
67
- <a name="l00046"></a>00046 <span class="comment"> * checker.changed(); // false</span>
68
- <a name="l00047"></a>00047 <span class="comment"> * @endcode</span>
69
- <a name="l00048"></a>00048 <span class="comment"> *</span>
70
- <a name="l00049"></a>00049 <span class="comment"> * FileChecker uses stat() to retrieve file information. FileChecker also</span>
71
- <a name="l00050"></a>00050 <span class="comment"> * supports throttling in order to limit the number of stat() calls. This</span>
72
- <a name="l00051"></a>00051 <span class="comment"> * can improve performance on systems where disk I/O is a problem.</span>
73
- <a name="l00052"></a>00052 <span class="comment"> */</span>
74
- <a name="l00053"></a><a class="code" href="classPassenger_1_1FileChecker.html">00053</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1FileChecker.html" title="Utility class for checking for file changes.">FileChecker</a> {
75
- <a name="l00054"></a>00054 <span class="keyword">private</span>:
76
- <a name="l00055"></a>00055 CachedFileStat cstat;
77
- <a name="l00056"></a>00056 time_t lastMtime;
78
- <a name="l00057"></a>00057 time_t lastCtime;
79
- <a name="l00058"></a>00058
80
- <a name="l00059"></a>00059 <span class="keyword">public</span>:<span class="comment"></span>
81
- <a name="l00060"></a>00060 <span class="comment"> /**</span>
82
- <a name="l00061"></a>00061 <span class="comment"> * Create a FileChecker object.</span>
83
- <a name="l00062"></a>00062 <span class="comment"> *</span>
84
- <a name="l00063"></a>00063 <span class="comment"> * @param filename The filename to check for.</span>
85
- <a name="l00064"></a>00064 <span class="comment"> */</span>
86
- <a name="l00065"></a><a class="code" href="classPassenger_1_1FileChecker.html#64556bc7e06a32363dbd87451d459b71">00065</a> <a class="code" href="classPassenger_1_1FileChecker.html#64556bc7e06a32363dbd87451d459b71" title="Create a FileChecker object.">FileChecker</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;filename)
87
- <a name="l00066"></a>00066 : cstat(filename)
88
- <a name="l00067"></a>00067 {
89
- <a name="l00068"></a>00068 lastMtime = 0;
90
- <a name="l00069"></a>00069 lastCtime = 0;
91
- <a name="l00070"></a>00070 <a class="code" href="classPassenger_1_1FileChecker.html#832ff27b4b3e5db84a9d986285e7c270" title="Checks whether the file&amp;#39;s timestamp has changed or has been created or removed...">changed</a>();
92
- <a name="l00071"></a>00071 }
93
- <a name="l00072"></a>00072 <span class="comment"></span>
94
- <a name="l00073"></a>00073 <span class="comment"> /**</span>
95
- <a name="l00074"></a>00074 <span class="comment"> * Checks whether the file's timestamp has changed or has been created</span>
96
- <a name="l00075"></a>00075 <span class="comment"> * or removed since the last call to changed().</span>
97
- <a name="l00076"></a>00076 <span class="comment"> *</span>
98
- <a name="l00077"></a>00077 <span class="comment"> * @param throttleRate When set to a non-zero value, throttling will be</span>
99
- <a name="l00078"></a>00078 <span class="comment"> * enabled. stat() will be called at most once per</span>
100
- <a name="l00079"></a>00079 <span class="comment"> * throttleRate seconds.</span>
101
- <a name="l00080"></a>00080 <span class="comment"> * @throws SystemException Something went wrong while retrieving the</span>
102
- <a name="l00081"></a>00081 <span class="comment"> * system time. stat() errors will &lt;em&gt;not&lt;/em&gt; result in SystemException</span>
103
- <a name="l00082"></a>00082 <span class="comment"> * being thrown.</span>
104
- <a name="l00083"></a>00083 <span class="comment"> * @throws boost::thread_interrupted</span>
105
- <a name="l00084"></a>00084 <span class="comment"> */</span>
106
- <a name="l00085"></a><a class="code" href="classPassenger_1_1FileChecker.html#832ff27b4b3e5db84a9d986285e7c270">00085</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1FileChecker.html#832ff27b4b3e5db84a9d986285e7c270" title="Checks whether the file&amp;#39;s timestamp has changed or has been created or removed...">changed</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0) {
107
- <a name="l00086"></a>00086 <span class="keywordtype">int</span> ret;
108
- <a name="l00087"></a>00087 time_t ctime, mtime;
109
- <a name="l00088"></a>00088 <span class="keywordtype">bool</span> result;
110
- <a name="l00089"></a>00089
111
- <a name="l00090"></a>00090 ret = cstat.refresh(throttleRate);
112
- <a name="l00091"></a>00091 <span class="keywordflow">if</span> (ret == -1) {
113
- <a name="l00092"></a>00092 ctime = 0;
114
- <a name="l00093"></a>00093 mtime = 0;
115
- <a name="l00094"></a>00094 } <span class="keywordflow">else</span> {
116
- <a name="l00095"></a>00095 ctime = cstat.info.st_ctime;
117
- <a name="l00096"></a>00096 mtime = cstat.info.st_mtime;
118
- <a name="l00097"></a>00097 }
119
- <a name="l00098"></a>00098 result = lastMtime != mtime || lastCtime != ctime;
120
- <a name="l00099"></a>00099 lastMtime = mtime;
121
- <a name="l00100"></a>00100 lastCtime = ctime;
122
- <a name="l00101"></a>00101 <span class="keywordflow">return</span> result;
123
- <a name="l00102"></a>00102 }
124
- <a name="l00103"></a>00103 };
125
- <a name="l00104"></a>00104
126
- <a name="l00105"></a>00105 } <span class="comment">// namespace Passenger</span>
127
- <a name="l00106"></a>00106
128
- <a name="l00107"></a>00107 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_FILE_CHECKER_H_ */</span>
129
- </pre></div></div>
130
- <hr size="1"><address style="text-align: right;"><small>Generated on Wed Apr 8 22:35:10 2009 for Passenger by&nbsp;
131
- <a href="http://www.doxygen.org/index.html">
132
- <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
133
- </body>
134
- </html>
@@ -1,842 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
- <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
3
- <title>Passenger: StandardApplicationPool.h Source File</title>
4
- <link href="tabs.css" rel="stylesheet" type="text/css">
5
- <link href="doxygen.css" rel="stylesheet" type="text/css">
6
- </head><body>
7
- <!-- Generated by Doxygen 1.5.8 -->
8
- <div class="navigation" id="top">
9
- <div class="tabs">
10
- <ul>
11
- <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
12
- <li><a href="modules.html"><span>Modules</span></a></li>
13
- <li><a href="annotated.html"><span>Classes</span></a></li>
14
- <li class="current"><a href="files.html"><span>Files</span></a></li>
15
- </ul>
16
- </div>
17
- <div class="tabs">
18
- <ul>
19
- <li><a href="files.html"><span>File&nbsp;List</span></a></li>
20
- </ul>
21
- </div>
22
- <h1>StandardApplicationPool.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
23
- <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
24
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
25
- <a name="l00004"></a>00004 <span class="comment"> *</span>
26
- <a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai &amp; Ninh Bui.</span>
27
- <a name="l00006"></a>00006 <span class="comment"> *</span>
28
- <a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
29
- <a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
30
- <a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
31
- <a name="l00010"></a>00010 <span class="comment"> *</span>
32
- <a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
33
- <a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
34
- <a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
35
- <a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
36
- <a name="l00015"></a>00015 <span class="comment"> *</span>
37
- <a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
38
- <a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
39
- <a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
40
- <a name="l00019"></a>00019 <span class="comment"> */</span>
41
- <a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_STANDARD_APPLICATION_POOL_H_</span>
42
- <a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_STANDARD_APPLICATION_POOL_H_</span>
43
- <a name="l00022"></a>00022 <span class="preprocessor"></span>
44
- <a name="l00023"></a>00023 <span class="preprocessor">#include &lt;boost/shared_ptr.hpp&gt;</span>
45
- <a name="l00024"></a>00024 <span class="preprocessor">#include &lt;boost/weak_ptr.hpp&gt;</span>
46
- <a name="l00025"></a>00025 <span class="preprocessor">#include &lt;boost/thread.hpp&gt;</span>
47
- <a name="l00026"></a>00026 <span class="preprocessor">#include &lt;boost/bind.hpp&gt;</span>
48
- <a name="l00027"></a>00027 <span class="preprocessor">#include &lt;boost/date_time/microsec_time_clock.hpp&gt;</span>
49
- <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;boost/date_time/posix_time/posix_time.hpp&gt;</span>
50
- <a name="l00029"></a>00029
51
- <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
52
- <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;oxt/backtrace.hpp&gt;</span>
53
- <a name="l00032"></a>00032
54
- <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;string&gt;</span>
55
- <a name="l00034"></a>00034 <span class="preprocessor">#include &lt;sstream&gt;</span>
56
- <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;map&gt;</span>
57
- <a name="l00036"></a>00036 <span class="preprocessor">#include &lt;list&gt;</span>
58
- <a name="l00037"></a>00037
59
- <a name="l00038"></a>00038 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
60
- <a name="l00039"></a>00039 <span class="preprocessor">#include &lt;sys/stat.h&gt;</span>
61
- <a name="l00040"></a>00040 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
62
- <a name="l00041"></a>00041 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
63
- <a name="l00042"></a>00042 <span class="preprocessor">#include &lt;ctime&gt;</span>
64
- <a name="l00043"></a>00043 <span class="preprocessor">#include &lt;cerrno&gt;</span>
65
- <a name="l00044"></a>00044 <span class="preprocessor">#ifdef TESTING_APPLICATION_POOL</span>
66
- <a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor"> #include &lt;cstdlib&gt;</span>
67
- <a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
68
- <a name="l00047"></a>00047 <span class="preprocessor"></span>
69
- <a name="l00048"></a>00048 <span class="preprocessor">#include "ApplicationPool.h"</span>
70
- <a name="l00049"></a>00049 <span class="preprocessor">#include "Logging.h"</span>
71
- <a name="l00050"></a>00050 <span class="preprocessor">#include "FileChecker.h"</span>
72
- <a name="l00051"></a>00051 <span class="preprocessor">#include "CachedFileStat.h"</span>
73
- <a name="l00052"></a>00052 <span class="preprocessor">#ifdef PASSENGER_USE_DUMMY_SPAWN_MANAGER</span>
74
- <a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor"> #include "DummySpawnManager.h"</span>
75
- <a name="l00054"></a>00054 <span class="preprocessor">#else</span>
76
- <a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor"> #include "SpawnManager.h"</span>
77
- <a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
78
- <a name="l00057"></a>00057 <span class="preprocessor"></span>
79
- <a name="l00058"></a>00058 <span class="keyword">namespace </span>Passenger {
80
- <a name="l00059"></a>00059
81
- <a name="l00060"></a>00060 <span class="keyword">using namespace </span>std;
82
- <a name="l00061"></a>00061 <span class="keyword">using namespace </span>boost;
83
- <a name="l00062"></a>00062 <span class="keyword">using namespace </span>oxt;
84
- <a name="l00063"></a>00063
85
- <a name="l00064"></a>00064 <span class="keyword">class </span>ApplicationPoolServer;
86
- <a name="l00065"></a>00065
87
- <a name="l00066"></a>00066 <span class="comment">/****************************************************************</span>
88
- <a name="l00067"></a>00067 <span class="comment"> *</span>
89
- <a name="l00068"></a>00068 <span class="comment"> * See "doc/ApplicationPool algorithm.txt" for a more readable</span>
90
- <a name="l00069"></a>00069 <span class="comment"> * and detailed description of the algorithm implemented here.</span>
91
- <a name="l00070"></a>00070 <span class="comment"> *</span>
92
- <a name="l00071"></a>00071 <span class="comment"> ****************************************************************/</span>
93
- <a name="l00072"></a>00072 <span class="comment"></span>
94
- <a name="l00073"></a>00073 <span class="comment">/**</span>
95
- <a name="l00074"></a>00074 <span class="comment"> * A standard implementation of ApplicationPool for single-process environments.</span>
96
- <a name="l00075"></a>00075 <span class="comment"> *</span>
97
- <a name="l00076"></a>00076 <span class="comment"> * The environment may or may not be multithreaded - StandardApplicationPool is completely</span>
98
- <a name="l00077"></a>00077 <span class="comment"> * thread-safe. Apache with the threading MPM is an example of a multithreaded single-process</span>
99
- <a name="l00078"></a>00078 <span class="comment"> * environment.</span>
100
- <a name="l00079"></a>00079 <span class="comment"> *</span>
101
- <a name="l00080"></a>00080 <span class="comment"> * This class is unusable in multi-process environments such as Apache with the prefork MPM.</span>
102
- <a name="l00081"></a>00081 <span class="comment"> * The reasons are as follows:</span>
103
- <a name="l00082"></a>00082 <span class="comment"> * - StandardApplicationPool uses threads internally. Because threads disappear after a fork(),</span>
104
- <a name="l00083"></a>00083 <span class="comment"> * a StandardApplicationPool object will become unusable after a fork().</span>
105
- <a name="l00084"></a>00084 <span class="comment"> * - StandardApplicationPool stores its internal cache on the heap. Different processes</span>
106
- <a name="l00085"></a>00085 <span class="comment"> * cannot share their heaps, so they will not be able to access each others' pool cache.</span>
107
- <a name="l00086"></a>00086 <span class="comment"> * - StandardApplicationPool has a connection to the spawn server. If there are multiple</span>
108
- <a name="l00087"></a>00087 <span class="comment"> * processes, and they all use the spawn servers's connection at the same time without</span>
109
- <a name="l00088"></a>00088 <span class="comment"> * some sort of synchronization, then bad things will happen.</span>
110
- <a name="l00089"></a>00089 <span class="comment"> *</span>
111
- <a name="l00090"></a>00090 <span class="comment"> * (Of course, StandardApplicationPool &lt;em&gt;is&lt;/em&gt; usable if each process creates its own</span>
112
- <a name="l00091"></a>00091 <span class="comment"> * StandardApplicationPool object, but that would defeat the point of having a shared pool.)</span>
113
- <a name="l00092"></a>00092 <span class="comment"> *</span>
114
- <a name="l00093"></a>00093 <span class="comment"> * For multi-process environments, one should use ApplicationPoolServer instead.</span>
115
- <a name="l00094"></a>00094 <span class="comment"> *</span>
116
- <a name="l00095"></a>00095 <span class="comment"> * @ingroup Support</span>
117
- <a name="l00096"></a>00096 <span class="comment"> */</span>
118
- <a name="l00097"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html">00097</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1StandardApplicationPool.html" title="A standard implementation of ApplicationPool for single-process environments.">StandardApplicationPool</a>: <span class="keyword">public</span> <a class="code" href="classPassenger_1_1ApplicationPool.html" title="A persistent pool of Applications.">ApplicationPool</a> {
119
- <a name="l00098"></a>00098 <span class="keyword">private</span>:
120
- <a name="l00099"></a>00099 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_MAX_IDLE_TIME = 120;
121
- <a name="l00100"></a>00100 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_MAX_POOL_SIZE = 20;
122
- <a name="l00101"></a>00101 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_MAX_INSTANCES_PER_APP = 0;
123
- <a name="l00102"></a>00102 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> CLEANER_THREAD_STACK_SIZE = 1024 * 128;
124
- <a name="l00103"></a>00103 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MAX_GET_ATTEMPTS = 10;
125
- <a name="l00104"></a>00104 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GET_TIMEOUT = 5000; <span class="comment">// In milliseconds.</span>
126
- <a name="l00105"></a>00105
127
- <a name="l00106"></a>00106 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ApplicationPoolServer.html" title="Multi-process usage support for ApplicationPool.">ApplicationPoolServer</a>;
128
- <a name="l00107"></a>00107 <span class="keyword">struct </span>Domain;
129
- <a name="l00108"></a>00108 <span class="keyword">struct </span>AppContainer;
130
- <a name="l00109"></a>00109
131
- <a name="l00110"></a>00110 <span class="keyword">typedef</span> shared_ptr&lt;Domain&gt; DomainPtr;
132
- <a name="l00111"></a>00111 <span class="keyword">typedef</span> shared_ptr&lt;AppContainer&gt; AppContainerPtr;
133
- <a name="l00112"></a>00112 <span class="keyword">typedef</span> list&lt;AppContainerPtr&gt; AppContainerList;
134
- <a name="l00113"></a>00113 <span class="keyword">typedef</span> map&lt;string, DomainPtr&gt; DomainMap;
135
- <a name="l00114"></a>00114
136
- <a name="l00115"></a>00115 <span class="keyword">struct </span>Domain {
137
- <a name="l00116"></a>00116 AppContainerList instances;
138
- <a name="l00117"></a>00117 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size;
139
- <a name="l00118"></a>00118 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxRequests;
140
- <a name="l00119"></a>00119 <a class="code" href="classPassenger_1_1FileChecker.html" title="Utility class for checking for file changes.">FileChecker</a> restartFileChecker;
141
- <a name="l00120"></a>00120 CachedFileStat alwaysRestartFileStatter;
142
- <a name="l00121"></a>00121
143
- <a name="l00122"></a>00122 Domain(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &amp;options)
144
- <a name="l00123"></a>00123 : restartFileChecker(determineRestartDir(options) + <span class="stringliteral">"/restart.txt"</span>),
145
- <a name="l00124"></a>00124 alwaysRestartFileStatter(determineRestartDir(options) + <span class="stringliteral">"/always_restart.txt"</span>)
146
- <a name="l00125"></a>00125 {
147
- <a name="l00126"></a>00126 }
148
- <a name="l00127"></a>00127
149
- <a name="l00128"></a>00128 <span class="keyword">private</span>:
150
- <a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keywordtype">string</span> determineRestartDir(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &amp;options) {
151
- <a name="l00130"></a>00130 <span class="keywordflow">if</span> (options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>.empty()) {
152
- <a name="l00131"></a>00131 <span class="keywordflow">return</span> options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a> + <span class="stringliteral">"/tmp"</span>;
153
- <a name="l00132"></a>00132 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>[0] == <span class="charliteral">'/'</span>) {
154
- <a name="l00133"></a>00133 <span class="keywordflow">return</span> options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>;
155
- <a name="l00134"></a>00134 } <span class="keywordflow">else</span> {
156
- <a name="l00135"></a>00135 <span class="keywordflow">return</span> options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a> + <span class="stringliteral">"/"</span> + options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>;
157
- <a name="l00136"></a>00136 }
158
- <a name="l00137"></a>00137 }
159
- <a name="l00138"></a>00138 };
160
- <a name="l00139"></a>00139
161
- <a name="l00140"></a>00140 <span class="keyword">struct </span>AppContainer {
162
- <a name="l00141"></a>00141 ApplicationPtr app;
163
- <a name="l00142"></a>00142 time_t startTime;
164
- <a name="l00143"></a>00143 time_t lastUsed;
165
- <a name="l00144"></a>00144 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sessions;
166
- <a name="l00145"></a>00145 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> processed;
167
- <a name="l00146"></a>00146 AppContainerList::iterator iterator;
168
- <a name="l00147"></a>00147 AppContainerList::iterator ia_iterator;
169
- <a name="l00148"></a>00148
170
- <a name="l00149"></a>00149 AppContainer() {
171
- <a name="l00150"></a>00150 startTime = time(NULL);
172
- <a name="l00151"></a>00151 processed = 0;
173
- <a name="l00152"></a>00152 }
174
- <a name="l00153"></a>00153 <span class="comment"></span>
175
- <a name="l00154"></a>00154 <span class="comment"> /**</span>
176
- <a name="l00155"></a>00155 <span class="comment"> * Returns the uptime of this AppContainer so far, as a string.</span>
177
- <a name="l00156"></a>00156 <span class="comment"> */</span>
178
- <a name="l00157"></a>00157 <span class="keywordtype">string</span> uptime()<span class="keyword"> const </span>{
179
- <a name="l00158"></a>00158 time_t seconds = time(NULL) - startTime;
180
- <a name="l00159"></a>00159 stringstream result;
181
- <a name="l00160"></a>00160
182
- <a name="l00161"></a>00161 <span class="keywordflow">if</span> (seconds &gt;= 60) {
183
- <a name="l00162"></a>00162 time_t minutes = seconds / 60;
184
- <a name="l00163"></a>00163 <span class="keywordflow">if</span> (minutes &gt;= 60) {
185
- <a name="l00164"></a>00164 time_t hours = minutes / 60;
186
- <a name="l00165"></a>00165 minutes = minutes % 60;
187
- <a name="l00166"></a>00166 result &lt;&lt; hours &lt;&lt; <span class="stringliteral">"h "</span>;
188
- <a name="l00167"></a>00167 }
189
- <a name="l00168"></a>00168
190
- <a name="l00169"></a>00169 seconds = seconds % 60;
191
- <a name="l00170"></a>00170 result &lt;&lt; minutes &lt;&lt; <span class="stringliteral">"m "</span>;
192
- <a name="l00171"></a>00171 }
193
- <a name="l00172"></a>00172 result &lt;&lt; seconds &lt;&lt; <span class="stringliteral">"s"</span>;
194
- <a name="l00173"></a>00173 <span class="keywordflow">return</span> result.str();
195
- <a name="l00174"></a>00174 }
196
- <a name="l00175"></a>00175 };
197
- <a name="l00176"></a>00176 <span class="comment"></span>
198
- <a name="l00177"></a>00177 <span class="comment"> /**</span>
199
- <a name="l00178"></a>00178 <span class="comment"> * A data structure which contains data that's shared between a</span>
200
- <a name="l00179"></a>00179 <span class="comment"> * StandardApplicationPool and a SessionCloseCallback object.</span>
201
- <a name="l00180"></a>00180 <span class="comment"> * This is because the StandardApplicationPool's life time could be</span>
202
- <a name="l00181"></a>00181 <span class="comment"> * different from a SessionCloseCallback's.</span>
203
- <a name="l00182"></a>00182 <span class="comment"> */</span>
204
- <a name="l00183"></a>00183 <span class="keyword">struct </span>SharedData {
205
- <a name="l00184"></a>00184 boost::mutex lock;
206
- <a name="l00185"></a>00185 condition activeOrMaxChanged;
207
- <a name="l00186"></a>00186
208
- <a name="l00187"></a>00187 DomainMap domains;
209
- <a name="l00188"></a>00188 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> max;
210
- <a name="l00189"></a>00189 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count;
211
- <a name="l00190"></a>00190 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> active;
212
- <a name="l00191"></a>00191 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxPerApp;
213
- <a name="l00192"></a>00192 AppContainerList inactiveApps;
214
- <a name="l00193"></a>00193 map&lt;string, unsigned int&gt; appInstanceCount;
215
- <a name="l00194"></a>00194 };
216
- <a name="l00195"></a>00195
217
- <a name="l00196"></a>00196 <span class="keyword">typedef</span> shared_ptr&lt;SharedData&gt; SharedDataPtr;
218
- <a name="l00197"></a>00197 <span class="comment"></span>
219
- <a name="l00198"></a>00198 <span class="comment"> /**</span>
220
- <a name="l00199"></a>00199 <span class="comment"> * Function object which will be called when a session has been closed.</span>
221
- <a name="l00200"></a>00200 <span class="comment"> */</span>
222
- <a name="l00201"></a>00201 <span class="keyword">struct </span>SessionCloseCallback {
223
- <a name="l00202"></a>00202 SharedDataPtr data;
224
- <a name="l00203"></a>00203 weak_ptr&lt;AppContainer&gt; container;
225
- <a name="l00204"></a>00204
226
- <a name="l00205"></a>00205 SessionCloseCallback(SharedDataPtr data,
227
- <a name="l00206"></a>00206 <span class="keyword">const</span> weak_ptr&lt;AppContainer&gt; &amp;container) {
228
- <a name="l00207"></a>00207 this-&gt;data = data;
229
- <a name="l00208"></a>00208 this-&gt;container = container;
230
- <a name="l00209"></a>00209 }
231
- <a name="l00210"></a>00210
232
- <a name="l00211"></a>00211 <span class="keywordtype">void</span> operator()() {
233
- <a name="l00212"></a>00212 boost::mutex::scoped_lock l(data-&gt;lock);
234
- <a name="l00213"></a>00213 AppContainerPtr container(this-&gt;container.lock());
235
- <a name="l00214"></a>00214
236
- <a name="l00215"></a>00215 <span class="keywordflow">if</span> (container == NULL) {
237
- <a name="l00216"></a>00216 <span class="keywordflow">return</span>;
238
- <a name="l00217"></a>00217 }
239
- <a name="l00218"></a>00218
240
- <a name="l00219"></a>00219 DomainMap::iterator it;
241
- <a name="l00220"></a>00220 it = data-&gt;domains.find(container-&gt;app-&gt;getAppRoot());
242
- <a name="l00221"></a>00221 <span class="keywordflow">if</span> (it != data-&gt;domains.end()) {
243
- <a name="l00222"></a>00222 Domain *domain = it-&gt;second.get();
244
- <a name="l00223"></a>00223 AppContainerList *instances = &amp;domain-&gt;instances;
245
- <a name="l00224"></a>00224
246
- <a name="l00225"></a>00225 container-&gt;processed++;
247
- <a name="l00226"></a>00226 <span class="keywordflow">if</span> (domain-&gt;maxRequests &gt; 0 &amp;&amp; container-&gt;processed &gt;= domain-&gt;maxRequests) {
248
- <a name="l00227"></a>00227 instances-&gt;erase(container-&gt;iterator);
249
- <a name="l00228"></a>00228 domain-&gt;size--;
250
- <a name="l00229"></a>00229 <span class="keywordflow">if</span> (instances-&gt;empty()) {
251
- <a name="l00230"></a>00230 data-&gt;domains.erase(container-&gt;app-&gt;getAppRoot());
252
- <a name="l00231"></a>00231 }
253
- <a name="l00232"></a>00232 data-&gt;count--;
254
- <a name="l00233"></a>00233 data-&gt;active--;
255
- <a name="l00234"></a>00234 data-&gt;activeOrMaxChanged.notify_all();
256
- <a name="l00235"></a>00235 } <span class="keywordflow">else</span> {
257
- <a name="l00236"></a>00236 container-&gt;lastUsed = time(NULL);
258
- <a name="l00237"></a>00237 container-&gt;sessions--;
259
- <a name="l00238"></a>00238 <span class="keywordflow">if</span> (container-&gt;sessions == 0) {
260
- <a name="l00239"></a>00239 instances-&gt;erase(container-&gt;iterator);
261
- <a name="l00240"></a>00240 instances-&gt;push_front(container);
262
- <a name="l00241"></a>00241 container-&gt;iterator = instances-&gt;begin();
263
- <a name="l00242"></a>00242 data-&gt;inactiveApps.push_back(container);
264
- <a name="l00243"></a>00243 container-&gt;ia_iterator = data-&gt;inactiveApps.end();
265
- <a name="l00244"></a>00244 container-&gt;ia_iterator--;
266
- <a name="l00245"></a>00245 data-&gt;active--;
267
- <a name="l00246"></a>00246 data-&gt;activeOrMaxChanged.notify_all();
268
- <a name="l00247"></a>00247 }
269
- <a name="l00248"></a>00248 }
270
- <a name="l00249"></a>00249 }
271
- <a name="l00250"></a>00250 }
272
- <a name="l00251"></a>00251 };
273
- <a name="l00252"></a>00252
274
- <a name="l00253"></a>00253 <span class="preprocessor"> #ifdef PASSENGER_USE_DUMMY_SPAWN_MANAGER</span>
275
- <a name="l00254"></a>00254 <span class="preprocessor"></span> <a class="code" href="classPassenger_1_1DummySpawnManager.html" title="A dummy SpawnManager replacement for testing/debugging purposes.">DummySpawnManager</a> spawnManager;
276
- <a name="l00255"></a>00255 <span class="preprocessor"> #else</span>
277
- <a name="l00256"></a>00256 <span class="preprocessor"></span> <a class="code" href="classPassenger_1_1SpawnManager.html" title="Spawning of Ruby on Rails/Rack application instances.">SpawnManager</a> spawnManager;
278
- <a name="l00257"></a>00257 <span class="preprocessor"> #endif</span>
279
- <a name="l00258"></a>00258 <span class="preprocessor"></span> SharedDataPtr data;
280
- <a name="l00259"></a>00259 boost::thread *cleanerThread;
281
- <a name="l00260"></a>00260 <span class="keywordtype">bool</span> detached;
282
- <a name="l00261"></a>00261 <span class="keywordtype">bool</span> done;
283
- <a name="l00262"></a>00262 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxIdleTime;
284
- <a name="l00263"></a>00263 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> waitingOnGlobalQueue;
285
- <a name="l00264"></a>00264 condition cleanerThreadSleeper;
286
- <a name="l00265"></a>00265
287
- <a name="l00266"></a>00266 <span class="comment">// Shortcuts for instance variables in SharedData. Saves typing in get().</span>
288
- <a name="l00267"></a>00267 boost::mutex &amp;lock;
289
- <a name="l00268"></a>00268 condition &amp;activeOrMaxChanged;
290
- <a name="l00269"></a>00269 DomainMap &amp;domains;
291
- <a name="l00270"></a>00270 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;max;
292
- <a name="l00271"></a>00271 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;count;
293
- <a name="l00272"></a>00272 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;active;
294
- <a name="l00273"></a>00273 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;maxPerApp;
295
- <a name="l00274"></a>00274 AppContainerList &amp;inactiveApps;
296
- <a name="l00275"></a>00275 map&lt;string, unsigned int&gt; &amp;appInstanceCount;
297
- <a name="l00276"></a>00276 <span class="comment"></span>
298
- <a name="l00277"></a>00277 <span class="comment"> /**</span>
299
- <a name="l00278"></a>00278 <span class="comment"> * Verify that all the invariants are correct.</span>
300
- <a name="l00279"></a>00279 <span class="comment"> */</span>
301
- <a name="l00280"></a>00280 <span class="keywordtype">bool</span> <span class="keyword">inline</span> verifyState() {
302
- <a name="l00281"></a>00281 <span class="preprocessor"> #if PASSENGER_DEBUG</span>
303
- <a name="l00282"></a>00282 <span class="preprocessor"></span> <span class="comment">// Invariants for _domains_.</span>
304
- <a name="l00283"></a>00283 DomainMap::const_iterator it;
305
- <a name="l00284"></a>00284 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSize = 0;
306
- <a name="l00285"></a>00285 <span class="keywordflow">for</span> (it = domains.begin(); it != domains.end(); it++) {
307
- <a name="l00286"></a>00286 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;appRoot = it-&gt;first;
308
- <a name="l00287"></a>00287 Domain *domain = it-&gt;second.get();
309
- <a name="l00288"></a>00288 AppContainerList *instances = &amp;domain-&gt;instances;
310
- <a name="l00289"></a>00289
311
- <a name="l00290"></a>00290 P_ASSERT(domain-&gt;size &lt;= count, <span class="keyword">false</span>,
312
- <a name="l00291"></a>00291 <span class="stringliteral">"domains['"</span> &lt;&lt; appRoot &lt;&lt; <span class="stringliteral">"'].size ("</span> &lt;&lt; domain-&gt;size &lt;&lt;
313
- <a name="l00292"></a>00292 <span class="stringliteral">") &lt;= count ("</span> &lt;&lt; count &lt;&lt; <span class="stringliteral">")"</span>);
314
- <a name="l00293"></a>00293 totalSize += domain-&gt;size;
315
- <a name="l00294"></a>00294
316
- <a name="l00295"></a>00295 <span class="comment">// Invariants for Domain.</span>
317
- <a name="l00296"></a>00296
318
- <a name="l00297"></a>00297 P_ASSERT(!instances-&gt;empty(), <span class="keyword">false</span>,
319
- <a name="l00298"></a>00298 <span class="stringliteral">"domains['"</span> &lt;&lt; appRoot &lt;&lt; <span class="stringliteral">"'].instances is nonempty."</span>);
320
- <a name="l00299"></a>00299
321
- <a name="l00300"></a>00300 AppContainerList::const_iterator prev_lit;
322
- <a name="l00301"></a>00301 AppContainerList::const_iterator lit;
323
- <a name="l00302"></a>00302 prev_lit = instances-&gt;begin();
324
- <a name="l00303"></a>00303 lit = prev_lit;
325
- <a name="l00304"></a>00304 lit++;
326
- <a name="l00305"></a>00305 <span class="keywordflow">for</span> (; lit != instances-&gt;end(); lit++) {
327
- <a name="l00306"></a>00306 <span class="keywordflow">if</span> ((*prev_lit)-&gt;sessions &gt; 0) {
328
- <a name="l00307"></a>00307 P_ASSERT((*lit)-&gt;sessions &gt; 0, <span class="keyword">false</span>,
329
- <a name="l00308"></a>00308 <span class="stringliteral">"domains['"</span> &lt;&lt; appRoot &lt;&lt; <span class="stringliteral">"'].instances "</span>
330
- <a name="l00309"></a>00309 <span class="stringliteral">"is sorted from nonactive to active"</span>);
331
- <a name="l00310"></a>00310 }
332
- <a name="l00311"></a>00311 }
333
- <a name="l00312"></a>00312 }
334
- <a name="l00313"></a>00313 P_ASSERT(totalSize == count, <span class="keyword">false</span>, <span class="stringliteral">"(sum of all d.size in domains) == count"</span>);
335
- <a name="l00314"></a>00314
336
- <a name="l00315"></a>00315 P_ASSERT(active &lt;= count, <span class="keyword">false</span>,
337
- <a name="l00316"></a>00316 <span class="stringliteral">"active ("</span> &lt;&lt; active &lt;&lt; <span class="stringliteral">") &lt; count ("</span> &lt;&lt; count &lt;&lt; <span class="stringliteral">")"</span>);
338
- <a name="l00317"></a>00317 P_ASSERT(inactiveApps.size() == count - active, <span class="keyword">false</span>,
339
- <a name="l00318"></a>00318 <span class="stringliteral">"inactive_apps.size() == count - active"</span>);
340
- <a name="l00319"></a>00319 <span class="preprocessor"> #endif</span>
341
- <a name="l00320"></a>00320 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
342
- <a name="l00321"></a>00321 }
343
- <a name="l00322"></a>00322
344
- <a name="l00323"></a>00323 <span class="keywordtype">string</span> toStringWithoutLock()<span class="keyword"> const </span>{
345
- <a name="l00324"></a>00324 stringstream result;
346
- <a name="l00325"></a>00325
347
- <a name="l00326"></a>00326 result &lt;&lt; <span class="stringliteral">"----------- General information -----------"</span> &lt;&lt; endl;
348
- <a name="l00327"></a>00327 result &lt;&lt; <span class="stringliteral">"max = "</span> &lt;&lt; max &lt;&lt; endl;
349
- <a name="l00328"></a>00328 result &lt;&lt; <span class="stringliteral">"count = "</span> &lt;&lt; count &lt;&lt; endl;
350
- <a name="l00329"></a>00329 result &lt;&lt; <span class="stringliteral">"active = "</span> &lt;&lt; active &lt;&lt; endl;
351
- <a name="l00330"></a>00330 result &lt;&lt; <span class="stringliteral">"inactive = "</span> &lt;&lt; inactiveApps.size() &lt;&lt; endl;
352
- <a name="l00331"></a>00331 result &lt;&lt; <span class="stringliteral">"Waiting on global queue: "</span> &lt;&lt; waitingOnGlobalQueue &lt;&lt; endl;
353
- <a name="l00332"></a>00332 result &lt;&lt; endl;
354
- <a name="l00333"></a>00333
355
- <a name="l00334"></a>00334 result &lt;&lt; <span class="stringliteral">"----------- Domains -----------"</span> &lt;&lt; endl;
356
- <a name="l00335"></a>00335 DomainMap::const_iterator it;
357
- <a name="l00336"></a>00336 <span class="keywordflow">for</span> (it = domains.begin(); it != domains.end(); it++) {
358
- <a name="l00337"></a>00337 Domain *domain = it-&gt;second.get();
359
- <a name="l00338"></a>00338 AppContainerList *instances = &amp;domain-&gt;instances;
360
- <a name="l00339"></a>00339 AppContainerList::const_iterator lit;
361
- <a name="l00340"></a>00340
362
- <a name="l00341"></a>00341 result &lt;&lt; it-&gt;first &lt;&lt; <span class="stringliteral">": "</span> &lt;&lt; endl;
363
- <a name="l00342"></a>00342 <span class="keywordflow">for</span> (lit = instances-&gt;begin(); lit != instances-&gt;end(); lit++) {
364
- <a name="l00343"></a>00343 AppContainer *container = lit-&gt;get();
365
- <a name="l00344"></a>00344 <span class="keywordtype">char</span> buf[128];
366
- <a name="l00345"></a>00345
367
- <a name="l00346"></a>00346 snprintf(buf, <span class="keyword">sizeof</span>(buf),
368
- <a name="l00347"></a>00347 <span class="stringliteral">"PID: %-5lu Sessions: %-2u Processed: %-5u Uptime: %s"</span>,
369
- <a name="l00348"></a>00348 (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) container-&gt;app-&gt;getPid(),
370
- <a name="l00349"></a>00349 container-&gt;sessions,
371
- <a name="l00350"></a>00350 container-&gt;processed,
372
- <a name="l00351"></a>00351 container-&gt;uptime().c_str());
373
- <a name="l00352"></a>00352 result &lt;&lt; <span class="stringliteral">" "</span> &lt;&lt; buf &lt;&lt; endl;
374
- <a name="l00353"></a>00353 }
375
- <a name="l00354"></a>00354 result &lt;&lt; endl;
376
- <a name="l00355"></a>00355 }
377
- <a name="l00356"></a>00356 <span class="keywordflow">return</span> result.str();
378
- <a name="l00357"></a>00357 }
379
- <a name="l00358"></a>00358 <span class="comment"></span>
380
- <a name="l00359"></a>00359 <span class="comment"> /**</span>
381
- <a name="l00360"></a>00360 <span class="comment"> * Checks whether the given application domain needs to be restarted.</span>
382
- <a name="l00361"></a>00361 <span class="comment"> *</span>
383
- <a name="l00362"></a>00362 <span class="comment"> * @throws SystemException Something went wrong while retrieving the system time.</span>
384
- <a name="l00363"></a>00363 <span class="comment"> * @throws boost::thread_interrupted</span>
385
- <a name="l00364"></a>00364 <span class="comment"> */</span>
386
- <a name="l00365"></a>00365 <span class="keywordtype">bool</span> needsRestart(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;appRoot, Domain *domain, <span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &amp;options) {
387
- <a name="l00366"></a>00366 <span class="keywordflow">return</span> domain-&gt;alwaysRestartFileStatter.refresh(options.<a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>) == 0
388
- <a name="l00367"></a>00367 || domain-&gt;restartFileChecker.changed(options.<a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>);
389
- <a name="l00368"></a>00368 }
390
- <a name="l00369"></a>00369
391
- <a name="l00370"></a>00370 <span class="keywordtype">void</span> cleanerThreadMainLoop() {
392
- <a name="l00371"></a>00371 this_thread::disable_syscall_interruption dsi;
393
- <a name="l00372"></a>00372 unique_lock&lt;boost::mutex&gt; l(lock);
394
- <a name="l00373"></a>00373 <span class="keywordflow">try</span> {
395
- <a name="l00374"></a>00374 <span class="keywordflow">while</span> (!done &amp;&amp; !this_thread::interruption_requested()) {
396
- <a name="l00375"></a>00375 xtime xt;
397
- <a name="l00376"></a>00376 xtime_get(&amp;xt, TIME_UTC);
398
- <a name="l00377"></a>00377 xt.sec += maxIdleTime + 1;
399
- <a name="l00378"></a>00378 <span class="keywordflow">if</span> (cleanerThreadSleeper.timed_wait(l, xt)) {
400
- <a name="l00379"></a>00379 <span class="comment">// Condition was woken up.</span>
401
- <a name="l00380"></a>00380 <span class="keywordflow">if</span> (done) {
402
- <a name="l00381"></a>00381 <span class="comment">// StandardApplicationPool is being destroyed.</span>
403
- <a name="l00382"></a>00382 <span class="keywordflow">break</span>;
404
- <a name="l00383"></a>00383 } <span class="keywordflow">else</span> {
405
- <a name="l00384"></a>00384 <span class="comment">// maxIdleTime changed.</span>
406
- <a name="l00385"></a>00385 <span class="keywordflow">continue</span>;
407
- <a name="l00386"></a>00386 }
408
- <a name="l00387"></a>00387 }
409
- <a name="l00388"></a>00388
410
- <a name="l00389"></a>00389 time_t now = syscalls::time(NULL);
411
- <a name="l00390"></a>00390 AppContainerList::iterator it;
412
- <a name="l00391"></a>00391 <span class="keywordflow">for</span> (it = inactiveApps.begin(); it != inactiveApps.end(); it++) {
413
- <a name="l00392"></a>00392 AppContainer &amp;container(*it-&gt;get());
414
- <a name="l00393"></a>00393 ApplicationPtr app(container.app);
415
- <a name="l00394"></a>00394 Domain *domain = domains[app-&gt;getAppRoot()].get();
416
- <a name="l00395"></a>00395 AppContainerList *instances = &amp;domain-&gt;instances;
417
- <a name="l00396"></a>00396
418
- <a name="l00397"></a>00397 <span class="keywordflow">if</span> (maxIdleTime &gt; 0 &amp;&amp;
419
- <a name="l00398"></a>00398 (now - container.lastUsed &gt; (time_t) maxIdleTime)) {
420
- <a name="l00399"></a>00399 P_DEBUG(<span class="stringliteral">"Cleaning idle app "</span> &lt;&lt; app-&gt;getAppRoot() &lt;&lt;
421
- <a name="l00400"></a>00400 <span class="stringliteral">" (PID "</span> &lt;&lt; app-&gt;getPid() &lt;&lt; <span class="stringliteral">")"</span>);
422
- <a name="l00401"></a>00401 instances-&gt;erase(container.iterator);
423
- <a name="l00402"></a>00402
424
- <a name="l00403"></a>00403 AppContainerList::iterator prev = it;
425
- <a name="l00404"></a>00404 prev--;
426
- <a name="l00405"></a>00405 inactiveApps.erase(it);
427
- <a name="l00406"></a>00406 it = prev;
428
- <a name="l00407"></a>00407
429
- <a name="l00408"></a>00408 domain-&gt;size--;
430
- <a name="l00409"></a>00409
431
- <a name="l00410"></a>00410 count--;
432
- <a name="l00411"></a>00411 }
433
- <a name="l00412"></a>00412 <span class="keywordflow">if</span> (instances-&gt;empty()) {
434
- <a name="l00413"></a>00413 domains.erase(app-&gt;getAppRoot());
435
- <a name="l00414"></a>00414 }
436
- <a name="l00415"></a>00415 }
437
- <a name="l00416"></a>00416 }
438
- <a name="l00417"></a>00417 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> exception &amp;e) {
439
- <a name="l00418"></a>00418 P_ERROR(<span class="stringliteral">"Uncaught exception: "</span> &lt;&lt; e.what());
440
- <a name="l00419"></a>00419 }
441
- <a name="l00420"></a>00420 }
442
- <a name="l00421"></a>00421 <span class="comment"></span>
443
- <a name="l00422"></a>00422 <span class="comment"> /**</span>
444
- <a name="l00423"></a>00423 <span class="comment"> * Spawn a new application instance, or use an existing one that's in the pool.</span>
445
- <a name="l00424"></a>00424 <span class="comment"> *</span>
446
- <a name="l00425"></a>00425 <span class="comment"> * @throws boost::thread_interrupted</span>
447
- <a name="l00426"></a>00426 <span class="comment"> * @throws SpawnException</span>
448
- <a name="l00427"></a>00427 <span class="comment"> * @throws SystemException</span>
449
- <a name="l00428"></a>00428 <span class="comment"> */</span>
450
- <a name="l00429"></a>00429 pair&lt;AppContainerPtr, Domain *&gt;
451
- <a name="l00430"></a>00430 spawnOrUseExisting(boost::mutex::scoped_lock &amp;l, <span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &amp;options) {
452
- <a name="l00431"></a>00431 beginning_of_function:
453
- <a name="l00432"></a>00432
454
- <a name="l00433"></a>00433 TRACE_POINT();
455
- <a name="l00434"></a>00434 this_thread::disable_interruption di;
456
- <a name="l00435"></a>00435 this_thread::disable_syscall_interruption dsi;
457
- <a name="l00436"></a>00436 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;appRoot(options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
458
- <a name="l00437"></a>00437 AppContainerPtr container;
459
- <a name="l00438"></a>00438 Domain *domain;
460
- <a name="l00439"></a>00439 AppContainerList *instances;
461
- <a name="l00440"></a>00440
462
- <a name="l00441"></a>00441 <span class="keywordflow">try</span> {
463
- <a name="l00442"></a>00442 DomainMap::iterator it(domains.find(appRoot));
464
- <a name="l00443"></a>00443
465
- <a name="l00444"></a>00444 <span class="keywordflow">if</span> (it != domains.end() &amp;&amp; needsRestart(appRoot, it-&gt;second.get(), options)) {
466
- <a name="l00445"></a>00445 AppContainerList::iterator it2;
467
- <a name="l00446"></a>00446 instances = &amp;it-&gt;second-&gt;instances;
468
- <a name="l00447"></a>00447 <span class="keywordflow">for</span> (it2 = instances-&gt;begin(); it2 != instances-&gt;end(); it2++) {
469
- <a name="l00448"></a>00448 container = *it2;
470
- <a name="l00449"></a>00449 <span class="keywordflow">if</span> (container-&gt;sessions == 0) {
471
- <a name="l00450"></a>00450 inactiveApps.erase(container-&gt;ia_iterator);
472
- <a name="l00451"></a>00451 } <span class="keywordflow">else</span> {
473
- <a name="l00452"></a>00452 active--;
474
- <a name="l00453"></a>00453 }
475
- <a name="l00454"></a>00454 it2--;
476
- <a name="l00455"></a>00455 instances-&gt;erase(container-&gt;iterator);
477
- <a name="l00456"></a>00456 count--;
478
- <a name="l00457"></a>00457 }
479
- <a name="l00458"></a>00458 domains.erase(appRoot);
480
- <a name="l00459"></a>00459 spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#2e85c43042b9556ca2fd74b8d28956ce" title="Remove the cached application instances at the given application root.">reload</a>(appRoot);
481
- <a name="l00460"></a>00460 it = domains.end();
482
- <a name="l00461"></a>00461 activeOrMaxChanged.notify_all();
483
- <a name="l00462"></a>00462 }
484
- <a name="l00463"></a>00463
485
- <a name="l00464"></a>00464 <span class="keywordflow">if</span> (it != domains.end()) {
486
- <a name="l00465"></a>00465 domain = it-&gt;second.get();
487
- <a name="l00466"></a>00466 instances = &amp;domain-&gt;instances;
488
- <a name="l00467"></a>00467
489
- <a name="l00468"></a>00468 <span class="keywordflow">if</span> (instances-&gt;front()-&gt;sessions == 0) {
490
- <a name="l00469"></a>00469 container = instances-&gt;front();
491
- <a name="l00470"></a>00470 instances-&gt;pop_front();
492
- <a name="l00471"></a>00471 instances-&gt;push_back(container);
493
- <a name="l00472"></a>00472 container-&gt;iterator = instances-&gt;end();
494
- <a name="l00473"></a>00473 container-&gt;iterator--;
495
- <a name="l00474"></a>00474 inactiveApps.erase(container-&gt;ia_iterator);
496
- <a name="l00475"></a>00475 active++;
497
- <a name="l00476"></a>00476 activeOrMaxChanged.notify_all();
498
- <a name="l00477"></a>00477 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (count &gt;= max || (
499
- <a name="l00478"></a>00478 maxPerApp != 0 &amp;&amp; domain-&gt;size &gt;= maxPerApp )
500
- <a name="l00479"></a>00479 ) {
501
- <a name="l00480"></a>00480 <span class="keywordflow">if</span> (options.<a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a>) {
502
- <a name="l00481"></a>00481 UPDATE_TRACE_POINT();
503
- <a name="l00482"></a>00482 waitingOnGlobalQueue++;
504
- <a name="l00483"></a>00483 activeOrMaxChanged.wait(l);
505
- <a name="l00484"></a>00484 waitingOnGlobalQueue--;
506
- <a name="l00485"></a>00485 <span class="keywordflow">goto</span> beginning_of_function;
507
- <a name="l00486"></a>00486 } <span class="keywordflow">else</span> {
508
- <a name="l00487"></a>00487 AppContainerList::iterator it(instances-&gt;begin());
509
- <a name="l00488"></a>00488 AppContainerList::iterator smallest(instances-&gt;begin());
510
- <a name="l00489"></a>00489 it++;
511
- <a name="l00490"></a>00490 <span class="keywordflow">for</span> (; it != instances-&gt;end(); it++) {
512
- <a name="l00491"></a>00491 <span class="keywordflow">if</span> ((*it)-&gt;sessions &lt; (*smallest)-&gt;sessions) {
513
- <a name="l00492"></a>00492 smallest = it;
514
- <a name="l00493"></a>00493 }
515
- <a name="l00494"></a>00494 }
516
- <a name="l00495"></a>00495 container = *smallest;
517
- <a name="l00496"></a>00496 instances-&gt;erase(smallest);
518
- <a name="l00497"></a>00497 instances-&gt;push_back(container);
519
- <a name="l00498"></a>00498 container-&gt;iterator = instances-&gt;end();
520
- <a name="l00499"></a>00499 container-&gt;iterator--;
521
- <a name="l00500"></a>00500 }
522
- <a name="l00501"></a>00501 } <span class="keywordflow">else</span> {
523
- <a name="l00502"></a>00502 container = <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AppContainer());
524
- <a name="l00503"></a>00503 {
525
- <a name="l00504"></a>00504 this_thread::restore_interruption ri(di);
526
- <a name="l00505"></a>00505 this_thread::restore_syscall_interruption rsi(dsi);
527
- <a name="l00506"></a>00506 container-&gt;app = spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#af035d564cc4e6683508939c9d6dbb64" title="Spawn a new instance of an application.">spawn</a>(options);
528
- <a name="l00507"></a>00507 }
529
- <a name="l00508"></a>00508 container-&gt;sessions = 0;
530
- <a name="l00509"></a>00509 instances-&gt;push_back(container);
531
- <a name="l00510"></a>00510 container-&gt;iterator = instances-&gt;end();
532
- <a name="l00511"></a>00511 container-&gt;iterator--;
533
- <a name="l00512"></a>00512 domain-&gt;size++;
534
- <a name="l00513"></a>00513 count++;
535
- <a name="l00514"></a>00514 active++;
536
- <a name="l00515"></a>00515 activeOrMaxChanged.notify_all();
537
- <a name="l00516"></a>00516 }
538
- <a name="l00517"></a>00517 } <span class="keywordflow">else</span> {
539
- <a name="l00518"></a>00518 <span class="keywordflow">if</span> (active &gt;= max) {
540
- <a name="l00519"></a>00519 UPDATE_TRACE_POINT();
541
- <a name="l00520"></a>00520 activeOrMaxChanged.wait(l);
542
- <a name="l00521"></a>00521 <span class="keywordflow">goto</span> beginning_of_function;
543
- <a name="l00522"></a>00522 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (count == max) {
544
- <a name="l00523"></a>00523 container = inactiveApps.front();
545
- <a name="l00524"></a>00524 inactiveApps.pop_front();
546
- <a name="l00525"></a>00525 domain = domains[container-&gt;app-&gt;getAppRoot()].get();
547
- <a name="l00526"></a>00526 instances = &amp;domain-&gt;instances;
548
- <a name="l00527"></a>00527 instances-&gt;erase(container-&gt;iterator);
549
- <a name="l00528"></a>00528 <span class="keywordflow">if</span> (instances-&gt;empty()) {
550
- <a name="l00529"></a>00529 domains.erase(container-&gt;app-&gt;getAppRoot());
551
- <a name="l00530"></a>00530 } <span class="keywordflow">else</span> {
552
- <a name="l00531"></a>00531 domain-&gt;size--;
553
- <a name="l00532"></a>00532 }
554
- <a name="l00533"></a>00533 count--;
555
- <a name="l00534"></a>00534 }
556
- <a name="l00535"></a>00535
557
- <a name="l00536"></a>00536 UPDATE_TRACE_POINT();
558
- <a name="l00537"></a>00537 container = <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AppContainer());
559
- <a name="l00538"></a>00538 {
560
- <a name="l00539"></a>00539 this_thread::restore_interruption ri(di);
561
- <a name="l00540"></a>00540 this_thread::restore_syscall_interruption rsi(dsi);
562
- <a name="l00541"></a>00541 container-&gt;app = spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#af035d564cc4e6683508939c9d6dbb64" title="Spawn a new instance of an application.">spawn</a>(options);
563
- <a name="l00542"></a>00542 }
564
- <a name="l00543"></a>00543 container-&gt;sessions = 0;
565
- <a name="l00544"></a>00544 it = domains.find(appRoot);
566
- <a name="l00545"></a>00545 <span class="keywordflow">if</span> (it == domains.end()) {
567
- <a name="l00546"></a>00546 domain = <span class="keyword">new</span> Domain(options);
568
- <a name="l00547"></a>00547 domain-&gt;size = 1;
569
- <a name="l00548"></a>00548 domain-&gt;maxRequests = options.<a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a>;
570
- <a name="l00549"></a>00549 domains[appRoot] = <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(domain);
571
- <a name="l00550"></a>00550 } <span class="keywordflow">else</span> {
572
- <a name="l00551"></a>00551 domain = it-&gt;second.get();
573
- <a name="l00552"></a>00552 domain-&gt;size++;
574
- <a name="l00553"></a>00553 }
575
- <a name="l00554"></a>00554 instances = &amp;domain-&gt;instances;
576
- <a name="l00555"></a>00555 instances-&gt;push_back(container);
577
- <a name="l00556"></a>00556 container-&gt;iterator = instances-&gt;end();
578
- <a name="l00557"></a>00557 container-&gt;iterator--;
579
- <a name="l00558"></a>00558 count++;
580
- <a name="l00559"></a>00559 active++;
581
- <a name="l00560"></a>00560 activeOrMaxChanged.notify_all();
582
- <a name="l00561"></a>00561 }
583
- <a name="l00562"></a>00562 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a> &amp;e) {
584
- <a name="l00563"></a>00563 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot spawn application '"</span>);
585
- <a name="l00564"></a>00564 message.append(appRoot);
586
- <a name="l00565"></a>00565 message.append(<span class="stringliteral">"': "</span>);
587
- <a name="l00566"></a>00566 message.append(e.<a class="code" href="classPassenger_1_1SpawnException.html#d2da180f89a43423a4b37248249972ff">what</a>());
588
- <a name="l00567"></a>00567 <span class="keywordflow">if</span> (e.<a class="code" href="classPassenger_1_1SpawnException.html#e65dc272e183fd9e5637a4091cc6bbf4" title="Check whether an error page is available.">hasErrorPage</a>()) {
589
- <a name="l00568"></a>00568 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(message, e.<a class="code" href="classPassenger_1_1SpawnException.html#6f675a37edd7070875d0744e7dd010a1" title="Return the error page content.">getErrorPage</a>());
590
- <a name="l00569"></a>00569 } <span class="keywordflow">else</span> {
591
- <a name="l00570"></a>00570 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(message);
592
- <a name="l00571"></a>00571 }
593
- <a name="l00572"></a>00572 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> exception &amp;e) {
594
- <a name="l00573"></a>00573 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot spawn application '"</span>);
595
- <a name="l00574"></a>00574 message.append(appRoot);
596
- <a name="l00575"></a>00575 message.append(<span class="stringliteral">"': "</span>);
597
- <a name="l00576"></a>00576 message.append(e.what());
598
- <a name="l00577"></a>00577 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(message);
599
- <a name="l00578"></a>00578 }
600
- <a name="l00579"></a>00579
601
- <a name="l00580"></a>00580 <span class="keywordflow">return</span> make_pair(container, domain);
602
- <a name="l00581"></a>00581 }
603
- <a name="l00582"></a>00582
604
- <a name="l00583"></a>00583 <span class="keyword">public</span>:<span class="comment"></span>
605
- <a name="l00584"></a>00584 <span class="comment"> /**</span>
606
- <a name="l00585"></a>00585 <span class="comment"> * Create a new StandardApplicationPool object.</span>
607
- <a name="l00586"></a>00586 <span class="comment"> *</span>
608
- <a name="l00587"></a>00587 <span class="comment"> * @param spawnServerCommand The filename of the spawn server to use.</span>
609
- <a name="l00588"></a>00588 <span class="comment"> * @param logFile Specify a log file that the spawn server should use.</span>
610
- <a name="l00589"></a>00589 <span class="comment"> * Messages on its standard output and standard error channels</span>
611
- <a name="l00590"></a>00590 <span class="comment"> * will be written to this log file. If an empty string is</span>
612
- <a name="l00591"></a>00591 <span class="comment"> * specified, no log file will be used, and the spawn server</span>
613
- <a name="l00592"></a>00592 <span class="comment"> * will use the same standard output/error channels as the</span>
614
- <a name="l00593"></a>00593 <span class="comment"> * current process.</span>
615
- <a name="l00594"></a>00594 <span class="comment"> * @param rubyCommand The Ruby interpreter's command.</span>
616
- <a name="l00595"></a>00595 <span class="comment"> * @param user The user that the spawn manager should run as. This</span>
617
- <a name="l00596"></a>00596 <span class="comment"> * parameter only has effect if the current process is</span>
618
- <a name="l00597"></a>00597 <span class="comment"> * running as root. If the empty string is given, or if</span>
619
- <a name="l00598"></a>00598 <span class="comment"> * the &lt;tt&gt;user&lt;/tt&gt; is not a valid username, then</span>
620
- <a name="l00599"></a>00599 <span class="comment"> * the spawn manager will be run as the current user.</span>
621
- <a name="l00600"></a>00600 <span class="comment"> * @throws SystemException An error occured while trying to setup the spawn server.</span>
622
- <a name="l00601"></a>00601 <span class="comment"> * @throws IOException The specified log file could not be opened.</span>
623
- <a name="l00602"></a>00602 <span class="comment"> */</span>
624
- <a name="l00603"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#f175704fc477f37ba1d387be09fa2e6b">00603</a> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#f175704fc477f37ba1d387be09fa2e6b" title="Create a new StandardApplicationPool object.">StandardApplicationPool</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;spawnServerCommand,
625
- <a name="l00604"></a>00604 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;logFile = <span class="stringliteral">""</span>,
626
- <a name="l00605"></a>00605 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;rubyCommand = <span class="stringliteral">"ruby"</span>,
627
- <a name="l00606"></a>00606 <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;user = <span class="stringliteral">""</span>)
628
- <a name="l00607"></a>00607 :
629
- <a name="l00608"></a>00608 #ifndef PASSENGER_USE_DUMMY_SPAWN_MANAGER
630
- <a name="l00609"></a>00609 spawnManager(spawnServerCommand, logFile, rubyCommand, user),
631
- <a name="l00610"></a>00610 #endif
632
- <a name="l00611"></a>00611 data(new SharedData()),
633
- <a name="l00612"></a>00612 lock(data-&gt;lock),
634
- <a name="l00613"></a>00613 activeOrMaxChanged(data-&gt;activeOrMaxChanged),
635
- <a name="l00614"></a>00614 domains(data-&gt;domains),
636
- <a name="l00615"></a>00615 max(data-&gt;max),
637
- <a name="l00616"></a>00616 count(data-&gt;count),
638
- <a name="l00617"></a>00617 active(data-&gt;active),
639
- <a name="l00618"></a>00618 maxPerApp(data-&gt;maxPerApp),
640
- <a name="l00619"></a>00619 inactiveApps(data-&gt;inactiveApps),
641
- <a name="l00620"></a>00620 appInstanceCount(data-&gt;appInstanceCount)
642
- <a name="l00621"></a>00621 {
643
- <a name="l00622"></a>00622 TRACE_POINT();
644
- <a name="l00623"></a>00623 detached = <span class="keyword">false</span>;
645
- <a name="l00624"></a>00624 done = <span class="keyword">false</span>;
646
- <a name="l00625"></a>00625 max = DEFAULT_MAX_POOL_SIZE;
647
- <a name="l00626"></a>00626 count = 0;
648
- <a name="l00627"></a>00627 active = 0;
649
- <a name="l00628"></a>00628 waitingOnGlobalQueue = 0;
650
- <a name="l00629"></a>00629 maxPerApp = DEFAULT_MAX_INSTANCES_PER_APP;
651
- <a name="l00630"></a>00630 maxIdleTime = DEFAULT_MAX_IDLE_TIME;
652
- <a name="l00631"></a>00631 cleanerThread = <span class="keyword">new</span> boost::thread(
653
- <a name="l00632"></a>00632 bind(&amp;StandardApplicationPool::cleanerThreadMainLoop, <span class="keyword">this</span>),
654
- <a name="l00633"></a>00633 CLEANER_THREAD_STACK_SIZE
655
- <a name="l00634"></a>00634 );
656
- <a name="l00635"></a>00635 }
657
- <a name="l00636"></a>00636
658
- <a name="l00637"></a>00637 <span class="keyword">virtual</span> ~<a class="code" href="classPassenger_1_1StandardApplicationPool.html" title="A standard implementation of ApplicationPool for single-process environments.">StandardApplicationPool</a>() {
659
- <a name="l00638"></a>00638 <span class="keywordflow">if</span> (!detached) {
660
- <a name="l00639"></a>00639 this_thread::disable_interruption di;
661
- <a name="l00640"></a>00640 {
662
- <a name="l00641"></a>00641 boost::mutex::scoped_lock l(lock);
663
- <a name="l00642"></a>00642 done = <span class="keyword">true</span>;
664
- <a name="l00643"></a>00643 cleanerThreadSleeper.notify_one();
665
- <a name="l00644"></a>00644 }
666
- <a name="l00645"></a>00645 cleanerThread-&gt;join();
667
- <a name="l00646"></a>00646 }
668
- <a name="l00647"></a>00647 <span class="keyword">delete</span> cleanerThread;
669
- <a name="l00648"></a>00648 }
670
- <a name="l00649"></a>00649
671
- <a name="l00650"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#5a33f0766bbcfb2a48e08fc27bd1b684">00650</a> <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a> <span class="keyword">get</span>(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;appRoot) {
672
- <a name="l00651"></a>00651 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#5a33f0766bbcfb2a48e08fc27bd1b684" title="Convenience shortcut for calling get() with default spawn options.">ApplicationPool::get</a>(appRoot);
673
- <a name="l00652"></a>00652 }
674
- <a name="l00653"></a>00653
675
- <a name="l00654"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#ffc8f3ef8b1d925d203794d191d7fef4">00654</a> <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a> <span class="keyword">get</span>(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &amp;options) {
676
- <a name="l00655"></a>00655 TRACE_POINT();
677
- <a name="l00656"></a>00656 <span class="keyword">using namespace </span>boost::posix_time;
678
- <a name="l00657"></a>00657 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> attempt = 0;
679
- <a name="l00658"></a>00658 <span class="comment">// TODO: We should probably add a timeout to the following</span>
680
- <a name="l00659"></a>00659 <span class="comment">// lock. This way we can fail gracefully if the server's under</span>
681
- <a name="l00660"></a>00660 <span class="comment">// rediculous load. Though I'm not sure how much it really helps.</span>
682
- <a name="l00661"></a>00661 unique_lock&lt;boost::mutex&gt; l(lock);
683
- <a name="l00662"></a>00662
684
- <a name="l00663"></a>00663 <span class="keywordflow">while</span> (<span class="keyword">true</span>) {
685
- <a name="l00664"></a>00664 attempt++;
686
- <a name="l00665"></a>00665
687
- <a name="l00666"></a>00666 pair&lt;AppContainerPtr, Domain *&gt; p(
688
- <a name="l00667"></a>00667 spawnOrUseExisting(l, options)
689
- <a name="l00668"></a>00668 );
690
- <a name="l00669"></a>00669 AppContainerPtr &amp;container = p.first;
691
- <a name="l00670"></a>00670 Domain *domain = p.second;
692
- <a name="l00671"></a>00671
693
- <a name="l00672"></a>00672 container-&gt;lastUsed = time(NULL);
694
- <a name="l00673"></a>00673 container-&gt;sessions++;
695
- <a name="l00674"></a>00674
696
- <a name="l00675"></a>00675 P_ASSERT(verifyState(), <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a>(),
697
- <a name="l00676"></a>00676 <span class="stringliteral">"State is valid:\n"</span> &lt;&lt; <a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383" title="Returns a textual description of the internal state of the application pool.">toString</a>(<span class="keyword">false</span>));
698
- <a name="l00677"></a>00677 <span class="keywordflow">try</span> {
699
- <a name="l00678"></a>00678 UPDATE_TRACE_POINT();
700
- <a name="l00679"></a>00679 <span class="keywordflow">return</span> container-&gt;app-&gt;connect(SessionCloseCallback(data, container));
701
- <a name="l00680"></a>00680 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> exception &amp;e) {
702
- <a name="l00681"></a>00681 container-&gt;sessions--;
703
- <a name="l00682"></a>00682
704
- <a name="l00683"></a>00683 AppContainerList &amp;instances(domain-&gt;instances);
705
- <a name="l00684"></a>00684 instances.erase(container-&gt;iterator);
706
- <a name="l00685"></a>00685 domain-&gt;size--;
707
- <a name="l00686"></a>00686 <span class="keywordflow">if</span> (instances.empty()) {
708
- <a name="l00687"></a>00687 domains.erase(options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
709
- <a name="l00688"></a>00688 }
710
- <a name="l00689"></a>00689 count--;
711
- <a name="l00690"></a>00690 active--;
712
- <a name="l00691"></a>00691 activeOrMaxChanged.notify_all();
713
- <a name="l00692"></a>00692 P_ASSERT(verifyState(), <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a>(),
714
- <a name="l00693"></a>00693 <span class="stringliteral">"State is valid: "</span> &lt;&lt; <a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383" title="Returns a textual description of the internal state of the application pool.">toString</a>(<span class="keyword">false</span>));
715
- <a name="l00694"></a>00694 <span class="keywordflow">if</span> (attempt == MAX_GET_ATTEMPTS) {
716
- <a name="l00695"></a>00695 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot connect to an existing "</span>
717
- <a name="l00696"></a>00696 <span class="stringliteral">"application instance for '"</span>);
718
- <a name="l00697"></a>00697 message.append(options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
719
- <a name="l00698"></a>00698 message.append(<span class="stringliteral">"': "</span>);
720
- <a name="l00699"></a>00699 <span class="keywordflow">try</span> {
721
- <a name="l00700"></a>00700 <span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &amp;syse =
722
- <a name="l00701"></a>00701 <span class="keyword">dynamic_cast&lt;</span><span class="keyword">const </span><a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &amp;<span class="keyword">&gt;</span>(e);
723
- <a name="l00702"></a>00702 message.append(syse.<a class="code" href="classPassenger_1_1SystemException.html#0ef41d755fea2c9b1db2252e7c418dc8" title="Returns the system&amp;#39;s error message.">sys</a>());
724
- <a name="l00703"></a>00703 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> bad_cast &amp;) {
725
- <a name="l00704"></a>00704 message.append(e.what());
726
- <a name="l00705"></a>00705 }
727
- <a name="l00706"></a>00706 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a>(message);
728
- <a name="l00707"></a>00707 }
729
- <a name="l00708"></a>00708 }
730
- <a name="l00709"></a>00709 }
731
- <a name="l00710"></a>00710 <span class="comment">// Never reached; shut up compiler warning</span>
732
- <a name="l00711"></a>00711 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a>();
733
- <a name="l00712"></a>00712 }
734
- <a name="l00713"></a>00713
735
- <a name="l00714"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#bcf8faeb4f431ae07ea0e20270661d08">00714</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#bcf8faeb4f431ae07ea0e20270661d08" title="Clear all application instances that are currently in the pool.">clear</a>() {
736
- <a name="l00715"></a>00715 boost::mutex::scoped_lock l(lock);
737
- <a name="l00716"></a>00716 domains.clear();
738
- <a name="l00717"></a>00717 inactiveApps.clear();
739
- <a name="l00718"></a>00718 appInstanceCount.clear();
740
- <a name="l00719"></a>00719 count = 0;
741
- <a name="l00720"></a>00720 active = 0;
742
- <a name="l00721"></a>00721 activeOrMaxChanged.notify_all();
743
- <a name="l00722"></a>00722 }
744
- <a name="l00723"></a>00723
745
- <a name="l00724"></a>00724 <span class="keyword">virtual</span> <span class="keywordtype">void</span> setMaxIdleTime(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seconds) {
746
- <a name="l00725"></a>00725 boost::mutex::scoped_lock l(lock);
747
- <a name="l00726"></a>00726 maxIdleTime = seconds;
748
- <a name="l00727"></a>00727 cleanerThreadSleeper.notify_one();
749
- <a name="l00728"></a>00728 }
750
- <a name="l00729"></a>00729
751
- <a name="l00730"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#04ef8c92da189520ad2022f4f82e9553">00730</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#04ef8c92da189520ad2022f4f82e9553" title="Set a hard limit on the number of application instances that this ApplicationPool...">setMax</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> max) {
752
- <a name="l00731"></a>00731 boost::mutex::scoped_lock l(lock);
753
- <a name="l00732"></a>00732 this-&gt;max = max;
754
- <a name="l00733"></a>00733 activeOrMaxChanged.notify_all();
755
- <a name="l00734"></a>00734 }
756
- <a name="l00735"></a>00735
757
- <a name="l00736"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#7773c4a3dfbd88eac72401d063831788">00736</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#7773c4a3dfbd88eac72401d063831788" title="Get the number of active applications in the pool.">getActive</a>()<span class="keyword"> const </span>{
758
- <a name="l00737"></a>00737 <span class="keywordflow">return</span> active;
759
- <a name="l00738"></a>00738 }
760
- <a name="l00739"></a>00739
761
- <a name="l00740"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#cdbfe2b9ffacdab4438c879c2411bf02">00740</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#cdbfe2b9ffacdab4438c879c2411bf02" title="Get the number of active applications in the pool.">getCount</a>()<span class="keyword"> const </span>{
762
- <a name="l00741"></a>00741 <span class="keywordflow">return</span> count;
763
- <a name="l00742"></a>00742 }
764
- <a name="l00743"></a>00743
765
- <a name="l00744"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#3bafcda8d880f70561ad8a9da16e26ef">00744</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#3bafcda8d880f70561ad8a9da16e26ef" title="Set a hard limit on the number of application instances that a single application...">setMaxPerApp</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxPerApp) {
766
- <a name="l00745"></a>00745 boost::mutex::scoped_lock l(lock);
767
- <a name="l00746"></a>00746 this-&gt;maxPerApp = maxPerApp;
768
- <a name="l00747"></a>00747 activeOrMaxChanged.notify_all();
769
- <a name="l00748"></a>00748 }
770
- <a name="l00749"></a>00749
771
- <a name="l00750"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#6955152d237920988d20297d2fff5660">00750</a> <span class="keyword">virtual</span> pid_t <a class="code" href="classPassenger_1_1StandardApplicationPool.html#6955152d237920988d20297d2fff5660" title="Get the process ID of the spawn server that is used.">getSpawnServerPid</a>()<span class="keyword"> const </span>{
772
- <a name="l00751"></a>00751 <span class="keywordflow">return</span> spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#1f77e2e7e6cb464028c13a29f983ad8e" title="Get the Process ID of the spawn server.">getServerPid</a>();
773
- <a name="l00752"></a>00752 }
774
- <a name="l00753"></a>00753 <span class="comment"></span>
775
- <a name="l00754"></a>00754 <span class="comment"> /**</span>
776
- <a name="l00755"></a>00755 <span class="comment"> * Returns a textual description of the internal state of</span>
777
- <a name="l00756"></a>00756 <span class="comment"> * the application pool.</span>
778
- <a name="l00757"></a>00757 <span class="comment"> */</span>
779
- <a name="l00758"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383">00758</a> <span class="keyword">virtual</span> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383" title="Returns a textual description of the internal state of the application pool.">toString</a>(<span class="keywordtype">bool</span> lockMutex = <span class="keyword">true</span>)<span class="keyword"> const </span>{
780
- <a name="l00759"></a>00759 <span class="keywordflow">if</span> (lockMutex) {
781
- <a name="l00760"></a>00760 unique_lock&lt;boost::mutex&gt; l(lock);
782
- <a name="l00761"></a>00761 <span class="keywordflow">return</span> toStringWithoutLock();
783
- <a name="l00762"></a>00762 } <span class="keywordflow">else</span> {
784
- <a name="l00763"></a>00763 <span class="keywordflow">return</span> toStringWithoutLock();
785
- <a name="l00764"></a>00764 }
786
- <a name="l00765"></a>00765 }
787
- <a name="l00766"></a>00766 <span class="comment"></span>
788
- <a name="l00767"></a>00767 <span class="comment"> /**</span>
789
- <a name="l00768"></a>00768 <span class="comment"> * Returns an XML description of the internal state of the</span>
790
- <a name="l00769"></a>00769 <span class="comment"> * application pool.</span>
791
- <a name="l00770"></a>00770 <span class="comment"> */</span>
792
- <a name="l00771"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#d153c41a1d0aca91d17cf36ed6fdda19">00771</a> <span class="keyword">virtual</span> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#d153c41a1d0aca91d17cf36ed6fdda19" title="Returns an XML description of the internal state of the application pool.">toXml</a>()<span class="keyword"> const </span>{
793
- <a name="l00772"></a>00772 unique_lock&lt;boost::mutex&gt; l(lock);
794
- <a name="l00773"></a>00773 stringstream result;
795
- <a name="l00774"></a>00774 DomainMap::const_iterator it;
796
- <a name="l00775"></a>00775
797
- <a name="l00776"></a>00776 result &lt;&lt; <span class="stringliteral">"&lt;?xml version=\"1.0\" encoding=\"iso8859-1\" ?&gt;\n"</span>;
798
- <a name="l00777"></a>00777 result &lt;&lt; <span class="stringliteral">"&lt;info&gt;"</span>;
799
- <a name="l00778"></a>00778
800
- <a name="l00779"></a>00779 result &lt;&lt; <span class="stringliteral">"&lt;domains&gt;"</span>;
801
- <a name="l00780"></a>00780 <span class="keywordflow">for</span> (it = domains.begin(); it != domains.end(); it++) {
802
- <a name="l00781"></a>00781 Domain *domain = it-&gt;second.get();
803
- <a name="l00782"></a>00782 AppContainerList *instances = &amp;domain-&gt;instances;
804
- <a name="l00783"></a>00783 AppContainerList::const_iterator lit;
805
- <a name="l00784"></a>00784
806
- <a name="l00785"></a>00785 result &lt;&lt; <span class="stringliteral">"&lt;domain&gt;"</span>;
807
- <a name="l00786"></a>00786 result &lt;&lt; <span class="stringliteral">"&lt;name&gt;"</span> &lt;&lt; <a class="code" href="group__Support.html#ge74addedf73782a1eb1f6dd48d6fce06" title="Escape the given raw string into an XML value.">escapeForXml</a>(it-&gt;first) &lt;&lt; <span class="stringliteral">"&lt;/name&gt;"</span>;
808
- <a name="l00787"></a>00787
809
- <a name="l00788"></a>00788 result &lt;&lt; <span class="stringliteral">"&lt;instances&gt;"</span>;
810
- <a name="l00789"></a>00789 <span class="keywordflow">for</span> (lit = instances-&gt;begin(); lit != instances-&gt;end(); lit++) {
811
- <a name="l00790"></a>00790 AppContainer *container = lit-&gt;get();
812
- <a name="l00791"></a>00791
813
- <a name="l00792"></a>00792 result &lt;&lt; <span class="stringliteral">"&lt;instance&gt;"</span>;
814
- <a name="l00793"></a>00793 result &lt;&lt; <span class="stringliteral">"&lt;pid&gt;"</span> &lt;&lt; container-&gt;app-&gt;getPid() &lt;&lt; <span class="stringliteral">"&lt;/pid&gt;"</span>;
815
- <a name="l00794"></a>00794 result &lt;&lt; <span class="stringliteral">"&lt;sessions&gt;"</span> &lt;&lt; container-&gt;sessions &lt;&lt; <span class="stringliteral">"&lt;/sessions&gt;"</span>;
816
- <a name="l00795"></a>00795 result &lt;&lt; <span class="stringliteral">"&lt;processed&gt;"</span> &lt;&lt; container-&gt;processed &lt;&lt; <span class="stringliteral">"&lt;/processed&gt;"</span>;
817
- <a name="l00796"></a>00796 result &lt;&lt; <span class="stringliteral">"&lt;uptime&gt;"</span> &lt;&lt; container-&gt;uptime() &lt;&lt; <span class="stringliteral">"&lt;/uptime&gt;"</span>;
818
- <a name="l00797"></a>00797 result &lt;&lt; <span class="stringliteral">"&lt;/instance&gt;"</span>;
819
- <a name="l00798"></a>00798 }
820
- <a name="l00799"></a>00799 result &lt;&lt; <span class="stringliteral">"&lt;/instances&gt;"</span>;
821
- <a name="l00800"></a>00800
822
- <a name="l00801"></a>00801 result &lt;&lt; <span class="stringliteral">"&lt;/domain&gt;"</span>;
823
- <a name="l00802"></a>00802 }
824
- <a name="l00803"></a>00803 result &lt;&lt; <span class="stringliteral">"&lt;/domains&gt;"</span>;
825
- <a name="l00804"></a>00804
826
- <a name="l00805"></a>00805 result &lt;&lt; <span class="stringliteral">"&lt;/info&gt;"</span>;
827
- <a name="l00806"></a>00806 <span class="keywordflow">return</span> result.str();
828
- <a name="l00807"></a>00807 }
829
- <a name="l00808"></a>00808 };
830
- <a name="l00809"></a>00809
831
- <a name="l00810"></a>00810 <span class="keyword">typedef</span> shared_ptr&lt;StandardApplicationPool&gt; StandardApplicationPoolPtr;
832
- <a name="l00811"></a>00811
833
- <a name="l00812"></a>00812 } <span class="comment">// namespace Passenger</span>
834
- <a name="l00813"></a>00813
835
- <a name="l00814"></a>00814 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_STANDARD_APPLICATION_POOL_H_ */</span>
836
- <a name="l00815"></a>00815
837
- </pre></div></div>
838
- <hr size="1"><address style="text-align: right;"><small>Generated on Wed Apr 8 22:35:10 2009 for Passenger by&nbsp;
839
- <a href="http://www.doxygen.org/index.html">
840
- <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
841
- </body>
842
- </html>