passenger 3.0.0 → 3.0.1

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 (538) hide show
  1. data/DEVELOPERS.TXT +9 -6
  2. data/NEWS +50 -0
  3. data/Rakefile +2 -1
  4. data/bin/passenger-install-apache2-module +4 -4
  5. data/bin/passenger-install-nginx-module +1 -1
  6. data/bin/passenger-make-enterprisey +1 -1
  7. data/build/agents.rb +26 -19
  8. data/build/apache2.rb +49 -46
  9. data/build/basics.rb +37 -13
  10. data/build/common_library.rb +134 -64
  11. data/build/config.rb +18 -11
  12. data/build/cplusplus_support.rb +4 -0
  13. data/build/cxx_tests.rb +26 -12
  14. data/build/documentation.rb +18 -11
  15. data/build/integration_tests.rb +18 -11
  16. data/build/misc.rb +18 -11
  17. data/build/nginx.rb +27 -19
  18. data/build/oxt_tests.rb +18 -11
  19. data/build/packaging.rb +45 -37
  20. data/build/rpm.rb +98 -0
  21. data/build/ruby_extension.rb +19 -13
  22. data/build/ruby_tests.rb +19 -12
  23. data/build/test_basics.rb +23 -11
  24. data/debian/README.Debian +15 -0
  25. data/debian/changelog +185 -0
  26. data/debian/control +47 -19
  27. data/debian/copyright +20 -0
  28. data/debian/libapache2-mod-passenger.install +1 -0
  29. data/debian/libapache2-mod-passenger.postinst +36 -0
  30. data/debian/libapache2-mod-passenger.prerm +15 -0
  31. data/debian/passenger-common.install +4 -0
  32. data/debian/passenger.conf +4 -0
  33. data/debian/passenger.load +1 -0
  34. data/debian/rules +37 -0
  35. data/debian/watch +3 -0
  36. data/{misc → dev}/copy_boost_headers.rb +3 -0
  37. data/{misc → dev}/find_owner_pipe_leaks.rb +0 -0
  38. data/{misc → dev}/render_error_pages.rb +0 -0
  39. data/doc/Users guide Apache.html +39 -1
  40. data/doc/Users guide Apache.txt +40 -0
  41. data/doc/Users guide Nginx.html +1 -1
  42. data/doc/Users guide Standalone.html +1 -1
  43. data/doc/cxxapi/Constants_8h_source.html +1 -1
  44. data/doc/cxxapi/DirectoryMapper_8h_source.html +6 -22
  45. data/doc/cxxapi/EventedClient_8h_source.html +572 -468
  46. data/doc/cxxapi/Exceptions_8h_source.html +142 -129
  47. data/doc/cxxapi/FileDescriptor_8h_source.html +263 -199
  48. data/doc/cxxapi/MessageChannel_8h_source.html +686 -770
  49. data/doc/cxxapi/MessageServer_8h_source.html +1 -1
  50. data/doc/cxxapi/PoolOptions_8h_source.html +79 -78
  51. data/doc/cxxapi/ResourceLocator_8h_source.html +105 -55
  52. data/doc/cxxapi/SafeLibev_8h_source.html +180 -0
  53. data/doc/cxxapi/ServerInstanceDir_8h_source.html +114 -110
  54. data/doc/cxxapi/Session_8h_source.html +1 -1
  55. data/doc/cxxapi/SpawnManager_8h_source.html +208 -208
  56. data/doc/cxxapi/StaticString_8h_source.html +258 -183
  57. data/doc/cxxapi/Utils_8h_source.html +71 -54
  58. data/doc/cxxapi/annotated.html +3 -0
  59. data/doc/cxxapi/classAgentWatcher.html +2 -2
  60. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -1
  61. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -27
  62. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +5 -0
  63. data/doc/cxxapi/classPassenger_1_1EventedClient.html +102 -7
  64. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +2 -1
  65. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +34 -8
  66. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +36 -0
  67. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +52 -0
  68. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -3
  69. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -120
  70. data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +36 -0
  71. data/doc/cxxapi/classPassenger_1_1SafeLibev.html +51 -0
  72. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -0
  73. data/doc/cxxapi/classPassenger_1_1SpawnException.html +22 -0
  74. data/doc/cxxapi/classes.html +14 -14
  75. data/doc/cxxapi/files.html +2 -0
  76. data/doc/cxxapi/functions_0x63.html +6 -3
  77. data/doc/cxxapi/functions_0x64.html +9 -2
  78. data/doc/cxxapi/functions_0x67.html +6 -9
  79. data/doc/cxxapi/functions_0x69.html +3 -0
  80. data/doc/cxxapi/functions_0x77.html +8 -8
  81. data/doc/cxxapi/functions_eval.html +6 -0
  82. data/doc/cxxapi/functions_func.html +18 -17
  83. data/doc/cxxapi/functions_vars.html +8 -0
  84. data/doc/cxxapi/graph_legend.png +0 -0
  85. data/doc/cxxapi/group__Core.png +0 -0
  86. data/doc/cxxapi/group__Hooks.png +0 -0
  87. data/doc/cxxapi/hierarchy.html +3 -0
  88. data/doc/cxxapi/inherit__graph__14.map +1 -1
  89. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  90. data/doc/cxxapi/inherit__graph__14.png +0 -0
  91. data/doc/cxxapi/inherit__graph__15.map +1 -3
  92. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  93. data/doc/cxxapi/inherit__graph__15.png +0 -0
  94. data/doc/cxxapi/inherit__graph__16.map +3 -1
  95. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  96. data/doc/cxxapi/inherit__graph__16.png +0 -0
  97. data/doc/cxxapi/inherit__graph__17.map +1 -1
  98. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  99. data/doc/cxxapi/inherit__graph__17.png +0 -0
  100. data/doc/cxxapi/inherit__graph__18.map +1 -2
  101. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  102. data/doc/cxxapi/inherit__graph__18.png +0 -0
  103. data/doc/cxxapi/inherit__graph__19.map +2 -1
  104. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  105. data/doc/cxxapi/inherit__graph__19.png +0 -0
  106. data/doc/cxxapi/inherit__graph__20.map +1 -1
  107. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  108. data/doc/cxxapi/inherit__graph__20.png +0 -0
  109. data/doc/cxxapi/inherit__graph__21.map +1 -1
  110. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  111. data/doc/cxxapi/inherit__graph__21.png +0 -0
  112. data/doc/cxxapi/inherit__graph__22.map +1 -1
  113. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  114. data/doc/cxxapi/inherit__graph__22.png +0 -0
  115. data/doc/cxxapi/inherit__graph__23.map +1 -1
  116. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  117. data/doc/cxxapi/inherit__graph__23.png +0 -0
  118. data/doc/cxxapi/inherit__graph__24.map +1 -1
  119. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  120. data/doc/cxxapi/inherit__graph__24.png +0 -0
  121. data/doc/cxxapi/inherit__graph__25.map +1 -1
  122. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  123. data/doc/cxxapi/inherit__graph__25.png +0 -0
  124. data/doc/cxxapi/inherit__graph__26.map +1 -1
  125. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  126. data/doc/cxxapi/inherit__graph__26.png +0 -0
  127. data/doc/cxxapi/inherit__graph__27.map +1 -1
  128. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  129. data/doc/cxxapi/inherit__graph__27.png +0 -0
  130. data/doc/cxxapi/inherit__graph__28.map +1 -2
  131. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  132. data/doc/cxxapi/inherit__graph__28.png +0 -0
  133. data/doc/cxxapi/inherit__graph__29.map +1 -1
  134. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  135. data/doc/cxxapi/inherit__graph__29.png +0 -0
  136. data/doc/cxxapi/inherit__graph__30.map +1 -1
  137. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  138. data/doc/cxxapi/inherit__graph__30.png +0 -0
  139. data/doc/cxxapi/inherit__graph__31.map +2 -1
  140. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  141. data/doc/cxxapi/inherit__graph__31.png +0 -0
  142. data/doc/cxxapi/inherit__graph__32.map +1 -3
  143. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  144. data/doc/cxxapi/inherit__graph__32.png +0 -0
  145. data/doc/cxxapi/inherit__graph__33.map +1 -1
  146. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  147. data/doc/cxxapi/inherit__graph__33.png +0 -0
  148. data/doc/cxxapi/inherit__graph__34.map +1 -1
  149. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  150. data/doc/cxxapi/inherit__graph__34.png +0 -0
  151. data/doc/cxxapi/inherit__graph__35.map +3 -1
  152. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  153. data/doc/cxxapi/inherit__graph__35.png +0 -0
  154. data/doc/cxxapi/inherit__graph__36.map +1 -1
  155. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  156. data/doc/cxxapi/inherit__graph__36.png +0 -0
  157. data/doc/cxxapi/inherit__graph__37.map +1 -1
  158. data/doc/cxxapi/inherit__graph__37.md5 +1 -1
  159. data/doc/cxxapi/inherit__graph__37.png +0 -0
  160. data/doc/cxxapi/inherit__graph__38.map +3 -1
  161. data/doc/cxxapi/inherit__graph__38.md5 +1 -1
  162. data/doc/cxxapi/inherit__graph__38.png +0 -0
  163. data/doc/cxxapi/inherit__graph__39.map +3 -1
  164. data/doc/cxxapi/inherit__graph__39.md5 +1 -1
  165. data/doc/cxxapi/inherit__graph__39.png +0 -0
  166. data/doc/cxxapi/inherits.html +33 -24
  167. data/doc/cxxapi/namespacePassenger.html +52 -0
  168. data/doc/cxxapi/namespacemembers.html +6 -0
  169. data/doc/cxxapi/namespacemembers_func.html +6 -0
  170. data/doc/cxxapi/tree.html +8 -0
  171. data/ext/apache2/Configuration.cpp +30 -8
  172. data/ext/apache2/Configuration.hpp +15 -14
  173. data/ext/apache2/DirectoryMapper.h +0 -16
  174. data/ext/apache2/Hooks.cpp +30 -29
  175. data/ext/boost/algorithm/string/detail/case_conv.hpp +6 -6
  176. data/ext/boost/algorithm/string/detail/find_format.hpp +14 -4
  177. data/ext/boost/algorithm/string/detail/find_format_all.hpp +13 -3
  178. data/ext/boost/algorithm/string/detail/find_format_store.hpp +11 -0
  179. data/ext/boost/algorithm/string/erase.hpp +2 -2
  180. data/ext/boost/bind/placeholders.hpp +2 -2
  181. data/ext/boost/concept/detail/backward_compatibility.hpp +16 -0
  182. data/ext/boost/concept/detail/general.hpp +15 -6
  183. data/ext/boost/concept/detail/has_constraints.hpp +5 -3
  184. data/ext/boost/concept/usage.hpp +5 -4
  185. data/ext/boost/concept_check.hpp +10 -1
  186. data/ext/boost/config/abi/borland_prefix.hpp +1 -1
  187. data/ext/boost/config/auto_link.hpp +68 -21
  188. data/ext/boost/config/compiler/borland.hpp +11 -3
  189. data/ext/boost/config/compiler/clang.hpp +62 -0
  190. data/ext/boost/config/compiler/codegear.hpp +21 -7
  191. data/ext/boost/config/compiler/common_edg.hpp +4 -2
  192. data/ext/boost/config/compiler/digitalmars.hpp +1 -1
  193. data/ext/boost/config/compiler/gcc.hpp +46 -7
  194. data/ext/boost/config/compiler/gcc_xml.hpp +25 -0
  195. data/ext/boost/config/compiler/intel.hpp +23 -0
  196. data/ext/boost/config/compiler/kai.hpp +1 -1
  197. data/ext/boost/config/compiler/metrowerks.hpp +1 -1
  198. data/ext/boost/config/compiler/nvcc.hpp +86 -0
  199. data/ext/boost/config/compiler/pgi.hpp +18 -3
  200. data/ext/boost/config/compiler/sunpro_cc.hpp +19 -5
  201. data/ext/boost/config/compiler/vacpp.hpp +8 -0
  202. data/ext/boost/config/compiler/visualc.hpp +27 -11
  203. data/ext/boost/config/platform/cygwin.hpp +0 -3
  204. data/ext/boost/config/platform/symbian.hpp +94 -0
  205. data/ext/boost/config/platform/win32.hpp +8 -1
  206. data/ext/boost/config/select_compiler_config.hpp +10 -0
  207. data/ext/boost/config/select_platform_config.hpp +4 -0
  208. data/ext/boost/config/stdlib/dinkumware.hpp +11 -1
  209. data/ext/boost/config/stdlib/libcomo.hpp +1 -0
  210. data/ext/boost/config/stdlib/libstdcpp3.hpp +1 -0
  211. data/ext/boost/config/stdlib/modena.hpp +1 -0
  212. data/ext/boost/config/stdlib/msl.hpp +1 -0
  213. data/ext/boost/config/stdlib/roguewave.hpp +1 -0
  214. data/ext/boost/config/stdlib/sgi.hpp +1 -0
  215. data/ext/boost/config/stdlib/stlport.hpp +1 -0
  216. data/ext/boost/config/stdlib/vacpp.hpp +1 -0
  217. data/ext/boost/config/suffix.hpp +40 -2
  218. data/ext/boost/cstdint.hpp +36 -7
  219. data/ext/boost/date_time/gregorian/conversion.hpp +4 -2
  220. data/ext/boost/date_time/microsec_time_clock.hpp +7 -7
  221. data/ext/boost/date_time/posix_time/conversion.hpp +4 -2
  222. data/ext/boost/date_time/time_facet.hpp +43 -4
  223. data/ext/boost/detail/endian.hpp +5 -2
  224. data/ext/boost/detail/lcast_precision.hpp +2 -2
  225. data/ext/boost/detail/sp_typeinfo.hpp +1 -1
  226. data/ext/boost/detail/workaround.hpp +5 -0
  227. data/ext/boost/exception/detail/error_info_impl.hpp +3 -3
  228. data/ext/boost/exception/detail/exception_ptr.hpp +76 -135
  229. data/ext/boost/exception/detail/is_output_streamable.hpp +15 -2
  230. data/ext/boost/exception/detail/type_info.hpp +9 -5
  231. data/ext/boost/exception/diagnostic_information.hpp +5 -3
  232. data/ext/boost/exception/exception.hpp +60 -46
  233. data/ext/boost/exception/info.hpp +47 -14
  234. data/ext/boost/function/function_base.hpp +4 -4
  235. data/ext/boost/integer.hpp +4 -0
  236. data/ext/boost/integer_fwd.hpp +9 -3
  237. data/ext/boost/iterator/iterator_concepts.hpp +284 -0
  238. data/ext/boost/iterator/transform_iterator.hpp +0 -1
  239. data/ext/boost/make_shared.hpp +17 -0
  240. data/ext/boost/mpl/aux_/config/has_xxx.hpp +4 -3
  241. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +2 -6
  242. data/ext/boost/mpl/aux_/template_arity.hpp +4 -4
  243. data/ext/boost/mpl/eval_if.hpp +3 -3
  244. data/ext/boost/mpl/has_xxx.hpp +369 -3
  245. data/ext/boost/optional/optional.hpp +3 -1
  246. data/ext/boost/optional/optional_fwd.hpp +1 -1
  247. data/ext/boost/preprocessor/repetition/enum_trailing_params.hpp +38 -0
  248. data/ext/boost/range/algorithm/equal.hpp +188 -0
  249. data/ext/boost/range/as_literal.hpp +15 -15
  250. data/ext/boost/range/concepts.hpp +331 -0
  251. data/ext/boost/range/const_iterator.hpp +7 -4
  252. data/ext/boost/range/detail/extract_optional_type.hpp +52 -0
  253. data/ext/boost/range/detail/implementation_help.hpp +7 -7
  254. data/ext/boost/range/detail/misc_concept.hpp +33 -0
  255. data/ext/boost/range/iterator.hpp +32 -32
  256. data/ext/boost/range/iterator_range.hpp +8 -651
  257. data/ext/boost/range/iterator_range_core.hpp +542 -0
  258. data/ext/boost/range/iterator_range_io.hpp +93 -0
  259. data/ext/boost/range/mutable_iterator.hpp +7 -4
  260. data/ext/boost/range/size.hpp +1 -1
  261. data/ext/boost/range/size_type.hpp +2 -1
  262. data/ext/boost/shared_array.hpp +19 -0
  263. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +2 -2
  264. data/ext/boost/smart_ptr/detail/yield_k.hpp +1 -1
  265. data/ext/boost/smart_ptr/make_shared.hpp +508 -0
  266. data/ext/boost/smart_ptr/shared_array.hpp +147 -0
  267. data/ext/boost/src/pthread/thread.cpp +16 -21
  268. data/ext/boost/src/pthread/timeconv.inl +7 -4
  269. data/ext/boost/thread/barrier.hpp +2 -1
  270. data/ext/boost/thread/detail/config.hpp +7 -1
  271. data/ext/boost/thread/detail/platform.hpp +1 -1
  272. data/ext/boost/thread/detail/thread.hpp +62 -18
  273. data/ext/boost/thread/detail/thread_group.hpp +5 -2
  274. data/ext/boost/thread/detail/tss_hooks.hpp +8 -25
  275. data/ext/boost/thread/future.hpp +45 -34
  276. data/ext/boost/thread/locks.hpp +184 -55
  277. data/ext/boost/thread/pthread/condition_variable.hpp +7 -7
  278. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +4 -2
  279. data/ext/boost/thread/pthread/mutex.hpp +29 -17
  280. data/ext/boost/thread/pthread/once.hpp +5 -0
  281. data/ext/boost/thread/pthread/recursive_mutex.hpp +97 -18
  282. data/ext/boost/thread/pthread/shared_mutex.hpp +1 -1
  283. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +1 -1
  284. data/ext/boost/thread/tss.hpp +2 -0
  285. data/ext/boost/throw_exception.hpp +21 -5
  286. data/ext/boost/token_functions.hpp +111 -91
  287. data/ext/boost/type_traits/add_reference.hpp +19 -1
  288. data/ext/boost/type_traits/function_traits.hpp +2 -2
  289. data/ext/boost/type_traits/is_const.hpp +24 -5
  290. data/ext/boost/type_traits/is_convertible.hpp +1 -1
  291. data/ext/boost/type_traits/is_function.hpp +3 -0
  292. data/ext/boost/type_traits/is_lvalue_reference.hpp +118 -0
  293. data/ext/boost/type_traits/is_reference.hpp +8 -81
  294. data/ext/boost/type_traits/is_rvalue_reference.hpp +29 -0
  295. data/ext/boost/type_traits/is_same.hpp +2 -2
  296. data/ext/boost/type_traits/is_volatile.hpp +26 -7
  297. data/ext/boost/type_traits/remove_const.hpp +12 -0
  298. data/ext/boost/type_traits/remove_cv.hpp +23 -1
  299. data/ext/boost/type_traits/remove_reference.hpp +21 -1
  300. data/ext/boost/type_traits/type_with_alignment.hpp +10 -10
  301. data/ext/boost/units/detail/utility.hpp +104 -0
  302. data/ext/boost/utility/compare_pointees.hpp +1 -1
  303. data/ext/common/AgentsStarter.hpp +151 -161
  304. data/ext/common/ApplicationPool/Pool.h +16 -4
  305. data/ext/common/Constants.h +1 -1
  306. data/ext/common/EventedClient.h +130 -26
  307. data/ext/common/Exceptions.h +15 -2
  308. data/ext/common/FileDescriptor.h +76 -12
  309. data/ext/common/IniFile.h +488 -0
  310. data/ext/common/LoggingAgent/LoggingServer.h +2 -2
  311. data/ext/common/LoggingAgent/RemoteSender.h +15 -6
  312. data/ext/common/MessageChannel.h +17 -101
  313. data/ext/common/PoolOptions.h +1 -0
  314. data/ext/common/ResourceLocator.h +78 -28
  315. data/ext/common/SafeLibev.h +149 -0
  316. data/ext/common/ServerInstanceDir.h +11 -7
  317. data/ext/common/Session.h +1 -1
  318. data/ext/common/SpawnManager.h +14 -14
  319. data/ext/common/StaticString.h +75 -0
  320. data/ext/common/Utils.cpp +304 -12
  321. data/ext/common/Utils.h +17 -0
  322. data/ext/common/Utils/BufferedIO.h +196 -0
  323. data/ext/common/Utils/IOUtils.cpp +159 -0
  324. data/ext/common/Utils/IOUtils.h +118 -1
  325. data/ext/common/Utils/ProcessMetricsCollector.h +184 -56
  326. data/ext/common/Utils/StrIntUtils.cpp +45 -11
  327. data/ext/common/Utils/StrIntUtils.h +8 -5
  328. data/ext/common/Utils/Timer.h +22 -0
  329. data/ext/common/Utils/utf8.h +35 -0
  330. data/ext/common/Utils/utf8/checked.h +324 -0
  331. data/ext/common/Utils/utf8/core.h +359 -0
  332. data/ext/common/Utils/utf8/unchecked.h +229 -0
  333. data/ext/common/Watchdog.cpp +52 -85
  334. data/ext/libev/config.h +122 -0
  335. data/ext/nginx/Configuration.c +7 -1
  336. data/ext/nginx/HelperAgent.cpp +16 -18
  337. data/ext/nginx/config +6 -4
  338. data/ext/oxt/system_calls.cpp +10 -0
  339. data/ext/oxt/system_calls.hpp +2 -0
  340. data/lib/phusion_passenger.rb +6 -11
  341. data/lib/phusion_passenger/dependencies.rb +2 -0
  342. data/lib/phusion_passenger/packaging.rb +5 -5
  343. data/lib/phusion_passenger/platform_info.rb +88 -0
  344. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +3 -17
  345. data/lib/phusion_passenger/platform_info/compiler.rb +14 -32
  346. data/lib/phusion_passenger/platform_info/curl.rb +6 -1
  347. data/lib/phusion_passenger/platform_info/operating_system.rb +107 -0
  348. data/lib/phusion_passenger/public_api.rb +2 -2
  349. data/lib/phusion_passenger/rails3_extensions/init.rb +5 -2
  350. data/lib/phusion_passenger/standalone/command.rb +6 -2
  351. data/lib/phusion_passenger/standalone/package_runtime_command.rb +2 -2
  352. data/lib/phusion_passenger/standalone/runtime_installer.rb +17 -5
  353. data/lib/phusion_passenger/standalone/start_command.rb +12 -12
  354. data/lib/phusion_passenger/standalone/stop_command.rb +3 -3
  355. data/lib/phusion_passenger/standalone/utils.rb +6 -2
  356. data/lib/phusion_passenger/templates/standalone/config.erb +37 -5
  357. data/lib/phusion_passenger/utils.rb +4 -7
  358. data/resources/mime.types +73 -0
  359. data/{misc → resources}/union_station_gateway.crt +0 -0
  360. data/test/cxx/BufferedIOTest.cpp +364 -0
  361. data/test/cxx/EventedClientTest.cpp +150 -13
  362. data/test/cxx/IOUtilsTest.cpp +399 -1
  363. data/test/cxx/MessageChannelTest.cpp +5 -120
  364. data/test/cxx/ProcessMetricsCollectorTest.cpp +121 -0
  365. data/test/cxx/StaticStringTest.cpp +134 -0
  366. data/test/cxx/UtilsTest.cpp +16 -46
  367. data/test/stub/rails_apps/2.3/mycook/public/dispatch.cgi +2 -2
  368. data/test/stub/rails_apps/2.3/mycook/public/dispatch.fcgi +1 -1
  369. data/test/stub/rails_apps/2.3/mycook/public/dispatch.rb +1 -1
  370. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +73 -0
  371. data/test/support/allocate_memory.c +14 -0
  372. data/test/support/test_helper.rb +3 -0
  373. metadata +57 -174
  374. data/bin/passenger-stress-test +0 -345
  375. data/debian/postinst +0 -24
  376. data/doc/rdoc/classes/ConditionVariable.html +0 -215
  377. data/doc/rdoc/classes/Exception.html +0 -120
  378. data/doc/rdoc/classes/GC.html +0 -113
  379. data/doc/rdoc/classes/IO.html +0 -221
  380. data/doc/rdoc/classes/PhusionPassenger.html +0 -397
  381. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -180
  382. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -647
  383. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -654
  384. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +0 -92
  385. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
  386. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
  387. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
  388. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
  389. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -619
  390. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -142
  391. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +0 -368
  392. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +0 -231
  393. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +0 -588
  394. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +0 -92
  395. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +0 -92
  396. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +0 -147
  397. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +0 -279
  398. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +0 -92
  399. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +0 -92
  400. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +0 -123
  401. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +0 -92
  402. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +0 -341
  403. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +0 -294
  404. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +0 -199
  405. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -155
  406. data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +0 -367
  407. data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +0 -95
  408. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +0 -351
  409. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +0 -98
  410. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +0 -200
  411. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +0 -410
  412. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +0 -98
  413. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +0 -156
  414. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +0 -115
  415. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +0 -202
  416. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
  417. data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +0 -273
  418. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
  419. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -162
  420. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
  421. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
  422. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -673
  423. data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +0 -92
  424. data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +0 -415
  425. data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +0 -134
  426. data/doc/rdoc/classes/PhusionPassenger/Packaging.html +0 -129
  427. data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +0 -1809
  428. data/doc/rdoc/classes/PhusionPassenger/Plugin.html +0 -237
  429. data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
  430. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -312
  431. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +0 -98
  432. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -218
  433. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +0 -114
  434. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +0 -256
  435. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +0 -139
  436. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +0 -118
  437. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +0 -135
  438. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -378
  439. data/doc/rdoc/classes/PhusionPassenger/Standalone.html +0 -111
  440. data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +0 -252
  441. data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +0 -161
  442. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +0 -368
  443. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +0 -132
  444. data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +0 -151
  445. data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +0 -189
  446. data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +0 -177
  447. data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +0 -341
  448. data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +0 -203
  449. data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +0 -156
  450. data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +0 -168
  451. data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +0 -86
  452. data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +0 -135
  453. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
  454. data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -1550
  455. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +0 -204
  456. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +0 -171
  457. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +0 -140
  458. data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +0 -260
  459. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
  460. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -265
  461. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
  462. data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +0 -561
  463. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
  464. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
  465. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -182
  466. data/doc/rdoc/classes/Process.html +0 -115
  467. data/doc/rdoc/classes/Signal.html +0 -139
  468. data/doc/rdoc/created.rid +0 -1
  469. data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -276
  470. data/doc/rdoc/files/README.html +0 -157
  471. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -130
  472. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -135
  473. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
  474. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
  475. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +0 -126
  476. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +0 -132
  477. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
  478. data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +0 -129
  479. data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +0 -127
  480. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +0 -141
  481. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +0 -126
  482. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +0 -146
  483. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +0 -125
  484. data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +0 -132
  485. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
  486. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
  487. data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +0 -122
  488. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -147
  489. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
  490. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -127
  491. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
  492. data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +0 -127
  493. data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +0 -132
  494. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
  495. data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +0 -127
  496. data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +0 -129
  497. data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +0 -126
  498. data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +0 -126
  499. data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +0 -126
  500. data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +0 -126
  501. data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +0 -127
  502. data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +0 -128
  503. data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +0 -126
  504. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -122
  505. data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +0 -127
  506. data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +0 -127
  507. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -137
  508. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
  509. data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +0 -127
  510. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
  511. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -160
  512. data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +0 -127
  513. data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +0 -135
  514. data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +0 -126
  515. data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +0 -126
  516. data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +0 -126
  517. data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +0 -127
  518. data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +0 -133
  519. data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +0 -136
  520. data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +0 -126
  521. data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +0 -126
  522. data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +0 -126
  523. data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +0 -127
  524. data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +0 -126
  525. data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +0 -120
  526. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
  527. data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +0 -122
  528. data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +0 -126
  529. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -179
  530. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -132
  531. data/doc/rdoc/fr_class_index.html +0 -138
  532. data/doc/rdoc/fr_file_index.html +0 -108
  533. data/doc/rdoc/fr_method_index.html +0 -430
  534. data/doc/rdoc/index.html +0 -26
  535. data/doc/rdoc/rdoc-style.css +0 -187
  536. data/ext/apache2/LICENSE-CNRI.TXT +0 -79
  537. data/ext/common/Utils/BlockingScalar.h +0 -50
  538. data/ext/common/Utils/FileHandleGuard.h +0 -81
@@ -17,7 +17,7 @@ namespace boost
17
17
  return new T();
18
18
  }
19
19
 
20
- #ifdef BOOST_HAS_RVALUE_REFS
20
+ #ifndef BOOST_NO_RVALUE_REFERENCES
21
21
  template<typename T,typename A1>
22
22
  inline T* heap_new(A1&& a1)
23
23
  {
@@ -62,6 +62,8 @@ namespace boost
62
62
  boost::shared_ptr<detail::tss_cleanup_function> cleanup;
63
63
 
64
64
  public:
65
+ typedef T element_type;
66
+
65
67
  thread_specific_ptr():
66
68
  cleanup(detail::heap_new<delete_data>(),detail::do_heap_delete<delete_data>())
67
69
  {}
@@ -36,17 +36,13 @@
36
36
  #if !defined( BOOST_EXCEPTION_DISABLE )
37
37
  # include <boost/exception/exception.hpp>
38
38
  # include <boost/current_function.hpp>
39
- # define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(::boost::enable_error_info(x) <<\
40
- ::boost::throw_function(BOOST_CURRENT_FUNCTION) <<\
41
- ::boost::throw_file(__FILE__) <<\
42
- ::boost::throw_line(__LINE__))
39
+ # define BOOST_THROW_EXCEPTION(x) ::boost::exception_detail::throw_exception_(x,BOOST_CURRENT_FUNCTION,__FILE__,__LINE__)
43
40
  #else
44
41
  # define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x)
45
42
  #endif
46
43
 
47
44
  namespace boost
48
45
  {
49
-
50
46
  #ifdef BOOST_NO_EXCEPTIONS
51
47
 
52
48
  void throw_exception( std::exception const & e ); // user defined
@@ -70,6 +66,26 @@ template<class E> BOOST_ATTRIBUTE_NORETURN inline void throw_exception( E const
70
66
 
71
67
  #endif
72
68
 
69
+ #if !defined( BOOST_EXCEPTION_DISABLE )
70
+ namespace
71
+ exception_detail
72
+ {
73
+ template <class E>
74
+ BOOST_ATTRIBUTE_NORETURN
75
+ void
76
+ throw_exception_( E const & x, char const * current_function, char const * file, int line )
77
+ {
78
+ boost::throw_exception(
79
+ set_info(
80
+ set_info(
81
+ set_info(
82
+ enable_error_info(x),
83
+ throw_function(current_function)),
84
+ throw_file(file)),
85
+ throw_line(line)));
86
+ }
87
+ }
88
+ #endif
73
89
  } // namespace boost
74
90
 
75
91
  #endif // #ifndef BOOST_THROW_EXCEPTION_HPP_INCLUDED
@@ -40,6 +40,9 @@
40
40
  #include <boost/assert.hpp>
41
41
  #include <boost/detail/workaround.hpp>
42
42
  #include <boost/mpl/if.hpp>
43
+ #if !defined(BOOST_NO_CWCTYPE)
44
+ #include <cwctype>
45
+ #endif
43
46
 
44
47
  //
45
48
  // the following must not be macros if we are to prefix them
@@ -48,9 +51,15 @@
48
51
  #ifdef ispunct
49
52
  # undef ispunct
50
53
  #endif
54
+ #ifdef iswpunct
55
+ # undef iswpunct
56
+ #endif
51
57
  #ifdef isspace
52
58
  # undef isspace
53
59
  #endif
60
+ #ifdef iswspace
61
+ # undef iswspace
62
+ #endif
54
63
  //
55
64
  // fix namespace problems:
56
65
  //
@@ -58,11 +67,14 @@
58
67
  namespace std{
59
68
  using ::ispunct;
60
69
  using ::isspace;
70
+ #if !defined(BOOST_NO_CWCTYPE)
71
+ using ::iswpunct;
72
+ using ::iswspace;
73
+ #endif
61
74
  }
62
75
  #endif
63
76
 
64
77
  namespace boost{
65
-
66
78
  //===========================================================================
67
79
  // The escaped_list_separator class. Which is a model of TokenizerFunction
68
80
  // An escaped list is a super-set of what is commonly known as a comma
@@ -76,17 +88,12 @@ namespace boost{
76
88
  struct escaped_list_error : public std::runtime_error{
77
89
  escaped_list_error(const std::string& what_arg):std::runtime_error(what_arg) { }
78
90
  };
79
-
91
+
80
92
 
81
93
  // The out of the box GCC 2.95 on cygwin does not have a char_traits class.
82
94
  // MSVC does not like the following typename
83
- #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
84
- template <class Char,
85
- class Traits = typename std::basic_string<Char>::traits_type >
86
- #else
87
- template <class Char,
88
- class Traits = std::basic_string<Char>::traits_type >
89
- #endif
95
+ template <class Char,
96
+ class Traits = BOOST_DEDUCED_TYPENAME std::basic_string<Char>::traits_type >
90
97
  class escaped_list_separator {
91
98
 
92
99
  private:
@@ -100,7 +107,7 @@ namespace boost{
100
107
  };
101
108
  string_type escape_;
102
109
  string_type c_;
103
- string_type quote_;
110
+ string_type quote_;
104
111
  bool last_;
105
112
 
106
113
  bool is_escape(Char e) {
@@ -140,21 +147,21 @@ namespace boost{
140
147
  }
141
148
 
142
149
  public:
143
-
150
+
144
151
  explicit escaped_list_separator(Char e = '\\',
145
152
  Char c = ',',Char q = '\"')
146
153
  : escape_(1,e), c_(1,c), quote_(1,q), last_(false) { }
147
-
154
+
148
155
  escaped_list_separator(string_type e, string_type c, string_type q)
149
156
  : escape_(e), c_(c), quote_(q), last_(false) { }
150
-
157
+
151
158
  void reset() {last_=false;}
152
159
 
153
160
  template <typename InputIterator, typename Token>
154
161
  bool operator()(InputIterator& next,InputIterator end,Token& tok) {
155
162
  bool bInQuote = false;
156
163
  tok = Token();
157
-
164
+
158
165
  if (next == end) {
159
166
  if (last_) {
160
167
  last_ = false;
@@ -193,8 +200,44 @@ namespace boost{
193
200
  //===========================================================================
194
201
  // The classes here are used by offset_separator and char_separator to implement
195
202
  // faster assigning of tokens using assign instead of +=
196
-
203
+
197
204
  namespace tokenizer_detail {
205
+ //===========================================================================
206
+ // Tokenizer was broken for wide character separators, at least on Windows, since
207
+ // CRT functions isspace etc only expect values in [0, 0xFF]. Debug build asserts
208
+ // if higher values are passed in. The traits extension class should take care of this.
209
+ // Assuming that the conditional will always get optimized out in the function
210
+ // implementations, argument types are not a problem since both forms of character classifiers
211
+ // expect an int.
212
+ // In case there is no cwctype header, we implement the checks manually.
213
+ // We make use of the fact that the tested categories should fit in ASCII.
214
+ template<typename traits>
215
+ struct traits_extension : public traits {
216
+ typedef typename traits::char_type char_type;
217
+ static bool isspace(char_type c)
218
+ {
219
+ #if !defined(BOOST_NO_CWCTYPE)
220
+ if (sizeof(char_type) == 1)
221
+ return std::isspace(c) != 0;
222
+ else
223
+ return std::iswspace(c) != 0;
224
+ #else
225
+ return static_cast< unsigned >(c) <= 255 && std::isspace(c) != 0;
226
+ #endif
227
+ }
228
+
229
+ static bool ispunct(char_type c)
230
+ {
231
+ #if !defined(BOOST_NO_CWCTYPE)
232
+ if (sizeof(char_type) == 1)
233
+ return std::ispunct(c) != 0;
234
+ else
235
+ return std::iswpunct(c) != 0;
236
+ #else
237
+ return static_cast< unsigned >(c) <= 255 && std::ispunct(c) != 0;
238
+ #endif
239
+ }
240
+ };
198
241
 
199
242
  // The assign_or_plus_equal struct contains functions that implement
200
243
  // assign, +=, and clearing based on the iterator type. The
@@ -229,26 +272,20 @@ namespace boost{
229
272
 
230
273
  }
231
274
 
232
- template<class Token, class Value>
233
- static void plus_equal(Token &, const Value &) {
234
-
235
- }
275
+ template<class Token, class Value>
276
+ static void plus_equal(Token &, const Value &) { }
236
277
 
237
278
  // If we are doing an assign, there is no need for the
238
- // the clear.
279
+ // the clear.
239
280
  //
240
281
  template<class Token>
241
- static void clear(Token &) {
242
-
243
- }
282
+ static void clear(Token &) { }
244
283
  };
245
284
 
246
285
  template <>
247
286
  struct assign_or_plus_equal<std::input_iterator_tag> {
248
287
  template<class Iterator, class Token>
249
- static void assign(Iterator b, Iterator e, Token &t) {
250
-
251
- }
288
+ static void assign(Iterator b, Iterator e, Token &t) { }
252
289
  template<class Token, class Value>
253
290
  static void plus_equal(Token &t, const Value &v) {
254
291
  t += v;
@@ -284,10 +321,10 @@ namespace boost{
284
321
  typedef typename cat::type iterator_category;
285
322
  };
286
323
 
287
-
288
- }
289
324
 
290
-
325
+ } // namespace tokenizer_detail
326
+
327
+
291
328
  //===========================================================================
292
329
  // The offset_separator class, which is a model of TokenizerFunction.
293
330
  // Offset breaks a string into tokens based on a range of offsets
@@ -299,7 +336,7 @@ namespace boost{
299
336
  unsigned int current_offset_;
300
337
  bool wrap_offsets_;
301
338
  bool return_partial_last_;
302
-
339
+
303
340
  public:
304
341
  template <typename Iter>
305
342
  offset_separator(Iter begin, Iter end, bool wrap_offsets = true,
@@ -307,7 +344,7 @@ namespace boost{
307
344
  : offsets_(begin,end), current_offset_(0),
308
345
  wrap_offsets_(wrap_offsets),
309
346
  return_partial_last_(return_partial_last) { }
310
-
347
+
311
348
  offset_separator()
312
349
  : offsets_(1,1), current_offset_(),
313
350
  wrap_offsets_(true), return_partial_last_(true) { }
@@ -320,18 +357,16 @@ namespace boost{
320
357
  bool operator()(InputIterator& next, InputIterator end, Token& tok)
321
358
  {
322
359
  typedef tokenizer_detail::assign_or_plus_equal<
323
- #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
324
- typename
325
- #endif
326
- tokenizer_detail::get_iterator_category<
327
- InputIterator>::iterator_category> assigner;
328
-
360
+ BOOST_DEDUCED_TYPENAME tokenizer_detail::get_iterator_category<
361
+ InputIterator
362
+ >::iterator_category
363
+ > assigner;
329
364
 
330
365
  BOOST_ASSERT(!offsets_.empty());
331
-
366
+
332
367
  assigner::clear(tok);
333
368
  InputIterator start(next);
334
-
369
+
335
370
  if (next == end)
336
371
  return false;
337
372
 
@@ -342,7 +377,7 @@ namespace boost{
342
377
  else
343
378
  return false;
344
379
  }
345
-
380
+
346
381
  int c = offsets_[current_offset_];
347
382
  int i = 0;
348
383
  for (; i < c; ++i) {
@@ -350,11 +385,11 @@ namespace boost{
350
385
  assigner::plus_equal(tok,*next++);
351
386
  }
352
387
  assigner::assign(start,next,tok);
353
-
388
+
354
389
  if (!return_partial_last_)
355
390
  if (i < (c-1) )
356
391
  return false;
357
-
392
+
358
393
  ++current_offset_;
359
394
  return true;
360
395
  }
@@ -378,15 +413,11 @@ namespace boost{
378
413
  enum empty_token_policy { drop_empty_tokens, keep_empty_tokens };
379
414
 
380
415
  // The out of the box GCC 2.95 on cygwin does not have a char_traits class.
381
- #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
382
- template <typename Char,
383
- typename Traits = typename std::basic_string<Char>::traits_type >
384
- #else
385
- template <typename Char,
386
- typename Traits = std::basic_string<Char>::traits_type >
387
- #endif
416
+ template <typename Char,
417
+ typename Tr = BOOST_DEDUCED_TYPENAME std::basic_string<Char>::traits_type >
388
418
  class char_separator
389
419
  {
420
+ typedef tokenizer_detail::traits_extension<Tr> Traits;
390
421
  typedef std::basic_string<Char,Traits> string_type;
391
422
  public:
392
423
  explicit
@@ -407,8 +438,8 @@ namespace boost{
407
438
  // use ispunct() for kept delimiters and isspace for dropped.
408
439
  explicit
409
440
  char_separator()
410
- : m_use_ispunct(true),
411
- m_use_isspace(true),
441
+ : m_use_ispunct(true),
442
+ m_use_isspace(true),
412
443
  m_empty_tokens(drop_empty_tokens) { }
413
444
 
414
445
  void reset() { }
@@ -417,11 +448,10 @@ namespace boost{
417
448
  bool operator()(InputIterator& next, InputIterator end, Token& tok)
418
449
  {
419
450
  typedef tokenizer_detail::assign_or_plus_equal<
420
- #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
421
- typename
422
- #endif
423
- tokenizer_detail::get_iterator_category<
424
- InputIterator>::iterator_category> assigner;
451
+ BOOST_DEDUCED_TYPENAME tokenizer_detail::get_iterator_category<
452
+ InputIterator
453
+ >::iterator_category
454
+ > assigner;
425
455
 
426
456
  assigner::clear(tok);
427
457
 
@@ -429,7 +459,7 @@ namespace boost{
429
459
  if (m_empty_tokens == drop_empty_tokens)
430
460
  for (; next != end && is_dropped(*next); ++next)
431
461
  { }
432
-
462
+
433
463
  InputIterator start(next);
434
464
 
435
465
  if (m_empty_tokens == drop_empty_tokens) {
@@ -446,13 +476,13 @@ namespace boost{
446
476
  // append all the non delim characters
447
477
  for (; next != end && !is_dropped(*next) && !is_kept(*next); ++next)
448
478
  assigner::plus_equal(tok,*next);
449
- }
479
+ }
450
480
  else { // m_empty_tokens == keep_empty_tokens
451
-
481
+
452
482
  // Handle empty token at the end
453
483
  if (next == end)
454
484
  {
455
- if (m_output_done == false)
485
+ if (m_output_done == false)
456
486
  {
457
487
  m_output_done = true;
458
488
  assigner::assign(start,next,tok);
@@ -461,7 +491,7 @@ namespace boost{
461
491
  else
462
492
  return false;
463
493
  }
464
-
494
+
465
495
  if (is_kept(*next)) {
466
496
  if (m_output_done == false)
467
497
  m_output_done = true;
@@ -493,13 +523,13 @@ namespace boost{
493
523
  bool m_use_isspace;
494
524
  empty_token_policy m_empty_tokens;
495
525
  bool m_output_done;
496
-
526
+
497
527
  bool is_kept(Char E) const
498
- {
528
+ {
499
529
  if (m_kept_delims.length())
500
530
  return m_kept_delims.find(E) != string_type::npos;
501
531
  else if (m_use_ispunct) {
502
- return std::ispunct(E) != 0;
532
+ return Traits::ispunct(E) != 0;
503
533
  } else
504
534
  return false;
505
535
  }
@@ -508,7 +538,7 @@ namespace boost{
508
538
  if (m_dropped_delims.length())
509
539
  return m_dropped_delims.find(E) != string_type::npos;
510
540
  else if (m_use_isspace) {
511
- return std::isspace(E) != 0;
541
+ return Traits::isspace(E) != 0;
512
542
  } else
513
543
  return false;
514
544
  }
@@ -525,31 +555,27 @@ namespace boost{
525
555
  // cannot be returned as tokens. These are often whitespace
526
556
 
527
557
  // The out of the box GCC 2.95 on cygwin does not have a char_traits class.
528
- #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
529
- template <class Char,
530
- class Traits = typename std::basic_string<Char>::traits_type >
531
- #else
532
- template <class Char,
533
- class Traits = std::basic_string<Char>::traits_type >
534
- #endif
558
+ template <class Char,
559
+ class Tr = BOOST_DEDUCED_TYPENAME std::basic_string<Char>::traits_type >
535
560
  class char_delimiters_separator {
536
- private:
561
+ private:
537
562
 
563
+ typedef tokenizer_detail::traits_extension<Tr> Traits;
538
564
  typedef std::basic_string<Char,Traits> string_type;
539
565
  string_type returnable_;
540
566
  string_type nonreturnable_;
541
567
  bool return_delims_;
542
568
  bool no_ispunct_;
543
569
  bool no_isspace_;
544
-
570
+
545
571
  bool is_ret(Char E)const
546
- {
572
+ {
547
573
  if (returnable_.length())
548
574
  return returnable_.find(E) != string_type::npos;
549
575
  else{
550
576
  if (no_ispunct_) {return false;}
551
577
  else{
552
- int r = std::ispunct(E);
578
+ int r = Traits::ispunct(E);
553
579
  return r != 0;
554
580
  }
555
581
  }
@@ -561,12 +587,12 @@ namespace boost{
561
587
  else{
562
588
  if (no_isspace_) {return false;}
563
589
  else{
564
- int r = std::isspace(E);
590
+ int r = Traits::isspace(E);
565
591
  return r != 0;
566
592
  }
567
593
  }
568
594
  }
569
-
595
+
570
596
  public:
571
597
  explicit char_delimiters_separator(bool return_delims = false,
572
598
  const Char* returnable = 0,
@@ -575,7 +601,7 @@ namespace boost{
575
601
  nonreturnable_(nonreturnable ? nonreturnable:string_type().c_str()),
576
602
  return_delims_(return_delims), no_ispunct_(returnable!=0),
577
603
  no_isspace_(nonreturnable!=0) { }
578
-
604
+
579
605
  void reset() { }
580
606
 
581
607
  public:
@@ -583,16 +609,16 @@ namespace boost{
583
609
  template <typename InputIterator, typename Token>
584
610
  bool operator()(InputIterator& next, InputIterator end,Token& tok) {
585
611
  tok = Token();
586
-
612
+
587
613
  // skip past all nonreturnable delims
588
614
  // skip past the returnable only if we are not returning delims
589
615
  for (;next!=end && ( is_nonret(*next) || (is_ret(*next)
590
616
  && !return_delims_ ) );++next) { }
591
-
617
+
592
618
  if (next == end) {
593
619
  return false;
594
620
  }
595
-
621
+
596
622
  // if we are to return delims and we are one a returnable one
597
623
  // move past it and stop
598
624
  if (is_ret(*next) && return_delims_) {
@@ -603,8 +629,8 @@ namespace boost{
603
629
  // append all the non delim characters
604
630
  for (;next!=end && !is_nonret(*next) && !is_ret(*next);++next)
605
631
  tok+=*next;
606
-
607
-
632
+
633
+
608
634
  return true;
609
635
  }
610
636
  };
@@ -612,10 +638,4 @@ namespace boost{
612
638
 
613
639
  } //namespace boost
614
640
 
615
-
616
- #endif
617
-
618
-
619
-
620
-
621
-
641
+ #endif