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
@@ -6,7 +6,7 @@
6
6
  * Boost Software License, Version 1.0. (See accompanying
7
7
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8
8
  * Author: Jeff Garland
9
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
9
+ * $Date: 2009-02-01 06:29:43 -0500 (Sun, 01 Feb 2009) $
10
10
  */
11
11
 
12
12
  #include <sstream>
@@ -49,6 +49,7 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
49
49
  {
50
50
  //grab the needed strings by using the locale to
51
51
  //output each month
52
+ const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
52
53
  for (int m=0; m < 12; m++) {
53
54
  tm tm_value;
54
55
  tm_value.tm_mon = m;
@@ -56,8 +57,8 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
56
57
  ostream_iter_type oitr(ss);
57
58
  std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(),
58
59
  &tm_value,
59
- &*outfmt.begin(),
60
- &*outfmt.begin()+outfmt.size());
60
+ p_outfmt,
61
+ p_outfmt_end);
61
62
  months.push_back(ss.str());
62
63
  }
63
64
  }
@@ -101,6 +102,7 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
101
102
  {
102
103
  //grab the needed strings by using the locale to
103
104
  //output each month / weekday
105
+ const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
104
106
  for (int i=0; i < 7; i++) {
105
107
  tm tm_value;
106
108
  tm_value.tm_wday = i;
@@ -108,8 +110,8 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
108
110
  ostream_iter_type oitr(ss);
109
111
  std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(),
110
112
  &tm_value,
111
- &*outfmt.begin(),
112
- &*outfmt.begin()+outfmt.size());
113
+ p_outfmt,
114
+ p_outfmt_end);
113
115
 
114
116
  weekdays.push_back(ss.str());
115
117
  }
@@ -6,16 +6,17 @@
6
6
  * Boost Software License, Version 1.0. (See accompanying
7
7
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8
8
  * Author: Jeff Garland, Bart Garst
9
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
9
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
10
10
  */
11
11
 
12
12
 
13
13
  /*! @file time.hpp
14
14
  This file contains the interface for the time associated classes.
15
15
  */
16
- #include "boost/date_time/time_defs.hpp"
17
- #include "boost/operators.hpp"
18
16
  #include <string>
17
+ #include <boost/operators.hpp>
18
+ #include <boost/date_time/time_defs.hpp>
19
+ #include <boost/date_time/special_defs.hpp>
19
20
 
20
21
  namespace boost {
21
22
  namespace date_time {
@@ -77,21 +78,21 @@ namespace date_time {
77
78
  /*! Optional bool parameter will return time zone as an offset
78
79
  * (ie "+07:00"). Empty string is returned for classes that do
79
80
  * not use a time_zone */
80
- std::string zone_name(bool as_offset=false) const
81
+ std::string zone_name(bool /*as_offset*/=false) const
81
82
  {
82
83
  return time_system::zone_name(time_);
83
84
  }
84
85
  /*! Optional bool parameter will return time zone as an offset
85
86
  * (ie "+07:00"). Empty string is returned for classes that do
86
87
  * not use a time_zone */
87
- std::string zone_abbrev(bool as_offset=false) const
88
+ std::string zone_abbrev(bool /*as_offset*/=false) const
88
89
  {
89
90
  return time_system::zone_name(time_);
90
91
  }
91
92
  //! An empty string is returned for classes that do not use a time_zone
92
93
  std::string zone_as_posix_string() const
93
94
  {
94
- return std::string("");
95
+ return std::string();
95
96
  }
96
97
 
97
98
  //! check to see if date is not a value
@@ -6,7 +6,7 @@
6
6
  * Boost Software License, Version 1.0. (See accompanying
7
7
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8
8
  * Author: Jeff Garland
9
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
9
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
10
10
  */
11
11
 
12
12
 
@@ -20,7 +20,17 @@ namespace boost {
20
20
  namespace date_time {
21
21
 
22
22
  //!Defines some nice types for handling time level resolutions
23
- enum time_resolutions {sec, tenth, hundreth, milli, ten_thousandth, micro, nano, NumResolutions };
23
+ enum time_resolutions {
24
+ sec,
25
+ tenth,
26
+ hundreth, // deprecated misspelled version of hundredth
27
+ hundredth = hundreth,
28
+ milli,
29
+ ten_thousandth,
30
+ micro,
31
+ nano,
32
+ NumResolutions
33
+ };
24
34
 
25
35
  //! Flags for daylight savings or summer time
26
36
  enum dst_flags {not_dst, is_dst, calculate};
@@ -6,18 +6,19 @@
6
6
  * Boost Software License, Version 1.0. (See accompanying
7
7
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8
8
  * Author: Jeff Garland, Bart Garst
9
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
9
+ * $Date: 2009-06-04 04:24:49 -0400 (Thu, 04 Jun 2009) $
10
10
  */
11
11
 
12
- #include "boost/operators.hpp"
13
- #include "boost/date_time/time_defs.hpp"
14
- #include "boost/date_time/special_defs.hpp"
15
- #include "boost/date_time/compiler_config.hpp"
12
+ #include <boost/cstdint.hpp>
13
+ #include <boost/operators.hpp>
14
+ #include <boost/date_time/time_defs.hpp>
15
+ #include <boost/date_time/special_defs.hpp>
16
+ #include <boost/date_time/compiler_config.hpp>
16
17
 
17
18
  namespace boost {
18
19
  namespace date_time {
19
20
 
20
-
21
+
21
22
  //! Represents some amount of elapsed time measure to a given resolution
22
23
  /*! This class represents a standard set of capabilities for all
23
24
  counted time durations. Time duration implementations should derive
@@ -30,13 +31,13 @@ namespace date_time {
30
31
  */
31
32
  template<class T, typename rep_type>
32
33
  class time_duration : private
33
- boost::less_than_comparable<T
34
+ boost::less_than_comparable<T
34
35
  , boost::equality_comparable<T
35
36
  > >
36
37
  /* dividable, addable, and subtractable operator templates
37
- * won't work with this class (MSVC++ 6.0). return type
38
- * from '+=' is different than expected return type
39
- * from '+'. multipliable probably wont work
38
+ * won't work with this class (MSVC++ 6.0). return type
39
+ * from '+=' is different than expected return type
40
+ * from '+'. multipliable probably wont work
40
41
  * either (haven't tried) */
41
42
  {
42
43
  public:
@@ -50,12 +51,12 @@ namespace date_time {
50
51
  typedef typename rep_type::tick_type tick_type;
51
52
  typedef typename rep_type::impl_type impl_type;
52
53
 
53
- time_duration() : ticks_(0) {}
54
- time_duration(hour_type hours_in,
55
- min_type minutes_in,
54
+ time_duration() : ticks_(0) {}
55
+ time_duration(hour_type hours_in,
56
+ min_type minutes_in,
56
57
  sec_type seconds_in=0,
57
58
  fractional_seconds_type frac_sec_in = 0) :
58
- ticks_(rep_type::to_tick_count(hours_in,minutes_in,seconds_in,frac_sec_in))
59
+ ticks_(rep_type::to_tick_count(hours_in,minutes_in,seconds_in,frac_sec_in))
59
60
  {}
60
61
  // copy constructor required for dividable<>
61
62
  //! Construct from another time_duration (Copy constructor)
@@ -136,17 +137,17 @@ namespace date_time {
136
137
  }
137
138
  duration_type invert_sign() const
138
139
  {
139
- return duration_type(ticks_ * (-1));
140
- }
140
+ return duration_type(ticks_ * (-1));
141
+ }
141
142
  bool is_negative() const
142
143
  {
143
144
  return ticks_ < 0;
144
- }
145
- bool operator<(const time_duration& rhs) const
145
+ }
146
+ bool operator<(const time_duration& rhs) const
146
147
  {
147
148
  return ticks_ < rhs.ticks_;
148
149
  }
149
- bool operator==(const time_duration& rhs) const
150
+ bool operator==(const time_duration& rhs) const
150
151
  {
151
152
  return ticks_ == rhs.ticks_;
152
153
  }
@@ -188,13 +189,13 @@ namespace date_time {
188
189
  {
189
190
  return duration_type(ticks_ * rhs);
190
191
  }
191
- duration_type operator*=(int divisor)
192
+ duration_type operator*=(int divisor)
192
193
  {
193
194
  ticks_ = ticks_ * divisor;
194
195
  return duration_type(ticks_);
195
196
  }
196
- tick_type ticks() const
197
- {
197
+ tick_type ticks() const
198
+ {
198
199
  return traits_type::as_number(ticks_);
199
200
  }
200
201
 
@@ -258,9 +259,9 @@ namespace date_time {
258
259
 
259
260
  //! Template for instantiating derived adjusting durations
260
261
  /* These templates are designed to work with multiples of
261
- * 10 for frac_of_second and resoultion adjustment
262
+ * 10 for frac_of_second and resoultion adjustment
262
263
  */
263
- template<class base_duration, boost::int64_t frac_of_second>
264
+ template<class base_duration, boost::int64_t frac_of_second>
264
265
  class subsecond_duration : public base_duration
265
266
  {
266
267
  public:
@@ -270,8 +271,8 @@ namespace date_time {
270
271
  {}
271
272
  };
272
273
 
273
-
274
-
274
+
275
+
275
276
  } } //namespace date_time
276
277
 
277
278
 
@@ -3,19 +3,31 @@
3
3
  #define _DATE_TIME_FACET__HPP__
4
4
 
5
5
  /* Copyright (c) 2004-2005 CrystalClear Software, Inc.
6
- * Use, modification and distribution is subject to the
6
+ * Use, modification and distribution is subject to the
7
7
  * Boost Software License, Version 1.0. (See accompanying
8
8
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
9
9
  * Author: Martin Andrian, Jeff Garland, Bart Garst
10
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
10
+ * $Date: 2010-01-10 14:17:23 -0500 (Sun, 10 Jan 2010) $
11
11
  */
12
12
 
13
- #include "boost/date_time/date_facet.hpp"
14
- #include "boost/date_time/string_convert.hpp"
15
- #include "boost/algorithm/string/erase.hpp"
13
+ #include <cctype>
14
+ #include <locale>
15
+ #include <limits>
16
+ #include <string>
16
17
  #include <sstream>
17
18
  #include <iomanip>
19
+ #include <iterator> // i/ostreambuf_iterator
18
20
  #include <exception>
21
+ #include <boost/assert.hpp>
22
+ #include <boost/lexical_cast.hpp>
23
+ #include <boost/throw_exception.hpp>
24
+ #include <boost/algorithm/string/erase.hpp>
25
+ #include <boost/algorithm/string/replace.hpp>
26
+ #include <boost/date_time/compiler_config.hpp>
27
+ #include <boost/date_time/date_facet.hpp>
28
+ #include <boost/date_time/string_convert.hpp>
29
+ #include <boost/date_time/special_defs.hpp>
30
+ #include <boost/date_time/time_resolution_traits.hpp> // absolute_value
19
31
 
20
32
  namespace boost {
21
33
  namespace date_time {
@@ -28,6 +40,8 @@ namespace date_time {
28
40
  static const char_type fractional_seconds_or_none_format[3]; // F
29
41
  static const char_type seconds_with_fractional_seconds_format[3]; // s
30
42
  static const char_type seconds_format[3]; // S
43
+ static const char_type hours_format[3]; // H
44
+ static const char_type unrestricted_hours_format[3]; // O
31
45
  static const char_type standard_format[9]; // x X
32
46
  static const char_type zone_abbrev_format[3]; // z
33
47
  static const char_type zone_name_format[3]; // Z
@@ -42,121 +56,129 @@ namespace date_time {
42
56
  static const char_type iso_time_format_specifier[18];
43
57
  static const char_type iso_time_format_extended_specifier[22];
44
58
  //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz]
45
- static const char_type default_time_format[23];
59
+ static const char_type default_time_format[23];
46
60
  // default_time_input_format uses a posix_time_zone_string instead of a time zone abbrev
47
- static const char_type default_time_input_format[24];
61
+ static const char_type default_time_input_format[24];
48
62
  //default time_duration format is HH:MM:SS[.fff...]
49
63
  static const char_type default_time_duration_format[11];
50
64
  };
51
65
 
52
- template <class CharT>
53
- const typename time_formats<CharT>::char_type
66
+ template <class CharT>
67
+ const typename time_formats<CharT>::char_type
54
68
  time_formats<CharT>::fractional_seconds_format[3] = {'%','f'};
55
69
 
56
- template <class CharT>
57
- const typename time_formats<CharT>::char_type
70
+ template <class CharT>
71
+ const typename time_formats<CharT>::char_type
58
72
  time_formats<CharT>::fractional_seconds_or_none_format[3] = {'%','F'};
59
73
 
60
- template <class CharT>
61
- const typename time_formats<CharT>::char_type
62
- time_formats<CharT>::seconds_with_fractional_seconds_format[3] =
74
+ template <class CharT>
75
+ const typename time_formats<CharT>::char_type
76
+ time_formats<CharT>::seconds_with_fractional_seconds_format[3] =
63
77
  {'%','s'};
64
78
 
65
- template <class CharT>
66
- const typename time_formats<CharT>::char_type
79
+ template <class CharT>
80
+ const typename time_formats<CharT>::char_type
67
81
  time_formats<CharT>::seconds_format[3] = {'%','S'};
68
82
 
69
- template <class CharT>
70
- const typename time_formats<CharT>::char_type
83
+ template <class CharT>
84
+ const typename time_formats<CharT>::char_type
85
+ time_formats<CharT>::hours_format[3] = {'%','H'};
86
+
87
+ template <class CharT>
88
+ const typename time_formats<CharT>::char_type
89
+ time_formats<CharT>::unrestricted_hours_format[3] = {'%','O'};
90
+
91
+ template <class CharT>
92
+ const typename time_formats<CharT>::char_type
71
93
  //time_formats<CharT>::standard_format[5] = {'%','c',' ','%','z'};
72
94
  time_formats<CharT>::standard_format[9] = {'%','x',' ','%','X',' ','%','z'};
73
95
 
74
- template <class CharT>
75
- const typename time_formats<CharT>::char_type
96
+ template <class CharT>
97
+ const typename time_formats<CharT>::char_type
76
98
  time_formats<CharT>::zone_abbrev_format[3] = {'%','z'};
77
99
 
78
- template <class CharT>
79
- const typename time_formats<CharT>::char_type
100
+ template <class CharT>
101
+ const typename time_formats<CharT>::char_type
80
102
  time_formats<CharT>::zone_name_format[3] = {'%','Z'};
81
103
 
82
- template <class CharT>
83
- const typename time_formats<CharT>::char_type
104
+ template <class CharT>
105
+ const typename time_formats<CharT>::char_type
84
106
  time_formats<CharT>::zone_iso_format[3] = {'%','q'};
85
107
 
86
- template <class CharT>
87
- const typename time_formats<CharT>::char_type
108
+ template <class CharT>
109
+ const typename time_formats<CharT>::char_type
88
110
  time_formats<CharT>::zone_iso_extended_format[3] ={'%','Q'};
89
111
 
90
- template <class CharT>
91
- const typename time_formats<CharT>::char_type
112
+ template <class CharT>
113
+ const typename time_formats<CharT>::char_type
92
114
  time_formats<CharT>::posix_zone_string_format[4] ={'%','Z','P'};
93
115
 
94
- template <class CharT>
95
- const typename time_formats<CharT>::char_type
116
+ template <class CharT>
117
+ const typename time_formats<CharT>::char_type
96
118
  time_formats<CharT>::duration_seperator[2] = {':'};
97
119
 
98
- template <class CharT>
99
- const typename time_formats<CharT>::char_type
120
+ template <class CharT>
121
+ const typename time_formats<CharT>::char_type
100
122
  time_formats<CharT>::negative_sign[2] = {'-'};
101
123
 
102
- template <class CharT>
103
- const typename time_formats<CharT>::char_type
124
+ template <class CharT>
125
+ const typename time_formats<CharT>::char_type
104
126
  time_formats<CharT>::positive_sign[2] = {'+'};
105
127
 
106
- template <class CharT>
107
- const typename time_formats<CharT>::char_type
128
+ template <class CharT>
129
+ const typename time_formats<CharT>::char_type
108
130
  time_formats<CharT>::duration_sign_negative_only[3] ={'%','-'};
109
131
 
110
- template <class CharT>
111
- const typename time_formats<CharT>::char_type
132
+ template <class CharT>
133
+ const typename time_formats<CharT>::char_type
112
134
  time_formats<CharT>::duration_sign_always[3] ={'%','+'};
113
135
 
114
- template <class CharT>
115
- const typename time_formats<CharT>::char_type
116
- time_formats<CharT>::iso_time_format_specifier[18] =
117
- {'%', 'Y', '%', 'm', '%', 'd', 'T',
136
+ template <class CharT>
137
+ const typename time_formats<CharT>::char_type
138
+ time_formats<CharT>::iso_time_format_specifier[18] =
139
+ {'%', 'Y', '%', 'm', '%', 'd', 'T',
118
140
  '%', 'H', '%', 'M', '%', 'S', '%', 'F', '%','q' };
119
141
 
120
- template <class CharT>
121
- const typename time_formats<CharT>::char_type
122
- time_formats<CharT>::iso_time_format_extended_specifier[22] =
123
- {'%', 'Y', '-', '%', 'm', '-', '%', 'd', ' ',
142
+ template <class CharT>
143
+ const typename time_formats<CharT>::char_type
144
+ time_formats<CharT>::iso_time_format_extended_specifier[22] =
145
+ {'%', 'Y', '-', '%', 'm', '-', '%', 'd', ' ',
124
146
  '%', 'H', ':', '%', 'M', ':', '%', 'S', '%', 'F','%','Q'};
125
147
 
126
- template <class CharT>
127
- const typename time_formats<CharT>::char_type
128
- time_formats<CharT>::default_time_format[23] =
148
+ template <class CharT>
149
+ const typename time_formats<CharT>::char_type
150
+ time_formats<CharT>::default_time_format[23] =
129
151
  {'%','Y','-','%','b','-','%','d',' ',
130
152
  '%','H',':','%','M',':','%','S','%','F',' ','%','z'};
131
153
 
132
- template <class CharT>
133
- const typename time_formats<CharT>::char_type
134
- time_formats<CharT>::default_time_input_format[24] =
154
+ template <class CharT>
155
+ const typename time_formats<CharT>::char_type
156
+ time_formats<CharT>::default_time_input_format[24] =
135
157
  {'%','Y','-','%','b','-','%','d',' ',
136
158
  '%','H',':','%','M',':','%','S','%','F',' ','%','Z','P'};
137
159
 
138
- template <class CharT>
139
- const typename time_formats<CharT>::char_type
140
- time_formats<CharT>::default_time_duration_format[11] =
141
- {'%','H',':','%','M',':','%','S','%','F'};
160
+ template <class CharT>
161
+ const typename time_formats<CharT>::char_type
162
+ time_formats<CharT>::default_time_duration_format[11] =
163
+ {'%','O',':','%','M',':','%','S','%','F'};
142
164
 
143
165
 
144
166
 
145
- /*! Facet used for format-based output of time types
167
+ /*! Facet used for format-based output of time types
146
168
  * This class provides for the use of format strings to output times. In addition
147
169
  * to the flags for formatting date elements, the following are the allowed format flags:
148
170
  * - %x %X => default format - enables addition of more flags to default (ie. "%x %X %z")
149
171
  * - %f => fractional seconds ".123456"
150
172
  * - %F => fractional seconds or none: like frac sec but empty if frac sec == 0
151
- * - %s => seconds w/ fractional sec "02.123" (this is the same as "%S%f)
173
+ * - %s => seconds w/ fractional sec "02.123" (this is the same as "%S%f)
152
174
  * - %S => seconds "02"
153
175
  * - %z => abbreviated time zone "EDT"
154
176
  * - %Z => full time zone name "Eastern Daylight Time"
155
177
  */
156
178
  template <class time_type,
157
- class CharT,
179
+ class CharT,
158
180
  class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > >
159
- class time_facet :
181
+ class time_facet :
160
182
  public boost::date_time::date_facet<typename time_type::date_type , CharT, OutItrT> {
161
183
  public:
162
184
  typedef typename time_type::date_type date_type;
@@ -172,6 +194,8 @@ namespace date_time {
172
194
  static const char_type* fractional_seconds_or_none_format; // %F
173
195
  static const char_type* seconds_with_fractional_seconds_format; // %s
174
196
  static const char_type* seconds_format; // %S
197
+ static const char_type* hours_format; // %H
198
+ static const char_type* unrestricted_hours_format; // %O
175
199
  static const char_type* standard_format; // %x X
176
200
  static const char_type* zone_abbrev_format; // %z
177
201
  static const char_type* zone_name_format; // %Z
@@ -187,7 +211,7 @@ namespace date_time {
187
211
  static const char_type* iso_time_format_extended_specifier;
188
212
 
189
213
  //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz]
190
- static const char_type* default_time_format;
214
+ static const char_type* default_time_format;
191
215
  //default time_duration format is HH:MM:SS[.fff...]
192
216
  static const char_type* default_time_duration_format;
193
217
  static std::locale::id id;
@@ -197,28 +221,27 @@ namespace date_time {
197
221
  #endif
198
222
 
199
223
  //! sets default formats for ptime, local_date_time, and time_duration
200
- explicit time_facet(::size_t /* a_ref */ = 0)
201
- //: base_type(standard_format),
202
- : base_type(default_time_format),
224
+ explicit time_facet(::size_t a_ref = 0)
225
+ : base_type(default_time_format, period_formatter_type(), special_values_formatter_type(), date_gen_formatter_type(), a_ref),
203
226
  m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
204
227
  {}
205
228
 
206
229
  //! Construct the facet with an explicitly specified format
207
230
  explicit time_facet(const char_type* a_format,
208
- period_formatter_type period_formatter = period_formatter_type(),
209
- const special_values_formatter_type& special_value_formatter = special_values_formatter_type(),
231
+ period_formatter_type period_formatter = period_formatter_type(),
232
+ const special_values_formatter_type& special_value_formatter = special_values_formatter_type(),
210
233
  date_gen_formatter_type dg_formatter = date_gen_formatter_type(),
211
- ::size_t a_ref = 0)
212
- : base_type(a_format,
234
+ ::size_t a_ref = 0)
235
+ : base_type(a_format,
213
236
  period_formatter,
214
- special_value_formatter,
215
- dg_formatter,
237
+ special_value_formatter,
238
+ dg_formatter,
216
239
  a_ref),
217
240
  m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
218
241
  {}
219
242
 
220
243
  //! Changes format for time_duration
221
- void time_duration_format(const char_type* const format)
244
+ void time_duration_format(const char_type* const format)
222
245
  {
223
246
  m_time_duration_format = format;
224
247
  }
@@ -232,40 +255,39 @@ namespace date_time {
232
255
  this->m_format = iso_time_format_extended_specifier;
233
256
  }
234
257
 
235
- OutItrT put(OutItrT a_next,
236
- std::ios_base& a_ios,
237
- char_type a_fill,
238
- const time_type& a_time) const
258
+ OutItrT put(OutItrT a_next,
259
+ std::ios_base& a_ios,
260
+ char_type a_fill,
261
+ const time_type& a_time) const
239
262
  {
240
- if (a_time.is_special()) {
241
- return this->do_put_special(a_next, a_ios, a_fill,
263
+ if (a_time.is_special()) {
264
+ return this->do_put_special(a_next, a_ios, a_fill,
242
265
  a_time.date().as_special());
243
266
  }
244
267
  string_type format(this->m_format);
268
+
245
269
  string_type frac_str;
246
270
  if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
247
- // replace %s with %S.nnn
248
- frac_str =
271
+ // replace %s with %S.nnn
272
+ frac_str =
249
273
  fractional_seconds_as_string(a_time.time_of_day(), false);
250
274
  char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
251
-
275
+
252
276
  string_type replace_string(seconds_format);
253
277
  replace_string += sep;
254
278
  replace_string += frac_str;
255
- boost::algorithm::replace_all(format,
256
- seconds_with_fractional_seconds_format,
279
+ boost::algorithm::replace_all(format,
280
+ seconds_with_fractional_seconds_format,
257
281
  replace_string);
258
282
  }
259
283
  /* NOTE: replacing posix_zone_string_format must be done BEFORE
260
- * zone_name_format: "%ZP" & "%Z", if Z is checked first it will
284
+ * zone_name_format: "%ZP" & "%Z", if Z is checked first it will
261
285
  * incorrectly replace a zone_name where a posix_string should go */
262
286
  if (format.find(posix_zone_string_format) != string_type::npos) {
263
287
  if(a_time.zone_abbrev().empty()) {
264
288
  // if zone_abbrev() returns an empty string, we want to
265
289
  // erase posix_zone_string_format from format
266
- boost::algorithm::replace_all(format,
267
- posix_zone_string_format,
268
- "");
290
+ boost::algorithm::erase_all(format, posix_zone_string_format);
269
291
  }
270
292
  else{
271
293
  boost::algorithm::replace_all(format,
@@ -275,17 +297,15 @@ namespace date_time {
275
297
  }
276
298
  if (format.find(zone_name_format) != string_type::npos) {
277
299
  if(a_time.zone_name().empty()) {
278
- /* TODO: this'll probably create problems if a user places
279
- * the zone_*_format flag in the format with a ptime. This
300
+ /* TODO: this'll probably create problems if a user places
301
+ * the zone_*_format flag in the format with a ptime. This
280
302
  * code removes the flag from the default formats */
281
303
 
282
304
  // if zone_name() returns an empty string, we want to
283
305
  // erase zone_name_format & one preceeding space
284
306
  std::basic_ostringstream<char_type> ss;
285
307
  ss << ' ' << zone_name_format;
286
- boost::algorithm::replace_all(format,
287
- ss.str(),
288
- "");
308
+ boost::algorithm::erase_all(format, ss.str());
289
309
  }
290
310
  else{
291
311
  boost::algorithm::replace_all(format,
@@ -295,17 +315,15 @@ namespace date_time {
295
315
  }
296
316
  if (format.find(zone_abbrev_format) != string_type::npos) {
297
317
  if(a_time.zone_abbrev(false).empty()) {
298
- /* TODO: this'll probably create problems if a user places
299
- * the zone_*_format flag in the format with a ptime. This
318
+ /* TODO: this'll probably create problems if a user places
319
+ * the zone_*_format flag in the format with a ptime. This
300
320
  * code removes the flag from the default formats */
301
321
 
302
322
  // if zone_abbrev() returns an empty string, we want to
303
323
  // erase zone_abbrev_format & one preceeding space
304
324
  std::basic_ostringstream<char_type> ss;
305
325
  ss << ' ' << zone_abbrev_format;
306
- boost::algorithm::replace_all(format,
307
- ss.str(),
308
- "");
326
+ boost::algorithm::erase_all(format, ss.str());
309
327
  }
310
328
  else{
311
329
  boost::algorithm::replace_all(format,
@@ -315,15 +333,13 @@ namespace date_time {
315
333
  }
316
334
  if (format.find(zone_iso_extended_format) != string_type::npos) {
317
335
  if(a_time.zone_name(true).empty()) {
318
- /* TODO: this'll probably create problems if a user places
319
- * the zone_*_format flag in the format with a ptime. This
336
+ /* TODO: this'll probably create problems if a user places
337
+ * the zone_*_format flag in the format with a ptime. This
320
338
  * code removes the flag from the default formats */
321
339
 
322
340
  // if zone_name() returns an empty string, we want to
323
341
  // erase zone_iso_extended_format from format
324
- boost::algorithm::replace_all(format,
325
- zone_iso_extended_format,
326
- "");
342
+ boost::algorithm::erase_all(format, zone_iso_extended_format);
327
343
  }
328
344
  else{
329
345
  boost::algorithm::replace_all(format,
@@ -334,15 +350,13 @@ namespace date_time {
334
350
 
335
351
  if (format.find(zone_iso_format) != string_type::npos) {
336
352
  if(a_time.zone_abbrev(true).empty()) {
337
- /* TODO: this'll probably create problems if a user places
338
- * the zone_*_format flag in the format with a ptime. This
353
+ /* TODO: this'll probably create problems if a user places
354
+ * the zone_*_format flag in the format with a ptime. This
339
355
  * code removes the flag from the default formats */
340
356
 
341
357
  // if zone_abbrev() returns an empty string, we want to
342
358
  // erase zone_iso_format from format
343
- boost::algorithm::replace_all(format,
344
- zone_iso_format,
345
- "");
359
+ boost::algorithm::erase_all(format, zone_iso_format);
346
360
  }
347
361
  else{
348
362
  boost::algorithm::replace_all(format,
@@ -356,13 +370,13 @@ namespace date_time {
356
370
  frac_str = fractional_seconds_as_string(a_time.time_of_day(), false);
357
371
  }
358
372
  boost::algorithm::replace_all(format,
359
- fractional_seconds_format,
373
+ fractional_seconds_format,
360
374
  frac_str);
361
375
  }
362
376
 
363
377
  if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
364
378
  // replace %F with nnnnnnn or nothing if fs == 0
365
- frac_str =
379
+ frac_str =
366
380
  fractional_seconds_as_string(a_time.time_of_day(), true);
367
381
  if (frac_str.size()) {
368
382
  char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
@@ -370,7 +384,7 @@ namespace date_time {
370
384
  replace_string += sep;
371
385
  replace_string += frac_str;
372
386
  boost::algorithm::replace_all(format,
373
- fractional_seconds_or_none_format,
387
+ fractional_seconds_or_none_format,
374
388
  replace_string);
375
389
  }
376
390
  else {
@@ -379,55 +393,76 @@ namespace date_time {
379
393
  }
380
394
  }
381
395
 
382
- return this->do_put_tm(a_next, a_ios, a_fill,
396
+ return this->do_put_tm(a_next, a_ios, a_fill,
383
397
  to_tm(a_time), format);
384
398
  }
385
399
 
386
400
  //! put function for time_duration
387
- OutItrT put(OutItrT a_next,
388
- std::ios_base& a_ios,
389
- char_type a_fill,
390
- const time_duration_type& a_time_dur) const
401
+ OutItrT put(OutItrT a_next,
402
+ std::ios_base& a_ios,
403
+ char_type a_fill,
404
+ const time_duration_type& a_time_dur) const
391
405
  {
392
- if (a_time_dur.is_special()) {
393
- return this->do_put_special(a_next, a_ios, a_fill,
406
+ if (a_time_dur.is_special()) {
407
+ return this->do_put_special(a_next, a_ios, a_fill,
394
408
  a_time_dur.get_rep().as_special());
395
409
  }
396
410
 
397
411
  string_type format(m_time_duration_format);
398
412
  if (a_time_dur.is_negative()) {
399
- // replace %- with minus sign. Should we use the numpunct facet?
400
- boost::algorithm::replace_all(format,
401
- duration_sign_negative_only,
402
- negative_sign);
413
+ // replace %- with minus sign. Should we use the numpunct facet?
414
+ boost::algorithm::replace_all(format,
415
+ duration_sign_negative_only,
416
+ negative_sign);
403
417
  // remove all the %+ in the string with '-'
404
- boost::algorithm::replace_all(format,
405
- duration_sign_always,
406
- negative_sign);
418
+ boost::algorithm::replace_all(format,
419
+ duration_sign_always,
420
+ negative_sign);
407
421
  }
408
422
  else { //duration is positive
409
- // remove all the %- combos from the string
410
- boost::algorithm::replace_all(format,
411
- duration_sign_negative_only,
412
- "");
413
- // remove all the %+ in the string with '+'
414
- boost::algorithm::replace_all(format,
415
- duration_sign_always,
416
- positive_sign);
423
+ // remove all the %- combos from the string
424
+ boost::algorithm::erase_all(format, duration_sign_negative_only);
425
+ // remove all the %+ in the string with '+'
426
+ boost::algorithm::replace_all(format,
427
+ duration_sign_always,
428
+ positive_sign);
429
+ }
430
+
431
+ /*
432
+ * It is possible for a time duration to span more then 24 hours.
433
+ * Standard time_put::put is obliged to behave the same as strftime
434
+ * (See ISO 14882-2003 22.2.5.3.1 par. 1) and strftime's behavior is
435
+ * unspecified for the case when tm_hour field is outside 0-23 range
436
+ * (See ISO 9899-1999 7.23.3.5 par. 3). So we must output %H and %O
437
+ * here ourself.
438
+ */
439
+ string_type hours_str;
440
+ if (format.find(unrestricted_hours_format) != string_type::npos) {
441
+ hours_str = hours_as_string(a_time_dur);
442
+ boost::algorithm::replace_all(format, unrestricted_hours_format, hours_str);
443
+ }
444
+ // We still have to process restricted hours format specifier. In order to
445
+ // support parseability of durations in ISO format (%H%M%S), we'll have to
446
+ // restrict the stringified hours length to 2 characters.
447
+ if (format.find(hours_format) != string_type::npos) {
448
+ if (hours_str.empty())
449
+ hours_str = hours_as_string(a_time_dur);
450
+ BOOST_ASSERT(hours_str.length() <= 2);
451
+ boost::algorithm::replace_all(format, hours_format, hours_str);
417
452
  }
418
453
 
419
454
  string_type frac_str;
420
455
  if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
421
- // replace %s with %S.nnn
422
- frac_str =
456
+ // replace %s with %S.nnn
457
+ frac_str =
423
458
  fractional_seconds_as_string(a_time_dur, false);
424
459
  char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
425
-
460
+
426
461
  string_type replace_string(seconds_format);
427
462
  replace_string += sep;
428
463
  replace_string += frac_str;
429
- boost::algorithm::replace_all(format,
430
- seconds_with_fractional_seconds_format,
464
+ boost::algorithm::replace_all(format,
465
+ seconds_with_fractional_seconds_format,
431
466
  replace_string);
432
467
  }
433
468
  if (format.find(fractional_seconds_format) != string_type::npos) {
@@ -436,13 +471,13 @@ namespace date_time {
436
471
  frac_str = fractional_seconds_as_string(a_time_dur, false);
437
472
  }
438
473
  boost::algorithm::replace_all(format,
439
- fractional_seconds_format,
474
+ fractional_seconds_format,
440
475
  frac_str);
441
476
  }
442
477
 
443
478
  if (format.find(fractional_seconds_or_none_format) != string_type::npos) {
444
479
  // replace %F with nnnnnnn or nothing if fs == 0
445
- frac_str =
480
+ frac_str =
446
481
  fractional_seconds_as_string(a_time_dur, true);
447
482
  if (frac_str.size()) {
448
483
  char_type sep = std::use_facet<std::numpunct<char_type> >(a_ios.getloc()).decimal_point();
@@ -450,7 +485,7 @@ namespace date_time {
450
485
  replace_string += sep;
451
486
  replace_string += frac_str;
452
487
  boost::algorithm::replace_all(format,
453
- fractional_seconds_or_none_format,
488
+ fractional_seconds_or_none_format,
454
489
  replace_string);
455
490
  }
456
491
  else {
@@ -459,12 +494,12 @@ namespace date_time {
459
494
  }
460
495
  }
461
496
 
462
- return this->do_put_tm(a_next, a_ios, a_fill,
497
+ return this->do_put_tm(a_next, a_ios, a_fill,
463
498
  to_tm(a_time_dur), format);
464
499
  }
465
-
466
- OutItrT put(OutItrT next, std::ios_base& a_ios,
467
- char_type fill, const period_type& p) const
500
+
501
+ OutItrT put(OutItrT next, std::ios_base& a_ios,
502
+ char_type fill, const period_type& p) const
468
503
  {
469
504
  return this->m_period_formatter.put_period(next, a_ios, fill,p,*this);
470
505
  }
@@ -472,12 +507,12 @@ namespace date_time {
472
507
 
473
508
  protected:
474
509
 
475
- static
476
- string_type
510
+ static
511
+ string_type
477
512
  fractional_seconds_as_string(const time_duration_type& a_time,
478
- bool null_when_zero)
513
+ bool null_when_zero)
479
514
  {
480
- typename time_duration_type::fractional_seconds_type frac_sec =
515
+ typename time_duration_type::fractional_seconds_type frac_sec =
481
516
  a_time.fractional_seconds();
482
517
 
483
518
  if (null_when_zero && (frac_sec == 0)) {
@@ -485,17 +520,33 @@ namespace date_time {
485
520
  }
486
521
 
487
522
  //make sure there is no sign
488
- frac_sec = date_time::absolute_value(frac_sec);
523
+ return integral_as_string(
524
+ date_time::absolute_value(frac_sec),
525
+ time_duration_type::num_fractional_digits());
526
+ }
527
+
528
+ static
529
+ string_type
530
+ hours_as_string(const time_duration_type& a_time, int width = 2)
531
+ {
532
+ return integral_as_string(date_time::absolute_value(a_time.hours()), width);
533
+ }
534
+
535
+ template< typename IntT >
536
+ static
537
+ string_type
538
+ integral_as_string(IntT val, int width = 2)
539
+ {
489
540
  std::basic_ostringstream<char_type> ss;
490
541
  ss.imbue(std::locale::classic()); // don't want any formatting
491
- ss << std::setw(time_duration_type::num_fractional_digits())
492
- << std::setfill(static_cast<char_type>('0'));
542
+ ss << std::setw(width)
543
+ << std::setfill(static_cast<char_type>('0'));
493
544
  #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
494
545
  // JDG [7/6/02 VC++ compatibility]
495
546
  char_type buff[34];
496
- ss << _i64toa(static_cast<boost::int64_t>(frac_sec), buff, 10);
547
+ ss << _i64toa(static_cast<boost::int64_t>(val), buff, 10);
497
548
  #else
498
- ss << frac_sec;
549
+ ss << val;
499
550
  #endif
500
551
  return ss.str();
501
552
  }
@@ -504,98 +555,106 @@ namespace date_time {
504
555
  string_type m_time_duration_format;
505
556
 
506
557
  };
507
-
508
- template <class time_type, class CharT, class OutItrT>
558
+
559
+ template <class time_type, class CharT, class OutItrT>
509
560
  std::locale::id time_facet<time_type, CharT, OutItrT>::id;
510
561
 
511
- template <class time_type, class CharT, class OutItrT>
512
- const typename time_facet<time_type, CharT, OutItrT>::char_type*
562
+ template <class time_type, class CharT, class OutItrT>
563
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
513
564
  time_facet<time_type, CharT, OutItrT>::fractional_seconds_format = time_formats<CharT>::fractional_seconds_format;
514
565
 
515
- template <class time_type, class CharT, class OutItrT>
516
- const typename time_facet<time_type, CharT, OutItrT>::char_type*
566
+ template <class time_type, class CharT, class OutItrT>
567
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
517
568
  time_facet<time_type, CharT, OutItrT>::fractional_seconds_or_none_format = time_formats<CharT>::fractional_seconds_or_none_format;
518
569
 
519
- template <class time_type, class CharT, class OutItrT>
520
- const typename time_facet<time_type, CharT, OutItrT>::char_type*
521
- time_facet<time_type, CharT, OutItrT>::seconds_with_fractional_seconds_format =
570
+ template <class time_type, class CharT, class OutItrT>
571
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
572
+ time_facet<time_type, CharT, OutItrT>::seconds_with_fractional_seconds_format =
522
573
  time_formats<CharT>::seconds_with_fractional_seconds_format;
523
574
 
524
575
 
525
- template <class time_type, class CharT, class OutItrT>
576
+ template <class time_type, class CharT, class OutItrT>
526
577
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
527
578
  time_facet<time_type, CharT, OutItrT>::zone_name_format = time_formats<CharT>::zone_name_format;
528
579
 
529
- template <class time_type, class CharT, class OutItrT>
580
+ template <class time_type, class CharT, class OutItrT>
530
581
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
531
582
  time_facet<time_type, CharT, OutItrT>::zone_abbrev_format = time_formats<CharT>::zone_abbrev_format;
532
583
 
533
- template <class time_type, class CharT, class OutItrT>
584
+ template <class time_type, class CharT, class OutItrT>
534
585
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
535
586
  time_facet<time_type, CharT, OutItrT>::zone_iso_extended_format =time_formats<CharT>::zone_iso_extended_format;
536
587
 
537
- template <class time_type, class CharT, class OutItrT>
588
+ template <class time_type, class CharT, class OutItrT>
538
589
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
539
590
  time_facet<time_type, CharT, OutItrT>::posix_zone_string_format =time_formats<CharT>::posix_zone_string_format;
540
591
 
541
- template <class time_type, class CharT, class OutItrT>
592
+ template <class time_type, class CharT, class OutItrT>
542
593
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
543
594
  time_facet<time_type, CharT, OutItrT>::zone_iso_format = time_formats<CharT>::zone_iso_format;
544
595
 
545
- template <class time_type, class CharT, class OutItrT>
596
+ template <class time_type, class CharT, class OutItrT>
546
597
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
547
598
  time_facet<time_type, CharT, OutItrT>::seconds_format = time_formats<CharT>::seconds_format;
548
599
 
549
- template <class time_type, class CharT, class OutItrT>
600
+ template <class time_type, class CharT, class OutItrT>
601
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
602
+ time_facet<time_type, CharT, OutItrT>::hours_format = time_formats<CharT>::hours_format;
603
+
604
+ template <class time_type, class CharT, class OutItrT>
605
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
606
+ time_facet<time_type, CharT, OutItrT>::unrestricted_hours_format = time_formats<CharT>::unrestricted_hours_format;
607
+
608
+ template <class time_type, class CharT, class OutItrT>
550
609
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
551
610
  time_facet<time_type, CharT, OutItrT>::standard_format = time_formats<CharT>::standard_format;
552
611
 
553
- template <class time_type, class CharT, class OutItrT>
612
+ template <class time_type, class CharT, class OutItrT>
554
613
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
555
614
  time_facet<time_type, CharT, OutItrT>::duration_seperator = time_formats<CharT>::duration_seperator;
556
615
 
557
- template <class time_type, class CharT, class OutItrT>
616
+ template <class time_type, class CharT, class OutItrT>
558
617
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
559
618
  time_facet<time_type, CharT, OutItrT>::negative_sign = time_formats<CharT>::negative_sign;
560
619
 
561
- template <class time_type, class CharT, class OutItrT>
620
+ template <class time_type, class CharT, class OutItrT>
562
621
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
563
622
  time_facet<time_type, CharT, OutItrT>::positive_sign = time_formats<CharT>::positive_sign;
564
623
 
565
- template <class time_type, class CharT, class OutItrT>
624
+ template <class time_type, class CharT, class OutItrT>
566
625
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
567
626
  time_facet<time_type, CharT, OutItrT>::duration_sign_negative_only = time_formats<CharT>::duration_sign_negative_only;
568
627
 
569
- template <class time_type, class CharT, class OutItrT>
628
+ template <class time_type, class CharT, class OutItrT>
570
629
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
571
630
  time_facet<time_type, CharT, OutItrT>::duration_sign_always = time_formats<CharT>::duration_sign_always;
572
631
 
573
- template <class time_type, class CharT, class OutItrT>
632
+ template <class time_type, class CharT, class OutItrT>
574
633
  const typename time_facet<time_type,CharT, OutItrT>::char_type*
575
634
  time_facet<time_type,CharT, OutItrT>::iso_time_format_specifier = time_formats<CharT>::iso_time_format_specifier;
576
635
 
577
- template <class time_type, class CharT, class OutItrT>
636
+ template <class time_type, class CharT, class OutItrT>
578
637
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
579
638
  time_facet<time_type, CharT, OutItrT>::iso_time_format_extended_specifier = time_formats<CharT>::iso_time_format_extended_specifier;
580
639
 
581
- template <class time_type, class CharT, class OutItrT>
640
+ template <class time_type, class CharT, class OutItrT>
582
641
  const typename time_facet<time_type, CharT, OutItrT>::char_type*
583
- time_facet<time_type, CharT, OutItrT>::default_time_format =
642
+ time_facet<time_type, CharT, OutItrT>::default_time_format =
584
643
  time_formats<CharT>::default_time_format;
585
644
 
586
- template <class time_type, class CharT, class OutItrT>
587
- const typename time_facet<time_type, CharT, OutItrT>::char_type*
588
- time_facet<time_type, CharT, OutItrT>::default_time_duration_format =
645
+ template <class time_type, class CharT, class OutItrT>
646
+ const typename time_facet<time_type, CharT, OutItrT>::char_type*
647
+ time_facet<time_type, CharT, OutItrT>::default_time_duration_format =
589
648
  time_formats<CharT>::default_time_duration_format;
590
649
 
591
650
 
592
- //! Facet for format-based input.
651
+ //! Facet for format-based input.
593
652
  /*!
594
653
  */
595
654
  template <class time_type,
596
- class CharT,
655
+ class CharT,
597
656
  class InItrT = std::istreambuf_iterator<CharT, std::char_traits<CharT> > >
598
- class time_input_facet :
657
+ class time_input_facet :
599
658
  public boost::date_time::date_input_facet<typename time_type::date_type , CharT, InItrT> {
600
659
  public:
601
660
  typedef typename time_type::date_type date_type;
@@ -628,13 +687,13 @@ namespace date_time {
628
687
  static const char_type* duration_seperator;
629
688
  static const char_type* iso_time_format_specifier;
630
689
  static const char_type* iso_time_format_extended_specifier;
631
- static const char_type* default_time_input_format;
690
+ static const char_type* default_time_input_format;
632
691
  static const char_type* default_time_duration_format;
633
692
  static std::locale::id id;
634
693
 
635
694
  //! Constructor that takes a format string for a ptime
636
- explicit time_input_facet(const string_type& format, ::size_t a_ref = 0)
637
- : base_type(format, a_ref),
695
+ explicit time_input_facet(const string_type& format, ::size_t a_ref = 0)
696
+ : base_type(format, a_ref),
638
697
  m_time_duration_format(default_time_duration_format)
639
698
  { }
640
699
 
@@ -649,16 +708,16 @@ namespace date_time {
649
708
  sv_parser,
650
709
  per_parser,
651
710
  date_gen_parser,
652
- a_ref),
711
+ a_ref),
653
712
  m_time_duration_format(default_time_duration_format)
654
713
  {}
655
714
 
656
715
  //! sets default formats for ptime, local_date_time, and time_duration
657
- explicit time_input_facet(::size_t a_ref = 0)
658
- : base_type(default_time_input_format, a_ref),
716
+ explicit time_input_facet(::size_t a_ref = 0)
717
+ : base_type(default_time_input_format, a_ref),
659
718
  m_time_duration_format(default_time_duration_format)
660
719
  { }
661
-
720
+
662
721
  //! Set the format for time_duration
663
722
  void time_duration_format(const char_type* const format) {
664
723
  m_time_duration_format = format;
@@ -671,94 +730,102 @@ namespace date_time {
671
730
  {
672
731
  this->m_format = iso_time_format_extended_specifier;
673
732
  }
674
-
733
+
675
734
  InItrT get(InItrT& sitr,
676
735
  InItrT& stream_end,
677
736
  std::ios_base& a_ios,
678
737
  period_type& p) const
679
738
  {
680
- p = this->m_period_parser.get_period(sitr,
681
- stream_end,
682
- a_ios,
683
- p,
684
- time_duration_type::unit(),
739
+ p = this->m_period_parser.get_period(sitr,
740
+ stream_end,
741
+ a_ios,
742
+ p,
743
+ time_duration_type::unit(),
685
744
  *this);
686
745
  return sitr;
687
746
  }
688
-
747
+
689
748
  //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz]
690
749
  //default time_duration format is %H:%M:%S%F HH:MM:SS[.fff...]
691
750
 
692
- InItrT get(InItrT& sitr,
693
- InItrT& stream_end,
694
- std::ios_base& a_ios,
751
+ InItrT get(InItrT& sitr,
752
+ InItrT& stream_end,
753
+ std::ios_base& a_ios,
695
754
  time_duration_type& td) const
696
755
  {
697
756
  // skip leading whitespace
698
757
  while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
699
-
758
+
700
759
  bool use_current_char = false;
701
-
760
+
702
761
  // num_get will consume the +/-, we may need a copy if special_value
703
762
  char_type c = '\0';
704
763
  if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) {
705
764
  c = *sitr;
706
765
  }
707
-
708
- long hour = 0;
709
- long min = 0;
710
- long sec = 0;
766
+
767
+ typedef typename time_duration_type::hour_type hour_type;
768
+ typedef typename time_duration_type::min_type min_type;
769
+ typedef typename time_duration_type::sec_type sec_type;
770
+
771
+ hour_type hour = 0;
772
+ min_type min = 0;
773
+ sec_type sec = 0;
711
774
  typename time_duration_type::fractional_seconds_type frac(0);
712
-
775
+
713
776
  typedef std::num_get<CharT, InItrT> num_get;
714
777
  if(!std::has_facet<num_get>(a_ios.getloc())) {
715
778
  num_get* ng = new num_get();
716
779
  std::locale loc = std::locale(a_ios.getloc(), ng);
717
780
  a_ios.imbue(loc);
718
781
  }
719
-
782
+
720
783
  const_itr itr(m_time_duration_format.begin());
721
784
  while (itr != m_time_duration_format.end() && (sitr != stream_end)) {
722
785
  if (*itr == '%') {
723
- itr++;
786
+ ++itr;
724
787
  if (*itr != '%') {
725
788
  switch(*itr) {
726
- case 'H':
789
+ case 'O':
727
790
  {
728
- match_results mr;
729
- hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
791
+ // A period may span more than 24 hours. In that case the format
792
+ // string should be composed with the unrestricted hours specifier.
793
+ hour = var_string_to_int<hour_type, CharT>(sitr, stream_end,
794
+ std::numeric_limits<hour_type>::digits10 + 1);
730
795
  if(hour == -1){
731
796
  return check_special_value(sitr, stream_end, td, c);
732
797
  }
733
798
  break;
734
799
  }
735
- case 'M':
800
+ case 'H':
736
801
  {
737
802
  match_results mr;
738
- min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
739
- if(min == -1){
803
+ hour = fixed_string_to_int<hour_type, CharT>(sitr, stream_end, mr, 2);
804
+ if(hour == -1){
740
805
  return check_special_value(sitr, stream_end, td, c);
741
806
  }
742
807
  break;
743
808
  }
744
- case 'S':
809
+ case 'M':
745
810
  {
746
811
  match_results mr;
747
- sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
748
- if(sec == -1){
812
+ min = fixed_string_to_int<min_type, CharT>(sitr, stream_end, mr, 2);
813
+ if(min == -1){
749
814
  return check_special_value(sitr, stream_end, td, c);
750
815
  }
751
816
  break;
752
817
  }
753
818
  case 's':
819
+ case 'S':
754
820
  {
755
821
  match_results mr;
756
- sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
822
+ sec = fixed_string_to_int<sec_type, CharT>(sitr, stream_end, mr, 2);
757
823
  if(sec == -1){
758
824
  return check_special_value(sitr, stream_end, td, c);
759
825
  }
826
+ if (*itr == 'S')
827
+ break;
760
828
  // %s is the same as %S%f so we drop through into %f
761
- //break;
762
829
  }
763
830
  case 'f':
764
831
  {
@@ -766,7 +833,7 @@ namespace date_time {
766
833
  if(*sitr == '.') {
767
834
  ++sitr;
768
835
  parse_frac_type(sitr, stream_end, frac);
769
- // sitr will point to next expected char after this parsing
836
+ // sitr will point to next expected char after this parsing
770
837
  // is complete so no need to advance it
771
838
  use_current_char = true;
772
839
  }
@@ -775,13 +842,13 @@ namespace date_time {
775
842
  }
776
843
  break;
777
844
  }
778
- case 'F':
845
+ case 'F':
779
846
  {
780
847
  // check for decimal, skip if missing
781
848
  if(*sitr == '.') {
782
849
  ++sitr;
783
850
  parse_frac_type(sitr, stream_end, frac);
784
- // sitr will point to next expected char after this parsing
851
+ // sitr will point to next expected char after this parsing
785
852
  // is complete so no need to advance it
786
853
  use_current_char = true;
787
854
  }
@@ -796,20 +863,20 @@ namespace date_time {
796
863
  }// switch
797
864
  }
798
865
  else { // itr == '%', second consecutive
799
- sitr++;
866
+ ++sitr;
800
867
  }
801
-
802
- itr++; //advance past format specifier
868
+
869
+ ++itr; //advance past format specifier
803
870
  }
804
871
  else { //skip past chars in format and in buffer
805
- itr++;
806
- // set use_current_char when sitr is already
872
+ ++itr;
873
+ // set use_current_char when sitr is already
807
874
  // pointing at the next character to process
808
875
  if (use_current_char) {
809
876
  use_current_char = false;
810
877
  }
811
878
  else {
812
- sitr++;
879
+ ++sitr;
813
880
  }
814
881
  }
815
882
  }
@@ -817,21 +884,21 @@ namespace date_time {
817
884
  td = time_duration_type(hour, min, sec, frac);
818
885
  return sitr;
819
886
  }
820
-
887
+
821
888
 
822
889
  //! Parses a time object from the input stream
823
- InItrT get(InItrT& sitr,
824
- InItrT& stream_end,
825
- std::ios_base& a_ios,
890
+ InItrT get(InItrT& sitr,
891
+ InItrT& stream_end,
892
+ std::ios_base& a_ios,
826
893
  time_type& t) const
827
894
  {
828
895
  string_type tz_str;
829
896
  return get(sitr, stream_end, a_ios, t, tz_str, false);
830
897
  }
831
898
  //! Expects a time_zone in the input stream
832
- InItrT get_local_time(InItrT& sitr,
833
- InItrT& stream_end,
834
- std::ios_base& a_ios,
899
+ InItrT get_local_time(InItrT& sitr,
900
+ InItrT& stream_end,
901
+ std::ios_base& a_ios,
835
902
  time_type& t,
836
903
  string_type& tz_str) const
837
904
  {
@@ -840,51 +907,55 @@ namespace date_time {
840
907
 
841
908
  protected:
842
909
 
843
- InItrT get(InItrT& sitr,
844
- InItrT& stream_end,
845
- std::ios_base& a_ios,
910
+ InItrT get(InItrT& sitr,
911
+ InItrT& stream_end,
912
+ std::ios_base& a_ios,
846
913
  time_type& t,
847
914
  string_type& tz_str,
848
915
  bool time_is_local) const
849
916
  {
850
917
  // skip leading whitespace
851
918
  while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; }
852
-
919
+
853
920
  bool use_current_char = false;
854
921
  bool use_current_format_char = false; // used whith two character flags
855
-
922
+
856
923
  // num_get will consume the +/-, we may need a copy if special_value
857
924
  char_type c = '\0';
858
925
  if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) {
859
926
  c = *sitr;
860
927
  }
861
-
928
+
929
+ typedef typename time_duration_type::hour_type hour_type;
930
+ typedef typename time_duration_type::min_type min_type;
931
+ typedef typename time_duration_type::sec_type sec_type;
932
+
862
933
  // time elements
863
- long hour = 0;
864
- long min = 0;
865
- long sec = 0;
934
+ hour_type hour = 0;
935
+ min_type min = 0;
936
+ sec_type sec = 0;
866
937
  typename time_duration_type::fractional_seconds_type frac(0);
867
938
  // date elements
868
939
  short day_of_year(0);
869
- /* Initialized the following to their minimum values. These intermediate
870
- * objects are used so we get specific exceptions when part of the input
871
- * is unparsable.
940
+ /* Initialized the following to their minimum values. These intermediate
941
+ * objects are used so we get specific exceptions when part of the input
942
+ * is unparsable.
872
943
  * Ex: "205-Jan-15" will throw a bad_year, "2005-Jsn-15"- bad_month, etc.*/
873
944
  year_type t_year(1400);
874
945
  month_type t_month(1);
875
946
  day_type t_day(1);
876
-
947
+
877
948
  typedef std::num_get<CharT, InItrT> num_get;
878
949
  if(!std::has_facet<num_get>(a_ios.getloc())) {
879
950
  num_get* ng = new num_get();
880
951
  std::locale loc = std::locale(a_ios.getloc(), ng);
881
952
  a_ios.imbue(loc);
882
953
  }
883
-
954
+
884
955
  const_itr itr(this->m_format.begin());
885
956
  while (itr != this->m_format.end() && (sitr != stream_end)) {
886
957
  if (*itr == '%') {
887
- itr++;
958
+ ++itr;
888
959
  if (*itr != '%') {
889
960
  // the cases are grouped by date & time flags - not alphabetical order
890
961
  switch(*itr) {
@@ -898,7 +969,7 @@ namespace date_time {
898
969
  try {
899
970
  t_year = this->m_parser.parse_year(sitr, stream_end, s, mr);
900
971
  }
901
- catch(std::out_of_range bad_year) { // base class for bad_year exception
972
+ catch(std::out_of_range&) { // base class for bad_year exception
902
973
  if(this->m_sv_parser.match(sitr, stream_end, mr)) {
903
974
  t = time_type(static_cast<special_values>(mr.current_match));
904
975
  return sitr;
@@ -919,13 +990,13 @@ namespace date_time {
919
990
  try {
920
991
  t_month = this->m_parser.parse_month(sitr, stream_end, s, mr);
921
992
  }
922
- catch(std::out_of_range bad_month) { // base class for bad_month exception
993
+ catch(std::out_of_range&) { // base class for bad_month exception
923
994
  if(this->m_sv_parser.match(sitr, stream_end, mr)) {
924
995
  t = time_type(static_cast<special_values>(mr.current_match));
925
996
  return sitr;
926
997
  }
927
998
  else {
928
- throw; // rethrow bad_year
999
+ throw; // rethrow bad_month
929
1000
  }
930
1001
  }
931
1002
  // did m_parser already advance sitr to next char?
@@ -946,7 +1017,7 @@ namespace date_time {
946
1017
  try {
947
1018
  wd = this->m_parser.parse_weekday(sitr, stream_end, s, mr);
948
1019
  }
949
- catch(std::out_of_range bad_weekday) { // base class for bad_weekday exception
1020
+ catch(std::out_of_range&) { // base class for bad_weekday exception
950
1021
  if(this->m_sv_parser.match(sitr, stream_end, mr)) {
951
1022
  t = time_type(static_cast<special_values>(mr.current_match));
952
1023
  return sitr;
@@ -982,55 +1053,48 @@ namespace date_time {
982
1053
  try {
983
1054
  t_day = this->m_parser.parse_day_of_month(sitr, stream_end);
984
1055
  }
985
- catch(std::out_of_range bad_day_of_month) { // base class for exception
1056
+ catch(std::out_of_range&) { // base class for exception bad_day_of_month
986
1057
  match_results mr;
987
1058
  if(this->m_sv_parser.match(sitr, stream_end, mr)) {
988
1059
  t = time_type(static_cast<special_values>(mr.current_match));
989
1060
  return sitr;
990
1061
  }
991
1062
  else {
992
- throw; // rethrow bad_year
1063
+ throw; // rethrow bad_day_of_month
993
1064
  }
994
1065
  }
995
1066
  break;
996
1067
  }
997
1068
  // time flags
998
- case 'H':
1069
+ case 'H':
999
1070
  {
1000
1071
  match_results mr;
1001
- hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1072
+ hour = fixed_string_to_int<hour_type, CharT>(sitr, stream_end, mr, 2);
1002
1073
  if(hour == -1){
1003
1074
  return check_special_value(sitr, stream_end, t, c);
1004
1075
  }
1005
1076
  break;
1006
1077
  }
1007
- case 'M':
1078
+ case 'M':
1008
1079
  {
1009
1080
  match_results mr;
1010
- min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1081
+ min = fixed_string_to_int<min_type, CharT>(sitr, stream_end, mr, 2);
1011
1082
  if(min == -1){
1012
1083
  return check_special_value(sitr, stream_end, t, c);
1013
1084
  }
1014
1085
  break;
1015
1086
  }
1016
- case 'S':
1017
- {
1018
- match_results mr;
1019
- sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1020
- if(sec == -1){
1021
- return check_special_value(sitr, stream_end, t, c);
1022
- }
1023
- break;
1024
- }
1025
1087
  case 's':
1088
+ case 'S':
1026
1089
  {
1027
1090
  match_results mr;
1028
- sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
1091
+ sec = fixed_string_to_int<sec_type, CharT>(sitr, stream_end, mr, 2);
1029
1092
  if(sec == -1){
1030
1093
  return check_special_value(sitr, stream_end, t, c);
1031
1094
  }
1095
+ if (*itr == 'S')
1096
+ break;
1032
1097
  // %s is the same as %S%f so we drop through into %f
1033
- //break;
1034
1098
  }
1035
1099
  case 'f':
1036
1100
  {
@@ -1038,7 +1102,7 @@ namespace date_time {
1038
1102
  if(*sitr == '.') {
1039
1103
  ++sitr;
1040
1104
  parse_frac_type(sitr, stream_end, frac);
1041
- // sitr will point to next expected char after this parsing
1105
+ // sitr will point to next expected char after this parsing
1042
1106
  // is complete so no need to advance it
1043
1107
  use_current_char = true;
1044
1108
  }
@@ -1047,13 +1111,13 @@ namespace date_time {
1047
1111
  }
1048
1112
  break;
1049
1113
  }
1050
- case 'F':
1114
+ case 'F':
1051
1115
  {
1052
1116
  // check for decimal, skip if missing
1053
1117
  if(*sitr == '.') {
1054
1118
  ++sitr;
1055
1119
  parse_frac_type(sitr, stream_end, frac);
1056
- // sitr will point to next expected char after this parsing
1120
+ // sitr will point to next expected char after this parsing
1057
1121
  // is complete so no need to advance it
1058
1122
  use_current_char = true;
1059
1123
  }
@@ -1083,44 +1147,44 @@ namespace date_time {
1083
1147
  else {
1084
1148
  use_current_format_char = true;
1085
1149
  }
1086
-
1150
+
1087
1151
  }
1088
1152
  else {
1089
1153
  // nothing was parsed so we don't want to advance sitr
1090
1154
  use_current_char = true;
1091
1155
  }
1092
-
1156
+
1093
1157
  break;
1094
1158
  }
1095
1159
  default:
1096
1160
  {} // ignore what we don't understand?
1097
1161
  }// switch
1098
- }
1162
+ }
1099
1163
  else { // itr == '%', second consecutive
1100
- sitr++;
1164
+ ++sitr;
1101
1165
  }
1102
-
1166
+
1103
1167
  if(use_current_format_char) {
1104
1168
  use_current_format_char = false;
1105
1169
  }
1106
1170
  else {
1107
- itr++; //advance past format specifier
1171
+ ++itr; //advance past format specifier
1108
1172
  }
1109
-
1173
+
1110
1174
  }
1111
1175
  else { //skip past chars in format and in buffer
1112
- itr++;
1113
- // set use_current_char when sitr is already
1176
+ ++itr;
1177
+ // set use_current_char when sitr is already
1114
1178
  // pointing at the next character to process
1115
1179
  if (use_current_char) {
1116
1180
  use_current_char = false;
1117
1181
  }
1118
1182
  else {
1119
- sitr++;
1183
+ ++sitr;
1120
1184
  }
1121
1185
  }
1122
1186
  }
1123
-
1187
+
1124
1188
  date_type d(not_a_date_time);
1125
1189
  if (day_of_year > 0) {
1126
1190
  d = date_type(static_cast<unsigned short>(t_year-1),12,31) + date_duration_type(day_of_year);
@@ -1135,8 +1199,8 @@ namespace date_time {
1135
1199
  }
1136
1200
 
1137
1201
  //! Helper function to check for special_value
1138
- /*! First character may have been consumed during original parse
1139
- * attempt. Parameter 'c' should be a copy of that character.
1202
+ /*! First character may have been consumed during original parse
1203
+ * attempt. Parameter 'c' should be a copy of that character.
1140
1204
  * Throws ios_base::failure if parse fails. */
1141
1205
  template<class temporal_type>
1142
1206
  inline
@@ -1149,15 +1213,16 @@ namespace date_time {
1149
1213
  this->m_sv_parser.match(sitr, stream_end, mr);
1150
1214
  if(mr.current_match == match_results::PARSE_ERROR) {
1151
1215
  std::string tmp = convert_string_type<char_type, char>(mr.cache);
1152
- throw std::ios_base::failure("Parse failed. No match found for '" + tmp + "'");
1216
+ boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + tmp + "'"));
1217
+ BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return sitr); // should never reach
1153
1218
  }
1154
- tt = temporal_type(static_cast<special_values>(mr.current_match));
1219
+ tt = temporal_type(static_cast<special_values>(mr.current_match));
1155
1220
  return sitr;
1156
1221
  }
1157
1222
 
1158
1223
  //! Helper function for parsing a fractional second type from the stream
1159
- void parse_frac_type(InItrT& sitr,
1160
- InItrT& stream_end,
1224
+ void parse_frac_type(InItrT& sitr,
1225
+ InItrT& stream_end,
1161
1226
  fracional_seconds_type& frac) const
1162
1227
  {
1163
1228
  string_type cache;
@@ -1178,7 +1243,7 @@ namespace date_time {
1178
1243
  }
1179
1244
  }
1180
1245
  }
1181
-
1246
+
1182
1247
  private:
1183
1248
  string_type m_time_duration_format;
1184
1249
 
@@ -1199,60 +1264,60 @@ namespace date_time {
1199
1264
  template <class time_type, class CharT, class InItrT>
1200
1265
  std::locale::id time_input_facet<time_type, CharT, InItrT>::id;
1201
1266
 
1202
- template <class time_type, class CharT, class InItrT>
1203
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1267
+ template <class time_type, class CharT, class InItrT>
1268
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1204
1269
  time_input_facet<time_type, CharT, InItrT>::fractional_seconds_format = time_formats<CharT>::fractional_seconds_format;
1205
1270
 
1206
- template <class time_type, class CharT, class InItrT>
1207
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1271
+ template <class time_type, class CharT, class InItrT>
1272
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1208
1273
  time_input_facet<time_type, CharT, InItrT>::fractional_seconds_or_none_format = time_formats<CharT>::fractional_seconds_or_none_format;
1209
1274
 
1210
- template <class time_type, class CharT, class InItrT>
1211
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1275
+ template <class time_type, class CharT, class InItrT>
1276
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1212
1277
  time_input_facet<time_type, CharT, InItrT>::seconds_with_fractional_seconds_format = time_formats<CharT>::seconds_with_fractional_seconds_format;
1213
1278
 
1214
- template <class time_type, class CharT, class InItrT>
1215
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1279
+ template <class time_type, class CharT, class InItrT>
1280
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1216
1281
  time_input_facet<time_type, CharT, InItrT>::seconds_format = time_formats<CharT>::seconds_format;
1217
1282
 
1218
- template <class time_type, class CharT, class InItrT>
1219
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1283
+ template <class time_type, class CharT, class InItrT>
1284
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1220
1285
  time_input_facet<time_type, CharT, InItrT>::standard_format = time_formats<CharT>::standard_format;
1221
1286
 
1222
- template <class time_type, class CharT, class InItrT>
1223
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1287
+ template <class time_type, class CharT, class InItrT>
1288
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1224
1289
  time_input_facet<time_type, CharT, InItrT>::zone_abbrev_format = time_formats<CharT>::zone_abbrev_format;
1225
1290
 
1226
- template <class time_type, class CharT, class InItrT>
1227
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1291
+ template <class time_type, class CharT, class InItrT>
1292
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1228
1293
  time_input_facet<time_type, CharT, InItrT>::zone_name_format = time_formats<CharT>::zone_name_format;
1229
1294
 
1230
- template <class time_type, class CharT, class InItrT>
1231
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1295
+ template <class time_type, class CharT, class InItrT>
1296
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1232
1297
  time_input_facet<time_type, CharT, InItrT>::zone_iso_format = time_formats<CharT>::zone_iso_format;
1233
1298
 
1234
- template <class time_type, class CharT, class InItrT>
1235
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1299
+ template <class time_type, class CharT, class InItrT>
1300
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1236
1301
  time_input_facet<time_type, CharT, InItrT>::zone_iso_extended_format = time_formats<CharT>::zone_iso_extended_format;
1237
1302
 
1238
- template <class time_type, class CharT, class InItrT>
1239
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1303
+ template <class time_type, class CharT, class InItrT>
1304
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1240
1305
  time_input_facet<time_type, CharT, InItrT>::duration_seperator = time_formats<CharT>::duration_seperator;
1241
1306
 
1242
- template <class time_type, class CharT, class InItrT>
1243
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1307
+ template <class time_type, class CharT, class InItrT>
1308
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1244
1309
  time_input_facet<time_type, CharT, InItrT>::iso_time_format_specifier = time_formats<CharT>::iso_time_format_specifier;
1245
1310
 
1246
- template <class time_type, class CharT, class InItrT>
1247
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1311
+ template <class time_type, class CharT, class InItrT>
1312
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1248
1313
  time_input_facet<time_type, CharT, InItrT>::iso_time_format_extended_specifier = time_formats<CharT>::iso_time_format_extended_specifier;
1249
1314
 
1250
- template <class time_type, class CharT, class InItrT>
1251
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1315
+ template <class time_type, class CharT, class InItrT>
1316
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1252
1317
  time_input_facet<time_type, CharT, InItrT>::default_time_input_format = time_formats<CharT>::default_time_input_format;
1253
1318
 
1254
- template <class time_type, class CharT, class InItrT>
1255
- const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1319
+ template <class time_type, class CharT, class InItrT>
1320
+ const typename time_input_facet<time_type, CharT, InItrT>::char_type*
1256
1321
  time_input_facet<time_type, CharT, InItrT>::default_time_duration_format = time_formats<CharT>::default_time_duration_format;
1257
1322
 
1258
1323