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
@@ -33,7 +33,7 @@
33
33
 
34
34
 
35
35
  typedef enum {
36
- AP_RAILS,
36
+ AP_CLASSIC_RAILS,
37
37
  AP_RACK,
38
38
  AP_WSGI,
39
39
  AP_NONE
@@ -1,12 +1,14 @@
1
- if ! test -f "$ngx_addon_dir/../common/libpassenger_common.a" || \
2
- ! test -f "$ngx_addon_dir/../common/libboost_oxt.a"; then
1
+ PATH="$ngx_addon_dir/../../bin:$PATH"
2
+ export PATH
3
+
4
+ if test "x$PASSENGER_LIBS" = "x" && ! passenger-config --compiled; then
3
5
  echo "*** The Phusion Passenger support files are not yet compiled. Compiling them for you... ***"
4
- echo "*** Running 'rake nginx RELEASE=yes' in $ngx_addon_dir... ***"
6
+ echo "*** Running 'rake nginx CACHING=false' in $ngx_addon_dir... ***"
5
7
  old_dir=`pwd`
6
8
  if ! cd $ngx_addon_dir; then
7
9
  exit 1
8
10
  fi
9
- if ! rake nginx RELEASE=yes; then
11
+ if ! rake nginx CACHING=false; then
10
12
  exit 1
11
13
  fi
12
14
  cd "$old_dir"
@@ -25,11 +27,13 @@ NGX_ADDON_DEPS="$NGX_ADDON_DEPS \
25
27
  ${ngx_addon_dir}/ContentHandler.h \
26
28
  ${ngx_addon_dir}/StaticContentHandler.h \
27
29
  ${ngx_addon_dir}/ngx_http_passenger_module.h \
28
- ${ngx_addon_dir}/../common/Constants.h"
29
- CORE_LIBS="$CORE_LIBS \
30
- ${ngx_addon_dir}/../common/libpassenger_common.a \
31
- ${ngx_addon_dir}/../common/libboost_oxt.a \
32
- -lstdc++ -lpthread"
30
+ `passenger-config --root`/ext/common/Constants.h"
31
+ if test "x$PASSENGER_LIBS" = "x"; then
32
+ CORE_LIBS="$CORE_LIBS `passenger-config --nginx-libs`"
33
+ else
34
+ CORE_LIBS="$CORE_LIBS $PASSENGER_LIBS"
35
+ fi
36
+ CORE_LIBS="$CORE_LIBS -lstdc++ -lpthread"
33
37
 
34
38
  ngx_feature="Math library"
35
39
  ngx_feature_name=
@@ -86,8 +86,7 @@ register_content_handler(ngx_conf_t *cf)
86
86
  */
87
87
 
88
88
  static void
89
- ignore_sigpipe()
90
- {
89
+ ignore_sigpipe() {
91
90
  struct sigaction action;
92
91
 
93
92
  action.sa_handler = SIG_IGN;
@@ -96,7 +95,7 @@ ignore_sigpipe()
96
95
  sigaction(SIGPIPE, &action, NULL);
97
96
  }
98
97
 
99
- char *
98
+ static char *
100
99
  ngx_str_null_terminate(ngx_str_t *str) {
101
100
  char *result = malloc(str->len + 1);
102
101
  memcpy(result, str->data, str->len);
@@ -232,7 +231,6 @@ start_helper_server(ngx_cycle_t *cycle) {
232
231
  char *default_user = NULL;
233
232
  char *default_group = NULL;
234
233
  char *passenger_root = NULL;
235
- char *ruby = NULL;
236
234
  char *analytics_log_dir;
237
235
  char *analytics_log_user;
238
236
  char *analytics_log_group;
@@ -251,7 +249,6 @@ start_helper_server(ngx_cycle_t *cycle) {
251
249
  default_user = ngx_str_null_terminate(&passenger_main_conf.default_user);
252
250
  default_group = ngx_str_null_terminate(&passenger_main_conf.default_group);
253
251
  passenger_root = ngx_str_null_terminate(&passenger_main_conf.root_dir);
254
- ruby = ngx_str_null_terminate(&passenger_main_conf.ruby);
255
252
  analytics_log_dir = ngx_str_null_terminate(&passenger_main_conf.analytics_log_dir);
256
253
  analytics_log_user = ngx_str_null_terminate(&passenger_main_conf.analytics_log_user);
257
254
  analytics_log_group = ngx_str_null_terminate(&passenger_main_conf.analytics_log_group);
@@ -279,7 +276,7 @@ start_helper_server(ngx_cycle_t *cycle) {
279
276
  "", passenger_main_conf.user_switching,
280
277
  default_user, default_group,
281
278
  core_conf->user, core_conf->group,
282
- passenger_root, ruby, passenger_main_conf.max_pool_size,
279
+ passenger_root, "ruby", passenger_main_conf.max_pool_size,
283
280
  passenger_main_conf.max_instances_per_app,
284
281
  passenger_main_conf.pool_idle_time,
285
282
  "",
@@ -354,7 +351,6 @@ cleanup:
354
351
  free(default_user);
355
352
  free(default_group);
356
353
  free(passenger_root);
357
- free(ruby);
358
354
  free(analytics_log_dir);
359
355
  free(analytics_log_user);
360
356
  free(analytics_log_group);
@@ -2,7 +2,7 @@
2
2
  * OXT - OS eXtensions for boosT
3
3
  * Provides important functionality necessary for writing robust server software.
4
4
  *
5
- * Copyright (c) 2010 Phusion
5
+ * Copyright (c) 2010, 2011, 2012 Phusion
6
6
  *
7
7
  * Permission is hereby granted, free of charge, to any person obtaining a copy
8
8
  * of this software and associated documentation files (the "Software"), to deal
@@ -27,32 +27,10 @@
27
27
 
28
28
  #define OXT_BACKTRACE_IS_ENABLED
29
29
 
30
- #include <boost/thread/mutex.hpp>
31
30
  #include <boost/current_function.hpp>
32
- #include <exception>
33
- #include <string>
34
- #include <list>
35
- #include <vector>
36
- #include "../spin_lock.hpp"
37
- #include "../macros.hpp"
38
31
 
39
32
  namespace oxt {
40
33
 
41
- using namespace std;
42
- using namespace boost;
43
- struct trace_point;
44
- class tracable_exception;
45
- struct thread_registration;
46
-
47
- extern boost::mutex _thread_registration_mutex;
48
- extern list<thread_registration *> _registered_threads;
49
-
50
- void _init_backtrace_tls();
51
- void _finalize_backtrace_tls();
52
- bool _get_backtrace_list_and_its_lock(vector<trace_point *> **backtrace_list, spin_lock **lock);
53
- string _format_backtrace(const list<trace_point *> *backtrace_list);
54
- string _format_backtrace(const vector<trace_point *> *backtrace_list);
55
-
56
34
  /**
57
35
  * A single point in a backtrace. Creating this object will cause it
58
36
  * to push itself to the thread's backtrace list. This backtrace list
@@ -61,9 +39,6 @@ string _format_backtrace(const vector<trace_point *> *backtrace_list);
61
39
  * backtrace list.
62
40
  *
63
41
  * Except if you set the 'detached' argument to true.
64
- *
65
- * Implementation detail - do not use directly!
66
- * @internal
67
42
  */
68
43
  struct trace_point {
69
44
  const char *function;
@@ -71,86 +46,14 @@ struct trace_point {
71
46
  unsigned int line;
72
47
  bool m_detached;
73
48
 
74
- trace_point(const char *function, const char *source, unsigned int line) {
75
- this->function = function;
76
- this->source = source;
77
- this->line = line;
78
- m_detached = false;
79
-
80
- vector<trace_point *> *backtrace_list;
81
- spin_lock *lock;
82
- if (OXT_LIKELY(_get_backtrace_list_and_its_lock(&backtrace_list, &lock))) {
83
- spin_lock::scoped_lock l(*lock);
84
- backtrace_list->push_back(this);
85
- }
86
- }
87
-
88
- trace_point(const char *function, const char *source, unsigned int line, bool detached) {
89
- this->function = function;
90
- this->source = source;
91
- this->line = line;
92
- m_detached = true;
93
- }
94
-
95
- ~trace_point() {
96
- if (OXT_LIKELY(!m_detached)) {
97
- vector<trace_point *> *backtrace_list;
98
- spin_lock *lock;
99
- if (OXT_LIKELY(_get_backtrace_list_and_its_lock(&backtrace_list, &lock))) {
100
- spin_lock::scoped_lock l(*lock);
101
- backtrace_list->pop_back();
102
- }
103
- }
104
- }
105
-
106
- void update(const char *source, unsigned int line) {
107
- this->source = source;
108
- this->line = line;
109
- }
49
+ trace_point(const char *function, const char *source, unsigned int line);
50
+ trace_point(const char *function, const char *source, unsigned int line, bool detached);
51
+ ~trace_point();
52
+ void update(const char *source, unsigned int line);
110
53
  };
111
54
 
112
55
  #define TRACE_POINT() oxt::trace_point __p(BOOST_CURRENT_FUNCTION, __FILE__, __LINE__)
113
56
  #define TRACE_POINT_WITH_NAME(name) oxt::trace_point __p(name, __FILE__, __LINE__)
114
57
  #define UPDATE_TRACE_POINT() __p.update(__FILE__, __LINE__)
115
58
 
116
- /**
117
- * @internal
118
- */
119
- struct thread_registration {
120
- string name;
121
- spin_lock *backtrace_lock;
122
- vector<trace_point *> *backtrace;
123
- };
124
-
125
- /**
126
- * @internal
127
- */
128
- struct initialize_backtrace_support_for_this_thread {
129
- thread_registration *registration;
130
- list<thread_registration *>::iterator it;
131
-
132
- initialize_backtrace_support_for_this_thread(const string &name) {
133
- _init_backtrace_tls();
134
- registration = new thread_registration();
135
- registration->name = name;
136
- _get_backtrace_list_and_its_lock(&registration->backtrace,
137
- &registration->backtrace_lock);
138
-
139
- boost::mutex::scoped_lock l(_thread_registration_mutex);
140
- _registered_threads.push_back(registration);
141
- it = _registered_threads.end();
142
- it--;
143
- }
144
-
145
- ~initialize_backtrace_support_for_this_thread() {
146
- {
147
- boost::mutex::scoped_lock l(_thread_registration_mutex);
148
- _registered_threads.erase(it);
149
- delete registration;
150
- }
151
- _finalize_backtrace_tls();
152
- }
153
- };
154
-
155
59
  } // namespace oxt
156
-
@@ -0,0 +1,90 @@
1
+ /*
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
+ *
5
+ * Copyright (c) 2012 Phusion
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
+ */
25
+ #ifndef _OXT_DETAIL_CONTEXT_HPP_
26
+ #define _OXT_DETAIL_CONTEXT_HPP_
27
+
28
+ #include <boost/thread/mutex.hpp>
29
+ #include <boost/shared_ptr.hpp>
30
+ #include <list>
31
+ #include <vector>
32
+ #include <string>
33
+ #include <pthread.h>
34
+ #ifdef __linux__
35
+ #include <sys/types.h>
36
+ #endif
37
+ #include "../spin_lock.hpp"
38
+
39
+ namespace oxt {
40
+
41
+
42
+ struct thread_local_context;
43
+
44
+ typedef boost::shared_ptr<thread_local_context> thread_local_context_ptr;
45
+
46
+ struct global_context_t {
47
+ boost::mutex next_thread_number_mutex;
48
+ /** Thread numbering begins at 2. The main thread has number 1.
49
+ * A thread number of 0 is invalid. */
50
+ unsigned int next_thread_number;
51
+
52
+ boost::mutex thread_registration_mutex;
53
+ std::list<thread_local_context_ptr> registered_threads;
54
+
55
+ global_context_t();
56
+ };
57
+
58
+ struct thread_local_context {
59
+ std::list<thread_local_context_ptr>::iterator iterator;
60
+
61
+ pthread_t thread;
62
+ #ifdef __linux__
63
+ pid_t tid;
64
+ #endif
65
+ unsigned int thread_number;
66
+ std::string thread_name;
67
+
68
+ /** This lock is normally locked, but only unlocked during an oxt::sycall function,
69
+ * and is relocked when that function returns. One can use try_lock to find out
70
+ * whether the code is inside an oxt::syscall function.
71
+ */
72
+ spin_lock syscall_interruption_lock;
73
+
74
+ #ifdef OXT_BACKTRACE_IS_ENABLED
75
+ std::vector<trace_point *> backtrace_list;
76
+ spin_lock backtrace_lock;
77
+ #endif
78
+
79
+ static thread_local_context_ptr make_shared_ptr();
80
+
81
+ thread_local_context();
82
+ };
83
+
84
+
85
+ thread_local_context *get_thread_local_context();
86
+
87
+
88
+ } // namespace oxt
89
+
90
+ #endif /* _OXT_DETAIL_CONTEXT_HPP_ */
@@ -64,6 +64,10 @@ public:
64
64
  void unlock() {
65
65
  OSSpinLockUnlock(&spin);
66
66
  }
67
+
68
+ bool try_lock() {
69
+ return OSSpinLockTry(&spin);
70
+ }
67
71
  };
68
72
 
69
73
  } // namespace oxt
@@ -75,6 +75,10 @@ public:
75
75
  void unlock() {
76
76
  __sync_lock_release(&exclusion);
77
77
  }
78
+
79
+ bool try_lock() {
80
+ return !__sync_lock_test_and_set(&exclusion, 1);
81
+ }
78
82
  };
79
83
 
80
84
  } // namespace oxt
@@ -91,6 +91,20 @@ public:
91
91
  throw boost::thread_resource_error("Cannot unlock spin lock", ret);
92
92
  }
93
93
  }
94
+
95
+ void try_lock() {
96
+ int ret;
97
+ do {
98
+ ret = pthread_spin_trylock(&spin);
99
+ } while (OXT_UNLIKELY(ret == EINTR));
100
+ if (ret == 0) {
101
+ return true;
102
+ } else if (ret == EBUSY) {
103
+ return false;
104
+ } else {
105
+ throw boost::thread_resource_error("Cannot lock spin lock", ret);
106
+ }
107
+ }
94
108
  };
95
109
 
96
110
  } // namespace oxt
@@ -24,7 +24,7 @@
24
24
  */
25
25
  #include <string>
26
26
  #include <exception>
27
- #include <list>
27
+ #include <vector>
28
28
 
29
29
  namespace oxt {
30
30
 
@@ -35,7 +35,7 @@ struct trace_point;
35
35
  */
36
36
  class tracable_exception: public std::exception {
37
37
  private:
38
- std::list<trace_point *> backtrace_copy;
38
+ std::vector<trace_point *> backtrace_copy;
39
39
  public:
40
40
  tracable_exception();
41
41
  tracable_exception(const tracable_exception &other);
@@ -128,7 +128,7 @@ public:
128
128
  * @throws thread_resource_error Cannot create a thread.
129
129
  * @post this->num_threads() == old->num_threads() + 1
130
130
  */
131
- void create_thread(boost::function<void ()> &func, const string &name = "", unsigned int stack_size = 0) {
131
+ void create_thread(const boost::function<void ()> &func, const string &name = "", unsigned int stack_size = 0) {
132
132
  boost::lock_guard<boost::mutex> l(lock);
133
133
  thread_handle_ptr handle(new thread_handle());
134
134
  thread_handles.push_back(handle);
@@ -181,6 +181,32 @@ public:
181
181
  thread::interrupt_and_join_multiple(threads, nthreads_copy);
182
182
  }
183
183
 
184
+ void join_all() {
185
+ // See comments from interrupt_and_join_all().
186
+ boost::unique_lock<boost::mutex> l(lock);
187
+ list<thread_handle_ptr> thread_handles_copy;
188
+ list<thread_handle_ptr>::iterator it;
189
+ thread_handle_ptr handle;
190
+ unsigned int nthreads_copy = nthreads;
191
+ thread *threads[nthreads];
192
+ unsigned int i = 0;
193
+
194
+ // We make a copy so that the handles aren't destroyed prematurely.
195
+ thread_handles_copy = thread_handles;
196
+ for (it = thread_handles.begin(); it != thread_handles.end(); it++, i++) {
197
+ handle = *it;
198
+ handle->removed_from_list = true;
199
+ threads[i] = handle->thr;
200
+ }
201
+ thread_handles.clear();
202
+ nthreads = 0;
203
+
204
+ l.unlock();
205
+ for (i = 0; i < nthreads_copy; i++) {
206
+ threads[i]->join();
207
+ }
208
+ }
209
+
184
210
  /**
185
211
  * Returns the number of threads currently in this thread group.
186
212
  */
@@ -0,0 +1,415 @@
1
+ /*
2
+ * OXT - OS eXtensions for boosT
3
+ * Provides important functionality necessary for writing robust server software.
4
+ *
5
+ * Copyright (c) 2008-2012 Phusion
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
+ */
25
+
26
+ #include <boost/thread/mutex.hpp>
27
+ #include <boost/shared_ptr.hpp>
28
+ #include <boost/make_shared.hpp>
29
+ #include "tracable_exception.hpp"
30
+ #include "backtrace.hpp"
31
+ #include "macros.hpp"
32
+ #include "thread.hpp"
33
+ #include "spin_lock.hpp"
34
+ #include "detail/context.hpp"
35
+ #ifdef __linux__
36
+ #include <sys/syscall.h>
37
+ #endif
38
+
39
+ #ifdef OXT_THREAD_LOCAL_KEYWORD_SUPPORTED
40
+ #include <cassert>
41
+ #include <sstream>
42
+ #include <cstring>
43
+ #endif
44
+
45
+
46
+ namespace oxt {
47
+
48
+ using namespace std;
49
+ using namespace boost;
50
+
51
+
52
+ static global_context_t *global_context = NULL;
53
+
54
+
55
+ /*
56
+ * boost::thread_specific_storage is pretty expensive. So we use the __thread
57
+ * keyword whenever possible - that's almost free.
58
+ */
59
+ #ifdef OXT_THREAD_LOCAL_KEYWORD_SUPPORTED
60
+ static __thread thread_local_context_ptr *local_context = NULL;
61
+
62
+ static void
63
+ init_thread_local_context_support() {
64
+ /* Do nothing. */
65
+ }
66
+
67
+ static void
68
+ set_thread_local_context(const thread_local_context_ptr &ctx) {
69
+ local_context = new thread_local_context_ptr(ctx);
70
+ }
71
+
72
+ static void
73
+ free_thread_local_context() {
74
+ delete local_context;
75
+ local_context = NULL;
76
+ }
77
+
78
+ thread_local_context *
79
+ get_thread_local_context() {
80
+ if (OXT_LIKELY(local_context != NULL)) {
81
+ return local_context->get();
82
+ } else {
83
+ return NULL;
84
+ }
85
+ }
86
+ #else
87
+ /*
88
+ * This is a *pointer* to a thread_specific_ptr because, once
89
+ * we've created a thread_specific_ptr, we never want to destroy it
90
+ * in order to avoid C++'s global variable destruction. All kinds
91
+ * of cleanup code may depend on local_context and because global
92
+ * variable destruction order is undefined, we just want to keep
93
+ * this object alive until the OS cleans it up.
94
+ */
95
+ static thread_specific_ptr<thread_local_context_ptr> *local_context = NULL;
96
+
97
+ static void
98
+ init_thread_local_context_support() {
99
+ local_context = new thread_specific_ptr<thread_local_context_ptr>();
100
+ }
101
+
102
+ static void
103
+ set_thread_local_context(const thread_local_context_ptr &ctx) {
104
+ if (local_context != NULL) {
105
+ local_context->reset(new thread_local_context_ptr(ctx));
106
+ }
107
+ }
108
+
109
+ static void
110
+ free_thread_local_context() {
111
+ if (local_context != NULL) {
112
+ local_context->reset();
113
+ }
114
+ }
115
+
116
+ thread_local_context *
117
+ get_thread_local_context() {
118
+ if (OXT_LIKELY(local_context != NULL)) {
119
+ thread_local_context_ptr *pointer = local_context->get();
120
+ if (OXT_LIKELY(pointer != NULL)) {
121
+ return pointer->get();
122
+ } else {
123
+ return NULL;
124
+ }
125
+ } else {
126
+ return NULL;
127
+ }
128
+ }
129
+ #endif
130
+
131
+
132
+ #ifdef OXT_BACKTRACE_IS_ENABLED
133
+
134
+ trace_point::trace_point(const char *_function, const char *_source, unsigned int _line)
135
+ : function(_function),
136
+ source(_source),
137
+ line(_line),
138
+ m_detached(false)
139
+ {
140
+ thread_local_context *ctx = get_thread_local_context();
141
+ if (OXT_LIKELY(ctx != NULL)) {
142
+ spin_lock::scoped_lock l(ctx->backtrace_lock);
143
+ ctx->backtrace_list.push_back(this);
144
+ } else {
145
+ m_detached = true;
146
+ }
147
+ }
148
+
149
+ trace_point::trace_point(const char *_function, const char *_source, unsigned int _line, bool detached)
150
+ : function(_function),
151
+ source(_source),
152
+ line(_line),
153
+ m_detached(true)
154
+ { }
155
+
156
+ trace_point::~trace_point() {
157
+ if (OXT_LIKELY(!m_detached)) {
158
+ thread_local_context *ctx = get_thread_local_context();
159
+ if (OXT_LIKELY(ctx != NULL)) {
160
+ spin_lock::scoped_lock l(ctx->backtrace_lock);
161
+ assert(!ctx->backtrace_list.empty());
162
+ ctx->backtrace_list.pop_back();
163
+ }
164
+ }
165
+ }
166
+
167
+ void
168
+ trace_point::update(const char *source, unsigned int line) {
169
+ this->source = source;
170
+ this->line = line;
171
+ }
172
+
173
+
174
+ tracable_exception::tracable_exception() {
175
+ thread_local_context *ctx = get_thread_local_context();
176
+ if (OXT_LIKELY(ctx != NULL)) {
177
+ spin_lock::scoped_lock l(ctx->backtrace_lock);
178
+ vector<trace_point *>::const_iterator it, end = ctx->backtrace_list.end();
179
+
180
+ backtrace_copy.reserve(ctx->backtrace_list.size());
181
+ for (it = ctx->backtrace_list.begin(); it != end; it++) {
182
+ trace_point *p = new trace_point(
183
+ (*it)->function,
184
+ (*it)->source,
185
+ (*it)->line,
186
+ true);
187
+ backtrace_copy.push_back(p);
188
+ }
189
+ }
190
+ }
191
+
192
+ tracable_exception::tracable_exception(const tracable_exception &other)
193
+ : std::exception()
194
+ {
195
+ vector<trace_point *>::const_iterator it, end = other.backtrace_copy.end();
196
+ backtrace_copy.reserve(other.backtrace_copy.size());
197
+ for (it = other.backtrace_copy.begin(); it != end; it++) {
198
+ trace_point *p = new trace_point(
199
+ (*it)->function,
200
+ (*it)->source,
201
+ (*it)->line,
202
+ true);
203
+ backtrace_copy.push_back(p);
204
+ }
205
+ }
206
+
207
+ tracable_exception::~tracable_exception() throw() {
208
+ vector<trace_point *>::iterator it, end = backtrace_copy.end();
209
+ for (it = backtrace_copy.begin(); it != end; it++) {
210
+ delete *it;
211
+ }
212
+ }
213
+
214
+ template<typename Collection>
215
+ static string
216
+ format_backtrace(const Collection &backtrace_list) {
217
+ if (backtrace_list.empty()) {
218
+ return " (empty)";
219
+ } else {
220
+ backtrace_list.rbegin();
221
+ stringstream result;
222
+ typename Collection::const_reverse_iterator it;
223
+
224
+ for (it = backtrace_list.rbegin(); it != backtrace_list.rend(); it++) {
225
+ const trace_point *p = *it;
226
+
227
+ result << " in '" << p->function << "'";
228
+ if (p->source != NULL) {
229
+ const char *source = strrchr(p->source, '/');
230
+ if (source != NULL) {
231
+ source++;
232
+ } else {
233
+ source = p->source;
234
+ }
235
+ result << " (" << source << ":" << p->line << ")";
236
+ }
237
+ result << endl;
238
+ }
239
+ return result.str();
240
+ }
241
+ }
242
+
243
+ string
244
+ tracable_exception::backtrace() const throw() {
245
+ return format_backtrace< vector<trace_point *> >(backtrace_copy);
246
+ }
247
+
248
+ const char *
249
+ tracable_exception::what() const throw() {
250
+ return "oxt::tracable_exception";
251
+ }
252
+
253
+ #endif /* OXT_BACKTRACE_IS_ENABLED */
254
+
255
+
256
+ void initialize() {
257
+ global_context = new global_context_t();
258
+ init_thread_local_context_support();
259
+ // For some reason make_shared() crashes here when compiled with clang 3.2 on OS X.
260
+ // Clang bug? We use 'new' to work around it.
261
+ thread_local_context_ptr ctx = thread_local_context::make_shared_ptr();
262
+ ctx->thread_number = 1;
263
+ ctx->thread_name = "Main thread";
264
+ set_thread_local_context(ctx);
265
+ }
266
+
267
+
268
+ global_context_t::global_context_t()
269
+ : next_thread_number(2)
270
+ { }
271
+
272
+
273
+ thread_local_context_ptr
274
+ thread_local_context::make_shared_ptr() {
275
+ // For some reason make_shared() crashes here when compiled with clang 3.2 on OS X.
276
+ // Clang bug? We use 'new' to work around it.
277
+ return thread_local_context_ptr(new thread_local_context());
278
+ }
279
+
280
+ thread_local_context::thread_local_context()
281
+ : thread_number(0)
282
+ {
283
+ thread = pthread_self();
284
+ #ifdef __linux__
285
+ tid = syscall(SYS_gettid);
286
+ #endif
287
+ syscall_interruption_lock.lock();
288
+ #ifdef OXT_BACKTRACE_IS_ENABLED
289
+ backtrace_list.reserve(50);
290
+ #endif
291
+ }
292
+
293
+
294
+ string
295
+ thread::make_thread_name(const string &given_name) {
296
+ if (given_name.empty()) {
297
+ if (OXT_LIKELY(global_context != NULL)) {
298
+ stringstream str;
299
+ str << "Thread #";
300
+ {
301
+ lock_guard<boost::mutex> l(global_context->thread_registration_mutex);
302
+ str << global_context->next_thread_number;
303
+ }
304
+ return str.str();
305
+ } else {
306
+ return "(unknown)";
307
+ }
308
+ } else {
309
+ return given_name;
310
+ }
311
+ }
312
+
313
+ void
314
+ thread::thread_main(const boost::function<void ()> func, thread_local_context_ptr ctx) {
315
+ set_thread_local_context(ctx);
316
+
317
+ if (OXT_LIKELY(global_context != NULL)) {
318
+ lock_guard<boost::mutex> l(global_context->thread_registration_mutex);
319
+
320
+ ctx->thread = pthread_self();
321
+ global_context->next_thread_number++;
322
+ global_context->registered_threads.push_back(ctx);
323
+ ctx->iterator = global_context->registered_threads.end();
324
+ ctx->iterator--;
325
+ // Set this after setting 'iterator' to indicate
326
+ // that push_back() has succeeded.
327
+ ctx->thread_number = global_context->next_thread_number;
328
+ }
329
+
330
+ try {
331
+ func();
332
+ } catch (const thread_interrupted &) {
333
+ // Do nothing.
334
+ }
335
+ // We don't care about other exceptions because they'll crash the process anyway.
336
+
337
+ if (OXT_LIKELY(global_context != NULL)) {
338
+ lock_guard<boost::mutex> l(global_context->thread_registration_mutex);
339
+ thread_local_context *ctx = get_thread_local_context();
340
+ if (ctx != 0 && ctx->thread_number != 0) {
341
+ global_context->registered_threads.erase(ctx->iterator);
342
+ ctx->thread_number = 0;
343
+ }
344
+ }
345
+ free_thread_local_context();
346
+ }
347
+
348
+ std::string
349
+ thread::name() const throw() {
350
+ return context->thread_name;
351
+ }
352
+
353
+ std::string
354
+ thread::backtrace() const throw() {
355
+ #ifdef OXT_BACKTRACE_IS_ENABLED
356
+ spin_lock::scoped_lock l(context->backtrace_lock);
357
+ return format_backtrace(context->backtrace_list);
358
+ #else
359
+ return " (backtrace support disabled during compile time)";
360
+ #endif
361
+ }
362
+
363
+ string
364
+ thread::all_backtraces() throw() {
365
+ #ifdef OXT_BACKTRACE_IS_ENABLED
366
+ if (OXT_LIKELY(global_context != NULL)) {
367
+ lock_guard<boost::mutex> l(global_context->thread_registration_mutex);
368
+ list<thread_local_context_ptr>::const_iterator it;
369
+ std::stringstream result;
370
+
371
+ for (it = global_context->registered_threads.begin();
372
+ it != global_context->registered_threads.end();
373
+ it++)
374
+ {
375
+ thread_local_context_ptr ctx = *it;
376
+ result << "Thread '" << ctx->thread_name <<
377
+ "' (" << hex << showbase << ctx->thread << dec;
378
+ #ifdef __linux__
379
+ result << ", LWP " << ctx->tid;
380
+ #endif
381
+ result << "):" << endl;
382
+
383
+ spin_lock::scoped_lock l(ctx->backtrace_lock);
384
+ std::string bt = format_backtrace(ctx->backtrace_list);
385
+ result << bt;
386
+ if (bt.empty() || bt[bt.size() - 1] != '\n') {
387
+ result << endl;
388
+ }
389
+ result << endl;
390
+ }
391
+ return result.str();
392
+ } else {
393
+ return "(OXT not initialized)";
394
+ }
395
+ #else
396
+ return "(backtrace support disabled during compile time)";
397
+ #endif
398
+ }
399
+
400
+ void
401
+ thread::interrupt(bool interruptSyscalls) {
402
+ int ret;
403
+
404
+ boost::thread::interrupt();
405
+ if (interruptSyscalls && context->syscall_interruption_lock.try_lock()) {
406
+ do {
407
+ ret = pthread_kill(native_handle(),
408
+ INTERRUPTION_SIGNAL);
409
+ } while (ret == EINTR);
410
+ context->syscall_interruption_lock.unlock();
411
+ }
412
+ }
413
+
414
+
415
+ } // namespace oxt