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.
- data/DEVELOPERS.TXT +4 -10
- data/NEWS +19 -27
- data/Rakefile +20 -19
- data/bin/passenger +3 -2
- data/bin/passenger-config +35 -5
- data/bin/passenger-install-apache2-module +12 -12
- data/bin/passenger-install-nginx-module +55 -38
- data/bin/passenger-memory-stats +3 -1
- data/bin/passenger-status +7 -35
- data/build/agents.rb +107 -21
- data/build/apache2.rb +11 -46
- data/build/basics.rb +61 -9
- data/build/common_library.rb +59 -142
- data/build/cxx_tests.rb +111 -110
- data/build/documentation.rb +33 -0
- data/build/misc.rb +30 -12
- data/build/nginx.rb +10 -39
- data/build/oxt_tests.rb +1 -0
- data/build/ruby_extension.rb +1 -5
- data/build/test_basics.rb +3 -2
- data/dev/copy_boost_headers.rb +2 -1
- data/doc/Architectural overview.html +49 -90
- data/doc/DebuggingAndStressTesting.txt.md +49 -0
- data/doc/Packaging.txt.md +254 -0
- data/doc/Security of user switching support.html +35 -66
- data/doc/Users guide Apache.html +588 -758
- data/doc/Users guide Apache.idmap.txt +253 -136
- data/doc/Users guide Apache.txt +154 -109
- data/doc/Users guide Nginx.html +544 -660
- data/doc/Users guide Nginx.idmap.txt +179 -91
- data/doc/Users guide Nginx.txt +192 -118
- data/doc/Users guide Standalone.html +65 -48
- data/doc/Users guide Standalone.idmap.txt +10 -2
- data/doc/Users guide Standalone.txt +4 -0
- data/doc/images/glyphicons-halflings-white.png +0 -0
- data/doc/images/glyphicons-halflings.png +0 -0
- data/doc/images/phusion_banner_small.png +0 -0
- data/doc/images/{smart-lv2.png → smart.png} +0 -0
- data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
- data/doc/templates/bootstrap.min.css +397 -0
- data/doc/templates/markdown.html.erb +117 -0
- data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
- data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
- data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
- data/doc/users_guide_snippets/support_information.txt +30 -0
- data/ext/apache2/Bucket.cpp +9 -26
- data/ext/apache2/Bucket.h +13 -10
- data/ext/apache2/Configuration.cpp +70 -58
- data/ext/apache2/Configuration.hpp +19 -47
- data/ext/apache2/DirectoryMapper.h +7 -7
- data/ext/apache2/Hooks.cpp +150 -313
- data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
- data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
- data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
- data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
- data/ext/boost/algorithm/string/formatter.hpp +20 -3
- data/ext/boost/assert.hpp +85 -4
- data/ext/boost/bind/bind.hpp +1 -1
- data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
- data/ext/boost/concept_check.hpp +140 -64
- data/ext/boost/config.hpp +1 -1
- data/ext/boost/config/auto_link.hpp +8 -6
- data/ext/boost/config/compiler/borland.hpp +12 -2
- data/ext/boost/config/compiler/clang.hpp +89 -30
- data/ext/boost/config/compiler/codegear.hpp +3 -2
- data/ext/boost/config/compiler/common_edg.hpp +7 -5
- data/ext/boost/config/compiler/cray.hpp +61 -0
- data/ext/boost/config/compiler/digitalmars.hpp +9 -1
- data/ext/boost/config/compiler/gcc.hpp +33 -24
- data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
- data/ext/boost/config/compiler/hp_acc.hpp +12 -1
- data/ext/boost/config/compiler/intel.hpp +78 -4
- data/ext/boost/config/compiler/metrowerks.hpp +4 -1
- data/ext/boost/config/compiler/mpw.hpp +4 -1
- data/ext/boost/config/compiler/nvcc.hpp +8 -66
- data/ext/boost/config/compiler/pathscale.hpp +80 -0
- data/ext/boost/config/compiler/pgi.hpp +5 -5
- data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
- data/ext/boost/config/compiler/vacpp.hpp +37 -13
- data/ext/boost/config/compiler/visualc.hpp +24 -11
- data/ext/boost/config/platform/bsd.hpp +1 -1
- data/ext/boost/config/platform/cray.hpp +18 -0
- data/ext/boost/config/platform/cygwin.hpp +10 -0
- data/ext/boost/config/platform/linux.hpp +5 -0
- data/ext/boost/config/platform/macos.hpp +5 -4
- data/ext/boost/config/platform/symbian.hpp +5 -2
- data/ext/boost/config/platform/vms.hpp +25 -0
- data/ext/boost/config/platform/win32.hpp +7 -1
- data/ext/boost/config/select_compiler_config.hpp +8 -25
- data/ext/boost/config/select_platform_config.hpp +8 -1
- data/ext/boost/config/select_stdlib_config.hpp +9 -1
- data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
- data/ext/boost/config/stdlib/libcomo.hpp +1 -4
- data/ext/boost/config/stdlib/libcpp.hpp +36 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
- data/ext/boost/config/stdlib/modena.hpp +1 -4
- data/ext/boost/config/stdlib/msl.hpp +1 -4
- data/ext/boost/config/stdlib/roguewave.hpp +9 -6
- data/ext/boost/config/stdlib/sgi.hpp +12 -4
- data/ext/boost/config/stdlib/stlport.hpp +11 -4
- data/ext/boost/config/stdlib/vacpp.hpp +11 -4
- data/ext/boost/config/suffix.hpp +71 -6
- data/ext/boost/config/warning_disable.hpp +1 -1
- data/ext/boost/container/container_fwd.hpp +177 -0
- data/ext/boost/cstdint.hpp +17 -12
- data/ext/boost/current_function.hpp +2 -1
- data/ext/boost/date_time/c_time.hpp +17 -1
- data/ext/boost/date_time/compiler_config.hpp +13 -15
- data/ext/boost/date_time/date_formatting.hpp +7 -1
- data/ext/boost/date_time/filetime_functions.hpp +4 -4
- data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
- data/ext/boost/date_time/strings_from_facet.hpp +3 -3
- data/ext/boost/date_time/time_facet.hpp +101 -101
- data/ext/boost/detail/endian.hpp +4 -2
- data/ext/boost/detail/fenv.hpp +74 -0
- data/ext/boost/detail/sp_typeinfo.hpp +6 -0
- data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
- data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
- data/ext/boost/exception/detail/type_info.hpp +3 -3
- data/ext/boost/exception/diagnostic_information.hpp +37 -21
- data/ext/boost/exception/exception.hpp +21 -1
- data/ext/boost/exception/info.hpp +0 -1
- data/ext/boost/function.hpp +2 -2
- data/ext/boost/function/function_base.hpp +15 -9
- data/ext/boost/function/function_template.hpp +26 -48
- data/ext/boost/integer_fwd.hpp +0 -16
- data/ext/boost/integer_traits.hpp +2 -2
- data/ext/boost/iterator.hpp +1 -1
- data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
- data/ext/boost/iterator/iterator_facade.hpp +13 -13
- data/ext/boost/iterator/transform_iterator.hpp +5 -20
- data/ext/boost/lexical_cast.hpp +1655 -673
- data/ext/boost/math/policies/policy.hpp +982 -0
- data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
- data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
- data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
- data/ext/boost/math/special_functions/sign.hpp +145 -0
- data/ext/boost/math/tools/config.hpp +321 -0
- data/ext/boost/math/tools/promotion.hpp +150 -0
- data/ext/boost/math/tools/real_cast.hpp +29 -0
- data/ext/boost/math/tools/user.hpp +97 -0
- data/ext/boost/move/move.hpp +1222 -0
- data/ext/boost/mpl/O1_size.hpp +40 -0
- data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
- data/ext/boost/mpl/advance.hpp +76 -0
- data/ext/boost/mpl/advance_fwd.hpp +28 -0
- data/ext/boost/mpl/at.hpp +52 -0
- data/ext/boost/mpl/at_fwd.hpp +24 -0
- data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
- data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
- data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
- data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
- data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
- data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
- data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
- data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
- data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
- data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
- data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
- data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
- data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
- data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
- data/ext/boost/mpl/aux_/has_size.hpp +23 -0
- data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
- data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
- data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
- data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
- data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
- data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
- data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
- data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
- data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
- data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
- data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
- data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
- data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
- data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
- data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
- data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
- data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
- data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
- data/ext/boost/mpl/back_fwd.hpp +24 -0
- data/ext/boost/mpl/back_inserter.hpp +34 -0
- data/ext/boost/mpl/begin_end.hpp +57 -0
- data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
- data/ext/boost/mpl/clear.hpp +39 -0
- data/ext/boost/mpl/clear_fwd.hpp +24 -0
- data/ext/boost/mpl/comparison.hpp +24 -0
- data/ext/boost/mpl/contains.hpp +41 -0
- data/ext/boost/mpl/contains_fwd.hpp +25 -0
- data/ext/boost/mpl/deref.hpp +41 -0
- data/ext/boost/mpl/distance.hpp +78 -0
- data/ext/boost/mpl/distance_fwd.hpp +28 -0
- data/ext/boost/mpl/empty_fwd.hpp +24 -0
- data/ext/boost/mpl/equal_to.hpp +21 -0
- data/ext/boost/mpl/find.hpp +38 -0
- data/ext/boost/mpl/find_if.hpp +50 -0
- data/ext/boost/mpl/fold.hpp +48 -0
- data/ext/boost/mpl/front_fwd.hpp +24 -0
- data/ext/boost/mpl/front_inserter.hpp +33 -0
- data/ext/boost/mpl/greater.hpp +21 -0
- data/ext/boost/mpl/greater_equal.hpp +21 -0
- data/ext/boost/mpl/inserter.hpp +32 -0
- data/ext/boost/mpl/iter_fold.hpp +49 -0
- data/ext/boost/mpl/iter_fold_if.hpp +117 -0
- data/ext/boost/mpl/iterator_range.hpp +42 -0
- data/ext/boost/mpl/iterator_tags.hpp +27 -0
- data/ext/boost/mpl/less.hpp +21 -0
- data/ext/boost/mpl/less_equal.hpp +21 -0
- data/ext/boost/mpl/limits/list.hpp +21 -0
- data/ext/boost/mpl/limits/vector.hpp +21 -0
- data/ext/boost/mpl/list.hpp +57 -0
- data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
- data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
- data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
- data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
- data/ext/boost/mpl/list/aux_/front.hpp +33 -0
- data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
- data/ext/boost/mpl/list/aux_/item.hpp +55 -0
- data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
- data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
- data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
- data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
- data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
- data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
- data/ext/boost/mpl/list/aux_/size.hpp +33 -0
- data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
- data/ext/boost/mpl/list/list0.hpp +42 -0
- data/ext/boost/mpl/list/list10.hpp +43 -0
- data/ext/boost/mpl/list/list20.hpp +43 -0
- data/ext/boost/mpl/long.hpp +22 -0
- data/ext/boost/mpl/long_fwd.hpp +27 -0
- data/ext/boost/mpl/minus.hpp +21 -0
- data/ext/boost/mpl/multiplies.hpp +53 -0
- data/ext/boost/mpl/negate.hpp +81 -0
- data/ext/boost/mpl/not_equal_to.hpp +21 -0
- data/ext/boost/mpl/numeric_cast.hpp +41 -0
- data/ext/boost/mpl/pair.hpp +70 -0
- data/ext/boost/mpl/plus.hpp +21 -0
- data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
- data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
- data/ext/boost/mpl/prior.hpp +19 -0
- data/ext/boost/mpl/push_back.hpp +53 -0
- data/ext/boost/mpl/push_back_fwd.hpp +24 -0
- data/ext/boost/mpl/push_front.hpp +52 -0
- data/ext/boost/mpl/push_front_fwd.hpp +24 -0
- data/ext/boost/mpl/remove_if.hpp +83 -0
- data/ext/boost/mpl/reverse_fold.hpp +50 -0
- data/ext/boost/mpl/same_as.hpp +55 -0
- data/ext/boost/mpl/sequence_tag.hpp +124 -0
- data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
- data/ext/boost/mpl/size.hpp +42 -0
- data/ext/boost/mpl/size_fwd.hpp +24 -0
- data/ext/boost/mpl/tag.hpp +52 -0
- data/ext/boost/mpl/times.hpp +21 -0
- data/ext/boost/mpl/vector.hpp +57 -0
- data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
- data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
- data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
- data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
- data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
- data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
- data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
- data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
- data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
- data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
- data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
- data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
- data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
- data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
- data/ext/boost/mpl/vector/vector0.hpp +34 -0
- data/ext/boost/mpl/vector/vector10.hpp +45 -0
- data/ext/boost/mpl/vector/vector20.hpp +45 -0
- data/ext/boost/none.hpp +1 -1
- data/ext/boost/numeric/conversion/bounds.hpp +24 -0
- data/ext/boost/numeric/conversion/cast.hpp +61 -0
- data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
- data/ext/boost/numeric/conversion/converter.hpp +68 -0
- data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
- data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
- data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
- data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
- data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
- data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
- data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
- data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
- data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
- data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
- data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
- data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
- data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
- data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
- data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
- data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
- data/ext/boost/operators.hpp +3 -1
- data/ext/boost/optional/optional.hpp +146 -79
- data/ext/boost/optional/optional_fwd.hpp +8 -1
- data/ext/boost/preprocessor/cat.hpp +2 -2
- data/ext/boost/preprocessor/config/config.hpp +39 -4
- data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
- data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
- data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
- data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
- data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
- data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
- data/ext/boost/preprocessor/seq/cat.hpp +5 -4
- data/ext/boost/preprocessor/seq/size.hpp +0 -1
- data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
- data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
- data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
- data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
- data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
- data/ext/boost/preprocessor/variadic/size.hpp +30 -0
- data/ext/boost/range/begin.hpp +17 -6
- data/ext/boost/range/concepts.hpp +37 -2
- data/ext/boost/range/detail/safe_bool.hpp +72 -0
- data/ext/boost/range/end.hpp +14 -9
- data/ext/boost/range/iterator_range_core.hpp +120 -12
- data/ext/boost/range/size.hpp +21 -5
- data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
- data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
- data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
- data/ext/boost/smart_ptr/make_shared.hpp +591 -22
- data/ext/boost/smart_ptr/shared_array.hpp +29 -1
- data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
- data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
- data/ext/boost/src/pthread/once.cpp +9 -7
- data/ext/boost/src/pthread/thread.cpp +32 -28
- data/ext/boost/src/pthread/timeconv.inl +4 -5
- data/ext/boost/src/tss_null.cpp +5 -1
- data/ext/boost/static_assert.hpp +8 -2
- data/ext/boost/thread/detail/config.hpp +19 -4
- data/ext/boost/thread/detail/move.hpp +11 -5
- data/ext/boost/thread/detail/thread.hpp +59 -43
- data/ext/boost/thread/exceptions.hpp +9 -9
- data/ext/boost/thread/future.hpp +150 -82
- data/ext/boost/thread/locks.hpp +101 -60
- data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
- data/ext/boost/thread/pthread/mutex.hpp +17 -14
- data/ext/boost/thread/pthread/once.hpp +3 -4
- data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
- data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
- data/ext/boost/thread/pthread/thread_data.hpp +40 -12
- data/ext/boost/thread/thread_time.hpp +5 -0
- data/ext/boost/throw_exception.hpp +1 -1
- data/ext/boost/token_functions.hpp +34 -10
- data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
- data/ext/boost/type_traits/alignment_of.hpp +1 -1
- data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
- data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
- data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
- data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
- data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
- data/ext/boost/type_traits/function_traits.hpp +1 -1
- data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
- data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
- data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
- data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
- data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
- data/ext/boost/type_traits/intrinsics.hpp +119 -71
- data/ext/boost/type_traits/is_const.hpp +5 -5
- data/ext/boost/type_traits/is_convertible.hpp +14 -13
- data/ext/boost/type_traits/is_enum.hpp +1 -1
- data/ext/boost/type_traits/is_floating_point.hpp +27 -0
- data/ext/boost/type_traits/is_function.hpp +3 -3
- data/ext/boost/type_traits/is_fundamental.hpp +1 -1
- data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_pod.hpp +11 -3
- data/ext/boost/type_traits/is_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_signed.hpp +8 -3
- data/ext/boost/type_traits/is_union.hpp +8 -0
- data/ext/boost/type_traits/is_unsigned.hpp +9 -4
- data/ext/boost/type_traits/is_volatile.hpp +5 -5
- data/ext/boost/type_traits/remove_cv.hpp +4 -3
- data/ext/boost/type_traits/remove_pointer.hpp +51 -2
- data/ext/boost/type_traits/remove_reference.hpp +2 -2
- data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
- data/ext/boost/utility/declval.hpp +44 -0
- data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
- data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
- data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
- data/ext/boost/utility/in_place_factory.hpp +88 -0
- data/ext/boost/utility/result_of.hpp +103 -0
- data/ext/boost/utility/swap.hpp +55 -0
- data/ext/common/AnsiColorConstants.h +36 -0
- data/ext/common/ApplicationPool2/Common.h +87 -0
- data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
- data/ext/common/ApplicationPool2/Group.h +648 -0
- data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
- data/ext/common/ApplicationPool2/Options.h +576 -0
- data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
- data/ext/common/ApplicationPool2/Pool.h +1181 -0
- data/ext/common/ApplicationPool2/Process.h +425 -0
- data/ext/common/ApplicationPool2/README.md +96 -0
- data/ext/common/ApplicationPool2/Session.h +158 -0
- data/ext/common/ApplicationPool2/Socket.h +246 -0
- data/ext/common/ApplicationPool2/Spawner.h +2212 -0
- data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
- data/ext/common/BackgroundEventLoop.cpp +129 -0
- data/ext/common/BackgroundEventLoop.h +61 -0
- data/ext/common/Constants.h +3 -1
- data/ext/common/EventedBufferedInput.h +331 -0
- data/ext/common/EventedMessageServer.h +17 -34
- data/ext/common/EventedServer.h +2 -2
- data/ext/common/Exceptions.h +71 -19
- data/ext/common/FileDescriptor.h +8 -6
- data/ext/common/HttpConstants.h +167 -0
- data/ext/common/IniFile.h +24 -0
- data/ext/common/Logging.h +62 -849
- data/ext/common/MessageReadersWriters.h +19 -0
- data/ext/common/MessageServer.h +11 -14
- data/ext/common/MultiLibeio.cpp +198 -0
- data/ext/common/MultiLibeio.h +67 -0
- data/ext/common/ResourceLocator.h +24 -41
- data/ext/common/SafeLibev.h +186 -14
- data/ext/common/StaticString.h +23 -3
- data/ext/common/UnionStation.h +972 -0
- data/ext/common/Utils.cpp +168 -24
- data/ext/common/Utils.h +25 -3
- data/ext/common/Utils/CachedFileStat.hpp +4 -3
- data/ext/common/Utils/FileChangeChecker.h +2 -2
- data/ext/common/Utils/HashMap.h +50 -0
- data/ext/common/Utils/IOUtils.cpp +229 -68
- data/ext/common/Utils/IOUtils.h +134 -3
- data/ext/common/Utils/Lock.h +28 -0
- data/ext/common/Utils/MemoryBarrier.h +52 -0
- data/ext/common/Utils/PriorityQueue.h +54 -0
- data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
- data/ext/common/Utils/ScopeGuard.h +50 -1
- data/ext/common/Utils/SmallVector.h +653 -0
- data/ext/common/Utils/StrIntUtils.cpp +26 -2
- data/ext/common/Utils/StrIntUtils.h +18 -2
- data/ext/common/Utils/StringMap.h +125 -8
- data/ext/common/Utils/Template.h +212 -0
- data/ext/common/Utils/fib.c +699 -0
- data/ext/common/Utils/fib.h +101 -0
- data/ext/common/Utils/fibpriv.h +67 -0
- data/ext/common/Utils/json-forwards.h +249 -0
- data/ext/common/Utils/json.h +1855 -0
- data/ext/common/Utils/jsoncpp.cpp +4230 -0
- data/ext/common/agents/Base.cpp +1126 -0
- data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
- data/ext/common/agents/EnvPrinter.c +16 -0
- data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
- data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
- data/ext/common/agents/HelperAgent/Main.cpp +497 -0
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
- data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
- data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
- data/ext/common/agents/SpawnPreparer.cpp +127 -0
- data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
- data/ext/libeio/Changes +72 -0
- data/ext/{google/COPYING → libeio/LICENSE} +17 -9
- data/ext/libeio/Makefile.am +15 -0
- data/ext/libeio/Makefile.in +694 -0
- data/ext/libeio/aclocal.m4 +9418 -0
- data/ext/libeio/autogen.sh +3 -0
- data/ext/libeio/config.guess +1501 -0
- data/ext/libeio/config.h.in +136 -0
- data/ext/libeio/config.sub +1705 -0
- data/ext/libeio/configure +14822 -0
- data/ext/libeio/configure.ac +22 -0
- data/ext/libeio/demo.c +194 -0
- data/ext/libeio/ecb.h +457 -0
- data/ext/libeio/eio.c +2816 -0
- data/ext/libeio/eio.h +411 -0
- data/ext/libeio/install-sh +520 -0
- data/ext/libeio/libeio.m4 +211 -0
- data/ext/libeio/ltmain.sh +9636 -0
- data/ext/libeio/missing +376 -0
- data/ext/libeio/xthread.h +166 -0
- data/ext/libev/Changes +125 -7
- data/ext/libev/Makefile.am +5 -3
- data/ext/libev/Makefile.in +209 -120
- data/ext/libev/aclocal.m4 +6027 -4619
- data/ext/libev/autogen.sh +1 -4
- data/ext/libev/config.h.in +11 -7
- data/ext/libev/configure +7312 -14993
- data/ext/libev/configure.ac +12 -5
- data/ext/libev/depcomp +630 -0
- data/ext/libev/ev++.h +48 -32
- data/ext/libev/ev.c +1173 -391
- data/ext/libev/ev.h +315 -181
- data/ext/libev/ev_epoll.c +66 -15
- data/ext/libev/ev_kqueue.c +20 -18
- data/ext/libev/ev_poll.c +27 -23
- data/ext/libev/ev_port.c +39 -19
- data/ext/libev/ev_select.c +23 -17
- data/ext/libev/ev_vars.h +25 -8
- data/ext/libev/ev_win32.c +6 -6
- data/ext/libev/ev_wrap.h +22 -2
- data/ext/libev/event.c +18 -17
- data/ext/libev/event.h +16 -4
- data/ext/libev/libev.m4 +10 -6
- data/ext/libev/ltmain.sh +7353 -5811
- data/ext/nginx/Configuration.c +74 -42
- data/ext/nginx/Configuration.h +3 -5
- data/ext/nginx/ContentHandler.c +26 -83
- data/ext/nginx/ContentHandler.h +1 -1
- data/ext/nginx/config +13 -9
- data/ext/nginx/ngx_http_passenger_module.c +3 -7
- data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
- data/ext/oxt/detail/context.hpp +90 -0
- data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
- data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
- data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
- data/ext/oxt/dynamic_thread_group.hpp +27 -1
- data/ext/oxt/implementation.cpp +415 -0
- data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
- data/ext/oxt/macros.hpp +32 -1
- data/ext/oxt/spin_lock.hpp +6 -11
- data/ext/oxt/system_calls.cpp +204 -16
- data/ext/oxt/system_calls.hpp +85 -45
- data/ext/oxt/thread.hpp +13 -117
- data/ext/ruby/passenger_native_support.c +82 -237
- data/helper-scripts/backtrace-sanitizer.rb +114 -0
- data/helper-scripts/classic-rails-loader.rb +135 -0
- data/helper-scripts/classic-rails-preloader.rb +161 -0
- data/helper-scripts/node-loader.js +314 -0
- data/helper-scripts/rack-loader.rb +104 -0
- data/helper-scripts/rack-preloader.rb +132 -0
- data/helper-scripts/wsgi-loader.py +231 -0
- data/helper-scripts/wsgi-preloader.py +1 -0
- data/lib/phusion_passenger.rb +159 -61
- data/lib/phusion_passenger/abstract_installer.rb +182 -87
- data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
- data/lib/phusion_passenger/analytics_logger.rb +5 -4
- data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
- data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
- data/lib/phusion_passenger/common_library.rb +441 -0
- data/lib/phusion_passenger/console_text_template.rb +4 -16
- data/lib/phusion_passenger/constants.rb +1 -8
- data/lib/phusion_passenger/debug_logging.rb +5 -2
- data/lib/phusion_passenger/dependencies.rb +51 -13
- data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
- data/lib/phusion_passenger/message_channel.rb +3 -47
- data/lib/phusion_passenger/message_client.rb +2 -2
- data/lib/phusion_passenger/native_support.rb +36 -15
- data/lib/phusion_passenger/packaging.rb +8 -11
- data/lib/phusion_passenger/platform_info.rb +25 -17
- data/lib/phusion_passenger/platform_info/apache.rb +10 -7
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
- data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
- data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
- data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
- data/lib/phusion_passenger/public_api.rb +1 -4
- data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
- data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
- data/lib/phusion_passenger/request_handler.rb +500 -0
- data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
- data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
- data/lib/phusion_passenger/standalone/command.rb +36 -15
- data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
- data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
- data/lib/phusion_passenger/standalone/start_command.rb +44 -39
- data/lib/phusion_passenger/standalone/utils.rb +5 -5
- data/lib/phusion_passenger/utils.rb +35 -914
- data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
- data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
- data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
- data/lib/phusion_passenger/utils/tee_input.rb +174 -0
- data/lib/phusion_passenger/utils/tmpio.rb +33 -0
- data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
- data/resources/mime.types +5 -1
- data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
- data/resources/templates/error_layout.html.template +89 -0
- data/resources/templates/general_error.html.template +1 -0
- data/resources/templates/general_error_with_html.html.template +1 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
- data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
- data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
- data/resources/templates/undisclosed_error.html.template +25 -0
- data/test/config.json.example +42 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
- data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
- data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
- data/test/cxx/BufferedIOTest.cpp +7 -7
- data/test/cxx/CxxTestMain.cpp +65 -2
- data/test/cxx/FileBackedPipeTest.cpp +626 -0
- data/test/cxx/FileChangeCheckerTest.cpp +20 -18
- data/test/cxx/FilterSupportTest.cpp +5 -5
- data/test/cxx/IOUtilsTest.cpp +11 -4
- data/test/cxx/MessageReadersWritersTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +31 -30
- data/test/cxx/RequestHandlerTest.cpp +777 -0
- data/test/cxx/ScgiRequestParserTest.cpp +36 -16
- data/test/cxx/ServerInstanceDirTest.cpp +1 -1
- data/test/cxx/StringMapTest.cpp +61 -0
- data/test/cxx/TemplateTest.cpp +118 -0
- data/test/cxx/TestSupport.cpp +25 -68
- data/test/cxx/TestSupport.h +81 -41
- data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
- data/test/cxx/UtilsTest.cpp +59 -5
- data/test/integration_tests/apache2_tests.rb +2 -2
- data/test/integration_tests/nginx_tests.rb +1 -1
- data/test/integration_tests/spec_helper.rb +7 -5
- data/test/oxt/oxt_test_main.cpp +2 -0
- data/test/oxt/syscall_interruption_test.cpp +1 -0
- data/test/ruby/classic_rails/loader_spec.rb +48 -0
- data/test/ruby/classic_rails/preloader_spec.rb +54 -0
- data/test/ruby/rack/loader_spec.rb +62 -0
- data/test/ruby/rack/preloader_spec.rb +74 -0
- data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
- data/test/ruby/shared/loader_spec.rb +241 -0
- data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
- data/test/ruby/shared/ruby_loader_spec.rb +55 -0
- data/test/ruby/spec_helper.rb +8 -53
- data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
- data/test/ruby/utils_spec.rb +10 -683
- data/test/stub/rack/config.ru +28 -3
- data/test/stub/rack/start.rb +47 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
- data/test/stub/rails3.0/Gemfile.lock +80 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
- data/test/stub/start_error.pl +24 -0
- data/test/stub/wsgi/passenger_wsgi.py +71 -3
- data/test/support/apache2_controller.rb +2 -2
- data/test/support/placebo-preloader.rb +88 -0
- data/test/support/test_helper.rb +1 -14
- data/test/tut/tut.h +11 -4
- metadata +590 -326
- data.tar.gz.asc +0 -12
- data/PACKAGING.TXT +0 -25
- data/build/config.rb +0 -46
- data/ext/apache2/HelperAgent.cpp +0 -364
- data/ext/boost/call_traits.hpp +0 -24
- data/ext/boost/detail/call_traits.hpp +0 -164
- data/ext/common/AbstractSpawnManager.h +0 -110
- data/ext/common/AgentBase.cpp +0 -432
- data/ext/common/ApplicationPool/Client.h +0 -788
- data/ext/common/ApplicationPool/Interface.h +0 -295
- data/ext/common/ApplicationPool/Pool.h +0 -1327
- data/ext/common/ApplicationPool/Server.h +0 -479
- data/ext/common/MessageChannel.h +0 -494
- data/ext/common/PoolOptions.h +0 -518
- data/ext/common/Process.h +0 -253
- data/ext/common/Session.h +0 -436
- data/ext/common/SpawnManager.h +0 -611
- data/ext/google/ChangeLog +0 -167
- data/ext/google/dense_hash_map +0 -310
- data/ext/google/dense_hash_set +0 -287
- data/ext/google/sparse_hash_map +0 -294
- data/ext/google/sparse_hash_set +0 -275
- data/ext/google/sparsehash/densehashtable.h +0 -1062
- data/ext/google/sparsehash/sparseconfig.h +0 -55
- data/ext/google/sparsehash/sparsehashtable.h +0 -1015
- data/ext/google/sparsetable +0 -1468
- data/ext/google/type_traits.h +0 -250
- data/ext/nginx/HelperAgent.cpp +0 -1355
- data/ext/nginx/ScgiRequestParser.h +0 -375
- data/ext/oxt/backtrace.cpp +0 -185
- data/ext/oxt/tracable_exception.cpp +0 -89
- data/helper-scripts/passenger-spawn-server +0 -106
- data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
- data/lib/phusion_passenger/abstract_server.rb +0 -372
- data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
- data/lib/phusion_passenger/app_process.rb +0 -174
- data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
- data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
- data/lib/phusion_passenger/exceptions.rb +0 -103
- data/lib/phusion_passenger/html_template.rb +0 -107
- data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
- data/lib/phusion_passenger/spawn_manager.rb +0 -359
- data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
- data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
- data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
- data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
- data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
- data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
- data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
- data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
- data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
- data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
- data/test/config.yml.example +0 -41
- data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
- data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
- data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
- data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
- data/test/cxx/MessageChannelTest.cpp +0 -557
- data/test/cxx/PoolOptionsTest.cpp +0 -116
- data/test/cxx/SpawnManagerTest.cpp +0 -161
- data/test/ruby/abstract_server_collection_spec.rb +0 -247
- data/test/ruby/abstract_server_spec.rb +0 -61
- data/test/ruby/app_process_spec.rb +0 -43
- data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
- data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
- data/test/ruby/rack/application_spawner_spec.rb +0 -116
- data/test/ruby/shared/abstract_server_spec.rb +0 -23
- data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
- data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
- data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
- data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
- data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
- data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
- data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
- data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
- data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
- data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
- data/test/ruby/spawn_manager_spec.rb +0 -134
- data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
- data/test/stub/message_channel.rb +0 -11
- data/test/stub/message_channel_2.rb +0 -12
- data/test/stub/message_channel_3.rb +0 -19
- data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
- data/test/stub/spawn_server.rb +0 -22
- metadata.gz.asc +0 -12
data/ext/nginx/ContentHandler.h
CHANGED
data/ext/nginx/config
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
2
|
-
|
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
|
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
|
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
|
-
|
29
|
-
|
30
|
-
$
|
31
|
-
|
32
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
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(®istration->backtrace,
|
137
|
-
®istration->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_ */
|
@@ -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 <
|
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::
|
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
|