passenger 2.2.15 → 3.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (1338) hide show
  1. data/DEVELOPERS.TXT +21 -12
  2. data/LICENSE +1 -1
  3. data/NEWS +8 -1
  4. data/PACKAGING.TXT +25 -0
  5. data/Rakefile +28 -891
  6. data/bin/passenger +32 -0
  7. data/bin/passenger-config +5 -5
  8. data/bin/passenger-install-apache2-module +37 -24
  9. data/bin/passenger-install-nginx-module +48 -46
  10. data/bin/passenger-make-enterprisey +8 -9
  11. data/bin/passenger-memory-stats +20 -150
  12. data/bin/passenger-status +130 -44
  13. data/bin/passenger-stress-test +5 -4
  14. data/build/agents.rb +73 -0
  15. data/build/apache2.rb +165 -0
  16. data/build/basics.rb +81 -0
  17. data/build/common_library.rb +198 -0
  18. data/build/config.rb +35 -0
  19. data/{misc/rake/cplusplus.rb → build/cplusplus_support.rb} +1 -1
  20. data/build/cxx_tests.rb +205 -0
  21. data/build/documentation.rb +77 -0
  22. data/{misc/rake → build}/gempackagetask.rb +1 -1
  23. data/build/integration_tests.rb +57 -0
  24. data/build/misc.rb +146 -0
  25. data/build/nginx.rb +64 -0
  26. data/build/oxt_tests.rb +52 -0
  27. data/{misc/rake → build}/packagetask.rb +0 -0
  28. data/build/packaging.rb +189 -0
  29. data/{misc/rake/extensions.rb → build/rake_extensions.rb} +1 -1
  30. data/{misc/rake → build}/rdoctask.rb +0 -0
  31. data/build/ruby_extension.rb +46 -0
  32. data/build/ruby_tests.rb +42 -0
  33. data/build/test_basics.rb +31 -0
  34. data/doc/ApplicationPool algorithm.txt +447 -234
  35. data/doc/Architectural overview.html +47 -56
  36. data/doc/Doxyfile +1 -1
  37. data/doc/Security of user switching support.html +46 -57
  38. data/doc/Users guide Apache.html +1033 -306
  39. data/doc/Users guide Apache.txt +419 -99
  40. data/doc/Users guide Nginx.html +1252 -253
  41. data/doc/Users guide Nginx.txt +711 -87
  42. data/doc/Users guide Standalone.html +603 -0
  43. data/doc/Users guide Standalone.txt +40 -0
  44. data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
  45. data/doc/cxxapi/Account_8h_source.html +206 -0
  46. data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
  47. data/doc/cxxapi/AgentBase_8h_source.html +70 -0
  48. data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
  49. data/doc/cxxapi/BCrypt_8h_source.html +104 -0
  50. data/doc/cxxapi/Blowfish_8h_source.html +134 -0
  51. data/doc/cxxapi/Bucket_8h_source.html +4 -3
  52. data/doc/cxxapi/Constants_8h_source.html +79 -0
  53. data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
  54. data/doc/cxxapi/DirectoryMapper_8h_source.html +9 -8
  55. data/doc/cxxapi/EventedClient_8h_source.html +629 -0
  56. data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
  57. data/doc/cxxapi/EventedServer_8h_source.html +326 -0
  58. data/doc/cxxapi/Exceptions_8h_source.html +366 -0
  59. data/doc/cxxapi/FileDescriptor_8h_source.html +260 -0
  60. data/doc/cxxapi/Hooks_8h_source.html +2 -1
  61. data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
  62. data/doc/cxxapi/Logging_8h_source.html +726 -0
  63. data/doc/cxxapi/MessageChannel_8h_source.html +852 -0
  64. data/doc/cxxapi/MessageClient_8h_source.html +328 -0
  65. data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
  66. data/doc/cxxapi/MessageServer_8h_source.html +606 -0
  67. data/doc/cxxapi/PoolOptions_8h_source.html +548 -0
  68. data/doc/cxxapi/Process_8h_source.html +286 -0
  69. data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
  70. data/doc/cxxapi/ResourceLocator_8h_source.html +115 -0
  71. data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
  72. data/doc/cxxapi/ServerInstanceDir_8h_source.html +374 -0
  73. data/doc/cxxapi/Session_8h_source.html +501 -0
  74. data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
  75. data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
  76. data/doc/cxxapi/StaticString_8h_source.html +254 -0
  77. data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
  78. data/doc/cxxapi/Utils_8h_source.html +442 -0
  79. data/doc/cxxapi/annotated.html +46 -0
  80. data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
  81. data/doc/cxxapi/classAgentWatcher-members.html +30 -26
  82. data/doc/cxxapi/classAgentWatcher.html +168 -194
  83. data/doc/cxxapi/classClient-members.html +14 -11
  84. data/doc/cxxapi/classClient.html +35 -35
  85. data/doc/cxxapi/classHooks-members.html +2 -0
  86. data/doc/cxxapi/classHooks.html +2 -0
  87. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +16 -13
  88. data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +78 -82
  89. data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +12 -9
  90. data/doc/cxxapi/classPassenger_1_1ArgumentException.html +26 -22
  91. data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
  92. data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
  93. data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +14 -11
  94. data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +41 -42
  95. data/doc/cxxapi/classPassenger_1_1BusyException-members.html +12 -9
  96. data/doc/cxxapi/classPassenger_1_1BusyException.html +24 -20
  97. data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +12 -9
  98. data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +23 -19
  99. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +2 -0
  100. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +8 -6
  101. data/doc/cxxapi/classPassenger_1_1EOFException-members.html +12 -9
  102. data/doc/cxxapi/classPassenger_1_1EOFException.html +27 -23
  103. data/doc/cxxapi/classPassenger_1_1EventFd-members.html +12 -9
  104. data/doc/cxxapi/classPassenger_1_1EventFd.html +24 -21
  105. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +54 -0
  106. data/doc/cxxapi/classPassenger_1_1EventedClient.html +436 -0
  107. data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
  108. data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
  109. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
  110. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
  111. data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
  112. data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
  113. data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
  114. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
  115. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
  116. data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
  117. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +16 -13
  118. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +63 -70
  119. data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +12 -9
  120. data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +26 -22
  121. data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +17 -14
  122. data/doc/cxxapi/classPassenger_1_1FileSystemException.html +32 -30
  123. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +15 -12
  124. data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +59 -59
  125. data/doc/cxxapi/classPassenger_1_1IOException-members.html +12 -9
  126. data/doc/cxxapi/classPassenger_1_1IOException.html +27 -23
  127. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +36 -33
  128. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +326 -344
  129. data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +25 -22
  130. data/doc/cxxapi/classPassenger_1_1MessageServer.html +160 -191
  131. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +12 -9
  132. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +29 -27
  133. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -1
  134. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -1
  135. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
  136. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +17 -14
  137. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +69 -79
  138. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -1
  139. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -1
  140. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
  141. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +15 -12
  142. data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +60 -63
  143. data/doc/cxxapi/classPassenger_1_1Process-members.html +20 -17
  144. data/doc/cxxapi/classPassenger_1_1Process.html +88 -95
  145. data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +13 -10
  146. data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +36 -35
  147. data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +12 -9
  148. data/doc/cxxapi/classPassenger_1_1RuntimeException.html +24 -20
  149. data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
  150. data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
  151. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +26 -23
  152. data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +121 -138
  153. data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +12 -9
  154. data/doc/cxxapi/classPassenger_1_1SecurityException.html +26 -22
  155. data/doc/cxxapi/classPassenger_1_1Session-members.html +29 -26
  156. data/doc/cxxapi/classPassenger_1_1Session.html +219 -240
  157. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +14 -11
  158. data/doc/cxxapi/classPassenger_1_1SpawnException.html +36 -37
  159. data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +18 -15
  160. data/doc/cxxapi/classPassenger_1_1SpawnManager.html +115 -110
  161. data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +30 -27
  162. data/doc/cxxapi/classPassenger_1_1StandardSession.html +163 -184
  163. data/doc/cxxapi/classPassenger_1_1StaticString-members.html +12 -9
  164. data/doc/cxxapi/classPassenger_1_1StaticString.html +27 -25
  165. data/doc/cxxapi/classPassenger_1_1SystemException-members.html +16 -13
  166. data/doc/cxxapi/classPassenger_1_1SystemException.html +65 -67
  167. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +16 -13
  168. data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +27 -23
  169. data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +12 -9
  170. data/doc/cxxapi/classPassenger_1_1TimeoutException.html +24 -20
  171. data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +36 -0
  172. data/doc/cxxapi/classPassenger_1_1Uint16Message.html +51 -0
  173. data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +36 -0
  174. data/doc/cxxapi/classPassenger_1_1Uint32Message.html +51 -0
  175. data/doc/cxxapi/classServer-members.html +12 -9
  176. data/doc/cxxapi/classServer.html +23 -20
  177. data/doc/cxxapi/classServerInstanceDirToucher-members.html +12 -9
  178. data/doc/cxxapi/classServerInstanceDirToucher.html +21 -17
  179. data/doc/cxxapi/classes.html +18 -4
  180. data/doc/cxxapi/definitions_8h_source.html +1 -0
  181. data/doc/cxxapi/files.html +36 -1
  182. data/doc/cxxapi/functions.html +53 -21
  183. data/doc/cxxapi/functions_0x62.html +82 -0
  184. data/doc/cxxapi/functions_0x63.html +99 -0
  185. data/doc/cxxapi/functions_0x64.html +95 -0
  186. data/doc/cxxapi/functions_0x65.html +88 -0
  187. data/doc/cxxapi/functions_0x66.html +100 -0
  188. data/doc/cxxapi/functions_0x67.html +170 -0
  189. data/doc/cxxapi/functions_0x68.html +88 -0
  190. data/doc/cxxapi/functions_0x69.html +93 -0
  191. data/doc/cxxapi/functions_0x6b.html +80 -0
  192. data/doc/cxxapi/functions_0x6c.html +88 -0
  193. data/doc/cxxapi/functions_0x6d.html +88 -0
  194. data/doc/cxxapi/functions_0x6e.html +86 -0
  195. data/doc/cxxapi/functions_0x6f.html +94 -0
  196. data/doc/cxxapi/functions_0x70.html +94 -0
  197. data/doc/cxxapi/functions_0x72.html +110 -0
  198. data/doc/cxxapi/functions_0x73.html +171 -0
  199. data/doc/cxxapi/functions_0x74.html +85 -0
  200. data/doc/cxxapi/functions_0x75.html +85 -0
  201. data/doc/cxxapi/functions_0x77.html +92 -0
  202. data/doc/cxxapi/functions_0x7e.html +79 -0
  203. data/doc/cxxapi/functions_enum.html +14 -12
  204. data/doc/cxxapi/functions_eval.html +22 -16
  205. data/doc/cxxapi/functions_func.html +460 -1
  206. data/doc/cxxapi/functions_vars.html +163 -63
  207. data/doc/cxxapi/graph_legend.html +1 -0
  208. data/doc/cxxapi/graph_legend.png +0 -0
  209. data/doc/cxxapi/group__Core.html +2 -2
  210. data/doc/cxxapi/group__Core.map +1 -2
  211. data/doc/cxxapi/group__Core.png +0 -0
  212. data/doc/cxxapi/group__Exceptions.html +32 -40
  213. data/doc/cxxapi/group__Hooks.html +2 -1
  214. data/doc/cxxapi/group__Hooks.map +1 -1
  215. data/doc/cxxapi/group__Hooks.png +0 -0
  216. data/doc/cxxapi/group__Support.html +509 -0
  217. data/doc/cxxapi/hierarchy.html +66 -62
  218. data/doc/cxxapi/inherit__graph__10.map +3 -1
  219. data/doc/cxxapi/inherit__graph__10.md5 +1 -1
  220. data/doc/cxxapi/inherit__graph__10.png +0 -0
  221. data/doc/cxxapi/inherit__graph__11.map +4 -1
  222. data/doc/cxxapi/inherit__graph__11.md5 +1 -1
  223. data/doc/cxxapi/inherit__graph__11.png +0 -0
  224. data/doc/cxxapi/inherit__graph__12.map +3 -1
  225. data/doc/cxxapi/inherit__graph__12.md5 +1 -1
  226. data/doc/cxxapi/inherit__graph__12.png +0 -0
  227. data/doc/cxxapi/inherit__graph__13.map +3 -1
  228. data/doc/cxxapi/inherit__graph__13.md5 +1 -1
  229. data/doc/cxxapi/inherit__graph__13.png +0 -0
  230. data/doc/cxxapi/inherit__graph__14.map +3 -1
  231. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  232. data/doc/cxxapi/inherit__graph__14.png +0 -0
  233. data/doc/cxxapi/inherit__graph__15.map +5 -1
  234. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  235. data/doc/cxxapi/inherit__graph__15.png +0 -0
  236. data/doc/cxxapi/inherit__graph__16.map +3 -3
  237. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  238. data/doc/cxxapi/inherit__graph__16.png +0 -0
  239. data/doc/cxxapi/inherit__graph__17.map +3 -1
  240. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  241. data/doc/cxxapi/inherit__graph__17.png +0 -0
  242. data/doc/cxxapi/inherit__graph__18.map +4 -1
  243. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  244. data/doc/cxxapi/inherit__graph__18.png +0 -0
  245. data/doc/cxxapi/inherit__graph__19.map +3 -1
  246. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  247. data/doc/cxxapi/inherit__graph__19.png +0 -0
  248. data/doc/cxxapi/inherit__graph__20.map +3 -2
  249. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  250. data/doc/cxxapi/inherit__graph__20.png +0 -0
  251. data/doc/cxxapi/inherit__graph__21.map +3 -1
  252. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  253. data/doc/cxxapi/inherit__graph__21.png +0 -0
  254. data/doc/cxxapi/inherit__graph__22.map +3 -1
  255. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  256. data/doc/cxxapi/inherit__graph__22.png +0 -0
  257. data/doc/cxxapi/inherit__graph__23.map +3 -1
  258. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  259. data/doc/cxxapi/inherit__graph__23.png +0 -0
  260. data/doc/cxxapi/inherit__graph__24.map +3 -1
  261. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  262. data/doc/cxxapi/inherit__graph__24.png +0 -0
  263. data/doc/cxxapi/inherit__graph__25.map +3 -1
  264. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  265. data/doc/cxxapi/inherit__graph__25.png +0 -0
  266. data/doc/cxxapi/inherit__graph__26.map +3 -1
  267. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  268. data/doc/cxxapi/inherit__graph__26.png +0 -0
  269. data/doc/cxxapi/inherit__graph__27.map +3 -1
  270. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  271. data/doc/cxxapi/inherit__graph__27.png +0 -0
  272. data/doc/cxxapi/inherit__graph__28.map +4 -1
  273. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  274. data/doc/cxxapi/inherit__graph__28.png +0 -0
  275. data/doc/cxxapi/inherit__graph__29.map +3 -1
  276. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  277. data/doc/cxxapi/inherit__graph__29.png +0 -0
  278. data/doc/cxxapi/inherit__graph__30.map +3 -2
  279. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  280. data/doc/cxxapi/inherit__graph__30.png +0 -0
  281. data/doc/cxxapi/inherit__graph__31.map +3 -1
  282. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  283. data/doc/cxxapi/inherit__graph__31.png +0 -0
  284. data/doc/cxxapi/inherit__graph__32.map +5 -1
  285. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  286. data/doc/cxxapi/inherit__graph__32.png +0 -0
  287. data/doc/cxxapi/inherit__graph__33.map +3 -1
  288. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  289. data/doc/cxxapi/inherit__graph__33.png +0 -0
  290. data/doc/cxxapi/inherit__graph__34.map +3 -3
  291. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  292. data/doc/cxxapi/inherit__graph__34.png +0 -0
  293. data/doc/cxxapi/inherit__graph__35.map +3 -1
  294. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  295. data/doc/cxxapi/inherit__graph__35.png +0 -0
  296. data/doc/cxxapi/inherit__graph__36.map +3 -1
  297. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  298. data/doc/cxxapi/inherit__graph__36.png +0 -0
  299. data/doc/cxxapi/inherit__graph__37.map +3 -1
  300. data/doc/cxxapi/inherit__graph__37.md5 +1 -1
  301. data/doc/cxxapi/inherit__graph__37.png +0 -0
  302. data/doc/cxxapi/inherit__graph__4.map +3 -1
  303. data/doc/cxxapi/inherit__graph__4.md5 +1 -1
  304. data/doc/cxxapi/inherit__graph__4.png +0 -0
  305. data/doc/cxxapi/inherit__graph__5.map +3 -1
  306. data/doc/cxxapi/inherit__graph__5.md5 +1 -1
  307. data/doc/cxxapi/inherit__graph__5.png +0 -0
  308. data/doc/cxxapi/inherit__graph__6.map +3 -1
  309. data/doc/cxxapi/inherit__graph__6.md5 +1 -1
  310. data/doc/cxxapi/inherit__graph__6.png +0 -0
  311. data/doc/cxxapi/inherit__graph__7.map +3 -1
  312. data/doc/cxxapi/inherit__graph__7.md5 +1 -1
  313. data/doc/cxxapi/inherit__graph__7.png +0 -0
  314. data/doc/cxxapi/inherit__graph__8.map +3 -1
  315. data/doc/cxxapi/inherit__graph__8.md5 +1 -1
  316. data/doc/cxxapi/inherit__graph__8.png +0 -0
  317. data/doc/cxxapi/inherit__graph__9.map +3 -1
  318. data/doc/cxxapi/inherit__graph__9.md5 +1 -1
  319. data/doc/cxxapi/inherit__graph__9.png +0 -0
  320. data/doc/cxxapi/inherits.html +123 -126
  321. data/doc/cxxapi/main.html +1 -0
  322. data/doc/cxxapi/modules.html +2 -1
  323. data/doc/cxxapi/namespacePassenger.html +263 -492
  324. data/doc/cxxapi/namespacemembers.html +68 -96
  325. data/doc/cxxapi/namespacemembers_enum.html +14 -12
  326. data/doc/cxxapi/namespacemembers_eval.html +20 -15
  327. data/doc/cxxapi/namespacemembers_func.html +52 -88
  328. data/doc/cxxapi/namespacemembers_type.html +18 -14
  329. data/doc/cxxapi/namespaces.html +12 -9
  330. data/doc/cxxapi/nginx_2Configuration_8h_source.html +125 -0
  331. data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
  332. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +12 -9
  333. data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +24 -22
  334. data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +43 -38
  335. data/doc/cxxapi/structPassenger_1_1PoolOptions.html +275 -325
  336. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +12 -9
  337. data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +24 -22
  338. data/doc/cxxapi/tree.html +152 -7
  339. data/doc/users_guide_snippets/{analysis_and_system_maintenance_tools.txt → analysis_and_system_maintenance.txt} +58 -1
  340. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +1 -2
  341. data/doc/users_guide_snippets/global_queueing_explained.txt +1 -5
  342. data/doc/users_guide_snippets/{rails_spawn_method.txt → passenger_spawn_method.txt} +9 -8
  343. data/doc/users_guide_snippets/tips.txt +12 -6
  344. data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
  345. data/ext/apache2/Bucket.cpp +4 -4
  346. data/ext/apache2/Bucket.h +3 -3
  347. data/ext/apache2/Configuration.cpp +278 -381
  348. data/ext/apache2/Configuration.h +3 -357
  349. data/ext/apache2/Configuration.hpp +461 -0
  350. data/ext/apache2/DirectoryMapper.h +3 -3
  351. data/ext/apache2/HelperAgent.cpp +359 -0
  352. data/ext/apache2/Hooks.cpp +339 -226
  353. data/ext/apache2/Hooks.h +1 -1
  354. data/ext/apache2/mod_passenger.c +10 -4
  355. data/ext/boost/algorithm/string/case_conv.hpp +4 -4
  356. data/ext/boost/algorithm/string/concept.hpp +2 -2
  357. data/ext/boost/algorithm/string/detail/case_conv.hpp +18 -9
  358. data/ext/boost/algorithm/string/detail/find_format.hpp +44 -43
  359. data/ext/boost/algorithm/string/detail/find_format_all.hpp +56 -56
  360. data/ext/boost/algorithm/string/detail/find_format_store.hpp +7 -0
  361. data/ext/boost/algorithm/string/detail/finder.hpp +14 -14
  362. data/ext/boost/algorithm/string/detail/formatter.hpp +2 -2
  363. data/ext/boost/algorithm/string/detail/replace_storage.hpp +3 -3
  364. data/ext/boost/algorithm/string/detail/sequence.hpp +3 -3
  365. data/ext/boost/algorithm/string/erase.hpp +98 -98
  366. data/ext/boost/algorithm/string/find_format.hpp +56 -38
  367. data/ext/boost/algorithm/string/finder.hpp +6 -6
  368. data/ext/boost/algorithm/string/formatter.hpp +1 -1
  369. data/ext/boost/algorithm/string/replace.hpp +99 -99
  370. data/ext/boost/bind.hpp +5 -1670
  371. data/ext/boost/bind/bind.hpp +1751 -0
  372. data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
  373. data/ext/boost/bind/mem_fn.hpp +389 -0
  374. data/ext/boost/bind/mem_fn_template.hpp +54 -27
  375. data/ext/boost/bind/placeholders.hpp +3 -2
  376. data/ext/boost/concept_check.hpp +10 -0
  377. data/ext/boost/config/abi/msvc_prefix.hpp +15 -1
  378. data/ext/boost/config/abi_prefix.hpp +1 -1
  379. data/ext/boost/config/abi_suffix.hpp +3 -2
  380. data/ext/boost/config/auto_link.hpp +6 -1
  381. data/ext/boost/config/compiler/borland.hpp +75 -17
  382. data/ext/boost/config/compiler/codegear.hpp +163 -0
  383. data/ext/boost/config/compiler/common_edg.hpp +35 -0
  384. data/ext/boost/config/compiler/digitalmars.hpp +26 -0
  385. data/ext/boost/config/compiler/gcc.hpp +69 -14
  386. data/ext/boost/config/compiler/hp_acc.hpp +32 -0
  387. data/ext/boost/config/compiler/intel.hpp +13 -2
  388. data/ext/boost/config/compiler/kai.hpp +0 -2
  389. data/ext/boost/config/compiler/metrowerks.hpp +29 -1
  390. data/ext/boost/config/compiler/mpw.hpp +30 -0
  391. data/ext/boost/config/compiler/pgi.hpp +37 -0
  392. data/ext/boost/config/compiler/sgi_mipspro.hpp +1 -0
  393. data/ext/boost/config/compiler/sunpro_cc.hpp +39 -7
  394. data/ext/boost/config/compiler/vacpp.hpp +31 -3
  395. data/ext/boost/config/compiler/visualc.hpp +72 -5
  396. data/ext/boost/config/no_tr1/cmath.hpp +28 -0
  397. data/ext/boost/config/platform/bsd.hpp +16 -3
  398. data/ext/boost/config/platform/hpux.hpp +3 -0
  399. data/ext/boost/config/platform/macos.hpp +8 -0
  400. data/ext/boost/config/platform/solaris.hpp +7 -0
  401. data/ext/boost/config/platform/vxworks.hpp +31 -0
  402. data/ext/boost/config/select_compiler_config.hpp +4 -0
  403. data/ext/boost/config/select_platform_config.hpp +6 -2
  404. data/ext/boost/config/select_stdlib_config.hpp +17 -8
  405. data/ext/boost/config/stdlib/dinkumware.hpp +34 -2
  406. data/ext/boost/config/stdlib/libcomo.hpp +25 -0
  407. data/ext/boost/config/stdlib/libstdcpp3.hpp +56 -2
  408. data/ext/boost/config/stdlib/modena.hpp +25 -0
  409. data/ext/boost/config/stdlib/msl.hpp +24 -0
  410. data/ext/boost/config/stdlib/roguewave.hpp +26 -0
  411. data/ext/boost/config/stdlib/sgi.hpp +25 -0
  412. data/ext/boost/config/stdlib/stlport.hpp +36 -1
  413. data/ext/boost/config/stdlib/vacpp.hpp +25 -0
  414. data/ext/boost/config/suffix.hpp +67 -32
  415. data/ext/boost/config/warning_disable.hpp +47 -0
  416. data/ext/boost/cstdint.hpp +62 -36
  417. data/ext/boost/date_time/c_time.hpp +28 -12
  418. data/ext/boost/date_time/compiler_config.hpp +27 -5
  419. data/ext/boost/date_time/constrained_value.hpp +36 -13
  420. data/ext/boost/date_time/date.hpp +44 -33
  421. data/ext/boost/date_time/date_duration.hpp +13 -14
  422. data/ext/boost/date_time/date_facet.hpp +215 -226
  423. data/ext/boost/date_time/date_generator_formatter.hpp +22 -20
  424. data/ext/boost/date_time/date_generator_parser.hpp +52 -51
  425. data/ext/boost/date_time/date_generators.hpp +16 -16
  426. data/ext/boost/date_time/date_parsing.hpp +115 -98
  427. data/ext/boost/date_time/filetime_functions.hpp +133 -41
  428. data/ext/boost/date_time/format_date_parser.hpp +22 -10
  429. data/ext/boost/date_time/gregorian/conversion.hpp +32 -39
  430. data/ext/boost/date_time/gregorian/greg_calendar.hpp +15 -14
  431. data/ext/boost/date_time/gregorian/greg_date.hpp +19 -18
  432. data/ext/boost/date_time/gregorian/greg_duration.hpp +106 -10
  433. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +16 -7
  434. data/ext/boost/date_time/gregorian/greg_weekday.hpp +2 -2
  435. data/ext/boost/date_time/gregorian/gregorian_io.hpp +11 -4
  436. data/ext/boost/date_time/gregorian_calendar.hpp +8 -8
  437. data/ext/boost/date_time/gregorian_calendar.ipp +30 -30
  438. data/ext/boost/date_time/int_adapter.hpp +4 -2
  439. data/ext/boost/date_time/microsec_time_clock.hpp +39 -117
  440. data/ext/boost/date_time/period_parser.hpp +17 -15
  441. data/ext/boost/date_time/posix_time/conversion.hpp +28 -29
  442. data/ext/boost/date_time/posix_time/posix_time_config.hpp +19 -19
  443. data/ext/boost/date_time/posix_time/posix_time_io.hpp +31 -38
  444. data/ext/boost/date_time/posix_time/time_formatters.hpp +32 -32
  445. data/ext/boost/date_time/string_parse_tree.hpp +46 -46
  446. data/ext/boost/date_time/strings_from_facet.hpp +7 -5
  447. data/ext/boost/date_time/time.hpp +7 -6
  448. data/ext/boost/date_time/time_defs.hpp +12 -2
  449. data/ext/boost/date_time/time_duration.hpp +27 -26
  450. data/ext/boost/date_time/time_facet.hpp +386 -321
  451. data/ext/boost/date_time/time_formatting_streams.hpp +8 -5
  452. data/ext/boost/date_time/time_resolution_traits.hpp +29 -25
  453. data/ext/boost/date_time/time_system_split.hpp +7 -13
  454. data/ext/boost/date_time/wrapping_int.hpp +21 -15
  455. data/ext/boost/detail/call_traits.hpp +1 -1
  456. data/ext/boost/detail/endian.hpp +4 -4
  457. data/ext/boost/detail/no_exceptions_support.hpp +87 -0
  458. data/ext/boost/detail/sp_typeinfo.hpp +50 -4
  459. data/ext/boost/detail/workaround.hpp +63 -3
  460. data/ext/boost/enable_shared_from_this.hpp +4 -59
  461. data/ext/boost/exception/current_exception_cast.hpp +43 -0
  462. data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
  463. data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
  464. data/ext/boost/exception/detail/exception_ptr.hpp +490 -0
  465. data/ext/boost/exception/detail/is_output_streamable.hpp +47 -0
  466. data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
  467. data/ext/boost/exception/detail/type_info.hpp +79 -0
  468. data/ext/boost/exception/diagnostic_information.hpp +182 -0
  469. data/ext/boost/exception/exception.hpp +422 -0
  470. data/ext/boost/exception/get_error_info.hpp +130 -0
  471. data/ext/boost/exception/info.hpp +167 -0
  472. data/ext/boost/exception/to_string.hpp +83 -0
  473. data/ext/boost/exception/to_string_stub.hpp +109 -0
  474. data/ext/boost/exception_ptr.hpp +11 -0
  475. data/ext/boost/function/detail/prologue.hpp +2 -1
  476. data/ext/boost/function/function_base.hpp +270 -128
  477. data/ext/boost/function/function_fwd.hpp +70 -0
  478. data/ext/boost/function/function_template.hpp +319 -130
  479. data/ext/boost/get_pointer.hpp +5 -1
  480. data/ext/boost/integer.hpp +253 -0
  481. data/ext/boost/integer_fwd.hpp +174 -0
  482. data/ext/boost/integer_traits.hpp +26 -1
  483. data/ext/boost/io/ios_state.hpp +8 -0
  484. data/ext/boost/iterator/detail/config_def.hpp +4 -2
  485. data/ext/boost/iterator/iterator_adaptor.hpp +7 -2
  486. data/ext/boost/iterator/iterator_facade.hpp +1 -2
  487. data/ext/boost/lexical_cast.hpp +113 -105
  488. data/ext/boost/limits.hpp +1 -1
  489. data/ext/boost/mem_fn.hpp +5 -370
  490. data/ext/boost/memory_order.hpp +53 -0
  491. data/ext/boost/mpl/always.hpp +3 -3
  492. data/ext/boost/mpl/and.hpp +3 -3
  493. data/ext/boost/mpl/apply.hpp +3 -3
  494. data/ext/boost/mpl/apply_fwd.hpp +3 -3
  495. data/ext/boost/mpl/apply_wrap.hpp +37 -6
  496. data/ext/boost/mpl/arg.hpp +3 -3
  497. data/ext/boost/mpl/arg_fwd.hpp +3 -3
  498. data/ext/boost/mpl/assert.hpp +6 -6
  499. data/ext/boost/mpl/aux_/adl_barrier.hpp +3 -3
  500. data/ext/boost/mpl/aux_/arg_typedef.hpp +3 -3
  501. data/ext/boost/mpl/aux_/arity.hpp +3 -3
  502. data/ext/boost/mpl/aux_/arity_spec.hpp +3 -3
  503. data/ext/boost/mpl/aux_/common_name_wknd.hpp +3 -3
  504. data/ext/boost/mpl/aux_/config/adl.hpp +4 -4
  505. data/ext/boost/mpl/aux_/config/arrays.hpp +4 -4
  506. data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
  507. data/ext/boost/mpl/aux_/config/bind.hpp +4 -4
  508. data/ext/boost/mpl/aux_/config/compiler.hpp +8 -6
  509. data/ext/boost/mpl/aux_/config/ctps.hpp +3 -3
  510. data/ext/boost/mpl/aux_/config/dtp.hpp +5 -5
  511. data/ext/boost/mpl/aux_/config/eti.hpp +3 -3
  512. data/ext/boost/mpl/aux_/config/gcc.hpp +3 -3
  513. data/ext/boost/mpl/aux_/config/has_apply.hpp +3 -3
  514. data/ext/boost/mpl/aux_/config/has_xxx.hpp +3 -3
  515. data/ext/boost/mpl/aux_/config/integral.hpp +4 -4
  516. data/ext/boost/mpl/aux_/config/intel.hpp +3 -3
  517. data/ext/boost/mpl/aux_/config/lambda.hpp +3 -3
  518. data/ext/boost/mpl/aux_/config/msvc.hpp +3 -3
  519. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +3 -3
  520. data/ext/boost/mpl/aux_/config/nttp.hpp +3 -3
  521. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +3 -3
  522. data/ext/boost/mpl/aux_/config/pp_counter.hpp +3 -3
  523. data/ext/boost/mpl/aux_/config/preprocessor.hpp +4 -4
  524. data/ext/boost/mpl/aux_/config/static_constant.hpp +3 -3
  525. data/ext/boost/mpl/aux_/config/ttp.hpp +4 -4
  526. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +3 -3
  527. data/ext/boost/mpl/aux_/config/workaround.hpp +3 -3
  528. data/ext/boost/mpl/aux_/full_lambda.hpp +3 -3
  529. data/ext/boost/mpl/aux_/has_apply.hpp +3 -3
  530. data/ext/boost/mpl/aux_/has_type.hpp +3 -3
  531. data/ext/boost/mpl/aux_/include_preprocessed.hpp +3 -3
  532. data/ext/boost/mpl/aux_/integral_wrapper.hpp +3 -3
  533. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +3 -3
  534. data/ext/boost/mpl/aux_/lambda_support.hpp +4 -4
  535. data/ext/boost/mpl/aux_/msvc_never_true.hpp +3 -3
  536. data/ext/boost/mpl/aux_/na.hpp +3 -3
  537. data/ext/boost/mpl/aux_/na_assert.hpp +3 -3
  538. data/ext/boost/mpl/aux_/na_fwd.hpp +3 -3
  539. data/ext/boost/mpl/aux_/na_spec.hpp +3 -3
  540. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +3 -3
  541. data/ext/boost/mpl/aux_/nttp_decl.hpp +3 -3
  542. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +3 -3
  543. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +3 -3
  544. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +3 -3
  545. data/ext/boost/mpl/aux_/preprocessor/params.hpp +3 -3
  546. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +3 -3
  547. data/ext/boost/mpl/aux_/static_cast.hpp +3 -3
  548. data/ext/boost/mpl/aux_/template_arity.hpp +3 -3
  549. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +3 -3
  550. data/ext/boost/mpl/aux_/type_wrapper.hpp +3 -3
  551. data/ext/boost/mpl/aux_/value_wknd.hpp +3 -3
  552. data/ext/boost/mpl/aux_/yes_no.hpp +3 -3
  553. data/ext/boost/mpl/bind.hpp +3 -3
  554. data/ext/boost/mpl/bind_fwd.hpp +3 -3
  555. data/ext/boost/mpl/bool.hpp +3 -3
  556. data/ext/boost/mpl/bool_fwd.hpp +3 -3
  557. data/ext/boost/mpl/eval_if.hpp +3 -3
  558. data/ext/boost/mpl/has_xxx.hpp +10 -8
  559. data/ext/boost/mpl/identity.hpp +3 -3
  560. data/ext/boost/mpl/if.hpp +3 -3
  561. data/ext/boost/mpl/int.hpp +3 -3
  562. data/ext/boost/mpl/int_fwd.hpp +3 -3
  563. data/ext/boost/mpl/integral_c.hpp +3 -3
  564. data/ext/boost/mpl/integral_c_fwd.hpp +3 -3
  565. data/ext/boost/mpl/integral_c_tag.hpp +3 -3
  566. data/ext/boost/mpl/lambda.hpp +3 -3
  567. data/ext/boost/mpl/lambda_fwd.hpp +3 -3
  568. data/ext/boost/mpl/limits/arity.hpp +3 -3
  569. data/ext/boost/mpl/logical.hpp +3 -3
  570. data/ext/boost/mpl/next.hpp +3 -3
  571. data/ext/boost/mpl/next_prior.hpp +3 -3
  572. data/ext/boost/mpl/not.hpp +3 -3
  573. data/ext/boost/mpl/or.hpp +3 -3
  574. data/ext/boost/mpl/placeholders.hpp +3 -3
  575. data/ext/boost/mpl/protect.hpp +3 -3
  576. data/ext/boost/mpl/quote.hpp +18 -7
  577. data/ext/boost/mpl/size_t.hpp +3 -3
  578. data/ext/boost/mpl/size_t_fwd.hpp +3 -3
  579. data/ext/boost/mpl/void.hpp +3 -3
  580. data/ext/boost/mpl/void_fwd.hpp +3 -3
  581. data/ext/boost/non_type.hpp +27 -27
  582. data/ext/boost/operators.hpp +51 -18
  583. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  584. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  585. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  586. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  587. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  588. data/ext/boost/preprocessor/seq/cat.hpp +48 -0
  589. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  590. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  591. data/ext/boost/range/as_literal.hpp +10 -14
  592. data/ext/boost/range/begin.hpp +4 -4
  593. data/ext/boost/range/detail/implementation_help.hpp +4 -0
  594. data/ext/boost/range/end.hpp +4 -4
  595. data/ext/boost/range/iterator_range.hpp +31 -15
  596. data/ext/boost/ref.hpp +12 -1
  597. data/ext/boost/scoped_array.hpp +16 -0
  598. data/ext/boost/scoped_ptr.hpp +16 -0
  599. data/ext/boost/shared_ptr.hpp +2 -602
  600. data/ext/boost/{detail → smart_ptr}/bad_weak_ptr.hpp +4 -4
  601. data/ext/boost/{detail → smart_ptr/detail}/atomic_count.hpp +14 -19
  602. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc.hpp +13 -9
  603. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc_x86.hpp +5 -12
  604. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_pthreads.hpp +5 -5
  605. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_solaris.hpp +3 -3
  606. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_sync.hpp +9 -5
  607. data/ext/boost/{detail → smart_ptr/detail}/atomic_count_win32.hpp +3 -3
  608. data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
  609. data/ext/boost/{detail → smart_ptr/detail}/shared_count.hpp +86 -17
  610. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
  611. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
  612. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_acc_ia64.hpp +4 -4
  613. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_ppc.hpp +4 -4
  614. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_x86.hpp +4 -4
  615. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ia64.hpp +4 -4
  616. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
  617. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ppc.hpp +4 -4
  618. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_sparc.hpp +7 -7
  619. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_x86.hpp +4 -4
  620. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_nt.hpp +4 -4
  621. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_pt.hpp +4 -4
  622. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_solaris.hpp +4 -4
  623. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
  624. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_sync.hpp +8 -4
  625. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_w32.hpp +4 -4
  626. data/ext/boost/{detail → smart_ptr/detail}/sp_counted_impl.hpp +5 -5
  627. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
  628. data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
  629. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
  630. data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
  631. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
  632. data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
  633. data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
  634. data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
  635. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
  636. data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
  637. data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
  638. data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
  639. data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
  640. data/ext/boost/src/pthread/thread.cpp +115 -203
  641. data/ext/boost/src/tss_null.cpp +1 -1
  642. data/ext/boost/static_assert.hpp +14 -4
  643. data/ext/boost/thread.hpp +7 -2
  644. data/ext/boost/thread/barrier.hpp +63 -0
  645. data/ext/boost/thread/detail/force_cast.hpp +39 -0
  646. data/ext/boost/thread/detail/move.hpp +29 -2
  647. data/ext/boost/thread/detail/platform.hpp +3 -3
  648. data/ext/boost/thread/detail/singleton.hpp +59 -0
  649. data/ext/boost/thread/detail/thread.hpp +496 -0
  650. data/ext/boost/thread/detail/thread_group.hpp +105 -0
  651. data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
  652. data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
  653. data/ext/boost/thread/detail/tss_hooks.hpp +82 -0
  654. data/ext/boost/thread/exceptions.hpp +174 -60
  655. data/ext/boost/thread/future.hpp +1364 -0
  656. data/ext/boost/thread/locks.hpp +899 -32
  657. data/ext/boost/thread/once.hpp +4 -0
  658. data/ext/boost/thread/pthread/condition_variable.hpp +16 -21
  659. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +37 -3
  660. data/ext/boost/thread/pthread/mutex.hpp +20 -7
  661. data/ext/boost/thread/pthread/once.hpp +7 -2
  662. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +5 -1
  663. data/ext/boost/thread/pthread/recursive_mutex.hpp +22 -5
  664. data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
  665. data/ext/boost/thread/pthread/thread_data.hpp +37 -10
  666. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
  667. data/ext/boost/thread/pthread/timespec.hpp +11 -3
  668. data/ext/boost/thread/shared_mutex.hpp +21 -0
  669. data/ext/boost/thread/thread.hpp +8 -3
  670. data/ext/boost/thread/thread_time.hpp +4 -0
  671. data/ext/boost/thread/tss.hpp +106 -13
  672. data/ext/boost/thread/xtime.hpp +6 -2
  673. data/ext/boost/throw_exception.hpp +36 -7
  674. data/ext/boost/token_functions.hpp +1 -1
  675. data/ext/boost/tokenizer.hpp +1 -1
  676. data/ext/boost/type_traits/add_pointer.hpp +1 -1
  677. data/ext/boost/type_traits/add_volatile.hpp +47 -0
  678. data/ext/boost/type_traits/alignment_of.hpp +29 -1
  679. data/ext/boost/type_traits/config.hpp +1 -1
  680. data/ext/boost/type_traits/conversion_traits.hpp +1 -1
  681. data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
  682. data/ext/boost/type_traits/intrinsics.hpp +88 -1
  683. data/ext/boost/type_traits/is_abstract.hpp +14 -5
  684. data/ext/boost/type_traits/is_arithmetic.hpp +8 -0
  685. data/ext/boost/type_traits/is_array.hpp +3 -2
  686. data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
  687. data/ext/boost/type_traits/is_base_of.hpp +51 -0
  688. data/ext/boost/type_traits/is_class.hpp +12 -0
  689. data/ext/boost/type_traits/is_const.hpp +6 -2
  690. data/ext/boost/type_traits/is_convertible.hpp +14 -2
  691. data/ext/boost/type_traits/is_enum.hpp +10 -1
  692. data/ext/boost/type_traits/is_function.hpp +11 -3
  693. data/ext/boost/type_traits/is_fundamental.hpp +45 -0
  694. data/ext/boost/type_traits/is_integral.hpp +5 -0
  695. data/ext/boost/type_traits/is_member_function_pointer.hpp +5 -3
  696. data/ext/boost/type_traits/is_member_pointer.hpp +4 -2
  697. data/ext/boost/type_traits/is_pointer.hpp +3 -1
  698. data/ext/boost/type_traits/is_reference.hpp +4 -2
  699. data/ext/boost/type_traits/is_signed.hpp +135 -0
  700. data/ext/boost/type_traits/is_unsigned.hpp +130 -0
  701. data/ext/boost/type_traits/is_void.hpp +5 -0
  702. data/ext/boost/type_traits/is_volatile.hpp +4 -2
  703. data/ext/boost/type_traits/make_unsigned.hpp +137 -0
  704. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  705. data/ext/boost/type_traits/type_with_alignment.hpp +106 -1
  706. data/ext/boost/utility.hpp +2 -1
  707. data/ext/boost/utility/addressof.hpp +61 -17
  708. data/ext/boost/utility/binary.hpp +708 -0
  709. data/ext/boost/utility/enable_if.hpp +2 -2
  710. data/ext/boost/weak_ptr.hpp +4 -174
  711. data/ext/common/AbstractSpawnManager.h +110 -0
  712. data/ext/common/Account.h +175 -0
  713. data/ext/common/AccountsDatabase.cpp +81 -0
  714. data/ext/common/AccountsDatabase.h +130 -0
  715. data/ext/common/AgentBase.cpp +323 -0
  716. data/ext/common/{Version.h → AgentBase.h} +14 -6
  717. data/ext/common/AgentsStarter.cpp +154 -0
  718. data/ext/common/AgentsStarter.h +81 -0
  719. data/ext/common/AgentsStarter.hpp +619 -0
  720. data/ext/common/ApplicationPool/Client.h +796 -0
  721. data/ext/common/{ApplicationPool.h → ApplicationPool/Interface.h} +108 -18
  722. data/ext/common/ApplicationPool/Pool.h +1315 -0
  723. data/ext/common/ApplicationPool/Server.h +475 -0
  724. data/ext/common/BCrypt.cpp +343 -0
  725. data/ext/common/BCrypt.h +73 -0
  726. data/ext/common/Blowfish.c +685 -0
  727. data/ext/common/Blowfish.h +103 -0
  728. data/ext/common/Constants.h +48 -0
  729. data/ext/common/EventedClient.h +598 -0
  730. data/ext/common/EventedMessageServer.h +327 -0
  731. data/ext/common/EventedServer.h +295 -0
  732. data/ext/common/Exceptions.h +78 -1
  733. data/ext/common/FileDescriptor.h +229 -0
  734. data/ext/common/HelperAgent/BacktracesServer.h +59 -0
  735. data/ext/common/Logging.cpp +8 -9
  736. data/ext/common/Logging.h +593 -21
  737. data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
  738. data/ext/common/LoggingAgent/DataStoreId.h +177 -0
  739. data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
  740. data/ext/common/LoggingAgent/Main.cpp +278 -0
  741. data/ext/common/LoggingAgent/RemoteSender.h +457 -0
  742. data/ext/common/MessageChannel.h +196 -34
  743. data/ext/common/MessageClient.h +297 -0
  744. data/ext/common/MessageReadersWriters.h +508 -0
  745. data/ext/common/MessageServer.h +575 -0
  746. data/ext/common/PoolOptions.h +279 -117
  747. data/ext/common/Process.h +255 -0
  748. data/ext/common/RandomGenerator.h +160 -0
  749. data/ext/common/ResourceLocator.h +84 -0
  750. data/ext/common/ServerInstanceDir.h +343 -0
  751. data/ext/common/Session.h +470 -0
  752. data/ext/common/SpawnManager.h +256 -201
  753. data/ext/common/StaticString.h +79 -4
  754. data/ext/common/StringListCreator.h +2 -2
  755. data/ext/common/Utils.cpp +385 -397
  756. data/ext/common/Utils.h +79 -165
  757. data/ext/common/{Base64.cpp → Utils/Base64.cpp} +0 -0
  758. data/ext/common/{Base64.h → Utils/Base64.h} +27 -1
  759. data/ext/common/Utils/BlockingQueue.h +136 -0
  760. data/ext/common/Utils/BlockingScalar.h +50 -0
  761. data/ext/common/{CachedFileStat.cpp → Utils/CachedFileStat.cpp} +1 -1
  762. data/ext/common/{CachedFileStat.h → Utils/CachedFileStat.h} +1 -1
  763. data/ext/common/{CachedFileStat.hpp → Utils/CachedFileStat.hpp} +1 -1
  764. data/ext/common/{FileChangeChecker.h → Utils/FileChangeChecker.h} +1 -1
  765. data/ext/common/Utils/FileHandleGuard.h +81 -0
  766. data/ext/common/Utils/IOUtils.cpp +754 -0
  767. data/ext/common/Utils/IOUtils.h +253 -0
  768. data/ext/common/Utils/MD5.cpp +406 -0
  769. data/ext/common/Utils/MD5.h +98 -0
  770. data/ext/common/Utils/MemZeroGuard.h +103 -0
  771. data/ext/common/Utils/ProcessMetricsCollector.h +462 -0
  772. data/ext/common/Utils/ScopeGuard.h +72 -0
  773. data/ext/common/Utils/StrIntUtils.cpp +329 -0
  774. data/ext/common/Utils/StrIntUtils.h +228 -0
  775. data/ext/common/{SystemTime.cpp → Utils/SystemTime.cpp} +5 -1
  776. data/ext/common/Utils/SystemTime.h +201 -0
  777. data/ext/common/{Timer.h → Utils/Timer.h} +58 -18
  778. data/ext/common/Utils/VariantMap.h +363 -0
  779. data/ext/common/Utils/foo.cpp +10 -0
  780. data/ext/common/Watchdog.cpp +1034 -0
  781. data/ext/google/COPYING +28 -0
  782. data/ext/google/ChangeLog +167 -0
  783. data/ext/google/dense_hash_map +310 -0
  784. data/ext/google/dense_hash_set +287 -0
  785. data/ext/google/sparse_hash_map +294 -0
  786. data/ext/google/sparse_hash_set +275 -0
  787. data/ext/google/sparsehash/densehashtable.h +1062 -0
  788. data/ext/google/sparsehash/sparseconfig.h +55 -0
  789. data/ext/google/sparsehash/sparsehashtable.h +1015 -0
  790. data/ext/google/sparsetable +1468 -0
  791. data/ext/google/type_traits.h +250 -0
  792. data/ext/libev/Changes +302 -0
  793. data/ext/libev/LICENSE +36 -0
  794. data/ext/libev/Makefile.am +18 -0
  795. data/ext/libev/Makefile.in +685 -0
  796. data/ext/libev/README +58 -0
  797. data/ext/libev/aclocal.m4 +7549 -0
  798. data/ext/libev/autogen.sh +6 -0
  799. data/ext/libev/config.guess +1526 -0
  800. data/ext/libev/config.h +122 -0
  801. data/ext/libev/config.h.in +121 -0
  802. data/ext/libev/config.sub +1658 -0
  803. data/ext/libev/configure +22156 -0
  804. data/ext/libev/configure.ac +18 -0
  805. data/ext/libev/ev++.h +800 -0
  806. data/ext/libev/ev.c +3694 -0
  807. data/ext/libev/ev.h +705 -0
  808. data/ext/libev/ev_epoll.c +228 -0
  809. data/ext/libev/ev_kqueue.c +196 -0
  810. data/ext/libev/ev_poll.c +144 -0
  811. data/ext/libev/ev_port.c +165 -0
  812. data/ext/libev/ev_select.c +308 -0
  813. data/ext/libev/ev_vars.h +187 -0
  814. data/ext/libev/ev_win32.c +153 -0
  815. data/ext/libev/ev_wrap.h +178 -0
  816. data/ext/libev/event.c +401 -0
  817. data/ext/libev/event.h +158 -0
  818. data/ext/libev/install-sh +294 -0
  819. data/ext/libev/libev.m4 +38 -0
  820. data/ext/libev/ltmain.sh +6871 -0
  821. data/ext/libev/missing +336 -0
  822. data/ext/libev/mkinstalldirs +111 -0
  823. data/ext/nginx/Configuration.c +532 -182
  824. data/ext/nginx/Configuration.h +33 -10
  825. data/ext/nginx/ContentHandler.c +188 -53
  826. data/ext/nginx/ContentHandler.h +1 -1
  827. data/ext/nginx/{HelperServer.cpp → HelperAgent.cpp} +433 -299
  828. data/ext/nginx/HttpStatusExtractor.h +1 -1
  829. data/ext/nginx/ScgiRequestParser.h +68 -11
  830. data/ext/nginx/StaticContentHandler.c +4 -1
  831. data/ext/nginx/StaticContentHandler.h +1 -1
  832. data/ext/nginx/config +5 -5
  833. data/ext/nginx/ngx_http_passenger_module.c +315 -469
  834. data/ext/nginx/ngx_http_passenger_module.h +8 -17
  835. data/ext/oxt/backtrace.cpp +49 -41
  836. data/ext/oxt/backtrace.hpp +1 -1
  837. data/ext/oxt/detail/backtrace_disabled.hpp +1 -1
  838. data/ext/oxt/detail/backtrace_enabled.hpp +16 -15
  839. data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
  840. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +3 -4
  841. data/ext/oxt/detail/spin_lock_portable.hpp +1 -1
  842. data/ext/oxt/detail/spin_lock_pthreads.hpp +1 -1
  843. data/ext/oxt/detail/tracable_exception_disabled.hpp +1 -1
  844. data/ext/oxt/detail/tracable_exception_enabled.hpp +1 -1
  845. data/ext/oxt/dynamic_thread_group.hpp +195 -0
  846. data/ext/oxt/macros.hpp +1 -1
  847. data/ext/oxt/spin_lock.hpp +4 -2
  848. data/ext/oxt/system_calls.cpp +129 -13
  849. data/ext/oxt/system_calls.hpp +16 -2
  850. data/ext/oxt/thread.cpp +1 -1
  851. data/ext/oxt/thread.hpp +49 -14
  852. data/ext/oxt/tracable_exception.cpp +5 -5
  853. data/ext/oxt/tracable_exception.hpp +1 -1
  854. data/ext/phusion_passenger/extconf.rb +7 -2
  855. data/ext/phusion_passenger/native_support.c +733 -33
  856. data/{bin → helper-scripts}/passenger-spawn-server +50 -12
  857. data/helper-scripts/prespawn +63 -0
  858. data/lib/phusion_passenger.rb +113 -0
  859. data/lib/phusion_passenger/abstract_installer.rb +50 -12
  860. data/lib/phusion_passenger/abstract_request_handler.rb +432 -171
  861. data/lib/phusion_passenger/abstract_server.rb +125 -122
  862. data/lib/phusion_passenger/abstract_server_collection.rb +51 -22
  863. data/lib/phusion_passenger/admin_tools.rb +1 -1
  864. data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
  865. data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
  866. data/lib/phusion_passenger/analytics_logger.rb +342 -0
  867. data/lib/phusion_passenger/{application.rb → app_process.rb} +73 -24
  868. data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
  869. data/lib/phusion_passenger/{railz → classic_rails}/cgi_fixed.rb +2 -2
  870. data/lib/phusion_passenger/{railz → classic_rails}/framework_spawner.rb +75 -98
  871. data/lib/phusion_passenger/{railz → classic_rails}/request_handler.rb +8 -6
  872. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
  873. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
  874. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
  875. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
  876. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
  877. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
  878. data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
  879. data/lib/phusion_passenger/console_text_template.rb +1 -1
  880. data/lib/phusion_passenger/constants.rb +9 -5
  881. data/lib/phusion_passenger/debug_logging.rb +104 -0
  882. data/lib/phusion_passenger/dependencies.rb +187 -4
  883. data/lib/phusion_passenger/exceptions.rb +4 -4
  884. data/lib/phusion_passenger/html_template.rb +6 -8
  885. data/lib/phusion_passenger/message_channel.rb +137 -21
  886. data/lib/phusion_passenger/message_client.rb +173 -0
  887. data/lib/phusion_passenger/native_support.rb +108 -0
  888. data/lib/phusion_passenger/packaging.rb +82 -13
  889. data/lib/phusion_passenger/platform_info.rb +84 -475
  890. data/lib/phusion_passenger/platform_info/apache.rb +329 -0
  891. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +187 -0
  892. data/lib/phusion_passenger/platform_info/compiler.rb +154 -0
  893. data/lib/phusion_passenger/{events.rb → platform_info/curl.rb} +26 -23
  894. data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
  895. data/lib/phusion_passenger/platform_info/linux.rb +77 -0
  896. data/lib/phusion_passenger/platform_info/operating_system.rb +51 -0
  897. data/lib/phusion_passenger/platform_info/ruby.rb +198 -0
  898. data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
  899. data/lib/phusion_passenger/plugin.rb +96 -0
  900. data/lib/phusion_passenger/public_api.rb +112 -0
  901. data/lib/phusion_passenger/rack/application_spawner.rb +146 -71
  902. data/lib/phusion_passenger/rack/request_handler.rb +36 -13
  903. data/lib/phusion_passenger/rails3_extensions/init.rb +204 -0
  904. data/lib/phusion_passenger/simple_benchmarking.rb +1 -1
  905. data/lib/phusion_passenger/spawn_manager.rb +137 -141
  906. data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
  907. data/lib/phusion_passenger/standalone/command.rb +237 -0
  908. data/lib/phusion_passenger/standalone/config_file.rb +119 -0
  909. data/lib/phusion_passenger/standalone/help_command.rb +57 -0
  910. data/lib/phusion_passenger/standalone/main.rb +101 -0
  911. data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
  912. data/lib/phusion_passenger/standalone/runtime_installer.rb +466 -0
  913. data/lib/phusion_passenger/standalone/start_command.rb +510 -0
  914. data/lib/phusion_passenger/standalone/status_command.rb +62 -0
  915. data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
  916. data/lib/phusion_passenger/standalone/utils.rb +42 -0
  917. data/lib/phusion_passenger/standalone/version_command.rb +42 -0
  918. data/lib/phusion_passenger/templates/framework_init_error.html.erb +1 -1
  919. data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
  920. data/lib/phusion_passenger/templates/standalone/config.erb +69 -0
  921. data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
  922. data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
  923. data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
  924. data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
  925. data/lib/phusion_passenger/templates/version_not_found.html.erb +2 -2
  926. data/lib/phusion_passenger/utils.rb +476 -125
  927. data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
  928. data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
  929. data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
  930. data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
  931. data/lib/phusion_passenger/wsgi/application_spawner.rb +24 -20
  932. data/lib/phusion_passenger/wsgi/request_handler.py +1 -1
  933. data/misc/copy_boost_headers.rb +36 -9
  934. data/misc/find_owner_pipe_leaks.rb +1 -1
  935. data/misc/render_error_pages.rb +1 -1
  936. data/misc/union_station_gateway.crt +32 -0
  937. data/test/config.yml.example +24 -13
  938. data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
  939. data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
  940. data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
  941. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
  942. data/test/{Base64Test.cpp → cxx/Base64Test.cpp} +4 -2
  943. data/test/{CachedFileStatTest.cpp → cxx/CachedFileStatTest.cpp} +3 -3
  944. data/test/{CxxTestMain.cpp → cxx/CxxTestMain.cpp} +6 -27
  945. data/test/cxx/EventedClientTest.cpp +386 -0
  946. data/test/{FileChangeCheckerTest.cpp → cxx/FileChangeCheckerTest.cpp} +3 -5
  947. data/test/cxx/FileDescriptorTest.cpp +69 -0
  948. data/test/{HttpStatusExtractorTest.cpp → cxx/HttpStatusExtractorTest.cpp} +1 -1
  949. data/test/cxx/IOUtilsTest.cpp +398 -0
  950. data/test/cxx/LoggingTest.cpp +914 -0
  951. data/test/cxx/MessageChannelTest.cpp +672 -0
  952. data/test/cxx/MessageReadersWritersTest.cpp +574 -0
  953. data/test/cxx/MessageServerTest.cpp +383 -0
  954. data/test/{PoolOptionsTest.cpp → cxx/PoolOptionsTest.cpp} +2 -3
  955. data/test/{ScgiRequestParserTest.cpp → cxx/ScgiRequestParserTest.cpp} +53 -1
  956. data/test/cxx/ServerInstanceDirTest.cpp +186 -0
  957. data/test/cxx/SpawnManagerTest.cpp +161 -0
  958. data/test/cxx/StaticStringTest.cpp +86 -0
  959. data/test/{SystemTimeTest.cpp → cxx/SystemTimeTest.cpp} +2 -2
  960. data/test/cxx/TestSupport.cpp +166 -0
  961. data/test/cxx/TestSupport.h +254 -0
  962. data/test/cxx/UtilsTest.cpp +521 -0
  963. data/test/cxx/VariantMapTest.cpp +179 -0
  964. data/test/integration_tests/apache2_tests.rb +198 -127
  965. data/test/integration_tests/cgi_environment_spec.rb +26 -0
  966. data/test/integration_tests/mycook_spec.rb +2 -28
  967. data/test/integration_tests/nginx_tests.rb +125 -16
  968. data/test/integration_tests/spec_helper.rb +19 -0
  969. data/test/oxt/backtrace_test.cpp +19 -59
  970. data/test/oxt/counter.hpp +55 -0
  971. data/test/oxt/dynamic_thread_group_test.cpp +131 -0
  972. data/test/oxt/oxt_test_main.cpp +2 -2
  973. data/test/oxt/spin_lock_test.cpp +59 -0
  974. data/test/oxt/syscall_interruption_test.cpp +1 -1
  975. data/test/ruby/abstract_request_handler_spec.rb +346 -25
  976. data/test/ruby/abstract_server_collection_spec.rb +4 -3
  977. data/test/ruby/abstract_server_spec.rb +37 -27
  978. data/test/ruby/admin_tools_spec.rb +362 -0
  979. data/test/ruby/analytics_logger_spec.rb +253 -0
  980. data/test/ruby/{application_spec.rb → app_process_spec.rb} +14 -14
  981. data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
  982. data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
  983. data/test/ruby/debug_logging_spec.rb +141 -0
  984. data/test/ruby/message_channel_spec.rb +51 -25
  985. data/test/ruby/rack/application_spawner_spec.rb +99 -82
  986. data/test/ruby/shared/abstract_server_spec.rb +23 -0
  987. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
  988. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
  989. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
  990. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
  991. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
  992. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
  993. data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
  994. data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
  995. data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
  996. data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
  997. data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
  998. data/test/ruby/spawn_manager_spec.rb +104 -175
  999. data/test/ruby/spec_helper.rb +104 -0
  1000. data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
  1001. data/test/ruby/utils/hosts_file_parser.rb +258 -0
  1002. data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
  1003. data/test/ruby/utils_spec.rb +410 -59
  1004. data/test/ruby/wsgi/application_spawner_spec.rb +16 -20
  1005. data/test/stub/apache2/httpd.conf.erb +11 -6
  1006. data/test/stub/message_channel.rb +3 -1
  1007. data/test/stub/message_channel_2.rb +3 -1
  1008. data/test/stub/message_channel_3.rb +5 -3
  1009. data/test/stub/nginx/nginx.conf.erb +3 -2
  1010. data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
  1011. data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
  1012. data/test/stub/rails_apps/{foobar → 1.2/empty}/app/helpers/application_helper.rb +0 -0
  1013. data/test/stub/rails_apps/{mycook → 1.2/empty}/config/boot.rb +3 -3
  1014. data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
  1015. data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
  1016. data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
  1017. data/test/stub/rails_apps/{foobar → 1.2/empty}/config/environments/production.rb +0 -0
  1018. data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
  1019. data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
  1020. data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
  1021. data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
  1022. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/404.html +0 -0
  1023. data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
  1024. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
  1025. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
  1026. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
  1027. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/favicon.ico +0 -0
  1028. data/test/stub/rails_apps/{mycook → 1.2/empty}/public/images/rails.png +0 -0
  1029. data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
  1030. data/test/stub/rails_apps/1.2/empty/script/about +3 -0
  1031. data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
  1032. data/test/stub/rails_apps/1.2/empty/script/console +3 -0
  1033. data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
  1034. data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
  1035. data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
  1036. data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
  1037. data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
  1038. data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
  1039. data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
  1040. data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
  1041. data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
  1042. data/test/stub/rails_apps/1.2/empty/script/server +3 -0
  1043. data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
  1044. data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
  1045. data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
  1046. data/test/stub/rails_apps/{mycook → 2.0/empty}/app/helpers/application_helper.rb +0 -0
  1047. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/boot.rb +3 -3
  1048. data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
  1049. data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
  1050. data/test/stub/rails_apps/{mycook → 2.0/empty}/config/environments/development.rb +1 -1
  1051. data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
  1052. data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
  1053. data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
  1054. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/inflections.rb +0 -0
  1055. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/mime_types.rb +0 -0
  1056. data/test/stub/rails_apps/{foobar → 2.0/empty}/config/routes.rb +0 -0
  1057. data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
  1058. data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
  1059. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/422.html +0 -0
  1060. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/500.html +0 -0
  1061. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
  1062. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
  1063. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
  1064. data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
  1065. data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
  1066. data/test/stub/rails_apps/{mycook → 2.0/empty}/public/robots.txt +0 -0
  1067. data/test/stub/rails_apps/2.0/empty/script/about +3 -0
  1068. data/test/stub/rails_apps/2.0/empty/script/console +3 -0
  1069. data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
  1070. data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
  1071. data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
  1072. data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
  1073. data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
  1074. data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
  1075. data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
  1076. data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
  1077. data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
  1078. data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
  1079. data/test/stub/rails_apps/2.0/empty/script/server +3 -0
  1080. data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
  1081. data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
  1082. data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
  1083. data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
  1084. data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
  1085. data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
  1086. data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
  1087. data/test/stub/rails_apps/{foobar → 2.2/empty}/config/environments/development.rb +0 -0
  1088. data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
  1089. data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
  1090. data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
  1091. data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
  1092. data/test/stub/rails_apps/{mycook → 2.2/empty}/config/initializers/mime_types.rb +0 -0
  1093. data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
  1094. data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
  1095. data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
  1096. data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
  1097. data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
  1098. data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
  1099. data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
  1100. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
  1101. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
  1102. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
  1103. data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
  1104. data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
  1105. data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
  1106. data/test/stub/rails_apps/2.2/empty/script/about +4 -0
  1107. data/test/stub/rails_apps/2.2/empty/script/console +3 -0
  1108. data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
  1109. data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
  1110. data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
  1111. data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
  1112. data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
  1113. data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
  1114. data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
  1115. data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
  1116. data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
  1117. data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
  1118. data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
  1119. data/test/stub/rails_apps/2.2/empty/script/server +3 -0
  1120. data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
  1121. data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
  1122. data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
  1123. data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
  1124. data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
  1125. data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
  1126. data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
  1127. data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
  1128. data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
  1129. data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
  1130. data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
  1131. data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
  1132. data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
  1133. data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
  1134. data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
  1135. data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
  1136. data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
  1137. data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
  1138. data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
  1139. data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
  1140. data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
  1141. data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
  1142. data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
  1143. data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
  1144. data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
  1145. data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
  1146. data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
  1147. data/test/stub/rails_apps/2.3/empty/script/about +4 -0
  1148. data/test/stub/rails_apps/2.3/empty/script/console +3 -0
  1149. data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
  1150. data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
  1151. data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
  1152. data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
  1153. data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
  1154. data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
  1155. data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
  1156. data/test/stub/rails_apps/2.3/empty/script/server +3 -0
  1157. data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
  1158. data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
  1159. data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
  1160. data/test/stub/rails_apps/{foobar/app/controllers/application.rb → 2.3/foobar/app/controllers/application_controller.rb} +0 -0
  1161. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_1.rb +0 -0
  1162. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_2.rb +0 -0
  1163. data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/foo_controller.rb +0 -0
  1164. data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
  1165. data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
  1166. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/database.yml +0 -0
  1167. data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/environment.rb +1 -1
  1168. data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
  1169. data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
  1170. data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
  1171. data/test/stub/rails_apps/{mycook → 2.3/foobar}/config/initializers/inflections.rb +0 -0
  1172. data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
  1173. data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
  1174. data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
  1175. data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
  1176. data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
  1177. data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
  1178. data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
  1179. data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
  1180. data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
  1181. data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
  1182. data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
  1183. data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
  1184. data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
  1185. data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
  1186. data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
  1187. data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
  1188. data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
  1189. data/test/stub/rails_apps/{mycook/app/controllers/application.rb → 2.3/mycook/app/controllers/application_controller.rb} +0 -0
  1190. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/recipes_controller.rb +0 -0
  1191. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/uploads_controller.rb +0 -0
  1192. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/welcome_controller.rb +0 -0
  1193. data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
  1194. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/layouts/default.rhtml +0 -0
  1195. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/create.rhtml +0 -0
  1196. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/index.rhtml +0 -0
  1197. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/new.rhtml +0 -0
  1198. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/index.rhtml +0 -0
  1199. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/new.html.erb +0 -0
  1200. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/cached.rhtml +0 -0
  1201. data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/index.rhtml +0 -0
  1202. data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
  1203. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/database.yml +0 -0
  1204. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environment.rb +1 -1
  1205. data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
  1206. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environments/production.rb +0 -0
  1207. data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
  1208. data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
  1209. data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/routes.rb +0 -0
  1210. data/test/stub/rails_apps/{mycook → 2.3/mycook}/log/useless.txt +0 -0
  1211. data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
  1212. data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
  1213. data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
  1214. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.cgi +0 -0
  1215. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.fcgi +0 -0
  1216. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.rb +1 -1
  1217. data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
  1218. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/angrywizard.gif +0 -0
  1219. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/cookbook.gif +0 -0
  1220. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/header.png +0 -0
  1221. data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
  1222. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/application.js +0 -0
  1223. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/controls.js +73 -73
  1224. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/dragdrop.js +166 -165
  1225. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/effects.js +174 -166
  1226. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/prototype.js +362 -267
  1227. data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
  1228. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/uploads.html +0 -0
  1229. data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/welcome/cached.html +0 -0
  1230. data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
  1231. data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
  1232. data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
  1233. data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
  1234. data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
  1235. data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
  1236. data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
  1237. data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
  1238. data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
  1239. data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
  1240. data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
  1241. data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
  1242. data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
  1243. data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
  1244. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/uploads.html +0 -0
  1245. data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/welcome/cached.html +0 -0
  1246. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/cache/useless.txt +0 -0
  1247. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/pids/useless.txt +0 -0
  1248. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sessions/useless.txt +0 -0
  1249. data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sockets/useless.txt +0 -0
  1250. data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
  1251. data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
  1252. data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
  1253. data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
  1254. data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
  1255. data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
  1256. data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
  1257. data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
  1258. data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
  1259. data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
  1260. data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
  1261. data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
  1262. data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
  1263. data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
  1264. data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
  1265. data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
  1266. data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
  1267. data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
  1268. data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
  1269. data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
  1270. data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
  1271. data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
  1272. data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
  1273. data/test/stub/rails_apps/3.0/empty/log/development.log +3 -0
  1274. data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
  1275. data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
  1276. data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
  1277. data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
  1278. data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
  1279. data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
  1280. data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
  1281. data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
  1282. data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
  1283. data/test/stub/spawn_server.rb +4 -2
  1284. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +3 -0
  1285. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +7 -2
  1286. data/test/support/apache2_controller.rb +10 -2
  1287. data/test/support/nginx_controller.rb +3 -2
  1288. data/test/support/test_helper.rb +282 -46
  1289. data/test/{support → tut}/tut.h +6 -0
  1290. data/test/{support → tut}/tut_reporter.h +0 -0
  1291. metadata +824 -266
  1292. data/benchmark/ApplicationPool.cpp +0 -52
  1293. data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +0 -126
  1294. data/benchmark/dispatcher.rb +0 -42
  1295. data/benchmark/overhead_of_password_checking.rb +0 -81
  1296. data/benchmark/socket_connections_vs_persistent_pipe.rb +0 -99
  1297. data/benchmark/unix_sockets_vs_pipes.rb +0 -83
  1298. data/ext/boost/LICENSE.TXT +0 -23
  1299. data/ext/boost/VERSION.TXT +0 -1
  1300. data/ext/boost/detail/sp_counted_base.hpp +0 -81
  1301. data/ext/boost/src/pthread/exceptions.cpp +0 -146
  1302. data/ext/boost/src/win32/exceptions.cpp +0 -124
  1303. data/ext/boost/src/win32/thread.cpp +0 -629
  1304. data/ext/boost/src/win32/timeconv.inl +0 -130
  1305. data/ext/boost/src/win32/tss_dll.cpp +0 -72
  1306. data/ext/boost/src/win32/tss_pe.cpp +0 -269
  1307. data/ext/boost/thread/pthread/thread.hpp +0 -339
  1308. data/ext/boost/thread/pthread/tss.hpp +0 -103
  1309. data/ext/common/Application.h +0 -511
  1310. data/ext/common/ApplicationPoolServer.h +0 -794
  1311. data/ext/common/ApplicationPoolServerExecutable.cpp +0 -743
  1312. data/ext/common/ApplicationPoolStatusReporter.h +0 -336
  1313. data/ext/common/DummySpawnManager.h +0 -108
  1314. data/ext/common/StandardApplicationPool.h +0 -821
  1315. data/ext/common/SystemTime.h +0 -88
  1316. data/lib/phusion_passenger/admin_tools/control_process.rb +0 -150
  1317. data/lib/phusion_passenger/railz/application_spawner.rb +0 -463
  1318. data/lib/phusion_passenger/templates/invalid_app_root.html.erb +0 -9
  1319. data/test/ApplicationPoolServerTest.cpp +0 -114
  1320. data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +0 -33
  1321. data/test/ApplicationPoolTest.cpp +0 -599
  1322. data/test/MessageChannelTest.cpp +0 -320
  1323. data/test/SpawnManagerTest.cpp +0 -64
  1324. data/test/StandardApplicationPoolTest.cpp +0 -27
  1325. data/test/StaticStringTest.cpp +0 -51
  1326. data/test/UtilsTest.cpp +0 -257
  1327. data/test/ruby/rails/application_spawner_spec.rb +0 -159
  1328. data/test/ruby/rails/framework_spawner_spec.rb +0 -133
  1329. data/test/ruby/rails/minimal_spawner_spec.rb +0 -93
  1330. data/test/ruby/rails/spawner_error_handling_spec.rb +0 -107
  1331. data/test/ruby/rails/spawner_privilege_lowering_spec.rb +0 -97
  1332. data/test/ruby/spawn_server_spec.rb +0 -26
  1333. data/test/stub/MessageServer.dSYM/Contents/Info.plist +0 -25
  1334. data/test/stub/MessageServer.dSYM/Contents/Resources/DWARF/MessageServer +0 -0
  1335. data/test/support/Support.cpp +0 -84
  1336. data/test/support/Support.h +0 -118
  1337. data/test/support/config.rb +0 -38
  1338. data/test/support/run_rspec_tests.rb +0 -10
@@ -0,0 +1,79 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
+ <title>Passenger: Constants.h Source File</title>
6
+ <link href="tabs.css" rel="stylesheet" type="text/css"/>
7
+ <link href="doxygen.css" rel="stylesheet" type="text/css"/>
8
+ </head>
9
+ <body>
10
+ <!-- Generated by Doxygen 1.6.2 -->
11
+ <div class="navigation" id="top">
12
+ <div class="tabs">
13
+ <ul>
14
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
+ <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
17
+ <li><a href="annotated.html"><span>Classes</span></a></li>
18
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
19
+ </ul>
20
+ </div>
21
+ <div class="tabs">
22
+ <ul>
23
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
24
+ </ul>
25
+ </div>
26
+ <h1>Constants.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
27
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
29
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
30
+ <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
31
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
32
+ <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
33
+ <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
34
+ <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
35
+ <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
36
+ <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
37
+ <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
38
+ <a name="l00013"></a>00013 <span class="comment"> *</span>
39
+ <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
40
+ <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
41
+ <a name="l00016"></a>00016 <span class="comment"> *</span>
42
+ <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
43
+ <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
44
+ <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
45
+ <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
46
+ <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
47
+ <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
48
+ <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
49
+ <a name="l00024"></a>00024 <span class="comment"> */</span>
50
+ <a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_CONSTANTS_H_</span>
51
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_CONSTANTS_H_</span>
52
+ <a name="l00027"></a>00027 <span class="preprocessor"></span>
53
+ <a name="l00028"></a>00028 <span class="comment">/* Don&#39;t forget to update lib/phusion_passenger.rb too. */</span>
54
+ <a name="l00029"></a>00029 <span class="preprocessor">#define PASSENGER_VERSION &quot;3.0.0.pre1&quot;</span>
55
+ <a name="l00030"></a>00030 <span class="preprocessor"></span>
56
+ <a name="l00031"></a>00031 <span class="preprocessor">#define FEEDBACK_FD 3</span>
57
+ <a name="l00032"></a>00032 <span class="preprocessor"></span>
58
+ <a name="l00033"></a>00033 <span class="preprocessor">#define DEFAULT_LOG_LEVEL 0</span>
59
+ <a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_MAX_POOL_SIZE 6</span>
60
+ <a name="l00035"></a>00035 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_POOL_IDLE_TIME 300</span>
61
+ <a name="l00036"></a>00036 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_MAX_INSTANCES_PER_APP 0</span>
62
+ <a name="l00037"></a>00037 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_WEB_APP_USER &quot;nobody&quot;</span>
63
+ <a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_ANALYTICS_LOG_USER DEFAULT_WEB_APP_USER</span>
64
+ <a name="l00039"></a>00039 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_ANALYTICS_LOG_GROUP &quot;&quot;</span>
65
+ <a name="l00040"></a>00040 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_ANALYTICS_LOG_PERMISSIONS &quot;u=rwx,g=rx,o=rx&quot;</span>
66
+ <a name="l00041"></a>00041 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_UNION_STATION_GATEWAY_ADDRESS &quot;gateway.unionstationapp.com&quot;</span>
67
+ <a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_UNION_STATION_GATEWAY_PORT 443</span>
68
+ <a name="l00043"></a>00043 <span class="preprocessor"></span>
69
+ <a name="l00044"></a>00044 <span class="preprocessor">#define MESSAGE_SERVER_MAX_USERNAME_SIZE 100</span>
70
+ <a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define MESSAGE_SERVER_MAX_PASSWORD_SIZE 100</span>
71
+ <a name="l00046"></a>00046 <span class="preprocessor"></span><span class="preprocessor">#define DEFAULT_BACKEND_ACCOUNT_RIGHTS Account::DETACH</span>
72
+ <a name="l00047"></a>00047 <span class="preprocessor"></span>
73
+ <a name="l00048"></a>00048 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_CONSTANTS_H */</span>
74
+ </pre></div></div>
75
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
76
+ <a href="http://www.doxygen.org/index.html">
77
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
78
+ </body>
79
+ </html>
@@ -0,0 +1,95 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
+ <title>Passenger: ContentHandler.h Source File</title>
6
+ <link href="tabs.css" rel="stylesheet" type="text/css"/>
7
+ <link href="doxygen.css" rel="stylesheet" type="text/css"/>
8
+ </head>
9
+ <body>
10
+ <!-- Generated by Doxygen 1.6.2 -->
11
+ <div class="navigation" id="top">
12
+ <div class="tabs">
13
+ <ul>
14
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
+ <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
17
+ <li><a href="annotated.html"><span>Classes</span></a></li>
18
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
19
+ </ul>
20
+ </div>
21
+ <div class="tabs">
22
+ <ul>
23
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
24
+ </ul>
25
+ </div>
26
+ <h1>ContentHandler.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
27
+ <a name="l00002"></a>00002 <span class="comment"> * Copyright (C) Igor Sysoev</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2007 Manlio Perillo (manlio.perillo@gmail.com)</span>
29
+ <a name="l00004"></a>00004 <span class="comment"> * Copyright (C) 2010 Phusion</span>
30
+ <a name="l00005"></a>00005 <span class="comment"> *</span>
31
+ <a name="l00006"></a>00006 <span class="comment"> * Redistribution and use in source and binary forms, with or without</span>
32
+ <a name="l00007"></a>00007 <span class="comment"> * modification, are permitted provided that the following conditions</span>
33
+ <a name="l00008"></a>00008 <span class="comment"> * are met:</span>
34
+ <a name="l00009"></a>00009 <span class="comment"> * 1. Redistributions of source code must retain the above copyright</span>
35
+ <a name="l00010"></a>00010 <span class="comment"> * notice, this list of conditions and the following disclaimer.</span>
36
+ <a name="l00011"></a>00011 <span class="comment"> * 2. Redistributions in binary form must reproduce the above copyright</span>
37
+ <a name="l00012"></a>00012 <span class="comment"> * notice, this list of conditions and the following disclaimer in the</span>
38
+ <a name="l00013"></a>00013 <span class="comment"> * documentation and/or other materials provided with the distribution.</span>
39
+ <a name="l00014"></a>00014 <span class="comment"> *</span>
40
+ <a name="l00015"></a>00015 <span class="comment"> * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS&#39;&#39; AND</span>
41
+ <a name="l00016"></a>00016 <span class="comment"> * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</span>
42
+ <a name="l00017"></a>00017 <span class="comment"> * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</span>
43
+ <a name="l00018"></a>00018 <span class="comment"> * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE</span>
44
+ <a name="l00019"></a>00019 <span class="comment"> * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</span>
45
+ <a name="l00020"></a>00020 <span class="comment"> * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</span>
46
+ <a name="l00021"></a>00021 <span class="comment"> * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span>
47
+ <a name="l00022"></a>00022 <span class="comment"> * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</span>
48
+ <a name="l00023"></a>00023 <span class="comment"> * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</span>
49
+ <a name="l00024"></a>00024 <span class="comment"> * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
50
+ <a name="l00025"></a>00025 <span class="comment"> * SUCH DAMAGE.</span>
51
+ <a name="l00026"></a>00026 <span class="comment"> */</span>
52
+ <a name="l00027"></a>00027
53
+ <a name="l00028"></a>00028 <span class="preprocessor">#ifndef _PASSENGER_NGINX_CONTENT_HANDLER_H_</span>
54
+ <a name="l00029"></a>00029 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_NGINX_CONTENT_HANDLER_H_</span>
55
+ <a name="l00030"></a>00030 <span class="preprocessor"></span>
56
+ <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;ngx_core.h&gt;</span>
57
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;ngx_http.h&gt;</span>
58
+ <a name="l00033"></a>00033
59
+ <a name="l00034"></a>00034
60
+ <a name="l00035"></a>00035 <span class="keyword">typedef</span> <span class="keyword">enum</span> {
61
+ <a name="l00036"></a>00036 AP_RAILS,
62
+ <a name="l00037"></a>00037 AP_RACK,
63
+ <a name="l00038"></a>00038 AP_WSGI,
64
+ <a name="l00039"></a>00039 AP_NONE
65
+ <a name="l00040"></a>00040 } passenger_app_type_t;
66
+ <a name="l00041"></a>00041
67
+ <a name="l00042"></a>00042 <span class="keyword">typedef</span> <span class="keyword">struct </span>{<span class="comment"></span>
68
+ <a name="l00043"></a>00043 <span class="comment"> /** Proxy state. */</span>
69
+ <a name="l00044"></a>00044 ngx_uint_t status;
70
+ <a name="l00045"></a>00045 ngx_uint_t status_count;
71
+ <a name="l00046"></a>00046 u_char *status_start;
72
+ <a name="l00047"></a>00047 u_char *status_end;
73
+ <a name="l00048"></a>00048 <span class="comment"></span>
74
+ <a name="l00049"></a>00049 <span class="comment"> /** The backend application&#39;s &#39;public&#39; directory. */</span>
75
+ <a name="l00050"></a>00050 ngx_str_t public_dir;
76
+ <a name="l00051"></a>00051 <span class="comment"></span>
77
+ <a name="l00052"></a>00052 <span class="comment"> /** The application&#39;s base URI. Points to an empty string if none. */</span>
78
+ <a name="l00053"></a>00053 ngx_str_t base_uri;
79
+ <a name="l00054"></a>00054 <span class="comment"></span>
80
+ <a name="l00055"></a>00055 <span class="comment"> /** The backend application&#39;s type. */</span>
81
+ <a name="l00056"></a>00056 passenger_app_type_t app_type;
82
+ <a name="l00057"></a>00057 } passenger_context_t;
83
+ <a name="l00058"></a>00058
84
+ <a name="l00059"></a>00059
85
+ <a name="l00060"></a>00060 ngx_int_t passenger_content_handler(ngx_http_request_t *r);
86
+ <a name="l00061"></a>00061
87
+ <a name="l00062"></a>00062
88
+ <a name="l00063"></a>00063 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_NGINX_CONTENT_HANDLER_H_ */</span>
89
+ <a name="l00064"></a>00064
90
+ </pre></div></div>
91
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
92
+ <a href="http://www.doxygen.org/index.html">
93
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
94
+ </body>
95
+ </html>
@@ -13,6 +13,7 @@
13
13
  <ul>
14
14
  <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
15
  <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
16
17
  <li><a href="annotated.html"><span>Classes</span></a></li>
17
18
  <li class="current"><a href="files.html"><span>Files</span></a></li>
18
19
  </ul>
@@ -24,7 +25,7 @@
24
25
  </div>
25
26
  <h1>DirectoryMapper.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
26
27
  <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
27
- <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2008, 2009 Phusion</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
28
29
  <a name="l00004"></a>00004 <span class="comment"> *</span>
29
30
  <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
30
31
  <a name="l00006"></a>00006 <span class="comment"> *</span>
@@ -55,9 +56,9 @@
55
56
  <a name="l00031"></a>00031
56
57
  <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;oxt/backtrace.hpp&gt;</span>
57
58
  <a name="l00033"></a>00033
58
- <a name="l00034"></a>00034 <span class="preprocessor">#include &quot;CachedFileStat.hpp&quot;</span>
59
- <a name="l00035"></a>00035 <span class="preprocessor">#include &quot;Configuration.h&quot;</span>
60
- <a name="l00036"></a>00036 <span class="preprocessor">#include &quot;Utils.h&quot;</span>
59
+ <a name="l00034"></a>00034 <span class="preprocessor">#include &quot;Configuration.hpp&quot;</span>
60
+ <a name="l00035"></a>00035 <span class="preprocessor">#include &quot;Utils.h&quot;</span>
61
+ <a name="l00036"></a>00036 <span class="preprocessor">#include &quot;Utils/CachedFileStat.hpp&quot;</span>
61
62
  <a name="l00037"></a>00037
62
63
  <a name="l00038"></a>00038 <span class="comment">// The Apache/APR headers *must* come after the Boost headers, otherwise</span>
63
64
  <a name="l00039"></a>00039 <span class="comment">// compilation will fail on OpenBSD.</span>
@@ -195,7 +196,7 @@
195
196
  <a name="l00171"></a>00171
196
197
  <a name="l00172"></a>00172 UPDATE_TRACE_POINT();
197
198
  <a name="l00173"></a>00173 <span class="keywordflow">if</span> (shouldAutoDetectRack()
198
- <a name="l00174"></a>00174 &amp;&amp; verifyRackDir(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
199
+ <a name="l00174"></a>00174 &amp;&amp; <a class="code" href="group__Support.html#ga53969f8e3ee68d1d99ffe75af8db9be8" title="Check whether the specified directory is a valid Rack application root directory...">verifyRackDir</a>(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
199
200
  <a name="l00175"></a>00175 baseURIKnown = <span class="keyword">true</span>;
200
201
  <a name="l00176"></a>00176 baseURI = <span class="stringliteral">&quot;/&quot;</span>;
201
202
  <a name="l00177"></a>00177 appType = RACK;
@@ -204,7 +205,7 @@
204
205
  <a name="l00180"></a>00180
205
206
  <a name="l00181"></a>00181 UPDATE_TRACE_POINT();
206
207
  <a name="l00182"></a>00182 <span class="keywordflow">if</span> (shouldAutoDetectRails()
207
- <a name="l00183"></a>00183 &amp;&amp; verifyRailsDir(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
208
+ <a name="l00183"></a>00183 &amp;&amp; <a class="code" href="group__Support.html#ga5e6bc7ff22b7c61238d7913521936f71" title="Check whether the specified directory is a valid Ruby on Rails application root directory...">verifyRailsDir</a>(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
208
209
  <a name="l00184"></a>00184 baseURIKnown = <span class="keyword">true</span>;
209
210
  <a name="l00185"></a>00185 baseURI = <span class="stringliteral">&quot;/&quot;</span>;
210
211
  <a name="l00186"></a>00186 appType = RAILS;
@@ -213,7 +214,7 @@
213
214
  <a name="l00189"></a>00189
214
215
  <a name="l00190"></a>00190 UPDATE_TRACE_POINT();
215
216
  <a name="l00191"></a>00191 <span class="keywordflow">if</span> (shouldAutoDetectWSGI()
216
- <a name="l00192"></a>00192 &amp;&amp; verifyWSGIDir(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
217
+ <a name="l00192"></a>00192 &amp;&amp; <a class="code" href="group__Support.html#gaaec51d2912999d611994c49341f36247" title="Check whether the specified directory is a valid WSGI application root directory...">verifyWSGIDir</a>(config-&gt;getAppRoot(ap_document_root(r)), cstat, throttleRate)) {
217
218
  <a name="l00193"></a>00193 baseURIKnown = <span class="keyword">true</span>;
218
219
  <a name="l00194"></a>00194 baseURI = <span class="stringliteral">&quot;/&quot;</span>;
219
220
  <a name="l00195"></a>00195 appType = WSGI;
@@ -255,7 +256,7 @@
255
256
  <a name="l00231"></a>00231 <span class="comment"> * This is probably a symlink, so let&#39;s resolve it.</span>
256
257
  <a name="l00232"></a>00232 <span class="comment"> */</span>
257
258
  <a name="l00233"></a>00233 path.append(baseURI);
258
- <a name="l00234"></a>00234 path = resolveSymlink(path);
259
+ <a name="l00234"></a>00234 path = <a class="code" href="group__Support.html#gac3d2b3d608188527d888e63d22c5163c" title="If path refers to a symlink, then this function resolves the symlink for 1 level...">resolveSymlink</a>(path);
259
260
  <a name="l00235"></a>00235 }
260
261
  <a name="l00236"></a>00236 <span class="keywordflow">return</span> path;
261
262
  <a name="l00237"></a>00237 } <span class="keywordflow">else</span> {
@@ -0,0 +1,629 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
+ <title>Passenger: EventedClient.h Source File</title>
6
+ <link href="tabs.css" rel="stylesheet" type="text/css"/>
7
+ <link href="doxygen.css" rel="stylesheet" type="text/css"/>
8
+ </head>
9
+ <body>
10
+ <!-- Generated by Doxygen 1.6.2 -->
11
+ <div class="navigation" id="top">
12
+ <div class="tabs">
13
+ <ul>
14
+ <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
15
+ <li><a href="modules.html"><span>Modules</span></a></li>
16
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
17
+ <li><a href="annotated.html"><span>Classes</span></a></li>
18
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
19
+ </ul>
20
+ </div>
21
+ <div class="tabs">
22
+ <ul>
23
+ <li><a href="files.html"><span>File&nbsp;List</span></a></li>
24
+ </ul>
25
+ </div>
26
+ <h1>EventedClient.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
27
+ <a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
28
+ <a name="l00003"></a>00003 <span class="comment"> * Copyright (c) 2010 Phusion</span>
29
+ <a name="l00004"></a>00004 <span class="comment"> *</span>
30
+ <a name="l00005"></a>00005 <span class="comment"> * &quot;Phusion Passenger&quot; is a trademark of Hongli Lai &amp; Ninh Bui.</span>
31
+ <a name="l00006"></a>00006 <span class="comment"> *</span>
32
+ <a name="l00007"></a>00007 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span>
33
+ <a name="l00008"></a>00008 <span class="comment"> * of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
34
+ <a name="l00009"></a>00009 <span class="comment"> * in the Software without restriction, including without limitation the rights</span>
35
+ <a name="l00010"></a>00010 <span class="comment"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
36
+ <a name="l00011"></a>00011 <span class="comment"> * copies of the Software, and to permit persons to whom the Software is</span>
37
+ <a name="l00012"></a>00012 <span class="comment"> * furnished to do so, subject to the following conditions:</span>
38
+ <a name="l00013"></a>00013 <span class="comment"> *</span>
39
+ <a name="l00014"></a>00014 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
40
+ <a name="l00015"></a>00015 <span class="comment"> * all copies or substantial portions of the Software.</span>
41
+ <a name="l00016"></a>00016 <span class="comment"> *</span>
42
+ <a name="l00017"></a>00017 <span class="comment"> * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
43
+ <a name="l00018"></a>00018 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
44
+ <a name="l00019"></a>00019 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
45
+ <a name="l00020"></a>00020 <span class="comment"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
46
+ <a name="l00021"></a>00021 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
47
+ <a name="l00022"></a>00022 <span class="comment"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
48
+ <a name="l00023"></a>00023 <span class="comment"> * THE SOFTWARE.</span>
49
+ <a name="l00024"></a>00024 <span class="comment"> */</span>
50
+ <a name="l00025"></a>00025 <span class="preprocessor">#ifndef _PASSENGER_EVENTED_CLIENT_H_</span>
51
+ <a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_EVENTED_CLIENT_H_</span>
52
+ <a name="l00027"></a>00027 <span class="preprocessor"></span>
53
+ <a name="l00028"></a>00028 <span class="preprocessor">#include &lt;ev++.h&gt;</span>
54
+ <a name="l00029"></a>00029 <span class="preprocessor">#include &lt;string&gt;</span>
55
+ <a name="l00030"></a>00030 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
56
+ <a name="l00031"></a>00031 <span class="preprocessor">#include &lt;cstdlib&gt;</span>
57
+ <a name="l00032"></a>00032 <span class="preprocessor">#include &lt;cerrno&gt;</span>
58
+ <a name="l00033"></a>00033 <span class="preprocessor">#include &lt;cassert&gt;</span>
59
+ <a name="l00034"></a>00034
60
+ <a name="l00035"></a>00035 <span class="preprocessor">#include &lt;boost/function.hpp&gt;</span>
61
+ <a name="l00036"></a>00036 <span class="preprocessor">#include &lt;oxt/system_calls.hpp&gt;</span>
62
+ <a name="l00037"></a>00037 <span class="preprocessor">#include &lt;oxt/thread.hpp&gt;</span>
63
+ <a name="l00038"></a>00038
64
+ <a name="l00039"></a>00039 <span class="preprocessor">#include &quot;FileDescriptor.h&quot;</span>
65
+ <a name="l00040"></a>00040 <span class="preprocessor">#include &quot;Utils/IOUtils.h&quot;</span>
66
+ <a name="l00041"></a>00041
67
+ <a name="l00042"></a>00042 <span class="keyword">namespace </span>Passenger {
68
+ <a name="l00043"></a>00043
69
+ <a name="l00044"></a>00044 <span class="keyword">using namespace </span>std;
70
+ <a name="l00045"></a>00045 <span class="keyword">using namespace </span>boost;
71
+ <a name="l00046"></a>00046 <span class="keyword">using namespace </span>oxt;
72
+ <a name="l00047"></a>00047
73
+ <a name="l00048"></a>00048 <span class="comment"></span>
74
+ <a name="l00049"></a>00049 <span class="comment">/**</span>
75
+ <a name="l00050"></a>00050 <span class="comment"> * A utility class for making I/O handling in non-blocking libev evented servers</span>
76
+ <a name="l00051"></a>00051 <span class="comment"> * much easier.</span>
77
+ <a name="l00052"></a>00052 <span class="comment"> * - An EventedClient is associated with a reference counted file descriptor.</span>
78
+ <a name="l00053"></a>00053 <span class="comment"> * - It contains connection state information (i.e. whether the connection is</span>
79
+ <a name="l00054"></a>00054 <span class="comment"> * established or closed). Callbacks are provided for watching connection</span>
80
+ <a name="l00055"></a>00055 <span class="comment"> * state changes (e.g. &lt;tt&gt;onDisconnect&lt;/tt&gt;).</span>
81
+ <a name="l00056"></a>00056 <span class="comment"> * - It provides reference counting features for simpler memory management</span>
82
+ <a name="l00057"></a>00057 <span class="comment"> * (&lt;tt&gt;ref()&lt;/tt&gt; and &lt;tt&gt;unref()&lt;/tt&gt;).</span>
83
+ <a name="l00058"></a>00058 <span class="comment"> * - It installs input and output readiness watchers that are unregistered</span>
84
+ <a name="l00059"></a>00059 <span class="comment"> * when the EventedClient is destroyed. One can hook into input readiness</span>
85
+ <a name="l00060"></a>00060 <span class="comment"> * watcher with the &lt;tt&gt;onReadable&lt;/tt&gt; callback.</span>
86
+ <a name="l00061"></a>00061 <span class="comment"> * - Makes zero-copy writes easy. The &lt;tt&gt;write()&lt;/tt&gt; method accepts an array</span>
87
+ <a name="l00062"></a>00062 <span class="comment"> * of buffers. Whenever possible, all of these buffers are written out in</span>
88
+ <a name="l00063"></a>00063 <span class="comment"> * the given order, using a single system call, without copying them into a</span>
89
+ <a name="l00064"></a>00064 <span class="comment"> * single temporary buffer.</span>
90
+ <a name="l00065"></a>00065 <span class="comment"> * - Makes non-blocking writes easy. Normally a write() system call on a</span>
91
+ <a name="l00066"></a>00066 <span class="comment"> * non-blocking socket can fail with EAGAIN if the socket send buffer is</span>
92
+ <a name="l00067"></a>00067 <span class="comment"> * full. EventedClient schedules the data to be sent later when the socket is</span>
93
+ <a name="l00068"></a>00068 <span class="comment"> * writable again. It automatically integrates into the main loop in order</span>
94
+ <a name="l00069"></a>00069 <span class="comment"> * to do this. This allows one to have write operations occur concurrently</span>
95
+ <a name="l00070"></a>00070 <span class="comment"> * with read operations.</span>
96
+ <a name="l00071"></a>00071 <span class="comment"> * In case too many scheduled writes are being piled up, EventedClient</span>
97
+ <a name="l00072"></a>00072 <span class="comment"> * is smart enough to temporarily disable read notifications and wait until</span>
98
+ <a name="l00073"></a>00073 <span class="comment"> * everything is written out before enabling read notifications again.</span>
99
+ <a name="l00074"></a>00074 <span class="comment"> * The definition of &quot;too many&quot; is customizable (&lt;tt&gt;setOutboxLimit()&lt;/tt&gt;).</span>
100
+ <a name="l00075"></a>00075 <span class="comment"> * - EventedClient&#39;s &lt;tt&gt;disconnect&lt;/tt&gt; method respects pending writes. It</span>
101
+ <a name="l00076"></a>00076 <span class="comment"> * will disconnect after all pending outgoing data have been written out.</span>
102
+ <a name="l00077"></a>00077 <span class="comment"> *</span>
103
+ <a name="l00078"></a>00078 <span class="comment"> * &lt;h2&gt;Basic usage&lt;/h2&gt;</span>
104
+ <a name="l00079"></a>00079 <span class="comment"> * Construct an EventedClient with a libev loop and a file descriptor:</span>
105
+ <a name="l00080"></a>00080 <span class="comment"> *</span>
106
+ <a name="l00081"></a>00081 <span class="comment"> * @code</span>
107
+ <a name="l00082"></a>00082 <span class="comment"> * EventedClient *client = new EventedClient(loop, fd);</span>
108
+ <a name="l00083"></a>00083 <span class="comment"> * @endcode</span>
109
+ <a name="l00084"></a>00084 <span class="comment"> *</span>
110
+ <a name="l00085"></a>00085 <span class="comment"> * You are probably interested in read readiness notifications on &lt;tt&gt;fd&lt;/tt&gt;.</span>
111
+ <a name="l00086"></a>00086 <span class="comment"> * However these notifications are disabled by default. You need to set the</span>
112
+ <a name="l00087"></a>00087 <span class="comment"> * &lt;tt&gt;onReadable&lt;/tt&gt; callback (which is called every time the fd is</span>
113
+ <a name="l00088"></a>00088 <span class="comment"> * readable) and enable read notifications.</span>
114
+ <a name="l00089"></a>00089 <span class="comment"> *</span>
115
+ <a name="l00090"></a>00090 <span class="comment"> * @code</span>
116
+ <a name="l00091"></a>00091 <span class="comment"> * void onReadable(EventedClient *client) {</span>
117
+ <a name="l00092"></a>00092 <span class="comment"> * // do whatever you want</span>
118
+ <a name="l00093"></a>00093 <span class="comment"> * }</span>
119
+ <a name="l00094"></a>00094 <span class="comment"> * </span>
120
+ <a name="l00095"></a>00095 <span class="comment"> * ...</span>
121
+ <a name="l00096"></a>00096 <span class="comment"> * client-&gt;onReadable = onReadable;</span>
122
+ <a name="l00097"></a>00097 <span class="comment"> * client-&gt;notifyReads(true);</span>
123
+ <a name="l00098"></a>00098 <span class="comment"> * @endcode</span>
124
+ <a name="l00099"></a>00099 <span class="comment"> *</span>
125
+ <a name="l00100"></a>00100 <span class="comment"> * &lt;h2&gt;Error handling&lt;/h2&gt;</span>
126
+ <a name="l00101"></a>00101 <span class="comment"> * EventedClient never raises exceptions, except when your callbacks do.</span>
127
+ <a name="l00102"></a>00102 <span class="comment"> * It reports errors with the &lt;tt&gt;onSystemError&lt;/tt&gt; callback. That said,</span>
128
+ <a name="l00103"></a>00103 <span class="comment"> * EventedClient is exception-aware and will ensure that its internal</span>
129
+ <a name="l00104"></a>00104 <span class="comment"> * state stays consistent even when your callbacks throw exceptions.</span>
130
+ <a name="l00105"></a>00105 <span class="comment"> */</span>
131
+ <a name="l00106"></a><a class="code" href="classPassenger_1_1EventedClient.html">00106</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> {
132
+ <a name="l00107"></a>00107 <span class="keyword">public</span>:
133
+ <a name="l00108"></a>00108 <span class="keyword">typedef</span> void (*Callback)(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client);
134
+ <a name="l00109"></a>00109 <span class="keyword">typedef</span> void (*SystemErrorCallback)(<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a> *client, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;message, <span class="keywordtype">int</span> code);
135
+ <a name="l00110"></a>00110
136
+ <a name="l00111"></a>00111 <span class="keyword">private</span>:
137
+ <a name="l00112"></a>00112 <span class="keyword">enum</span> {<span class="comment"></span>
138
+ <a name="l00113"></a>00113 <span class="comment"> /**</span>
139
+ <a name="l00114"></a>00114 <span class="comment"> * This is the initial state for a client. It means we&#39;re</span>
140
+ <a name="l00115"></a>00115 <span class="comment"> * connected to the client, ready to receive data and</span>
141
+ <a name="l00116"></a>00116 <span class="comment"> * there&#39;s no pending outgoing data. In this state we will</span>
142
+ <a name="l00117"></a>00117 <span class="comment"> * only be watching for read events.</span>
143
+ <a name="l00118"></a>00118 <span class="comment"> */</span>
144
+ <a name="l00119"></a>00119 EC_CONNECTED,
145
+ <a name="l00120"></a>00120 <span class="comment"></span>
146
+ <a name="l00121"></a>00121 <span class="comment"> /**</span>
147
+ <a name="l00122"></a>00122 <span class="comment"> * This state is entered from EC_CONNECTED when the write()</span>
148
+ <a name="l00123"></a>00123 <span class="comment"> * method fails to send all data immediately and EventedClient</span>
149
+ <a name="l00124"></a>00124 <span class="comment"> * schedules some data to be sent later, when the socket becomes</span>
150
+ <a name="l00125"></a>00125 <span class="comment"> * readable again. In here we will be watching for read</span>
151
+ <a name="l00126"></a>00126 <span class="comment"> * and write events.</span>
152
+ <a name="l00127"></a>00127 <span class="comment"> */</span>
153
+ <a name="l00128"></a>00128 EC_WRITES_PENDING,
154
+ <a name="l00129"></a>00129 <span class="comment"></span>
155
+ <a name="l00130"></a>00130 <span class="comment"> /**</span>
156
+ <a name="l00131"></a>00131 <span class="comment"> * This state is entered from EC_WRITES_PENDING or from EC_CONNECTED</span>
157
+ <a name="l00132"></a>00132 <span class="comment"> * when the write() method fails to send all data immediately, and</span>
158
+ <a name="l00133"></a>00133 <span class="comment"> * the amount of data to be scheduled to be sent later is larger</span>
159
+ <a name="l00134"></a>00134 <span class="comment"> * than the specified outbox limit. In this state, EventedClient</span>
160
+ <a name="l00135"></a>00135 <span class="comment"> * will not watch for read events and will instead concentrate on</span>
161
+ <a name="l00136"></a>00136 <span class="comment"> * sending out all pending data before watching read events again.</span>
162
+ <a name="l00137"></a>00137 <span class="comment"> * When all pending data has been sent out the system will transition</span>
163
+ <a name="l00138"></a>00138 <span class="comment"> * to EC_CONNECTED.</span>
164
+ <a name="l00139"></a>00139 <span class="comment"> */</span>
165
+ <a name="l00140"></a>00140 EC_TOO_MANY_WRITES_PENDING,
166
+ <a name="l00141"></a>00141 <span class="comment"></span>
167
+ <a name="l00142"></a>00142 <span class="comment"> /**</span>
168
+ <a name="l00143"></a>00143 <span class="comment"> * This state is entered from the EC_WRITES_PENDING or the</span>
169
+ <a name="l00144"></a>00144 <span class="comment"> * EC_TOO_MANY_WRITES_PENDING state when disconnect() is called.</span>
170
+ <a name="l00145"></a>00145 <span class="comment"> * It means that we want to close the connection as soon as all</span>
171
+ <a name="l00146"></a>00146 <span class="comment"> * pending outgoing data has been sent. As soon as that happens</span>
172
+ <a name="l00147"></a>00147 <span class="comment"> * it&#39;ll transition to EC_DISCONNECTED. In this state no further</span>
173
+ <a name="l00148"></a>00148 <span class="comment"> * I/O should be allowed.</span>
174
+ <a name="l00149"></a>00149 <span class="comment"> */</span>
175
+ <a name="l00150"></a>00150 EC_DISCONNECTING_WITH_WRITES_PENDING,
176
+ <a name="l00151"></a>00151 <span class="comment"></span>
177
+ <a name="l00152"></a>00152 <span class="comment"> /**</span>
178
+ <a name="l00153"></a>00153 <span class="comment"> * Final state. Client connection has been closed. No</span>
179
+ <a name="l00154"></a>00154 <span class="comment"> * I/O with the client is possible.</span>
180
+ <a name="l00155"></a>00155 <span class="comment"> */</span>
181
+ <a name="l00156"></a>00156 EC_DISCONNECTED
182
+ <a name="l00157"></a>00157 } state;
183
+ <a name="l00158"></a>00158 <span class="comment"></span>
184
+ <a name="l00159"></a>00159 <span class="comment"> /** A libev watcher on for watching read events on &lt;tt&gt;fd&lt;/tt&gt;. */</span>
185
+ <a name="l00160"></a>00160 ev::io readWatcher;<span class="comment"></span>
186
+ <a name="l00161"></a>00161 <span class="comment"> /** A libev watcher on for watching write events on &lt;tt&gt;fd&lt;/tt&gt;. */</span>
187
+ <a name="l00162"></a>00162 ev::io writeWatcher;<span class="comment"></span>
188
+ <a name="l00163"></a>00163 <span class="comment"> /** Storage for data that could not be sent out immediately. */</span>
189
+ <a name="l00164"></a>00164 <span class="keywordtype">string</span> outbox;
190
+ <a name="l00165"></a>00165 <span class="keywordtype">int</span> refcount;
191
+ <a name="l00166"></a>00166 <span class="keywordtype">bool</span> m_notifyReads;
192
+ <a name="l00167"></a>00167 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outboxLimit;
193
+ <a name="l00168"></a>00168
194
+ <a name="l00169"></a>00169 <span class="keywordtype">void</span> _onReadable(ev::io &amp;w, <span class="keywordtype">int</span> revents) {
195
+ <a name="l00170"></a>00170 emitEvent(<a class="code" href="classPassenger_1_1EventedClient.html#a155988f311fba920bef3031f3d9b6f6a" title="Called when the file descriptor becomes readable and read notifications are enabled...">onReadable</a>);
196
+ <a name="l00171"></a>00171 }
197
+ <a name="l00172"></a>00172
198
+ <a name="l00173"></a>00173 <span class="keywordtype">void</span> onWritable(ev::io &amp;w, <span class="keywordtype">int</span> revents) {
199
+ <a name="l00174"></a>00174 assert(state != EC_DISCONNECTED);
200
+ <a name="l00175"></a>00175
201
+ <a name="l00176"></a>00176 this_thread::disable_interruption di;
202
+ <a name="l00177"></a>00177 this_thread::disable_syscall_interruption dsi;
203
+ <a name="l00178"></a>00178 <span class="keywordtype">size_t</span> sent = 0;
204
+ <a name="l00179"></a>00179 <span class="keywordtype">bool</span> done = outbox.empty();
205
+ <a name="l00180"></a>00180
206
+ <a name="l00181"></a>00181 <span class="keywordflow">while</span> (!done) {
207
+ <a name="l00182"></a>00182 ssize_t ret = syscalls::write(<a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>,
208
+ <a name="l00183"></a>00183 outbox.data() + sent,
209
+ <a name="l00184"></a>00184 outbox.size() - sent);
210
+ <a name="l00185"></a>00185 <span class="keywordflow">if</span> (ret == -1) {
211
+ <a name="l00186"></a>00186 <span class="keywordflow">if</span> (errno != EAGAIN) {
212
+ <a name="l00187"></a>00187 <span class="keywordtype">int</span> e = errno;
213
+ <a name="l00188"></a>00188 <a class="code" href="classPassenger_1_1EventedClient.html#a5b1a3011165ea9a47f6fe668a5010a20" title="Disconnects the client.">disconnect</a>(<span class="keyword">true</span>);
214
+ <a name="l00189"></a>00189 emitSystemErrorEvent(<span class="stringliteral">&quot;Cannot write data to client&quot;</span>, e);
215
+ <a name="l00190"></a>00190 <span class="keywordflow">return</span>;
216
+ <a name="l00191"></a>00191 }
217
+ <a name="l00192"></a>00192 done = <span class="keyword">true</span>;
218
+ <a name="l00193"></a>00193 } <span class="keywordflow">else</span> {
219
+ <a name="l00194"></a>00194 sent += ret;
220
+ <a name="l00195"></a>00195 done = sent == outbox.size();
221
+ <a name="l00196"></a>00196 }
222
+ <a name="l00197"></a>00197 }
223
+ <a name="l00198"></a>00198 <span class="keywordflow">if</span> (sent &gt; 0) {
224
+ <a name="l00199"></a>00199 outbox.erase(0, sent);
225
+ <a name="l00200"></a>00200 }
226
+ <a name="l00201"></a>00201
227
+ <a name="l00202"></a>00202 updateWatcherStates();
228
+ <a name="l00203"></a>00203 <span class="keywordflow">if</span> (outbox.empty()) {
229
+ <a name="l00204"></a>00204 emitEvent(<a class="code" href="classPassenger_1_1EventedClient.html#a22e93ce2be05a4f47dbeba95d79a79b9" title="Called after all pending outgoing data have been written out.">onPendingDataFlushed</a>);
230
+ <a name="l00205"></a>00205 }
231
+ <a name="l00206"></a>00206 }
232
+ <a name="l00207"></a>00207
233
+ <a name="l00208"></a>00208 <span class="keywordtype">bool</span> outboxTooLarge() {
234
+ <a name="l00209"></a>00209 <span class="keywordflow">return</span> outbox.size() &gt; 0 &amp;&amp; outbox.size() &gt;= outboxLimit;
235
+ <a name="l00210"></a>00210 }
236
+ <a name="l00211"></a>00211
237
+ <a name="l00212"></a>00212 <span class="keywordtype">void</span> updateWatcherStates() {
238
+ <a name="l00213"></a>00213 <span class="keywordflow">if</span> (outbox.empty()) {
239
+ <a name="l00214"></a>00214 <span class="keywordflow">switch</span> (state) {
240
+ <a name="l00215"></a>00215 <span class="keywordflow">case</span> EC_CONNECTED:
241
+ <a name="l00216"></a>00216 watchReadEvents(m_notifyReads);
242
+ <a name="l00217"></a>00217 watchWriteEvents(<span class="keyword">false</span>);
243
+ <a name="l00218"></a>00218 <span class="keywordflow">break</span>;
244
+ <a name="l00219"></a>00219 <span class="keywordflow">case</span> EC_WRITES_PENDING:
245
+ <a name="l00220"></a>00220 <span class="keywordflow">case</span> EC_TOO_MANY_WRITES_PENDING:
246
+ <a name="l00221"></a>00221 state = EC_CONNECTED;
247
+ <a name="l00222"></a>00222 watchReadEvents(m_notifyReads);
248
+ <a name="l00223"></a>00223 watchWriteEvents(<span class="keyword">false</span>);
249
+ <a name="l00224"></a>00224 <span class="keywordflow">break</span>;
250
+ <a name="l00225"></a>00225 <span class="keywordflow">case</span> EC_DISCONNECTING_WITH_WRITES_PENDING:
251
+ <a name="l00226"></a>00226 state = EC_DISCONNECTED;
252
+ <a name="l00227"></a>00227 watchReadEvents(<span class="keyword">false</span>);
253
+ <a name="l00228"></a>00228 watchWriteEvents(<span class="keyword">false</span>);
254
+ <a name="l00229"></a>00229 <span class="keywordflow">try</span> {
255
+ <a name="l00230"></a>00230 <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>.<a class="code" href="classPassenger_1_1FileDescriptor.html#ad7c1a99531181878cbab74a7400c5432" title="Close the underlying file descriptor.">close</a>();
256
+ <a name="l00231"></a>00231 } <span class="keywordflow">catch</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;e) {
257
+ <a name="l00232"></a>00232 emitSystemErrorEvent(e.<a class="code" href="classPassenger_1_1SystemException.html#a84fa2ab4f5b7b96704734fcdfdaa0269" title="Returns a brief version of the exception message.">brief</a>(), e.<a class="code" href="classPassenger_1_1SystemException.html#aee7a6672bf79b72a4c3ee70c57d6a47c" title="The value of errno at the time the error occured.">code</a>());
258
+ <a name="l00233"></a>00233 }
259
+ <a name="l00234"></a>00234 emitEvent(<a class="code" href="classPassenger_1_1EventedClient.html#a211210ecd85eb2da47d200215132bb2d" title="Called when the client is disconnected.">onDisconnect</a>);
260
+ <a name="l00235"></a>00235 <span class="keywordflow">break</span>;
261
+ <a name="l00236"></a>00236 <span class="keywordflow">default</span>:
262
+ <a name="l00237"></a>00237 <span class="comment">// Should never be reached.</span>
263
+ <a name="l00238"></a>00238 abort();
264
+ <a name="l00239"></a>00239 }
265
+ <a name="l00240"></a>00240 } <span class="keywordflow">else</span> {
266
+ <a name="l00241"></a>00241 <span class="keywordflow">switch</span> (state) {
267
+ <a name="l00242"></a>00242 <span class="keywordflow">case</span> EC_CONNECTED:
268
+ <a name="l00243"></a>00243 <span class="keywordflow">if</span> (outboxTooLarge()) {
269
+ <a name="l00244"></a>00244 <span class="comment">// If we have way too much stuff in the outbox then</span>
270
+ <a name="l00245"></a>00245 <span class="comment">// suspend reading until we&#39;ve sent out the entire outbox.</span>
271
+ <a name="l00246"></a>00246 state = EC_TOO_MANY_WRITES_PENDING;
272
+ <a name="l00247"></a>00247 watchReadEvents(<span class="keyword">false</span>);
273
+ <a name="l00248"></a>00248 watchWriteEvents(<span class="keyword">true</span>);
274
+ <a name="l00249"></a>00249 } <span class="keywordflow">else</span> {
275
+ <a name="l00250"></a>00250 state = EC_WRITES_PENDING;
276
+ <a name="l00251"></a>00251 watchReadEvents(m_notifyReads);
277
+ <a name="l00252"></a>00252 watchWriteEvents(<span class="keyword">true</span>);
278
+ <a name="l00253"></a>00253 }
279
+ <a name="l00254"></a>00254 <span class="keywordflow">break</span>;
280
+ <a name="l00255"></a>00255 <span class="keywordflow">case</span> EC_WRITES_PENDING:
281
+ <a name="l00256"></a>00256 watchReadEvents(m_notifyReads);
282
+ <a name="l00257"></a>00257 watchWriteEvents(<span class="keyword">true</span>);
283
+ <a name="l00258"></a>00258 <span class="keywordflow">break</span>;
284
+ <a name="l00259"></a>00259 <span class="keywordflow">case</span> EC_TOO_MANY_WRITES_PENDING:
285
+ <a name="l00260"></a>00260 <span class="keywordflow">case</span> EC_DISCONNECTING_WITH_WRITES_PENDING:
286
+ <a name="l00261"></a>00261 watchReadEvents(<span class="keyword">false</span>);
287
+ <a name="l00262"></a>00262 watchWriteEvents(<span class="keyword">true</span>);
288
+ <a name="l00263"></a>00263 <span class="keywordflow">break</span>;
289
+ <a name="l00264"></a>00264 <span class="keywordflow">default</span>:
290
+ <a name="l00265"></a>00265 <span class="comment">// Should never be reached.</span>
291
+ <a name="l00266"></a>00266 abort();
292
+ <a name="l00267"></a>00267 }
293
+ <a name="l00268"></a>00268 }
294
+ <a name="l00269"></a>00269 }
295
+ <a name="l00270"></a>00270
296
+ <a name="l00271"></a>00271 <span class="keywordtype">void</span> watchReadEvents(<span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
297
+ <a name="l00272"></a>00272 <span class="keywordflow">if</span> (readWatcher.is_active() &amp;&amp; !enable) {
298
+ <a name="l00273"></a>00273 readWatcher.stop();
299
+ <a name="l00274"></a>00274 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!readWatcher.is_active() &amp;&amp; enable) {
300
+ <a name="l00275"></a>00275 readWatcher.start();
301
+ <a name="l00276"></a>00276 }
302
+ <a name="l00277"></a>00277 }
303
+ <a name="l00278"></a>00278
304
+ <a name="l00279"></a>00279 <span class="keywordtype">void</span> watchWriteEvents(<span class="keywordtype">bool</span> enable = <span class="keyword">true</span>) {
305
+ <a name="l00280"></a>00280 <span class="keywordflow">if</span> (writeWatcher.is_active() &amp;&amp; !enable) {
306
+ <a name="l00281"></a>00281 writeWatcher.stop();
307
+ <a name="l00282"></a>00282 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!writeWatcher.is_active() &amp;&amp; enable) {
308
+ <a name="l00283"></a>00283 writeWatcher.start();
309
+ <a name="l00284"></a>00284 }
310
+ <a name="l00285"></a>00285 }
311
+ <a name="l00286"></a>00286
312
+ <a name="l00287"></a>00287 <span class="keywordtype">void</span> emitEvent(Callback callback) {
313
+ <a name="l00288"></a>00288 <span class="keywordflow">if</span> (callback != NULL) {
314
+ <a name="l00289"></a>00289 callback(<span class="keyword">this</span>);
315
+ <a name="l00290"></a>00290 }
316
+ <a name="l00291"></a>00291 }
317
+ <a name="l00292"></a>00292
318
+ <a name="l00293"></a>00293 <span class="keywordtype">void</span> emitSystemErrorEvent(<span class="keyword">const</span> <span class="keywordtype">string</span> &amp;message, <span class="keywordtype">int</span> code) {
319
+ <a name="l00294"></a>00294 <span class="keywordflow">if</span> (<a class="code" href="classPassenger_1_1EventedClient.html#a9522b2c5a42d75a93ed865e74510818f" title="System call errors are reported with this callback.">onSystemError</a> != NULL) {
320
+ <a name="l00295"></a>00295 <a class="code" href="classPassenger_1_1EventedClient.html#a9522b2c5a42d75a93ed865e74510818f" title="System call errors are reported with this callback.">onSystemError</a>(<span class="keyword">this</span>, message, code);
321
+ <a name="l00296"></a>00296 }
322
+ <a name="l00297"></a>00297 }
323
+ <a name="l00298"></a>00298
324
+ <a name="l00299"></a>00299 <span class="keyword">public</span>:<span class="comment"></span>
325
+ <a name="l00300"></a>00300 <span class="comment"> /** The client&#39;s file descriptor. Could be -1: see &lt;tt&gt;ioAllowed()&lt;/tt&gt;. */</span>
326
+ <a name="l00301"></a><a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491">00301</a> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>;
327
+ <a name="l00302"></a>00302 <span class="comment"></span>
328
+ <a name="l00303"></a>00303 <span class="comment"> /**</span>
329
+ <a name="l00304"></a>00304 <span class="comment"> * Called when the file descriptor becomes readable and read notifications</span>
330
+ <a name="l00305"></a>00305 <span class="comment"> * are enabled (see &lt;tt&gt;notifyRead()&lt;/tt&gt;). When there&#39;s too much pending</span>
331
+ <a name="l00306"></a>00306 <span class="comment"> * outgoing data, readability notifications are temporarily disabled; see</span>
332
+ <a name="l00307"></a>00307 <span class="comment"> * &lt;tt&gt;write()&lt;/tt&gt; for details.</span>
333
+ <a name="l00308"></a>00308 <span class="comment"> */</span>
334
+ <a name="l00309"></a><a class="code" href="classPassenger_1_1EventedClient.html#a155988f311fba920bef3031f3d9b6f6a">00309</a> Callback <a class="code" href="classPassenger_1_1EventedClient.html#a155988f311fba920bef3031f3d9b6f6a" title="Called when the file descriptor becomes readable and read notifications are enabled...">onReadable</a>;
335
+ <a name="l00310"></a>00310 <span class="comment"></span>
336
+ <a name="l00311"></a>00311 <span class="comment"> /**</span>
337
+ <a name="l00312"></a>00312 <span class="comment"> * Called when the client is disconnected. This happens either immediately</span>
338
+ <a name="l00313"></a>00313 <span class="comment"> * when &lt;tt&gt;disconnect()&lt;/tt&gt; is called, or a short amount of time later.</span>
339
+ <a name="l00314"></a>00314 <span class="comment"> * See the documentation for that function for details.</span>
340
+ <a name="l00315"></a>00315 <span class="comment"> *</span>
341
+ <a name="l00316"></a>00316 <span class="comment"> * Please note that destroying an EventedClient object does *not* cause</span>
342
+ <a name="l00317"></a>00317 <span class="comment"> * this callback to be called.</span>
343
+ <a name="l00318"></a>00318 <span class="comment"> */</span>
344
+ <a name="l00319"></a><a class="code" href="classPassenger_1_1EventedClient.html#a211210ecd85eb2da47d200215132bb2d">00319</a> Callback <a class="code" href="classPassenger_1_1EventedClient.html#a211210ecd85eb2da47d200215132bb2d" title="Called when the client is disconnected.">onDisconnect</a>;
345
+ <a name="l00320"></a>00320 <span class="comment"></span>
346
+ <a name="l00321"></a>00321 <span class="comment"> /**</span>
347
+ <a name="l00322"></a>00322 <span class="comment"> * Called when &lt;tt&gt;detach()&lt;/tt&gt; is called for the first time.</span>
348
+ <a name="l00323"></a>00323 <span class="comment"> */</span>
349
+ <a name="l00324"></a><a class="code" href="classPassenger_1_1EventedClient.html#a742805d40508b0af89eb2ed2c1e50060">00324</a> Callback <a class="code" href="classPassenger_1_1EventedClient.html#a742805d40508b0af89eb2ed2c1e50060" title="Called when detach() is called for the first time.">onDetach</a>;
350
+ <a name="l00325"></a>00325 <span class="comment"></span>
351
+ <a name="l00326"></a>00326 <span class="comment"> /**</span>
352
+ <a name="l00327"></a>00327 <span class="comment"> * Called after all pending outgoing data have been written out.</span>
353
+ <a name="l00328"></a>00328 <span class="comment"> * If &lt;tt&gt;write()&lt;/tt&gt; can be completed immediately without scheduling</span>
354
+ <a name="l00329"></a>00329 <span class="comment"> * data for later, then &lt;tt&gt;write()&lt;/tt&gt; will call this callback</span>
355
+ <a name="l00330"></a>00330 <span class="comment"> * immediately after writing.</span>
356
+ <a name="l00331"></a>00331 <span class="comment"> */</span>
357
+ <a name="l00332"></a><a class="code" href="classPassenger_1_1EventedClient.html#a22e93ce2be05a4f47dbeba95d79a79b9">00332</a> Callback <a class="code" href="classPassenger_1_1EventedClient.html#a22e93ce2be05a4f47dbeba95d79a79b9" title="Called after all pending outgoing data have been written out.">onPendingDataFlushed</a>;
358
+ <a name="l00333"></a>00333 <span class="comment"></span>
359
+ <a name="l00334"></a>00334 <span class="comment"> /**</span>
360
+ <a name="l00335"></a>00335 <span class="comment"> * System call errors are reported with this callback.</span>
361
+ <a name="l00336"></a>00336 <span class="comment"> */</span>
362
+ <a name="l00337"></a><a class="code" href="classPassenger_1_1EventedClient.html#a9522b2c5a42d75a93ed865e74510818f">00337</a> SystemErrorCallback <a class="code" href="classPassenger_1_1EventedClient.html#a9522b2c5a42d75a93ed865e74510818f" title="System call errors are reported with this callback.">onSystemError</a>;
363
+ <a name="l00338"></a>00338 <span class="comment"></span>
364
+ <a name="l00339"></a>00339 <span class="comment"> /**</span>
365
+ <a name="l00340"></a>00340 <span class="comment"> * EventedClient doesn&#39;t do anything with this. Set it to whatever you want.</span>
366
+ <a name="l00341"></a>00341 <span class="comment"> */</span>
367
+ <a name="l00342"></a><a class="code" href="classPassenger_1_1EventedClient.html#a793c843b7ba01cc1bb2c568c6539b9e0">00342</a> <span class="keywordtype">void</span> *<a class="code" href="classPassenger_1_1EventedClient.html#a793c843b7ba01cc1bb2c568c6539b9e0" title="EventedClient doesn&amp;#39;t do anything with this.">userData</a>;
368
+ <a name="l00343"></a>00343 <span class="comment"></span>
369
+ <a name="l00344"></a>00344 <span class="comment"> /**</span>
370
+ <a name="l00345"></a>00345 <span class="comment"> * Creates a new EventedClient with the given libev loop and file descriptor.</span>
371
+ <a name="l00346"></a>00346 <span class="comment"> * The initial reference count is 1.</span>
372
+ <a name="l00347"></a>00347 <span class="comment"> */</span>
373
+ <a name="l00348"></a><a class="code" href="classPassenger_1_1EventedClient.html#ac3c45bfa7ac30b6d59ef08dc296f3c4e">00348</a> <a class="code" href="classPassenger_1_1EventedClient.html#ac3c45bfa7ac30b6d59ef08dc296f3c4e" title="Creates a new EventedClient with the given libev loop and file descriptor.">EventedClient</a>(<span class="keyword">struct</span> ev_loop *loop, <span class="keyword">const</span> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> &amp;_fd)
374
+ <a name="l00349"></a>00349 : readWatcher(loop),
375
+ <a name="l00350"></a>00350 writeWatcher(loop),
376
+ <a name="l00351"></a>00351 <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>(_fd)
377
+ <a name="l00352"></a>00352 {
378
+ <a name="l00353"></a>00353 state = EC_CONNECTED;
379
+ <a name="l00354"></a>00354 refcount = 1;
380
+ <a name="l00355"></a>00355 m_notifyReads = <span class="keyword">false</span>;
381
+ <a name="l00356"></a>00356 outboxLimit = 1024 * 32;
382
+ <a name="l00357"></a>00357 <a class="code" href="classPassenger_1_1EventedClient.html#a155988f311fba920bef3031f3d9b6f6a" title="Called when the file descriptor becomes readable and read notifications are enabled...">onReadable</a> = NULL;
383
+ <a name="l00358"></a>00358 <a class="code" href="classPassenger_1_1EventedClient.html#a211210ecd85eb2da47d200215132bb2d" title="Called when the client is disconnected.">onDisconnect</a> = NULL;
384
+ <a name="l00359"></a>00359 <a class="code" href="classPassenger_1_1EventedClient.html#a742805d40508b0af89eb2ed2c1e50060" title="Called when detach() is called for the first time.">onDetach</a> = NULL;
385
+ <a name="l00360"></a>00360 <a class="code" href="classPassenger_1_1EventedClient.html#a22e93ce2be05a4f47dbeba95d79a79b9" title="Called after all pending outgoing data have been written out.">onPendingDataFlushed</a> = NULL;
386
+ <a name="l00361"></a>00361 <a class="code" href="classPassenger_1_1EventedClient.html#a9522b2c5a42d75a93ed865e74510818f" title="System call errors are reported with this callback.">onSystemError</a> = NULL;
387
+ <a name="l00362"></a>00362 <a class="code" href="classPassenger_1_1EventedClient.html#a793c843b7ba01cc1bb2c568c6539b9e0" title="EventedClient doesn&amp;#39;t do anything with this.">userData</a> = NULL;
388
+ <a name="l00363"></a>00363 readWatcher.set(<a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>, ev::READ);
389
+ <a name="l00364"></a>00364 readWatcher.set&lt;<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a>, &amp;EventedClient::_onReadable&gt;(<span class="keyword">this</span>);
390
+ <a name="l00365"></a>00365 writeWatcher.set&lt;<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a>, &amp;EventedClient::onWritable&gt;(<span class="keyword">this</span>);
391
+ <a name="l00366"></a>00366 writeWatcher.set(<a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>, ev::WRITE);
392
+ <a name="l00367"></a>00367 }
393
+ <a name="l00368"></a>00368
394
+ <a name="l00369"></a>00369 <span class="keyword">virtual</span> ~<a class="code" href="classPassenger_1_1EventedClient.html" title="A utility class for making I/O handling in non-blocking libev evented servers much...">EventedClient</a>() {
395
+ <a name="l00370"></a>00370 <span class="comment">// Unregister file descriptor from the event loop poller before</span>
396
+ <a name="l00371"></a>00371 <span class="comment">// closing the file descriptor.</span>
397
+ <a name="l00372"></a>00372 watchReadEvents(<span class="keyword">false</span>);
398
+ <a name="l00373"></a>00373 watchWriteEvents(<span class="keyword">false</span>);
399
+ <a name="l00374"></a>00374 }
400
+ <a name="l00375"></a>00375 <span class="comment"></span>
401
+ <a name="l00376"></a>00376 <span class="comment"> /**</span>
402
+ <a name="l00377"></a>00377 <span class="comment"> * Increase reference count.</span>
403
+ <a name="l00378"></a>00378 <span class="comment"> */</span>
404
+ <a name="l00379"></a><a class="code" href="classPassenger_1_1EventedClient.html#aec0aee41bd623d7a3f3cd8ae201ba717">00379</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedClient.html#aec0aee41bd623d7a3f3cd8ae201ba717" title="Increase reference count.">ref</a>() {
405
+ <a name="l00380"></a>00380 refcount++;
406
+ <a name="l00381"></a>00381 }
407
+ <a name="l00382"></a>00382 <span class="comment"></span>
408
+ <a name="l00383"></a>00383 <span class="comment"> /**</span>
409
+ <a name="l00384"></a>00384 <span class="comment"> * Decrease reference count. Upon reaching 0, this EventedClient object</span>
410
+ <a name="l00385"></a>00385 <span class="comment"> * will be destroyed.</span>
411
+ <a name="l00386"></a>00386 <span class="comment"> */</span>
412
+ <a name="l00387"></a><a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190">00387</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedClient.html#a1e480f15dfd339ff781f8daedc5b8190" title="Decrease reference count.">unref</a>() {
413
+ <a name="l00388"></a>00388 refcount--;
414
+ <a name="l00389"></a>00389 assert(refcount &gt;= 0);
415
+ <a name="l00390"></a>00390 <span class="keywordflow">if</span> (refcount == 0) {
416
+ <a name="l00391"></a>00391 <span class="keyword">delete</span> <span class="keyword">this</span>;
417
+ <a name="l00392"></a>00392 }
418
+ <a name="l00393"></a>00393 }
419
+ <a name="l00394"></a>00394 <span class="comment"></span>
420
+ <a name="l00395"></a>00395 <span class="comment"> /**</span>
421
+ <a name="l00396"></a>00396 <span class="comment"> * Returns whether it is allowed to perform any I/O with this client.</span>
422
+ <a name="l00397"></a>00397 <span class="comment"> * Usually true, and false when the client is either being disconnected</span>
423
+ <a name="l00398"></a>00398 <span class="comment"> * or has been disconnected. A return value of false indicates that</span>
424
+ <a name="l00399"></a>00399 <span class="comment"> * &lt;tt&gt;fd&lt;/tt&gt; might be -1, but even when it isn&#39;t -1 you shouldn&#39;t</span>
425
+ <a name="l00400"></a>00400 <span class="comment"> * access &lt;tt&gt;fd&lt;/tt&gt; anymore.</span>
426
+ <a name="l00401"></a>00401 <span class="comment"> */</span>
427
+ <a name="l00402"></a><a class="code" href="classPassenger_1_1EventedClient.html#a50436eb8ec0cc38b5a7278962e98a22c">00402</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1EventedClient.html#a50436eb8ec0cc38b5a7278962e98a22c" title="Returns whether it is allowed to perform any I/O with this client.">ioAllowed</a>()<span class="keyword"> const </span>{
428
+ <a name="l00403"></a>00403 <span class="keywordflow">return</span> state != EC_DISCONNECTING_WITH_WRITES_PENDING
429
+ <a name="l00404"></a>00404 &amp;&amp; state != EC_DISCONNECTED;
430
+ <a name="l00405"></a>00405 }
431
+ <a name="l00406"></a>00406 <span class="comment"></span>
432
+ <a name="l00407"></a>00407 <span class="comment"> /** Used by unit tests. */</span>
433
+ <a name="l00408"></a><a class="code" href="classPassenger_1_1EventedClient.html#a129f6d6a6123c9af1999eca4ae04a75a">00408</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1EventedClient.html#a129f6d6a6123c9af1999eca4ae04a75a" title="Used by unit tests.">readWatcherActive</a>()<span class="keyword"> const </span>{
434
+ <a name="l00409"></a>00409 <span class="keywordflow">return</span> readWatcher.is_active();
435
+ <a name="l00410"></a>00410 }
436
+ <a name="l00411"></a>00411 <span class="comment"></span>
437
+ <a name="l00412"></a>00412 <span class="comment"> /**</span>
438
+ <a name="l00413"></a>00413 <span class="comment"> * Returns the number of bytes that are scheduled to be sent to the</span>
439
+ <a name="l00414"></a>00414 <span class="comment"> * client at a later time.</span>
440
+ <a name="l00415"></a>00415 <span class="comment"> * </span>
441
+ <a name="l00416"></a>00416 <span class="comment"> * @see write()</span>
442
+ <a name="l00417"></a>00417 <span class="comment"> */</span>
443
+ <a name="l00418"></a><a class="code" href="classPassenger_1_1EventedClient.html#a0a032e54979b074641ffda807648a6e2">00418</a> <span class="keywordtype">size_t</span> <a class="code" href="classPassenger_1_1EventedClient.html#a0a032e54979b074641ffda807648a6e2" title="Returns the number of bytes that are scheduled to be sent to the client at a later...">pendingWrites</a>()<span class="keyword"> const </span>{
444
+ <a name="l00419"></a>00419 <span class="keywordflow">return</span> outbox.size();
445
+ <a name="l00420"></a>00420 }
446
+ <a name="l00421"></a>00421 <span class="comment"></span>
447
+ <a name="l00422"></a>00422 <span class="comment"> /**</span>
448
+ <a name="l00423"></a>00423 <span class="comment"> * Sets whether you&#39;re interested in read events. This will start or</span>
449
+ <a name="l00424"></a>00424 <span class="comment"> * stop the input readiness watcher appropriately according to the</span>
450
+ <a name="l00425"></a>00425 <span class="comment"> * current state.</span>
451
+ <a name="l00426"></a>00426 <span class="comment"> *</span>
452
+ <a name="l00427"></a>00427 <span class="comment"> * If the client connection is already being closed or has already</span>
453
+ <a name="l00428"></a>00428 <span class="comment"> * been closed then this method does nothing.</span>
454
+ <a name="l00429"></a>00429 <span class="comment"> */</span>
455
+ <a name="l00430"></a><a class="code" href="classPassenger_1_1EventedClient.html#a56ac52f1a4e77c49f72202d16e588f2f">00430</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedClient.html#a56ac52f1a4e77c49f72202d16e588f2f" title="Sets whether you&amp;#39;re interested in read events.">notifyReads</a>(<span class="keywordtype">bool</span> enable) {
456
+ <a name="l00431"></a>00431 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1EventedClient.html#a50436eb8ec0cc38b5a7278962e98a22c" title="Returns whether it is allowed to perform any I/O with this client.">ioAllowed</a>()) {
457
+ <a name="l00432"></a>00432 <span class="keywordflow">return</span>;
458
+ <a name="l00433"></a>00433 }
459
+ <a name="l00434"></a>00434
460
+ <a name="l00435"></a>00435 this_thread::disable_interruption di;
461
+ <a name="l00436"></a>00436 this_thread::disable_syscall_interruption dsi;
462
+ <a name="l00437"></a>00437 m_notifyReads = enable;
463
+ <a name="l00438"></a>00438 updateWatcherStates();
464
+ <a name="l00439"></a>00439 }
465
+ <a name="l00440"></a>00440 <span class="comment"></span>
466
+ <a name="l00441"></a>00441 <span class="comment"> /**</span>
467
+ <a name="l00442"></a>00442 <span class="comment"> * Sets a limit on the client outbox. The outbox is where data is stored</span>
468
+ <a name="l00443"></a>00443 <span class="comment"> * that could not be immediately sent to the client, e.g. because of</span>
469
+ <a name="l00444"></a>00444 <span class="comment"> * network congestion. Whenver the outbox&#39;s size grows past this limit,</span>
470
+ <a name="l00445"></a>00445 <span class="comment"> * EventedClient will enter a state in which it will stop listening for</span>
471
+ <a name="l00446"></a>00446 <span class="comment"> * read events and instead concentrate on sending out all pending data.</span>
472
+ <a name="l00447"></a>00447 <span class="comment"> *</span>
473
+ <a name="l00448"></a>00448 <span class="comment"> * Setting this to 0 means that the outbox has an unlimited size. Please</span>
474
+ <a name="l00449"></a>00449 <span class="comment"> * note however that this also means that the outbox&#39;s memory could grow</span>
475
+ <a name="l00450"></a>00450 <span class="comment"> * unbounded if the client is too slow at receiving data.</span>
476
+ <a name="l00451"></a>00451 <span class="comment"> *</span>
477
+ <a name="l00452"></a>00452 <span class="comment"> * The default value is some non-zero value.</span>
478
+ <a name="l00453"></a>00453 <span class="comment"> *</span>
479
+ <a name="l00454"></a>00454 <span class="comment"> * If the client connection is already being closed or has already</span>
480
+ <a name="l00455"></a>00455 <span class="comment"> * been closed then this method does nothing.</span>
481
+ <a name="l00456"></a>00456 <span class="comment"> */</span>
482
+ <a name="l00457"></a><a class="code" href="classPassenger_1_1EventedClient.html#ac1eb48c0d5382a97facbf9af40924849">00457</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedClient.html#ac1eb48c0d5382a97facbf9af40924849" title="Sets a limit on the client outbox.">setOutboxLimit</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
483
+ <a name="l00458"></a>00458 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1EventedClient.html#a50436eb8ec0cc38b5a7278962e98a22c" title="Returns whether it is allowed to perform any I/O with this client.">ioAllowed</a>()) {
484
+ <a name="l00459"></a>00459 <span class="keywordflow">return</span>;
485
+ <a name="l00460"></a>00460 }
486
+ <a name="l00461"></a>00461
487
+ <a name="l00462"></a>00462 this_thread::disable_interruption di;
488
+ <a name="l00463"></a>00463 this_thread::disable_syscall_interruption dsi;
489
+ <a name="l00464"></a>00464 outboxLimit = size;
490
+ <a name="l00465"></a>00465 updateWatcherStates();
491
+ <a name="l00466"></a>00466 }
492
+ <a name="l00467"></a>00467
493
+ <a name="l00468"></a>00468 <span class="keywordtype">void</span> write(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> &amp;data) {
494
+ <a name="l00469"></a>00469 write(&amp;data, 1);
495
+ <a name="l00470"></a>00470 }
496
+ <a name="l00471"></a>00471 <span class="comment"></span>
497
+ <a name="l00472"></a>00472 <span class="comment"> /**</span>
498
+ <a name="l00473"></a>00473 <span class="comment"> * Sends data to this client. This method will try to send the data</span>
499
+ <a name="l00474"></a>00474 <span class="comment"> * immediately (in which no intermediate copies of the data will be made),</span>
500
+ <a name="l00475"></a>00475 <span class="comment"> * but if the client is not yet ready to receive data (e.g. because of</span>
501
+ <a name="l00476"></a>00476 <span class="comment"> * network congestion) then the data will be buffered and scheduled for</span>
502
+ <a name="l00477"></a>00477 <span class="comment"> * sending later.</span>
503
+ <a name="l00478"></a>00478 <span class="comment"> *</span>
504
+ <a name="l00479"></a>00479 <span class="comment"> * If an I/O error was encountered then the client connection will be</span>
505
+ <a name="l00480"></a>00480 <span class="comment"> * closed by calling &lt;tt&gt;disconnect(true)&lt;/tt&gt;. This means this method</span>
506
+ <a name="l00481"></a>00481 <span class="comment"> * could potentially call the &lt;tt&gt;onDisconnect&lt;/tt&gt; callback.</span>
507
+ <a name="l00482"></a>00482 <span class="comment"> *</span>
508
+ <a name="l00483"></a>00483 <span class="comment"> * If the client connection is already being closed or has already</span>
509
+ <a name="l00484"></a>00484 <span class="comment"> * been closed then this method does nothing.</span>
510
+ <a name="l00485"></a>00485 <span class="comment"> *</span>
511
+ <a name="l00486"></a>00486 <span class="comment"> * The &lt;tt&gt;onPendingDataFlushed&lt;/tt&gt; callback will be called after</span>
512
+ <a name="l00487"></a>00487 <span class="comment"> * this data and whatever existing pending data have been written</span>
513
+ <a name="l00488"></a>00488 <span class="comment"> * out. That may either be immediately or after a short period of</span>
514
+ <a name="l00489"></a>00489 <span class="comment"> * of time.</span>
515
+ <a name="l00490"></a>00490 <span class="comment"> */</span>
516
+ <a name="l00491"></a><a class="code" href="classPassenger_1_1EventedClient.html#aa07723456786b9f18b973bd88ff51e27">00491</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedClient.html#aa07723456786b9f18b973bd88ff51e27" title="Sends data to this client.">write</a>(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1StaticString.html" title="An immutable, static byte buffer.">StaticString</a> data[], <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count) {
517
+ <a name="l00492"></a>00492 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1EventedClient.html#a50436eb8ec0cc38b5a7278962e98a22c" title="Returns whether it is allowed to perform any I/O with this client.">ioAllowed</a>()) {
518
+ <a name="l00493"></a>00493 <span class="keywordflow">return</span>;
519
+ <a name="l00494"></a>00494 }
520
+ <a name="l00495"></a>00495
521
+ <a name="l00496"></a>00496 ssize_t ret;
522
+ <a name="l00497"></a>00497 this_thread::disable_interruption di;
523
+ <a name="l00498"></a>00498 this_thread::disable_syscall_interruption dsi;
524
+ <a name="l00499"></a>00499
525
+ <a name="l00500"></a>00500 ret = gatheredWrite(<a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>, data, count, outbox);
526
+ <a name="l00501"></a>00501 <span class="keywordflow">if</span> (ret == -1) {
527
+ <a name="l00502"></a>00502 <span class="keywordtype">int</span> e = errno;
528
+ <a name="l00503"></a>00503 <a class="code" href="classPassenger_1_1EventedClient.html#a5b1a3011165ea9a47f6fe668a5010a20" title="Disconnects the client.">disconnect</a>(<span class="keyword">true</span>);
529
+ <a name="l00504"></a>00504 emitSystemErrorEvent(<span class="stringliteral">&quot;Cannot write data to client&quot;</span>, e);
530
+ <a name="l00505"></a>00505 } <span class="keywordflow">else</span> {
531
+ <a name="l00506"></a>00506 updateWatcherStates();
532
+ <a name="l00507"></a>00507 <span class="keywordflow">if</span> (outbox.empty()) {
533
+ <a name="l00508"></a>00508 emitEvent(<a class="code" href="classPassenger_1_1EventedClient.html#a22e93ce2be05a4f47dbeba95d79a79b9" title="Called after all pending outgoing data have been written out.">onPendingDataFlushed</a>);
534
+ <a name="l00509"></a>00509 }
535
+ <a name="l00510"></a>00510 }
536
+ <a name="l00511"></a>00511 }
537
+ <a name="l00512"></a>00512 <span class="comment"></span>
538
+ <a name="l00513"></a>00513 <span class="comment"> /**</span>
539
+ <a name="l00514"></a>00514 <span class="comment"> * Disconnects the client. This actually closes the underlying file</span>
540
+ <a name="l00515"></a>00515 <span class="comment"> * descriptor, even if the FileDescriptor object still has references.</span>
541
+ <a name="l00516"></a>00516 <span class="comment"> *</span>
542
+ <a name="l00517"></a>00517 <span class="comment"> * If &lt;em&gt;force&lt;/em&gt; is true then the client will be disconnected</span>
543
+ <a name="l00518"></a>00518 <span class="comment"> * immediately, and any pending outgoing data will be discarded.</span>
544
+ <a name="l00519"></a>00519 <span class="comment"> * Otherwise the client will be disconnected after all pending</span>
545
+ <a name="l00520"></a>00520 <span class="comment"> * outgoing data have been sent; in the mean time no new data can be</span>
546
+ <a name="l00521"></a>00521 <span class="comment"> * received from or sent to the client.</span>
547
+ <a name="l00522"></a>00522 <span class="comment"> *</span>
548
+ <a name="l00523"></a>00523 <span class="comment"> * After the client has actually been disconnected (which may be either</span>
549
+ <a name="l00524"></a>00524 <span class="comment"> * immediately or after a short period of time), a disconnect event will</span>
550
+ <a name="l00525"></a>00525 <span class="comment"> * be emitted.</span>
551
+ <a name="l00526"></a>00526 <span class="comment"> *</span>
552
+ <a name="l00527"></a>00527 <span class="comment"> * If the client connection has already been closed then this method</span>
553
+ <a name="l00528"></a>00528 <span class="comment"> * does nothing. If the client connection is being closed (because</span>
554
+ <a name="l00529"></a>00529 <span class="comment"> * there&#39;s pending outgoing data) then the behavior depends on the</span>
555
+ <a name="l00530"></a>00530 <span class="comment"> * &lt;tt&gt;force&lt;/tt&gt; argument: if true then the connection is closed</span>
556
+ <a name="l00531"></a>00531 <span class="comment"> * immediately and the pending data is discarded, otherwise this</span>
557
+ <a name="l00532"></a>00532 <span class="comment"> * method does nothing.</span>
558
+ <a name="l00533"></a>00533 <span class="comment"> *</span>
559
+ <a name="l00534"></a>00534 <span class="comment"> * The &lt;tt&gt;onDisconnect&lt;/tt&gt; callback will be called after the file</span>
560
+ <a name="l00535"></a>00535 <span class="comment"> * descriptor is closed, which is either immediately or after all</span>
561
+ <a name="l00536"></a>00536 <span class="comment"> * pending data has been sent out.</span>
562
+ <a name="l00537"></a>00537 <span class="comment"> */</span>
563
+ <a name="l00538"></a><a class="code" href="classPassenger_1_1EventedClient.html#a5b1a3011165ea9a47f6fe668a5010a20">00538</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1EventedClient.html#a5b1a3011165ea9a47f6fe668a5010a20" title="Disconnects the client.">disconnect</a>(<span class="keywordtype">bool</span> force = <span class="keyword">false</span>) {
564
+ <a name="l00539"></a>00539 <span class="keywordflow">if</span> (!<a class="code" href="classPassenger_1_1EventedClient.html#a50436eb8ec0cc38b5a7278962e98a22c" title="Returns whether it is allowed to perform any I/O with this client.">ioAllowed</a>() &amp;&amp; !(state == EC_DISCONNECTING_WITH_WRITES_PENDING &amp;&amp; force)) {
565
+ <a name="l00540"></a>00540 <span class="keywordflow">return</span>;
566
+ <a name="l00541"></a>00541 }
567
+ <a name="l00542"></a>00542
568
+ <a name="l00543"></a>00543 this_thread::disable_interruption di;
569
+ <a name="l00544"></a>00544 this_thread::disable_syscall_interruption dsi;
570
+ <a name="l00545"></a>00545
571
+ <a name="l00546"></a>00546 <span class="keywordflow">if</span> (state == EC_CONNECTED || force) {
572
+ <a name="l00547"></a>00547 state = EC_DISCONNECTED;
573
+ <a name="l00548"></a>00548 watchReadEvents(<span class="keyword">false</span>);
574
+ <a name="l00549"></a>00549 watchWriteEvents(<span class="keyword">false</span>);
575
+ <a name="l00550"></a>00550 <span class="keywordflow">try</span> {
576
+ <a name="l00551"></a>00551 <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>.<a class="code" href="classPassenger_1_1FileDescriptor.html#ad7c1a99531181878cbab74a7400c5432" title="Close the underlying file descriptor.">close</a>();
577
+ <a name="l00552"></a>00552 } <span class="keywordflow">catch</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;e) {
578
+ <a name="l00553"></a>00553 emitSystemErrorEvent(e.<a class="code" href="classPassenger_1_1SystemException.html#a84fa2ab4f5b7b96704734fcdfdaa0269" title="Returns a brief version of the exception message.">brief</a>(), e.<a class="code" href="classPassenger_1_1SystemException.html#aee7a6672bf79b72a4c3ee70c57d6a47c" title="The value of errno at the time the error occured.">code</a>());
579
+ <a name="l00554"></a>00554 }
580
+ <a name="l00555"></a>00555 emitEvent(<a class="code" href="classPassenger_1_1EventedClient.html#a211210ecd85eb2da47d200215132bb2d" title="Called when the client is disconnected.">onDisconnect</a>);
581
+ <a name="l00556"></a>00556 } <span class="keywordflow">else</span> {
582
+ <a name="l00557"></a>00557 state = EC_DISCONNECTING_WITH_WRITES_PENDING;
583
+ <a name="l00558"></a>00558 watchReadEvents(<span class="keyword">false</span>);
584
+ <a name="l00559"></a>00559 watchWriteEvents(<span class="keyword">true</span>);
585
+ <a name="l00560"></a>00560 <span class="keywordflow">if</span> (syscalls::shutdown(<a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>, SHUT_RD) == -1) {
586
+ <a name="l00561"></a>00561 <span class="keywordtype">int</span> e = errno;
587
+ <a name="l00562"></a>00562 emitSystemErrorEvent(
588
+ <a name="l00563"></a>00563 <span class="stringliteral">&quot;Cannot shutdown reader half of the client socket&quot;</span>,
589
+ <a name="l00564"></a>00564 e);
590
+ <a name="l00565"></a>00565 }
591
+ <a name="l00566"></a>00566 }
592
+ <a name="l00567"></a>00567 }
593
+ <a name="l00568"></a>00568 <span class="comment"></span>
594
+ <a name="l00569"></a>00569 <span class="comment"> /**</span>
595
+ <a name="l00570"></a>00570 <span class="comment"> * Detaches the client file descriptor so that this EventedClient no longer</span>
596
+ <a name="l00571"></a>00571 <span class="comment"> * has any control over it. Any EventedClient I/O watchers on the client file</span>
597
+ <a name="l00572"></a>00572 <span class="comment"> * descriptor will be stopped and further I/O on the file descriptor via</span>
598
+ <a name="l00573"></a>00573 <span class="comment"> * EventedClient will become impossible. The original client file descriptor</span>
599
+ <a name="l00574"></a>00574 <span class="comment"> * is returned and &lt;tt&gt;onDetach&lt;/tt&gt; is called. Subsequent calls to this</span>
600
+ <a name="l00575"></a>00575 <span class="comment"> * function will return -1 and will no longer call &lt;tt&gt;onDetach&lt;/tt&gt;.</span>
601
+ <a name="l00576"></a>00576 <span class="comment"> *</span>
602
+ <a name="l00577"></a>00577 <span class="comment"> * @post !ioAllowed()</span>
603
+ <a name="l00578"></a>00578 <span class="comment"> * @post fd == -1</span>
604
+ <a name="l00579"></a>00579 <span class="comment"> */</span>
605
+ <a name="l00580"></a><a class="code" href="classPassenger_1_1EventedClient.html#a408b593d118c3483bcef8118a7edba0f">00580</a> <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> <a class="code" href="classPassenger_1_1EventedClient.html#a408b593d118c3483bcef8118a7edba0f" title="Detaches the client file descriptor so that this EventedClient no longer has any...">detach</a>() {
606
+ <a name="l00581"></a>00581 <span class="keywordflow">if</span> (state == EC_DISCONNECTED) {
607
+ <a name="l00582"></a>00582 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>;
608
+ <a name="l00583"></a>00583 } <span class="keywordflow">else</span> {
609
+ <a name="l00584"></a>00584 <a class="code" href="classPassenger_1_1FileDescriptor.html" title="Wrapper class around a file descriptor integer, for RAII behavior.">FileDescriptor</a> oldFd = <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a>;
610
+ <a name="l00585"></a>00585 state = EC_DISCONNECTED;
611
+ <a name="l00586"></a>00586 watchReadEvents(<span class="keyword">false</span>);
612
+ <a name="l00587"></a>00587 watchWriteEvents(<span class="keyword">false</span>);
613
+ <a name="l00588"></a>00588 <a class="code" href="classPassenger_1_1EventedClient.html#a4473719c16cae760e1811b7ccb1dc491" title="The client&amp;#39;s file descriptor.">fd</a> = -1;
614
+ <a name="l00589"></a>00589 emitEvent(<a class="code" href="classPassenger_1_1EventedClient.html#a742805d40508b0af89eb2ed2c1e50060" title="Called when detach() is called for the first time.">onDetach</a>);
615
+ <a name="l00590"></a>00590 <span class="keywordflow">return</span> oldFd;
616
+ <a name="l00591"></a>00591 }
617
+ <a name="l00592"></a>00592 }
618
+ <a name="l00593"></a>00593 };
619
+ <a name="l00594"></a>00594
620
+ <a name="l00595"></a>00595
621
+ <a name="l00596"></a>00596 } <span class="comment">// namespace Passenger</span>
622
+ <a name="l00597"></a>00597
623
+ <a name="l00598"></a>00598 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_EVENTED_CLIENT_H_ */</span>
624
+ </pre></div></div>
625
+ <hr size="1"/><address style="text-align: right;"><small>Generated by&nbsp;
626
+ <a href="http://www.doxygen.org/index.html">
627
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.2 </small></address>
628
+ </body>
629
+ </html>