passenger 3.0.21 → 3.9.1.beta

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 (835) hide show
  1. data/DEVELOPERS.TXT +4 -10
  2. data/NEWS +19 -27
  3. data/Rakefile +20 -19
  4. data/bin/passenger +3 -2
  5. data/bin/passenger-config +35 -5
  6. data/bin/passenger-install-apache2-module +12 -12
  7. data/bin/passenger-install-nginx-module +55 -38
  8. data/bin/passenger-memory-stats +3 -1
  9. data/bin/passenger-status +7 -35
  10. data/build/agents.rb +107 -21
  11. data/build/apache2.rb +11 -46
  12. data/build/basics.rb +61 -9
  13. data/build/common_library.rb +59 -142
  14. data/build/cxx_tests.rb +111 -110
  15. data/build/documentation.rb +33 -0
  16. data/build/misc.rb +30 -12
  17. data/build/nginx.rb +10 -39
  18. data/build/oxt_tests.rb +1 -0
  19. data/build/ruby_extension.rb +1 -5
  20. data/build/test_basics.rb +3 -2
  21. data/dev/copy_boost_headers.rb +2 -1
  22. data/doc/Architectural overview.html +49 -90
  23. data/doc/DebuggingAndStressTesting.txt.md +49 -0
  24. data/doc/Packaging.txt.md +254 -0
  25. data/doc/Security of user switching support.html +35 -66
  26. data/doc/Users guide Apache.html +588 -758
  27. data/doc/Users guide Apache.idmap.txt +253 -136
  28. data/doc/Users guide Apache.txt +154 -109
  29. data/doc/Users guide Nginx.html +544 -660
  30. data/doc/Users guide Nginx.idmap.txt +179 -91
  31. data/doc/Users guide Nginx.txt +192 -118
  32. data/doc/Users guide Standalone.html +65 -48
  33. data/doc/Users guide Standalone.idmap.txt +10 -2
  34. data/doc/Users guide Standalone.txt +4 -0
  35. data/doc/images/glyphicons-halflings-white.png +0 -0
  36. data/doc/images/glyphicons-halflings.png +0 -0
  37. data/doc/images/phusion_banner_small.png +0 -0
  38. data/doc/images/{smart-lv2.png → smart.png} +0 -0
  39. data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
  40. data/doc/templates/bootstrap.min.css +397 -0
  41. data/doc/templates/markdown.html.erb +117 -0
  42. data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
  43. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
  44. data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
  45. data/doc/users_guide_snippets/support_information.txt +30 -0
  46. data/ext/apache2/Bucket.cpp +9 -26
  47. data/ext/apache2/Bucket.h +13 -10
  48. data/ext/apache2/Configuration.cpp +70 -58
  49. data/ext/apache2/Configuration.hpp +19 -47
  50. data/ext/apache2/DirectoryMapper.h +7 -7
  51. data/ext/apache2/Hooks.cpp +150 -313
  52. data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
  53. data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
  54. data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
  55. data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
  56. data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
  57. data/ext/boost/algorithm/string/formatter.hpp +20 -3
  58. data/ext/boost/assert.hpp +85 -4
  59. data/ext/boost/bind/bind.hpp +1 -1
  60. data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
  61. data/ext/boost/concept_check.hpp +140 -64
  62. data/ext/boost/config.hpp +1 -1
  63. data/ext/boost/config/auto_link.hpp +8 -6
  64. data/ext/boost/config/compiler/borland.hpp +12 -2
  65. data/ext/boost/config/compiler/clang.hpp +89 -30
  66. data/ext/boost/config/compiler/codegear.hpp +3 -2
  67. data/ext/boost/config/compiler/common_edg.hpp +7 -5
  68. data/ext/boost/config/compiler/cray.hpp +61 -0
  69. data/ext/boost/config/compiler/digitalmars.hpp +9 -1
  70. data/ext/boost/config/compiler/gcc.hpp +33 -24
  71. data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
  72. data/ext/boost/config/compiler/hp_acc.hpp +12 -1
  73. data/ext/boost/config/compiler/intel.hpp +78 -4
  74. data/ext/boost/config/compiler/metrowerks.hpp +4 -1
  75. data/ext/boost/config/compiler/mpw.hpp +4 -1
  76. data/ext/boost/config/compiler/nvcc.hpp +8 -66
  77. data/ext/boost/config/compiler/pathscale.hpp +80 -0
  78. data/ext/boost/config/compiler/pgi.hpp +5 -5
  79. data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
  80. data/ext/boost/config/compiler/vacpp.hpp +37 -13
  81. data/ext/boost/config/compiler/visualc.hpp +24 -11
  82. data/ext/boost/config/platform/bsd.hpp +1 -1
  83. data/ext/boost/config/platform/cray.hpp +18 -0
  84. data/ext/boost/config/platform/cygwin.hpp +10 -0
  85. data/ext/boost/config/platform/linux.hpp +5 -0
  86. data/ext/boost/config/platform/macos.hpp +5 -4
  87. data/ext/boost/config/platform/symbian.hpp +5 -2
  88. data/ext/boost/config/platform/vms.hpp +25 -0
  89. data/ext/boost/config/platform/win32.hpp +7 -1
  90. data/ext/boost/config/select_compiler_config.hpp +8 -25
  91. data/ext/boost/config/select_platform_config.hpp +8 -1
  92. data/ext/boost/config/select_stdlib_config.hpp +9 -1
  93. data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
  94. data/ext/boost/config/stdlib/libcomo.hpp +1 -4
  95. data/ext/boost/config/stdlib/libcpp.hpp +36 -0
  96. data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
  97. data/ext/boost/config/stdlib/modena.hpp +1 -4
  98. data/ext/boost/config/stdlib/msl.hpp +1 -4
  99. data/ext/boost/config/stdlib/roguewave.hpp +9 -6
  100. data/ext/boost/config/stdlib/sgi.hpp +12 -4
  101. data/ext/boost/config/stdlib/stlport.hpp +11 -4
  102. data/ext/boost/config/stdlib/vacpp.hpp +11 -4
  103. data/ext/boost/config/suffix.hpp +71 -6
  104. data/ext/boost/config/warning_disable.hpp +1 -1
  105. data/ext/boost/container/container_fwd.hpp +177 -0
  106. data/ext/boost/cstdint.hpp +17 -12
  107. data/ext/boost/current_function.hpp +2 -1
  108. data/ext/boost/date_time/c_time.hpp +17 -1
  109. data/ext/boost/date_time/compiler_config.hpp +13 -15
  110. data/ext/boost/date_time/date_formatting.hpp +7 -1
  111. data/ext/boost/date_time/filetime_functions.hpp +4 -4
  112. data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
  113. data/ext/boost/date_time/strings_from_facet.hpp +3 -3
  114. data/ext/boost/date_time/time_facet.hpp +101 -101
  115. data/ext/boost/detail/endian.hpp +4 -2
  116. data/ext/boost/detail/fenv.hpp +74 -0
  117. data/ext/boost/detail/sp_typeinfo.hpp +6 -0
  118. data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
  119. data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
  120. data/ext/boost/exception/detail/type_info.hpp +3 -3
  121. data/ext/boost/exception/diagnostic_information.hpp +37 -21
  122. data/ext/boost/exception/exception.hpp +21 -1
  123. data/ext/boost/exception/info.hpp +0 -1
  124. data/ext/boost/function.hpp +2 -2
  125. data/ext/boost/function/function_base.hpp +15 -9
  126. data/ext/boost/function/function_template.hpp +26 -48
  127. data/ext/boost/integer_fwd.hpp +0 -16
  128. data/ext/boost/integer_traits.hpp +2 -2
  129. data/ext/boost/iterator.hpp +1 -1
  130. data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
  131. data/ext/boost/iterator/iterator_facade.hpp +13 -13
  132. data/ext/boost/iterator/transform_iterator.hpp +5 -20
  133. data/ext/boost/lexical_cast.hpp +1655 -673
  134. data/ext/boost/math/policies/policy.hpp +982 -0
  135. data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
  136. data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
  137. data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
  138. data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
  139. data/ext/boost/math/special_functions/sign.hpp +145 -0
  140. data/ext/boost/math/tools/config.hpp +321 -0
  141. data/ext/boost/math/tools/promotion.hpp +150 -0
  142. data/ext/boost/math/tools/real_cast.hpp +29 -0
  143. data/ext/boost/math/tools/user.hpp +97 -0
  144. data/ext/boost/move/move.hpp +1222 -0
  145. data/ext/boost/mpl/O1_size.hpp +40 -0
  146. data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
  147. data/ext/boost/mpl/advance.hpp +76 -0
  148. data/ext/boost/mpl/advance_fwd.hpp +28 -0
  149. data/ext/boost/mpl/at.hpp +52 -0
  150. data/ext/boost/mpl/at_fwd.hpp +24 -0
  151. data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
  152. data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
  153. data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
  154. data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
  155. data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
  156. data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
  157. data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
  158. data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
  159. data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
  160. data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
  161. data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
  162. data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
  163. data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
  164. data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
  165. data/ext/boost/mpl/aux_/has_size.hpp +23 -0
  166. data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
  167. data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
  168. data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
  169. data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
  170. data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
  171. data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
  172. data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
  173. data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
  174. data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
  175. data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
  176. data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
  177. data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
  178. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
  179. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
  180. data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
  181. data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
  182. data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
  183. data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
  184. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
  185. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
  186. data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
  187. data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
  188. data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
  189. data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
  190. data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
  191. data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
  192. data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
  193. data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
  194. data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
  195. data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
  196. data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
  197. data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
  198. data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
  199. data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
  200. data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
  201. data/ext/boost/mpl/back_fwd.hpp +24 -0
  202. data/ext/boost/mpl/back_inserter.hpp +34 -0
  203. data/ext/boost/mpl/begin_end.hpp +57 -0
  204. data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
  205. data/ext/boost/mpl/clear.hpp +39 -0
  206. data/ext/boost/mpl/clear_fwd.hpp +24 -0
  207. data/ext/boost/mpl/comparison.hpp +24 -0
  208. data/ext/boost/mpl/contains.hpp +41 -0
  209. data/ext/boost/mpl/contains_fwd.hpp +25 -0
  210. data/ext/boost/mpl/deref.hpp +41 -0
  211. data/ext/boost/mpl/distance.hpp +78 -0
  212. data/ext/boost/mpl/distance_fwd.hpp +28 -0
  213. data/ext/boost/mpl/empty_fwd.hpp +24 -0
  214. data/ext/boost/mpl/equal_to.hpp +21 -0
  215. data/ext/boost/mpl/find.hpp +38 -0
  216. data/ext/boost/mpl/find_if.hpp +50 -0
  217. data/ext/boost/mpl/fold.hpp +48 -0
  218. data/ext/boost/mpl/front_fwd.hpp +24 -0
  219. data/ext/boost/mpl/front_inserter.hpp +33 -0
  220. data/ext/boost/mpl/greater.hpp +21 -0
  221. data/ext/boost/mpl/greater_equal.hpp +21 -0
  222. data/ext/boost/mpl/inserter.hpp +32 -0
  223. data/ext/boost/mpl/iter_fold.hpp +49 -0
  224. data/ext/boost/mpl/iter_fold_if.hpp +117 -0
  225. data/ext/boost/mpl/iterator_range.hpp +42 -0
  226. data/ext/boost/mpl/iterator_tags.hpp +27 -0
  227. data/ext/boost/mpl/less.hpp +21 -0
  228. data/ext/boost/mpl/less_equal.hpp +21 -0
  229. data/ext/boost/mpl/limits/list.hpp +21 -0
  230. data/ext/boost/mpl/limits/vector.hpp +21 -0
  231. data/ext/boost/mpl/list.hpp +57 -0
  232. data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
  233. data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
  234. data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
  235. data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
  236. data/ext/boost/mpl/list/aux_/front.hpp +33 -0
  237. data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
  238. data/ext/boost/mpl/list/aux_/item.hpp +55 -0
  239. data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
  240. data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
  241. data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
  242. data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
  243. data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
  244. data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
  245. data/ext/boost/mpl/list/aux_/size.hpp +33 -0
  246. data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
  247. data/ext/boost/mpl/list/list0.hpp +42 -0
  248. data/ext/boost/mpl/list/list10.hpp +43 -0
  249. data/ext/boost/mpl/list/list20.hpp +43 -0
  250. data/ext/boost/mpl/long.hpp +22 -0
  251. data/ext/boost/mpl/long_fwd.hpp +27 -0
  252. data/ext/boost/mpl/minus.hpp +21 -0
  253. data/ext/boost/mpl/multiplies.hpp +53 -0
  254. data/ext/boost/mpl/negate.hpp +81 -0
  255. data/ext/boost/mpl/not_equal_to.hpp +21 -0
  256. data/ext/boost/mpl/numeric_cast.hpp +41 -0
  257. data/ext/boost/mpl/pair.hpp +70 -0
  258. data/ext/boost/mpl/plus.hpp +21 -0
  259. data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
  260. data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
  261. data/ext/boost/mpl/prior.hpp +19 -0
  262. data/ext/boost/mpl/push_back.hpp +53 -0
  263. data/ext/boost/mpl/push_back_fwd.hpp +24 -0
  264. data/ext/boost/mpl/push_front.hpp +52 -0
  265. data/ext/boost/mpl/push_front_fwd.hpp +24 -0
  266. data/ext/boost/mpl/remove_if.hpp +83 -0
  267. data/ext/boost/mpl/reverse_fold.hpp +50 -0
  268. data/ext/boost/mpl/same_as.hpp +55 -0
  269. data/ext/boost/mpl/sequence_tag.hpp +124 -0
  270. data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
  271. data/ext/boost/mpl/size.hpp +42 -0
  272. data/ext/boost/mpl/size_fwd.hpp +24 -0
  273. data/ext/boost/mpl/tag.hpp +52 -0
  274. data/ext/boost/mpl/times.hpp +21 -0
  275. data/ext/boost/mpl/vector.hpp +57 -0
  276. data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
  277. data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
  278. data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
  279. data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
  280. data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
  281. data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
  282. data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
  283. data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
  284. data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
  285. data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
  286. data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
  287. data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
  288. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
  289. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
  290. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
  291. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
  292. data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
  293. data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
  294. data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
  295. data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
  296. data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
  297. data/ext/boost/mpl/vector/vector0.hpp +34 -0
  298. data/ext/boost/mpl/vector/vector10.hpp +45 -0
  299. data/ext/boost/mpl/vector/vector20.hpp +45 -0
  300. data/ext/boost/none.hpp +1 -1
  301. data/ext/boost/numeric/conversion/bounds.hpp +24 -0
  302. data/ext/boost/numeric/conversion/cast.hpp +61 -0
  303. data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
  304. data/ext/boost/numeric/conversion/converter.hpp +68 -0
  305. data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
  306. data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
  307. data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
  308. data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
  309. data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
  310. data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
  311. data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
  312. data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
  313. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
  314. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
  315. data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
  316. data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
  317. data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
  318. data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
  319. data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
  320. data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
  321. data/ext/boost/operators.hpp +3 -1
  322. data/ext/boost/optional/optional.hpp +146 -79
  323. data/ext/boost/optional/optional_fwd.hpp +8 -1
  324. data/ext/boost/preprocessor/cat.hpp +2 -2
  325. data/ext/boost/preprocessor/config/config.hpp +39 -4
  326. data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
  327. data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
  328. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
  329. data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
  330. data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
  331. data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
  332. data/ext/boost/preprocessor/seq/cat.hpp +5 -4
  333. data/ext/boost/preprocessor/seq/size.hpp +0 -1
  334. data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
  335. data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
  336. data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
  337. data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
  338. data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
  339. data/ext/boost/preprocessor/variadic/size.hpp +30 -0
  340. data/ext/boost/range/begin.hpp +17 -6
  341. data/ext/boost/range/concepts.hpp +37 -2
  342. data/ext/boost/range/detail/safe_bool.hpp +72 -0
  343. data/ext/boost/range/end.hpp +14 -9
  344. data/ext/boost/range/iterator_range_core.hpp +120 -12
  345. data/ext/boost/range/size.hpp +21 -5
  346. data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
  347. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
  348. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
  349. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
  350. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
  351. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
  352. data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
  353. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
  354. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
  355. data/ext/boost/smart_ptr/make_shared.hpp +591 -22
  356. data/ext/boost/smart_ptr/shared_array.hpp +29 -1
  357. data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
  358. data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
  359. data/ext/boost/src/pthread/once.cpp +9 -7
  360. data/ext/boost/src/pthread/thread.cpp +32 -28
  361. data/ext/boost/src/pthread/timeconv.inl +4 -5
  362. data/ext/boost/src/tss_null.cpp +5 -1
  363. data/ext/boost/static_assert.hpp +8 -2
  364. data/ext/boost/thread/detail/config.hpp +19 -4
  365. data/ext/boost/thread/detail/move.hpp +11 -5
  366. data/ext/boost/thread/detail/thread.hpp +59 -43
  367. data/ext/boost/thread/exceptions.hpp +9 -9
  368. data/ext/boost/thread/future.hpp +150 -82
  369. data/ext/boost/thread/locks.hpp +101 -60
  370. data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
  371. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
  372. data/ext/boost/thread/pthread/mutex.hpp +17 -14
  373. data/ext/boost/thread/pthread/once.hpp +3 -4
  374. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
  375. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
  376. data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
  377. data/ext/boost/thread/pthread/thread_data.hpp +40 -12
  378. data/ext/boost/thread/thread_time.hpp +5 -0
  379. data/ext/boost/throw_exception.hpp +1 -1
  380. data/ext/boost/token_functions.hpp +34 -10
  381. data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
  382. data/ext/boost/type_traits/alignment_of.hpp +1 -1
  383. data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
  384. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
  385. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
  386. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
  387. data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
  388. data/ext/boost/type_traits/function_traits.hpp +1 -1
  389. data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
  390. data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
  391. data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
  392. data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
  393. data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
  394. data/ext/boost/type_traits/intrinsics.hpp +119 -71
  395. data/ext/boost/type_traits/is_const.hpp +5 -5
  396. data/ext/boost/type_traits/is_convertible.hpp +14 -13
  397. data/ext/boost/type_traits/is_enum.hpp +1 -1
  398. data/ext/boost/type_traits/is_floating_point.hpp +27 -0
  399. data/ext/boost/type_traits/is_function.hpp +3 -3
  400. data/ext/boost/type_traits/is_fundamental.hpp +1 -1
  401. data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
  402. data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
  403. data/ext/boost/type_traits/is_pod.hpp +11 -3
  404. data/ext/boost/type_traits/is_pointer.hpp +2 -2
  405. data/ext/boost/type_traits/is_signed.hpp +8 -3
  406. data/ext/boost/type_traits/is_union.hpp +8 -0
  407. data/ext/boost/type_traits/is_unsigned.hpp +9 -4
  408. data/ext/boost/type_traits/is_volatile.hpp +5 -5
  409. data/ext/boost/type_traits/remove_cv.hpp +4 -3
  410. data/ext/boost/type_traits/remove_pointer.hpp +51 -2
  411. data/ext/boost/type_traits/remove_reference.hpp +2 -2
  412. data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
  413. data/ext/boost/utility/declval.hpp +44 -0
  414. data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
  415. data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
  416. data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
  417. data/ext/boost/utility/in_place_factory.hpp +88 -0
  418. data/ext/boost/utility/result_of.hpp +103 -0
  419. data/ext/boost/utility/swap.hpp +55 -0
  420. data/ext/common/AnsiColorConstants.h +36 -0
  421. data/ext/common/ApplicationPool2/Common.h +87 -0
  422. data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
  423. data/ext/common/ApplicationPool2/Group.h +648 -0
  424. data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
  425. data/ext/common/ApplicationPool2/Options.h +576 -0
  426. data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
  427. data/ext/common/ApplicationPool2/Pool.h +1181 -0
  428. data/ext/common/ApplicationPool2/Process.h +425 -0
  429. data/ext/common/ApplicationPool2/README.md +96 -0
  430. data/ext/common/ApplicationPool2/Session.h +158 -0
  431. data/ext/common/ApplicationPool2/Socket.h +246 -0
  432. data/ext/common/ApplicationPool2/Spawner.h +2212 -0
  433. data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
  434. data/ext/common/BackgroundEventLoop.cpp +129 -0
  435. data/ext/common/BackgroundEventLoop.h +61 -0
  436. data/ext/common/Constants.h +3 -1
  437. data/ext/common/EventedBufferedInput.h +331 -0
  438. data/ext/common/EventedMessageServer.h +17 -34
  439. data/ext/common/EventedServer.h +2 -2
  440. data/ext/common/Exceptions.h +71 -19
  441. data/ext/common/FileDescriptor.h +8 -6
  442. data/ext/common/HttpConstants.h +167 -0
  443. data/ext/common/IniFile.h +24 -0
  444. data/ext/common/Logging.h +62 -849
  445. data/ext/common/MessageReadersWriters.h +19 -0
  446. data/ext/common/MessageServer.h +11 -14
  447. data/ext/common/MultiLibeio.cpp +198 -0
  448. data/ext/common/MultiLibeio.h +67 -0
  449. data/ext/common/ResourceLocator.h +24 -41
  450. data/ext/common/SafeLibev.h +186 -14
  451. data/ext/common/StaticString.h +23 -3
  452. data/ext/common/UnionStation.h +972 -0
  453. data/ext/common/Utils.cpp +168 -24
  454. data/ext/common/Utils.h +25 -3
  455. data/ext/common/Utils/CachedFileStat.hpp +4 -3
  456. data/ext/common/Utils/FileChangeChecker.h +2 -2
  457. data/ext/common/Utils/HashMap.h +50 -0
  458. data/ext/common/Utils/IOUtils.cpp +229 -68
  459. data/ext/common/Utils/IOUtils.h +134 -3
  460. data/ext/common/Utils/Lock.h +28 -0
  461. data/ext/common/Utils/MemoryBarrier.h +52 -0
  462. data/ext/common/Utils/PriorityQueue.h +54 -0
  463. data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
  464. data/ext/common/Utils/ScopeGuard.h +50 -1
  465. data/ext/common/Utils/SmallVector.h +653 -0
  466. data/ext/common/Utils/StrIntUtils.cpp +26 -2
  467. data/ext/common/Utils/StrIntUtils.h +18 -2
  468. data/ext/common/Utils/StringMap.h +125 -8
  469. data/ext/common/Utils/Template.h +212 -0
  470. data/ext/common/Utils/fib.c +699 -0
  471. data/ext/common/Utils/fib.h +101 -0
  472. data/ext/common/Utils/fibpriv.h +67 -0
  473. data/ext/common/Utils/json-forwards.h +249 -0
  474. data/ext/common/Utils/json.h +1855 -0
  475. data/ext/common/Utils/jsoncpp.cpp +4230 -0
  476. data/ext/common/agents/Base.cpp +1126 -0
  477. data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
  478. data/ext/common/agents/EnvPrinter.c +16 -0
  479. data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
  480. data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
  481. data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
  482. data/ext/common/agents/HelperAgent/Main.cpp +497 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
  484. data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
  485. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
  486. data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
  487. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
  488. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
  489. data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
  490. data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
  491. data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
  492. data/ext/common/agents/SpawnPreparer.cpp +127 -0
  493. data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
  494. data/ext/libeio/Changes +72 -0
  495. data/ext/{google/COPYING → libeio/LICENSE} +17 -9
  496. data/ext/libeio/Makefile.am +15 -0
  497. data/ext/libeio/Makefile.in +694 -0
  498. data/ext/libeio/aclocal.m4 +9418 -0
  499. data/ext/libeio/autogen.sh +3 -0
  500. data/ext/libeio/config.guess +1501 -0
  501. data/ext/libeio/config.h.in +136 -0
  502. data/ext/libeio/config.sub +1705 -0
  503. data/ext/libeio/configure +14822 -0
  504. data/ext/libeio/configure.ac +22 -0
  505. data/ext/libeio/demo.c +194 -0
  506. data/ext/libeio/ecb.h +457 -0
  507. data/ext/libeio/eio.c +2816 -0
  508. data/ext/libeio/eio.h +411 -0
  509. data/ext/libeio/install-sh +520 -0
  510. data/ext/libeio/libeio.m4 +211 -0
  511. data/ext/libeio/ltmain.sh +9636 -0
  512. data/ext/libeio/missing +376 -0
  513. data/ext/libeio/xthread.h +166 -0
  514. data/ext/libev/Changes +125 -7
  515. data/ext/libev/Makefile.am +5 -3
  516. data/ext/libev/Makefile.in +209 -120
  517. data/ext/libev/aclocal.m4 +6027 -4619
  518. data/ext/libev/autogen.sh +1 -4
  519. data/ext/libev/config.h.in +11 -7
  520. data/ext/libev/configure +7312 -14993
  521. data/ext/libev/configure.ac +12 -5
  522. data/ext/libev/depcomp +630 -0
  523. data/ext/libev/ev++.h +48 -32
  524. data/ext/libev/ev.c +1173 -391
  525. data/ext/libev/ev.h +315 -181
  526. data/ext/libev/ev_epoll.c +66 -15
  527. data/ext/libev/ev_kqueue.c +20 -18
  528. data/ext/libev/ev_poll.c +27 -23
  529. data/ext/libev/ev_port.c +39 -19
  530. data/ext/libev/ev_select.c +23 -17
  531. data/ext/libev/ev_vars.h +25 -8
  532. data/ext/libev/ev_win32.c +6 -6
  533. data/ext/libev/ev_wrap.h +22 -2
  534. data/ext/libev/event.c +18 -17
  535. data/ext/libev/event.h +16 -4
  536. data/ext/libev/libev.m4 +10 -6
  537. data/ext/libev/ltmain.sh +7353 -5811
  538. data/ext/nginx/Configuration.c +74 -42
  539. data/ext/nginx/Configuration.h +3 -5
  540. data/ext/nginx/ContentHandler.c +26 -83
  541. data/ext/nginx/ContentHandler.h +1 -1
  542. data/ext/nginx/config +13 -9
  543. data/ext/nginx/ngx_http_passenger_module.c +3 -7
  544. data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
  545. data/ext/oxt/detail/context.hpp +90 -0
  546. data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
  547. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
  548. data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
  549. data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
  550. data/ext/oxt/dynamic_thread_group.hpp +27 -1
  551. data/ext/oxt/implementation.cpp +415 -0
  552. data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
  553. data/ext/oxt/macros.hpp +32 -1
  554. data/ext/oxt/spin_lock.hpp +6 -11
  555. data/ext/oxt/system_calls.cpp +204 -16
  556. data/ext/oxt/system_calls.hpp +85 -45
  557. data/ext/oxt/thread.hpp +13 -117
  558. data/ext/ruby/passenger_native_support.c +82 -237
  559. data/helper-scripts/backtrace-sanitizer.rb +114 -0
  560. data/helper-scripts/classic-rails-loader.rb +135 -0
  561. data/helper-scripts/classic-rails-preloader.rb +161 -0
  562. data/helper-scripts/node-loader.js +314 -0
  563. data/helper-scripts/rack-loader.rb +104 -0
  564. data/helper-scripts/rack-preloader.rb +132 -0
  565. data/helper-scripts/wsgi-loader.py +231 -0
  566. data/helper-scripts/wsgi-preloader.py +1 -0
  567. data/lib/phusion_passenger.rb +159 -61
  568. data/lib/phusion_passenger/abstract_installer.rb +182 -87
  569. data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
  570. data/lib/phusion_passenger/analytics_logger.rb +5 -4
  571. data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
  572. data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
  573. data/lib/phusion_passenger/common_library.rb +441 -0
  574. data/lib/phusion_passenger/console_text_template.rb +4 -16
  575. data/lib/phusion_passenger/constants.rb +1 -8
  576. data/lib/phusion_passenger/debug_logging.rb +5 -2
  577. data/lib/phusion_passenger/dependencies.rb +51 -13
  578. data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
  579. data/lib/phusion_passenger/message_channel.rb +3 -47
  580. data/lib/phusion_passenger/message_client.rb +2 -2
  581. data/lib/phusion_passenger/native_support.rb +36 -15
  582. data/lib/phusion_passenger/packaging.rb +8 -11
  583. data/lib/phusion_passenger/platform_info.rb +25 -17
  584. data/lib/phusion_passenger/platform_info/apache.rb +10 -7
  585. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
  586. data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
  587. data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
  588. data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
  589. data/lib/phusion_passenger/public_api.rb +1 -4
  590. data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
  591. data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
  592. data/lib/phusion_passenger/request_handler.rb +500 -0
  593. data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
  594. data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
  595. data/lib/phusion_passenger/standalone/command.rb +36 -15
  596. data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
  597. data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
  598. data/lib/phusion_passenger/standalone/start_command.rb +44 -39
  599. data/lib/phusion_passenger/standalone/utils.rb +5 -5
  600. data/lib/phusion_passenger/utils.rb +35 -914
  601. data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
  602. data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  603. data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
  604. data/lib/phusion_passenger/utils/tee_input.rb +174 -0
  605. data/lib/phusion_passenger/utils/tmpio.rb +33 -0
  606. data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
  607. data/resources/mime.types +5 -1
  608. data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
  609. data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  610. data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
  611. data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
  612. data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
  613. data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  614. data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
  615. data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
  616. data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
  617. data/resources/templates/error_layout.html.template +89 -0
  618. data/resources/templates/general_error.html.template +1 -0
  619. data/resources/templates/general_error_with_html.html.template +1 -0
  620. data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
  621. data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
  622. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
  623. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
  624. data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
  625. data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
  626. data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
  627. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
  628. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
  629. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  630. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  631. data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
  632. data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
  633. data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
  634. data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
  635. data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
  636. data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  637. data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
  638. data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
  639. data/resources/templates/undisclosed_error.html.template +25 -0
  640. data/test/config.json.example +42 -0
  641. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
  642. data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
  643. data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
  644. data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
  645. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
  646. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
  647. data/test/cxx/BufferedIOTest.cpp +7 -7
  648. data/test/cxx/CxxTestMain.cpp +65 -2
  649. data/test/cxx/FileBackedPipeTest.cpp +626 -0
  650. data/test/cxx/FileChangeCheckerTest.cpp +20 -18
  651. data/test/cxx/FilterSupportTest.cpp +5 -5
  652. data/test/cxx/IOUtilsTest.cpp +11 -4
  653. data/test/cxx/MessageReadersWritersTest.cpp +1 -1
  654. data/test/cxx/MessageServerTest.cpp +31 -30
  655. data/test/cxx/RequestHandlerTest.cpp +777 -0
  656. data/test/cxx/ScgiRequestParserTest.cpp +36 -16
  657. data/test/cxx/ServerInstanceDirTest.cpp +1 -1
  658. data/test/cxx/StringMapTest.cpp +61 -0
  659. data/test/cxx/TemplateTest.cpp +118 -0
  660. data/test/cxx/TestSupport.cpp +25 -68
  661. data/test/cxx/TestSupport.h +81 -41
  662. data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
  663. data/test/cxx/UtilsTest.cpp +59 -5
  664. data/test/integration_tests/apache2_tests.rb +2 -2
  665. data/test/integration_tests/nginx_tests.rb +1 -1
  666. data/test/integration_tests/spec_helper.rb +7 -5
  667. data/test/oxt/oxt_test_main.cpp +2 -0
  668. data/test/oxt/syscall_interruption_test.cpp +1 -0
  669. data/test/ruby/classic_rails/loader_spec.rb +48 -0
  670. data/test/ruby/classic_rails/preloader_spec.rb +54 -0
  671. data/test/ruby/rack/loader_spec.rb +62 -0
  672. data/test/ruby/rack/preloader_spec.rb +74 -0
  673. data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
  674. data/test/ruby/shared/loader_spec.rb +241 -0
  675. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
  676. data/test/ruby/shared/ruby_loader_spec.rb +55 -0
  677. data/test/ruby/spec_helper.rb +8 -53
  678. data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
  679. data/test/ruby/utils_spec.rb +10 -683
  680. data/test/stub/rack/config.ru +28 -3
  681. data/test/stub/rack/start.rb +47 -0
  682. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
  683. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
  684. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
  685. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
  686. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
  687. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
  688. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
  689. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
  690. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
  691. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
  692. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
  693. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
  694. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
  695. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
  696. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
  697. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
  698. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
  699. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
  700. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
  701. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
  702. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
  703. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
  704. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
  705. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
  706. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
  707. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
  708. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
  709. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
  710. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
  711. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
  712. data/test/stub/rails3.0/Gemfile.lock +80 -0
  713. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
  714. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
  715. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
  716. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
  717. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
  718. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
  719. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
  720. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
  721. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
  722. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
  723. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
  724. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
  725. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
  726. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
  727. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
  728. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
  729. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
  730. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
  731. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
  732. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
  733. data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
  734. data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
  735. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
  736. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
  737. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
  738. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
  739. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
  740. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
  741. data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
  742. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
  743. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
  744. data/test/stub/start_error.pl +24 -0
  745. data/test/stub/wsgi/passenger_wsgi.py +71 -3
  746. data/test/support/apache2_controller.rb +2 -2
  747. data/test/support/placebo-preloader.rb +88 -0
  748. data/test/support/test_helper.rb +1 -14
  749. data/test/tut/tut.h +11 -4
  750. metadata +590 -326
  751. data.tar.gz.asc +0 -12
  752. data/PACKAGING.TXT +0 -25
  753. data/build/config.rb +0 -46
  754. data/ext/apache2/HelperAgent.cpp +0 -364
  755. data/ext/boost/call_traits.hpp +0 -24
  756. data/ext/boost/detail/call_traits.hpp +0 -164
  757. data/ext/common/AbstractSpawnManager.h +0 -110
  758. data/ext/common/AgentBase.cpp +0 -432
  759. data/ext/common/ApplicationPool/Client.h +0 -788
  760. data/ext/common/ApplicationPool/Interface.h +0 -295
  761. data/ext/common/ApplicationPool/Pool.h +0 -1327
  762. data/ext/common/ApplicationPool/Server.h +0 -479
  763. data/ext/common/MessageChannel.h +0 -494
  764. data/ext/common/PoolOptions.h +0 -518
  765. data/ext/common/Process.h +0 -253
  766. data/ext/common/Session.h +0 -436
  767. data/ext/common/SpawnManager.h +0 -611
  768. data/ext/google/ChangeLog +0 -167
  769. data/ext/google/dense_hash_map +0 -310
  770. data/ext/google/dense_hash_set +0 -287
  771. data/ext/google/sparse_hash_map +0 -294
  772. data/ext/google/sparse_hash_set +0 -275
  773. data/ext/google/sparsehash/densehashtable.h +0 -1062
  774. data/ext/google/sparsehash/sparseconfig.h +0 -55
  775. data/ext/google/sparsehash/sparsehashtable.h +0 -1015
  776. data/ext/google/sparsetable +0 -1468
  777. data/ext/google/type_traits.h +0 -250
  778. data/ext/nginx/HelperAgent.cpp +0 -1355
  779. data/ext/nginx/ScgiRequestParser.h +0 -375
  780. data/ext/oxt/backtrace.cpp +0 -185
  781. data/ext/oxt/tracable_exception.cpp +0 -89
  782. data/helper-scripts/passenger-spawn-server +0 -106
  783. data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
  784. data/lib/phusion_passenger/abstract_server.rb +0 -372
  785. data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
  786. data/lib/phusion_passenger/app_process.rb +0 -174
  787. data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
  788. data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
  789. data/lib/phusion_passenger/exceptions.rb +0 -103
  790. data/lib/phusion_passenger/html_template.rb +0 -107
  791. data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
  792. data/lib/phusion_passenger/spawn_manager.rb +0 -359
  793. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
  794. data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
  795. data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
  796. data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
  797. data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
  798. data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
  799. data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
  800. data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
  801. data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
  802. data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
  803. data/test/config.yml.example +0 -41
  804. data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
  805. data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
  806. data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
  807. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
  808. data/test/cxx/MessageChannelTest.cpp +0 -557
  809. data/test/cxx/PoolOptionsTest.cpp +0 -116
  810. data/test/cxx/SpawnManagerTest.cpp +0 -161
  811. data/test/ruby/abstract_server_collection_spec.rb +0 -247
  812. data/test/ruby/abstract_server_spec.rb +0 -61
  813. data/test/ruby/app_process_spec.rb +0 -43
  814. data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
  815. data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
  816. data/test/ruby/rack/application_spawner_spec.rb +0 -116
  817. data/test/ruby/shared/abstract_server_spec.rb +0 -23
  818. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
  819. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
  820. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
  821. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
  822. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
  823. data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
  824. data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
  825. data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
  826. data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
  827. data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
  828. data/test/ruby/spawn_manager_spec.rb +0 -134
  829. data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
  830. data/test/stub/message_channel.rb +0 -11
  831. data/test/stub/message_channel_2.rb +0 -12
  832. data/test/stub/message_channel_3.rb +0 -19
  833. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
  834. data/test/stub/spawn_server.rb +0 -22
  835. metadata.gz.asc +0 -12
@@ -1,3 +1,27 @@
1
+ /*
2
+ * Phusion Passenger - http://www.modrails.com/
3
+ * Copyright (c) 2011 Phusion
4
+ *
5
+ * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in
15
+ * all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ * THE SOFTWARE.
24
+ */
1
25
  #ifndef _PASSENGER_INI_FILE_H_
2
26
  #define _PASSENGER_INI_FILE_H_
3
27
 
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - http://www.modrails.com/
3
- * Copyright (c) 2010 Phusion
3
+ * Copyright (c) 2010, 2011, 2012 Phusion
4
4
  *
5
5
  * "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
6
6
  *
@@ -25,11 +25,9 @@
25
25
  #ifndef _PASSENGER_LOGGING_H_
26
26
  #define _PASSENGER_LOGGING_H_
27
27
 
28
- #include <boost/shared_ptr.hpp>
29
- #include <boost/noncopyable.hpp>
30
28
  #include <oxt/thread.hpp>
31
29
  #include <oxt/system_calls.hpp>
32
- #include <oxt/backtrace.hpp>
30
+ #include <oxt/macros.hpp>
33
31
 
34
32
  #include <sys/types.h>
35
33
  #include <sys/time.h>
@@ -39,25 +37,15 @@
39
37
  #include <fcntl.h>
40
38
  #include <pthread.h>
41
39
  #include <string>
42
- #include <map>
40
+ #include <exception>
43
41
  #include <stdexcept>
42
+ #include <iomanip>
44
43
  #include <ostream>
45
44
  #include <sstream>
46
45
  #include <cstdio>
47
46
  #include <ctime>
48
47
  #include <cerrno>
49
48
 
50
- #include <RandomGenerator.h>
51
- #include <FileDescriptor.h>
52
- #include <StaticString.h>
53
- #include <Exceptions.h>
54
- #include <Utils.h>
55
- #include <Utils/ScopeGuard.h>
56
- #include <Utils/MessageIO.h>
57
- #include <Utils/StrIntUtils.h>
58
- #include <Utils/MD5.h>
59
- #include <Utils/SystemTime.h>
60
-
61
49
 
62
50
  namespace Passenger {
63
51
 
@@ -92,13 +80,14 @@ void setDebugFile(const char *logFile = NULL);
92
80
  \
93
81
  the_time = time(NULL); \
94
82
  localtime_r(&the_time, &the_tm); \
95
- strftime(datetime_buf, sizeof(datetime_buf), "%F %H:%M:%S", &the_tm); \
83
+ strftime(datetime_buf, sizeof(datetime_buf) - 1, "%F %H:%M:%S", &the_tm); \
96
84
  gettimeofday(&tv, NULL); \
97
85
  sstream << \
98
86
  "[ pid=" << ((unsigned long) getpid()) << \
99
87
  " thr=" << pthread_self() << \
100
88
  " file=" << __FILE__ << ":" << (unsigned long) __LINE__ << \
101
- " time=" << datetime_buf << "." << (unsigned long) (tv.tv_usec / 1000) << \
89
+ " time=" << datetime_buf << "." << std::setfill('0') << std::setw(4) << \
90
+ (unsigned long) (tv.tv_usec / 100) << \
102
91
  " ]: " << \
103
92
  expr << std::endl; \
104
93
  *stream << sstream.str(); \
@@ -117,6 +106,12 @@ void setDebugFile(const char *logFile = NULL);
117
106
  */
118
107
  #define P_WARN(expr) P_LOG(0, expr)
119
108
 
109
+ /**
110
+ * Write the given expression, which represents a warning,
111
+ * to the log stream.
112
+ */
113
+ #define P_INFO(expr) P_LOG(0, expr)
114
+
120
115
  /**
121
116
  * Write the given expression, which represents an error,
122
117
  * to the log stream.
@@ -129,858 +124,76 @@ void setDebugFile(const char *logFile = NULL);
129
124
  */
130
125
  #define P_DEBUG(expr) P_TRACE(1, expr)
131
126
 
127
+ /**
128
+ * Aborts the current process. At least on OS X, abort() unfortunately sends SIGABRT
129
+ * to a random thread, causing the original backtrace to be lost when gdb has
130
+ * detected SIGABRT. We fix that by sending SIGABRT to the calling thread.
131
+ */
132
+ #define P_ABORT() \
133
+ do { \
134
+ P_ERROR("Aborting!"); \
135
+ sigset_t set; \
136
+ sigemptyset(&set); \
137
+ sigaddset(&set, SIGABRT); \
138
+ pthread_sigmask(SIG_UNBLOCK, &set, NULL); \
139
+ pthread_kill(pthread_self(), SIGABRT); \
140
+ abort(); \
141
+ } while (false)
142
+
132
143
  #ifdef PASSENGER_DEBUG
133
144
  #define P_TRACE(level, expr) P_LOG_TO(level, expr, Passenger::_logStream)
134
145
 
135
- #define P_ASSERT(expr, result_if_failed, message) \
136
- do { \
137
- if (!(expr)) { \
138
- P_ERROR("Assertion failed: " << message); \
139
- return result_if_failed; \
140
- } \
141
- } while (false)
142
- #define P_ASSERT_WITH_VOID_RETURN(expr, message) \
146
+ /* A version of assert() that works better. We also print the process ID, time
147
+ * and other stuff that the P_* logging functions normally print.
148
+ */
149
+ #define P_ASSERT(expr) \
143
150
  do { \
144
- if (!(expr)) { \
145
- P_ERROR("Assertion failed: " << message); \
146
- return; \
151
+ if (OXT_UNLIKELY(!(expr))) { \
152
+ P_ERROR("Assertion failed: " << #expr); \
153
+ P_ABORT(); \
147
154
  } \
148
155
  } while (false)
149
156
  #else
150
157
  #define P_TRACE(level, expr) do { /* nothing */ } while (false)
151
-
152
- #define P_ASSERT(expr, result_if_failed, message) do { /* nothing */ } while (false)
153
- #define P_ASSERT_WITH_VOID_RETURN(expr, message) do { /* nothing */ } while (false)
158
+ #define P_ASSERT(expr) ((void) 0)
154
159
  #endif
155
160
 
156
161
 
157
- /********** Analytics logging facilities *********/
158
-
159
- // All access to the file descriptor must be synchronized through the lock.
160
- struct AnalyticsLoggerConnection {
161
- mutable boost::mutex lock;
162
- FileDescriptor fd;
163
-
164
- AnalyticsLoggerConnection(FileDescriptor _fd)
165
- : fd(_fd)
166
- { }
167
-
168
- bool connected() const {
169
- return fd != -1;
170
- }
171
-
172
- bool disconnect(string &errorResponse) {
173
- if (!connected()) {
174
- return false;
175
- }
176
-
177
- // The server might send an "error" array message
178
- // just before disconnecting. Try to read it.
179
- TRACE_POINT();
180
- vector<string> response;
181
- try {
182
- while (true) {
183
- unsigned long long timeout = 10000;
184
- response = readArrayMessage(fd, &timeout);
185
- }
186
- } catch (const TimeoutException &) {
187
- // This means that the last message isn't an array
188
- // message or that the server didn't send it quickly
189
- // enough. In any case, discard whatever previous
190
- // array messages we were able to read because they're
191
- // guaranteed not to be the error message we're expecting.
192
- response.clear();
193
- } catch (const SystemException &e) {
194
- // We treat ECONNRESET the same as EOFException.
195
- // Other errors are treated as TimeoutException.
196
- if (e.code() != ECONNRESET) {
197
- response.clear();
198
- }
199
- } catch (const EOFException &) {
200
- // Do nothing. We've successfully read the last array message.
201
- }
202
-
203
- this_thread::disable_interruption di;
204
- this_thread::disable_syscall_interruption dsi;
205
- UPDATE_TRACE_POINT();
206
- fd.close();
207
-
208
- if (response.size() == 2 && response[0] == "error") {
209
- errorResponse = response[1];
210
- return true;
211
- } else {
212
- return false;
213
- }
214
- }
215
-
216
- void disconnect() {
217
- fd.close();
218
- }
219
- };
220
-
221
- typedef shared_ptr<AnalyticsLoggerConnection> AnalyticsLoggerConnectionPtr;
222
-
223
-
224
- enum ExceptionHandlingMode {
225
- PRINT,
226
- THROW,
227
- IGNORE
228
- };
229
-
230
-
231
- class AnalyticsLog {
162
+ class NotExpectingExceptions {
232
163
  private:
233
- static const int INT64_STR_BUFSIZE = 22; // Long enough for a 64-bit number.
234
- static const unsigned long long IO_TIMEOUT = 5000000; // In microseconds.
235
-
236
- const AnalyticsLoggerConnectionPtr connection;
237
- const string txnId;
238
- const string groupName;
239
- const string category;
240
- const string unionStationKey;
241
- const ExceptionHandlingMode exceptionHandlingMode;
242
- bool shouldFlushToDiskAfterClose;
243
-
244
- /**
245
- * Buffer must be at least txnId.size() + 1 + INT64_STR_BUFSIZE + 1 bytes.
246
- */
247
- char *insertTxnIdAndTimestamp(char *buffer) {
248
- int size;
249
-
250
- // "txn-id-here"
251
- memcpy(buffer, txnId.c_str(), txnId.size());
252
- buffer += txnId.size();
253
-
254
- // "txn-id-here "
255
- *buffer = ' ';
256
- buffer++;
257
-
258
- // "txn-id-here 123456"
259
- size = snprintf(buffer, INT64_STR_BUFSIZE, "%llu", SystemTime::getUsec());
260
- if (size >= INT64_STR_BUFSIZE) {
261
- // The buffer is too small.
262
- throw IOException("Cannot format a new transaction log message timestamp.");
263
- }
264
- buffer += size;
265
-
266
- // "txn-id-here 123456 "
267
- *buffer = ' ';
268
-
269
- return buffer + 1;
270
- }
271
-
272
- template<typename ExceptionType>
273
- void handleException(const ExceptionType &e) {
274
- switch (exceptionHandlingMode) {
275
- case THROW:
276
- throw e;
277
- case PRINT:
278
- try {
279
- const tracable_exception &te =
280
- dynamic_cast<const tracable_exception &>(e);
281
- P_WARN(te.what() << "\n" << te.backtrace());
282
- } catch (const bad_cast &) {
283
- P_WARN(e.what());
284
- }
285
- break;
286
- default:
287
- break;
288
- }
289
- }
290
-
291
- public:
292
- AnalyticsLog()
293
- : exceptionHandlingMode(PRINT)
294
- { }
295
-
296
- AnalyticsLog(const AnalyticsLoggerConnectionPtr &_connection,
297
- const string &_txnId,
298
- const string &_groupName,
299
- const string &_category,
300
- const string &_unionStationKey,
301
- ExceptionHandlingMode _exceptionHandlingMode = PRINT)
302
- : connection(_connection),
303
- txnId(_txnId),
304
- groupName(_groupName),
305
- category(_category),
306
- unionStationKey(_unionStationKey),
307
- exceptionHandlingMode(_exceptionHandlingMode),
308
- shouldFlushToDiskAfterClose(false)
309
- { }
310
-
311
- ~AnalyticsLog() {
312
- TRACE_POINT();
313
- if (connection == NULL) {
314
- return;
315
- }
316
- lock_guard<boost::mutex> l(connection->lock);
317
- if (!connection->connected()) {
318
- return;
319
- }
320
-
321
- char timestamp[2 * sizeof(unsigned long long) + 1];
322
- integerToHexatri<unsigned long long>(SystemTime::getUsec(),
323
- timestamp);
324
-
325
- UPDATE_TRACE_POINT();
326
- ScopeGuard guard(boost::bind(&AnalyticsLoggerConnection::disconnect,
327
- connection.get()));
328
- try {
329
- unsigned long long timeout = IO_TIMEOUT;
330
- writeArrayMessage(connection->fd, &timeout,
331
- "closeTransaction",
332
- txnId.c_str(),
333
- timestamp,
334
- NULL);
335
-
336
- if (shouldFlushToDiskAfterClose) {
337
- UPDATE_TRACE_POINT();
338
- timeout = IO_TIMEOUT;
339
- writeArrayMessage(connection->fd, &timeout,
340
- "flush", NULL);
341
- readArrayMessage(connection->fd, &timeout);
342
- }
343
- guard.clear();
344
- } catch (const SystemException &e) {
345
- string errorResponse;
346
-
347
- UPDATE_TRACE_POINT();
348
- guard.clear();
349
- if (connection->disconnect(errorResponse)) {
350
- handleException(IOException(
351
- string("Logging agent disconnected with error: ") +
352
- e.what()));
353
- } else {
354
- handleException(e);
355
- }
356
- }
357
- }
358
-
359
- void message(const StaticString &text) {
360
- TRACE_POINT();
361
- if (connection == NULL) {
362
- return;
363
- }
364
- lock_guard<boost::mutex> l(connection->lock);
365
- if (!connection->connected()) {
366
- return;
367
- }
368
-
369
- char timestamp[2 * sizeof(unsigned long long) + 1];
370
- integerToHexatri<unsigned long long>(SystemTime::getUsec(), timestamp);
371
-
372
- UPDATE_TRACE_POINT();
373
- ScopeGuard guard(boost::bind(&AnalyticsLoggerConnection::disconnect,
374
- connection.get()));
375
- try {
376
- unsigned long long timeout = IO_TIMEOUT;
377
- writeArrayMessage(connection->fd, &timeout,
378
- "log",
379
- txnId.c_str(),
380
- timestamp,
381
- NULL);
382
- writeScalarMessage(connection->fd, text, &timeout);
383
- guard.clear();
384
- } catch (const std::exception &e) {
385
- string errorResponse;
386
-
387
- UPDATE_TRACE_POINT();
388
- guard.clear();
389
- if (connection->disconnect(errorResponse)) {
390
- handleException(IOException(
391
- string("Logging agent disconnected with error: ") +
392
- e.what()));
393
- } else {
394
- handleException(e);
395
- }
396
- }
397
- }
398
-
399
- void abort(const StaticString &text) {
400
- message("ABORT");
401
- }
402
-
403
- void flushToDiskAfterClose(bool value) {
404
- shouldFlushToDiskAfterClose = value;
405
- }
406
-
407
- bool isNull() const {
408
- return connection == NULL;
409
- }
410
-
411
- string getTxnId() const {
412
- return txnId;
413
- }
414
-
415
- string getGroupName() const {
416
- return groupName;
417
- }
418
-
419
- string getCategory() const {
420
- return category;
421
- }
422
-
423
- string getUnionStationKey() const {
424
- return unionStationKey;
425
- }
426
- };
427
-
428
- typedef shared_ptr<AnalyticsLog> AnalyticsLogPtr;
429
-
164
+ this_thread::disable_interruption di;
165
+ this_thread::disable_syscall_interruption dsi;
166
+ const char *filename;
167
+ const char *function;
168
+ unsigned int line;
430
169
 
431
- class AnalyticsScopeLog: public boost::noncopyable {
432
- private:
433
- AnalyticsLog * const log;
434
- enum {
435
- NAME,
436
- GRANULAR
437
- } type;
438
- union {
439
- const char *name;
440
- struct {
441
- const char *endMessage;
442
- const char *abortMessage;
443
- } granular;
444
- } data;
445
- bool ok;
446
-
447
- static string timevalToString(struct timeval &tv) {
448
- unsigned long long i = (unsigned long long) tv.tv_sec * 1000000 + tv.tv_usec;
449
- return usecToString(i);
450
- }
451
-
452
- static string usecToString(unsigned long long usec) {
453
- char timestamp[2 * sizeof(unsigned long long) + 1];
454
- integerToHexatri<unsigned long long>(usec, timestamp);
455
- return timestamp;
456
- }
457
-
458
170
  public:
459
- AnalyticsScopeLog(const AnalyticsLogPtr &_log, const char *name)
460
- : log(_log.get())
461
- {
462
- type = NAME;
463
- data.name = name;
464
- ok = false;
465
- if (log != NULL && !log->isNull()) {
466
- string message;
467
- struct rusage usage;
468
-
469
- message.reserve(150);
470
- message.append("BEGIN: ");
471
- message.append(name);
472
- message.append(" (");
473
- message.append(usecToString(SystemTime::getUsec()));
474
- message.append(",");
475
- if (getrusage(RUSAGE_SELF, &usage) == -1) {
476
- int e = errno;
477
- throw SystemException("getrusage() failed", e);
478
- }
479
- message.append(timevalToString(usage.ru_utime));
480
- message.append(",");
481
- message.append(timevalToString(usage.ru_stime));
482
- message.append(") ");
483
- log->message(message);
484
- }
485
- }
486
-
487
- AnalyticsScopeLog(const AnalyticsLogPtr &_log,
488
- const char *beginMessage,
489
- const char *endMessage,
490
- const char *abortMessage = NULL)
491
- : log(_log.get())
492
- {
493
- if (_log != NULL) {
494
- type = GRANULAR;
495
- data.granular.endMessage = endMessage;
496
- data.granular.abortMessage = abortMessage;
497
- ok = abortMessage == NULL;
498
- _log->message(beginMessage);
499
- }
500
- }
501
-
502
- ~AnalyticsScopeLog() {
503
- if (log == NULL) {
504
- return;
505
- }
506
- if (type == NAME) {
507
- if (!log->isNull()) {
508
- string message;
509
- struct rusage usage;
510
-
511
- message.reserve(150);
512
- if (ok) {
513
- message.append("END: ");
514
- } else {
515
- message.append("FAIL: ");
516
- }
517
- message.append(data.name);
518
- message.append(" (");
519
- message.append(usecToString(SystemTime::getUsec()));
520
- message.append(",");
521
- if (getrusage(RUSAGE_SELF, &usage) == -1) {
522
- int e = errno;
523
- throw SystemException("getrusage() failed", e);
524
- }
525
- message.append(timevalToString(usage.ru_utime));
526
- message.append(",");
527
- message.append(timevalToString(usage.ru_stime));
528
- message.append(")");
529
- log->message(message);
530
- }
531
- } else {
532
- if (ok) {
533
- log->message(data.granular.endMessage);
534
- } else {
535
- log->message(data.granular.abortMessage);
536
- }
537
- }
538
- }
539
-
540
- void success() {
541
- ok = true;
171
+ NotExpectingExceptions(const char *_filename, unsigned int _line, const char *_function) {
172
+ filename = _filename;
173
+ line = _line;
174
+ function = _function;
542
175
  }
543
- };
544
-
545
176
 
546
- class AnalyticsLogger {
547
- private:
548
- /** A special lock type for AnalyticsLoggerConnection that also
549
- * keeps a smart pointer to the data structure so that the mutex
550
- * is not destroyed prematurely.
551
- */
552
- struct ConnectionLock {
553
- AnalyticsLoggerConnectionPtr connection;
554
- bool locked;
555
-
556
- ConnectionLock(const AnalyticsLoggerConnectionPtr &c)
557
- : connection(c)
558
- {
559
- c->lock.lock();
560
- locked = true;
561
- }
562
-
563
- ~ConnectionLock() {
564
- if (locked) {
565
- connection->lock.unlock();
566
- }
177
+ ~NotExpectingExceptions() {
178
+ if (std::uncaught_exception()) {
179
+ P_ERROR("Unexpected exception detected at " << filename <<
180
+ ":" << line << ", function '" << function << "'!");
567
181
  }
568
-
569
- void reset(const AnalyticsLoggerConnectionPtr &c, bool lockNow = true) {
570
- if (locked) {
571
- connection->lock.unlock();
572
- }
573
- connection = c;
574
- if (lockNow) {
575
- connection->lock.lock();
576
- locked = true;
577
- } else {
578
- locked = false;
579
- }
580
- }
581
-
582
- void lock() {
583
- assert(!locked);
584
- connection->lock.lock();
585
- locked = true;
586
- }
587
- };
588
-
589
- const string serverAddress;
590
- const string username;
591
- const string password;
592
- const string nodeName;
593
- RandomGenerator randomGenerator;
594
-
595
- /** Lock protecting the fields that follow, but not the
596
- * contents of the connection object.
597
- */
598
- mutable boost::mutex lock;
599
-
600
- unsigned int maxConnectTries;
601
- unsigned long long reconnectTimeout;
602
- unsigned long long nextReconnectTime;
603
- /** Normally never NULL, except when constructed with the default constructor
604
- * or if serverName is empty. In those cases the AnalyticsLogger object is
605
- * considered unusable.
606
- */
607
- AnalyticsLoggerConnectionPtr connection;
608
-
609
- static string determineNodeName(const string &givenNodeName) {
610
- if (givenNodeName.empty()) {
611
- return getHostName();
612
- } else {
613
- return givenNodeName;
614
- }
615
- }
616
-
617
- static bool isNetworkError(int code) {
618
- return code == EPIPE || code == ECONNREFUSED || code == ECONNRESET
619
- || code == EHOSTUNREACH || code == ENETDOWN || code == ENETUNREACH
620
- || code == ETIMEDOUT;
621
- }
622
-
623
- bool connected() const {
624
- return connection->connected();
625
- }
626
-
627
- void connect() {
628
- TRACE_POINT();
629
- FileDescriptor fd;
630
- vector<string> args;
631
- unsigned long long timeout = 15000000;
632
-
633
- fd = connectToServer(serverAddress);
634
- if (!readArrayMessage(fd, args, &timeout)) {
635
- throw IOException("The logging agent closed the connection before sending a version identifier.");
636
- }
637
- if (args.size() != 2 || args[0] != "version") {
638
- throw IOException("The logging agent server didn't sent a valid version identifier.");
639
- }
640
- if (args[1] != "1") {
641
- string message = string("Unsupported logging agent protocol version ") +
642
- args[1] + ".";
643
- throw IOException(message);
644
- }
645
-
646
- UPDATE_TRACE_POINT();
647
- writeScalarMessage(fd, username, &timeout);
648
- writeScalarMessage(fd, password, &timeout);
649
-
650
- UPDATE_TRACE_POINT();
651
- if (!readArrayMessage(fd, args, &timeout)) {
652
- throw IOException("The logging agent did not send an authentication response.");
653
- } else if (args.size() != 1) {
654
- throw IOException("The authentication response that the logging agent sent is not valid.");
655
- } else if (args[0] != "ok") {
656
- throw SecurityException("The logging agent server denied authentication: " + args[0]);
657
- }
658
-
659
- UPDATE_TRACE_POINT();
660
- writeArrayMessage(fd, &timeout, "init", nodeName.c_str(), NULL);
661
- if (!readArrayMessage(fd, args, &timeout)) {
662
- throw SystemException("Cannot connect to logging server", ECONNREFUSED);
663
- } else if (args.size() != 1) {
664
- throw IOException("Logging server returned an invalid reply for the 'init' command");
665
- } else if (args[0] == "server shutting down") {
666
- throw SystemException("Cannot connect to server", ECONNREFUSED);
667
- } else if (args[0] != "ok") {
668
- throw IOException("Logging server returned an invalid reply for the 'init' command");
669
- }
670
-
671
- connection = make_shared<AnalyticsLoggerConnection>(fd);
672
- }
673
-
674
- public:
675
- AnalyticsLogger() { }
676
-
677
- AnalyticsLogger(const string &_serverAddress, const string &_username,
678
- const string &_password, const string &_nodeName = "")
679
- : serverAddress(_serverAddress),
680
- username(_username),
681
- password(_password),
682
- nodeName(determineNodeName(_nodeName))
683
- {
684
- if (!serverAddress.empty()) {
685
- connection = make_shared<AnalyticsLoggerConnection>(FileDescriptor());
686
- }
687
- if (isLocalSocketAddress(serverAddress)) {
688
- maxConnectTries = 10;
689
- } else {
690
- maxConnectTries = 1;
691
- }
692
- reconnectTimeout = 1000000;
693
- nextReconnectTime = 0;
694
- }
695
-
696
- template<typename T>
697
- static bool instanceof(const std::exception &e) {
698
- try {
699
- (void) dynamic_cast<const T &>(e);
700
- return true;
701
- } catch (const bad_cast &) {
702
- return false;
703
- }
704
- }
705
-
706
- AnalyticsLogPtr newTransaction(const string &groupName,
707
- const string &category = "requests",
708
- const string &unionStationKey = string(),
709
- const string &filters = string())
710
- {
711
- if (serverAddress.empty()) {
712
- return make_shared<AnalyticsLog>();
713
- }
714
-
715
- unsigned long long timestamp = SystemTime::getUsec();
716
- char txnId[
717
- 2 * sizeof(unsigned int) + // max hex timestamp size
718
- 11 + // space for a random identifier
719
- 1 // null terminator
720
- ];
721
- char *end;
722
- unsigned int timestampSize;
723
- char timestampStr[2 * sizeof(unsigned long long) + 1];
724
-
725
- // "[timestamp]"
726
- // Our timestamp is like a Unix timestamp but with minutes
727
- // resolution instead of seconds. 32 bits will last us for
728
- // about 8000 years.
729
- timestampSize = integerToHexatri<unsigned int>(timestamp / 1000000 / 60,
730
- txnId);
731
- end = txnId + timestampSize;
732
-
733
- // "[timestamp]-"
734
- *end = '-';
735
- end++;
736
-
737
- // "[timestamp]-[random id]"
738
- randomGenerator.generateAsciiString(end, 11);
739
- end += 11;
740
- *end = '\0';
741
-
742
- integerToHexatri<unsigned long long>(timestamp, timestampStr);
743
-
744
- unique_lock<boost::mutex> l(lock);
745
- if (SystemTime::getUsec() < nextReconnectTime) {
746
- return make_shared<AnalyticsLog>();
747
- }
748
- ConnectionLock cl(connection);
749
-
750
- if (!connected()) {
751
- TRACE_POINT();
752
- try {
753
- connect();
754
- cl.reset(connection);
755
- } catch (const TimeoutException &) {
756
- P_WARN("Timeout trying to connect to the logging agent at " << serverAddress << "; " <<
757
- "will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
758
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
759
- return make_shared<AnalyticsLog>();
760
- } catch (const tracable_exception &e) {
761
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
762
- if (instanceof<IOException>(e) || instanceof<SystemException>(e)) {
763
- P_WARN("Cannot connect to the logging agent at " << serverAddress <<
764
- " (" << e.what() << "); will reconnect in " <<
765
- reconnectTimeout / 1000000 << " second(s).");
766
- return make_shared<AnalyticsLog>();
767
- } else {
768
- throw;
769
- }
770
- }
771
- }
772
-
773
- ScopeGuard guard(boost::bind(
774
- &AnalyticsLoggerConnection::disconnect,
775
- connection.get()));
776
- try {
777
- unsigned long long timeout = 15000000;
778
-
779
- writeArrayMessage(connection->fd, &timeout,
780
- "openTransaction",
781
- txnId,
782
- groupName.c_str(),
783
- "",
784
- category.c_str(),
785
- timestampStr,
786
- unionStationKey.c_str(),
787
- "true",
788
- "true",
789
- filters.c_str(),
790
- NULL);
791
-
792
- vector<string> args;
793
- if (!readArrayMessage(connection->fd, args, &timeout)) {
794
- P_WARN("The logging agent at " << serverAddress <<
795
- " closed the connection (no error message given);" <<
796
- " will reconnect in " << reconnectTimeout / 1000000 <<
797
- " second(s).");
798
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
799
- return make_shared<AnalyticsLog>();
800
- } else if (args.size() == 2 && args[0] == "error") {
801
- P_WARN("The logging agent at " << serverAddress <<
802
- " closed the connection (error message: " << args[1] <<
803
- "); will reconnect in " << reconnectTimeout / 1000000 <<
804
- " second(s).");
805
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
806
- return make_shared<AnalyticsLog>();
807
- } else if (args.empty() || args[0] != "ok") {
808
- P_WARN("The logging agent at " << serverAddress <<
809
- " sent an unexpected reply;" <<
810
- " will reconnect in " << reconnectTimeout / 1000000 <<
811
- " second(s).");
812
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
813
- return make_shared<AnalyticsLog>();
814
- }
815
-
816
- guard.clear();
817
- return make_shared<AnalyticsLog>(connection,
818
- string(txnId, end - txnId),
819
- groupName, category,
820
- unionStationKey);
821
-
822
- } catch (const TimeoutException &) {
823
- P_WARN("Timeout trying to communicate with the logging agent at " << serverAddress << "; " <<
824
- "will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
825
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
826
- return make_shared<AnalyticsLog>();
827
-
828
- } catch (const SystemException &e) {
829
- if (e.code() == ENOENT || isNetworkError(e.code())) {
830
- string errorResponse;
831
-
832
- guard.clear();
833
- if (connection->disconnect(errorResponse)) {
834
- P_WARN("The logging agent at " << serverAddress <<
835
- " closed the connection (error message: " << errorResponse <<
836
- "); will reconnect in " << reconnectTimeout / 1000000 <<
837
- " second(s).");
838
- } else {
839
- P_WARN("The logging agent at " << serverAddress <<
840
- " closed the connection (no error message given);" <<
841
- " will reconnect in " << reconnectTimeout / 1000000 <<
842
- " second(s).");
843
- }
844
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
845
- return make_shared<AnalyticsLog>();
846
- } else {
847
- throw;
848
- }
849
- }
850
- }
851
-
852
- AnalyticsLogPtr continueTransaction(const string &txnId, const string &groupName,
853
- const string &category = "requests", const string &unionStationKey = string())
854
- {
855
- if (serverAddress.empty() || txnId.empty()) {
856
- return make_shared<AnalyticsLog>();
857
- }
858
-
859
- char timestampStr[2 * sizeof(unsigned long long) + 1];
860
- integerToHexatri<unsigned long long>(SystemTime::getUsec(), timestampStr);
861
-
862
- unique_lock<boost::mutex> l(lock);
863
- if (SystemTime::getUsec() < nextReconnectTime) {
864
- return make_shared<AnalyticsLog>();
865
- }
866
- ConnectionLock cl(connection);
867
-
868
- if (!connected()) {
869
- TRACE_POINT();
870
- try {
871
- connect();
872
- cl.reset(connection);
873
- } catch (const TimeoutException &) {
874
- P_WARN("Timeout trying to connect to the logging agent at " << serverAddress << "; " <<
875
- "will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
876
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
877
- return make_shared<AnalyticsLog>();
878
- } catch (const tracable_exception &e) {
879
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
880
- if (instanceof<IOException>(e) || instanceof<SystemException>(e)) {
881
- P_WARN("Cannot connect to the logging agent at " << serverAddress <<
882
- " (" << e.what() << "); will reconnect in " <<
883
- reconnectTimeout / 1000000 << " second(s).");
884
- return make_shared<AnalyticsLog>();
885
- } else {
886
- throw;
887
- }
888
- }
889
- }
890
-
891
- ScopeGuard guard(boost::bind(
892
- &AnalyticsLoggerConnection::disconnect,
893
- connection.get()));
894
- try {
895
- unsigned long long timeout = 15000000;
896
- writeArrayMessage(connection->fd, &timeout,
897
- "openTransaction",
898
- txnId.c_str(),
899
- groupName.c_str(),
900
- "",
901
- category.c_str(),
902
- timestampStr,
903
- unionStationKey.c_str(),
904
- "true",
905
- NULL);
906
- guard.clear();
907
- return make_shared<AnalyticsLog>(connection,
908
- txnId, groupName, category,
909
- unionStationKey);
910
-
911
- } catch (const TimeoutException &) {
912
- P_WARN("Timeout trying to communicate with the logging agent at " << serverAddress << "; " <<
913
- "will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
914
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
915
- return make_shared<AnalyticsLog>();
916
-
917
- } catch (const SystemException &e) {
918
- if (e.code() == ENOENT || isNetworkError(e.code())) {
919
- string errorResponse;
920
-
921
- guard.clear();
922
- if (connection->disconnect(errorResponse)) {
923
- P_WARN("The logging agent at " << serverAddress <<
924
- " closed the connection (error message: " << errorResponse <<
925
- "); will reconnect in " << reconnectTimeout / 1000000 <<
926
- " second(s).");
927
- } else {
928
- P_WARN("The logging agent at " << serverAddress <<
929
- " closed the connection (no error message given);" <<
930
- " will reconnect in " << reconnectTimeout / 1000000 <<
931
- " second(s).");
932
- }
933
- nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
934
- return make_shared<AnalyticsLog>();
935
- } else {
936
- throw;
937
- }
938
- }
939
- }
940
-
941
- void setMaxConnectTries(unsigned int value) {
942
- lock_guard<boost::mutex> l(lock);
943
- maxConnectTries = value;
944
- }
945
-
946
- void setReconnectTimeout(unsigned long long usec) {
947
- lock_guard<boost::mutex> l(lock);
948
- reconnectTimeout = usec;
949
- }
950
-
951
- bool isNull() const {
952
- return serverAddress.empty();
953
- }
954
-
955
- string getAddress() const {
956
- return serverAddress;
957
- }
958
-
959
- string getUsername() const {
960
- return username;
961
- }
962
-
963
- string getPassword() const {
964
- return password;
965
- }
966
-
967
- FileDescriptor getConnection() const {
968
- lock_guard<boost::mutex> l(lock);
969
- lock_guard<boost::mutex> l2(connection->lock);
970
- return connection->fd;
971
- }
972
-
973
- /**
974
- * @post !result.empty()
975
- */
976
- string getNodeName() const {
977
- return nodeName;
978
182
  }
979
183
  };
980
184
 
981
- typedef shared_ptr<AnalyticsLogger> AnalyticsLoggerPtr;
185
+ /**
186
+ * Put this in code sections where you don't expect *any* exceptions to be thrown.
187
+ * This macro will automatically disables interruptions in the current scope,
188
+ * and will print an error message whenever the scope exits with an exception.
189
+ *
190
+ * When inside critical sections, you should put this macro right after the lock
191
+ * object so that the error message is displayed before unlocking the lock;
192
+ * otherwise other threads may run before the error message is displayed, and
193
+ * those threads may see an inconsistant state and crash.
194
+ */
195
+ #define NOT_EXPECTING_EXCEPTIONS() NotExpectingExceptions __nee(__FILE__, __LINE__, __PRETTY_FUNCTION__)
982
196
 
983
197
  } // namespace Passenger
984
198
 
985
199
  #endif /* _PASSENGER_LOGGING_H_ */
986
-