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
@@ -0,0 +1,749 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - http://www.modrails.com/
|
3
|
+
* Copyright (c) 2011, 2012 Phusion
|
4
|
+
*
|
5
|
+
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
25
|
+
#ifndef _PASSENGER_APPLICATION_POOL2_SUPER_GROUP_H_
|
26
|
+
#define _PASSENGER_APPLICATION_POOL2_SUPER_GROUP_H_
|
27
|
+
|
28
|
+
#include <boost/function.hpp>
|
29
|
+
#include <boost/bind.hpp>
|
30
|
+
#include <boost/shared_ptr.hpp>
|
31
|
+
#include <boost/make_shared.hpp>
|
32
|
+
#include <oxt/thread.hpp>
|
33
|
+
#include <vector>
|
34
|
+
#include <utility>
|
35
|
+
#include <Logging.h>
|
36
|
+
#include <ApplicationPool2/Common.h>
|
37
|
+
#include <ApplicationPool2/ComponentInfo.h>
|
38
|
+
#include <ApplicationPool2/Group.h>
|
39
|
+
#include <ApplicationPool2/Options.h>
|
40
|
+
|
41
|
+
namespace Passenger {
|
42
|
+
namespace ApplicationPool2 {
|
43
|
+
|
44
|
+
using namespace std;
|
45
|
+
using namespace boost;
|
46
|
+
using namespace oxt;
|
47
|
+
|
48
|
+
|
49
|
+
/**
|
50
|
+
* An abstract container for multiple Groups (applications). It is a support
|
51
|
+
* structure for supporting application sets, multiple applications that can
|
52
|
+
* closely work with each other as if they were a single entity. There's no
|
53
|
+
* support for application sets yet in Phusion Passenger 4, but this class
|
54
|
+
* lays the foundation to make it possible.
|
55
|
+
*
|
56
|
+
* An application set is backed by a directory that contains:
|
57
|
+
*
|
58
|
+
* - The files for the individual applications.
|
59
|
+
* - An application set manifest file that:
|
60
|
+
* * Describes the containing applications.
|
61
|
+
* * Describes the application set itself.
|
62
|
+
* * Describes instructions that must be first
|
63
|
+
* followed before the application set is usable.
|
64
|
+
* * Describes instructions that must be followed when the
|
65
|
+
* application set is to be cleaned up.
|
66
|
+
*
|
67
|
+
* SuperGroup is designed to assume to that loading the manifest file
|
68
|
+
* and following the instructions in them may be a blocking operation
|
69
|
+
* that can take a while. Thus it makes use of background threads to
|
70
|
+
* do most of initialization and destruction work (see `doInitialize()`
|
71
|
+
* and `doDestroy()`). The `state` variable keeps track of things.
|
72
|
+
*
|
73
|
+
* A SuperGroup starts off in the `INITIALIZING` state. When it's done
|
74
|
+
* initializing, it becomes `READY`. If a restart is necessary it will
|
75
|
+
* transition to `RESTARTING` and then eventually back to `READY`.
|
76
|
+
* At any time the SuperGroup may be instructed to destroy itself, in
|
77
|
+
* which case it will first transition to `DESTROYING` and eventually
|
78
|
+
* to `DESTROYED`. Once destroyed, the SuperGroup is reusable so it
|
79
|
+
* can go back to `INITIALIZING` when needed.
|
80
|
+
*
|
81
|
+
*
|
82
|
+
* ## Life time
|
83
|
+
*
|
84
|
+
* A SuperGroup, once created and added to the Pool, is normally not
|
85
|
+
* supposed to be destroyed and removed from the Pool automatically.
|
86
|
+
* This is because a SuperGroup may contain important spawning
|
87
|
+
* parameters such as SuperGroup-specific environment variables.
|
88
|
+
* However the system does not disallow the administrator from
|
89
|
+
* manually removing a SuperGroup from the pool.
|
90
|
+
*
|
91
|
+
*
|
92
|
+
* ## Multiple instances and initialization/destruction
|
93
|
+
*
|
94
|
+
* It is allowed to create multiple SuperGroups backed by the same
|
95
|
+
* application set directory, e.g. to increase concurrency. The system
|
96
|
+
* may destroy a SuperGroup in the background while creating a new
|
97
|
+
* one while that is in progress. This could even happen across processes,
|
98
|
+
* e.g. one process is busy destroying a SuperGroup while another
|
99
|
+
* one is initializing it.
|
100
|
+
*
|
101
|
+
* Furthermore, it is possible for a SuperGroup to receive a get()
|
102
|
+
* command during destruction.
|
103
|
+
*
|
104
|
+
* It is therefore important that `doInitialize()` and `doDestroy()`
|
105
|
+
* do not interfere with other instances of the same code, and can
|
106
|
+
* commit their work atomatically.
|
107
|
+
*
|
108
|
+
*
|
109
|
+
* ## Thread-safety
|
110
|
+
*
|
111
|
+
* Except for otherwise documented parts, this class is not thread-safe,
|
112
|
+
* so only access it within the ApplicationPool lock.
|
113
|
+
*/
|
114
|
+
class SuperGroup: public enable_shared_from_this<SuperGroup> {
|
115
|
+
public:
|
116
|
+
enum State {
|
117
|
+
/** This SuperGroup is being initialized. `groups` is empty and
|
118
|
+
* `get()` actions cannot be immediately satisfied, so they
|
119
|
+
* are placed in `getWaitlist`. Once the SuperGroup is done
|
120
|
+
* loading the state it will transition to `READY`. Calling `destroy()`
|
121
|
+
* will make it transition to `DESTROYING`. If initialization
|
122
|
+
* failed it will transition to `DESTROYED`.
|
123
|
+
*/
|
124
|
+
INITIALIZING,
|
125
|
+
|
126
|
+
/** This SuperGroup is loaded and is ready for action. From
|
127
|
+
* here the state can transition to `RESTARTING` or `DESTROYING`.
|
128
|
+
*/
|
129
|
+
READY,
|
130
|
+
|
131
|
+
/** This SuperGroup is being restarted. The SuperGroup
|
132
|
+
* information is being reloaded from the data source
|
133
|
+
* and processes are being restarted. In this state
|
134
|
+
* `get()` actions can still be statisfied, and the data
|
135
|
+
* structures still contain the old information. Once reloading
|
136
|
+
* is done the data structures will be atomically swapped
|
137
|
+
* with the newly reloaded ones.
|
138
|
+
* Once the restart is completed, the state will transition
|
139
|
+
* to `READY`.
|
140
|
+
* Re-restarting won't have any effect in this state.
|
141
|
+
* `destroy()` will cause the restart to be aborted and will
|
142
|
+
* cause a transition to `DESTROYING`.
|
143
|
+
*/
|
144
|
+
RESTARTING,
|
145
|
+
|
146
|
+
/** This SuperGroup is being destroyed. Processes are being shut
|
147
|
+
* down and other resources are being cleaned up. In this state,
|
148
|
+
* `groups` is empty.
|
149
|
+
* Restarting won't have any effect, but `get()` will cause a
|
150
|
+
* transition to `INITIALIZING`.
|
151
|
+
*/
|
152
|
+
DESTROYING,
|
153
|
+
|
154
|
+
/** This SuperGroup has been destroyed and all resources have been
|
155
|
+
* freed. Restarting won't have any effect but calling `get()` will
|
156
|
+
* make it transition to `INITIALIZING`.
|
157
|
+
*/
|
158
|
+
DESTROYED
|
159
|
+
};
|
160
|
+
|
161
|
+
private:
|
162
|
+
friend class Pool;
|
163
|
+
friend class Group;
|
164
|
+
|
165
|
+
Options options;
|
166
|
+
/** A number for concurrency control, incremented every time the state changes.
|
167
|
+
* Every background thread that SuperGroup spawns knows the generation number
|
168
|
+
* from when the thread was spawned. A thread generally does some work outside
|
169
|
+
* the lock, then grabs the lock and updates the information in this SuperGroup
|
170
|
+
* with the results of the work. But before updating happens it first checks
|
171
|
+
* whether the generation number is as expected, so increasing this generation
|
172
|
+
* number will prevent old threads from updating the information with possibly
|
173
|
+
* now-stale information. It is a good way to prevent A-B-A concurrency
|
174
|
+
* problems.
|
175
|
+
*/
|
176
|
+
unsigned int generation;
|
177
|
+
|
178
|
+
|
179
|
+
// Thread-safe.
|
180
|
+
static boost::mutex &getPoolSyncher(const PoolPtr &pool);
|
181
|
+
static void runAllActions(const vector<Callback> &actions);
|
182
|
+
string generateSecret() const;
|
183
|
+
|
184
|
+
void createInterruptableThread(const function<void ()> &func, const string &name,
|
185
|
+
unsigned int stackSize);
|
186
|
+
void createNonInterruptableThread(const function<void ()> &func, const string &name,
|
187
|
+
unsigned int stackSize);
|
188
|
+
|
189
|
+
void verifyInvariants() const {
|
190
|
+
// !a || b: logical equivalent of a IMPLIES b.
|
191
|
+
|
192
|
+
P_ASSERT(groups.empty() ==
|
193
|
+
(state == INITIALIZING || state == DESTROYING || state == DESTROYED));
|
194
|
+
P_ASSERT((defaultGroup == NULL) ==
|
195
|
+
(state == INITIALIZING || state == DESTROYING || state == DESTROYED));
|
196
|
+
P_ASSERT(!( state == READY || state == RESTARTING || state == DESTROYING || state == DESTROYED ) ||
|
197
|
+
( getWaitlist.empty() ));
|
198
|
+
}
|
199
|
+
|
200
|
+
void setState(State newState) {
|
201
|
+
state = newState;
|
202
|
+
generation++;
|
203
|
+
}
|
204
|
+
|
205
|
+
vector<ComponentInfo> loadComponentInfos(const Options &options) const {
|
206
|
+
vector<ComponentInfo> infos;
|
207
|
+
ComponentInfo info;
|
208
|
+
info.name = "default";
|
209
|
+
info.isDefault = true;
|
210
|
+
infos.push_back(info);
|
211
|
+
return infos;
|
212
|
+
}
|
213
|
+
|
214
|
+
Group *findDefaultGroup(const vector<GroupPtr> &groups) const {
|
215
|
+
vector<GroupPtr>::const_iterator it;
|
216
|
+
|
217
|
+
for (it = groups.begin(); it != groups.end(); it++) {
|
218
|
+
const GroupPtr &group = *it;
|
219
|
+
if (group->componentInfo.isDefault) {
|
220
|
+
return group.get();
|
221
|
+
}
|
222
|
+
}
|
223
|
+
return NULL;
|
224
|
+
}
|
225
|
+
|
226
|
+
pair<GroupPtr, unsigned int> findGroupCorrespondingToComponent(
|
227
|
+
const vector<GroupPtr> &groups, const ComponentInfo &info) const
|
228
|
+
{
|
229
|
+
unsigned int i;
|
230
|
+
for (i = 0; i < groups.size(); i++) {
|
231
|
+
const GroupPtr &group = groups[i];
|
232
|
+
if (group->componentInfo.name == info.name) {
|
233
|
+
return make_pair(const_cast<GroupPtr &>(group), i);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
return make_pair(GroupPtr(), 0);
|
237
|
+
}
|
238
|
+
|
239
|
+
void detachGroup(const GroupPtr &group, vector<Callback> &postLockActions) {
|
240
|
+
group->detachAll(postLockActions);
|
241
|
+
group->setSuperGroup(SuperGroupPtr());
|
242
|
+
while (!group->getWaitlist.empty()) {
|
243
|
+
getWaitlist.push(group->getWaitlist.front());
|
244
|
+
group->getWaitlist.pop();
|
245
|
+
}
|
246
|
+
for (unsigned int i = 0; i < groups.size(); i++) {
|
247
|
+
if (groups[i] == group) {
|
248
|
+
groups.erase(groups.begin() + i);
|
249
|
+
break;
|
250
|
+
}
|
251
|
+
}
|
252
|
+
}
|
253
|
+
|
254
|
+
void detachGroups(const vector<GroupPtr> &groups, vector<Callback> &postLockActions) {
|
255
|
+
vector<GroupPtr>::const_iterator it, end = groups.end();
|
256
|
+
|
257
|
+
for (it = groups.begin(); it != end; it++) {
|
258
|
+
const GroupPtr &group = *it;
|
259
|
+
// doRestart() may temporarily nullify elements in 'groups'.
|
260
|
+
if (group != NULL) {
|
261
|
+
detachGroup(group, postLockActions);
|
262
|
+
}
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
void assignGetWaitlistToGroups(vector<Callback> &postLockActions) {
|
267
|
+
while (!getWaitlist.empty()) {
|
268
|
+
GetWaiter &waiter = getWaitlist.front();
|
269
|
+
Group *group = route(waiter.options);
|
270
|
+
Options adjustedOptions = waiter.options;
|
271
|
+
adjustOptions(adjustedOptions, group);
|
272
|
+
SessionPtr session = group->get(adjustedOptions, waiter.callback);
|
273
|
+
if (session != NULL) {
|
274
|
+
postLockActions.push_back(boost::bind(
|
275
|
+
waiter.callback, session, ExceptionPtr()));
|
276
|
+
}
|
277
|
+
getWaitlist.pop();
|
278
|
+
}
|
279
|
+
}
|
280
|
+
|
281
|
+
void adjustOptions(Options &options, const Group *group) const {
|
282
|
+
// No-op.
|
283
|
+
}
|
284
|
+
|
285
|
+
void doInitialize(SuperGroupPtr self, Options options, unsigned int generation) {
|
286
|
+
try {
|
287
|
+
realDoInitialize(options, generation);
|
288
|
+
} catch (const thread_interrupted &) {
|
289
|
+
// Return;
|
290
|
+
}
|
291
|
+
}
|
292
|
+
|
293
|
+
void realDoInitialize(const Options &options, unsigned int generation) {
|
294
|
+
vector<ComponentInfo> componentInfos;
|
295
|
+
vector<ComponentInfo>::const_iterator it;
|
296
|
+
ExceptionPtr exception;
|
297
|
+
|
298
|
+
P_TRACE(2, "Initializing SuperGroup " << inspect() << " in the background...");
|
299
|
+
try {
|
300
|
+
componentInfos = loadComponentInfos(options);
|
301
|
+
} catch (const tracable_exception &e) {
|
302
|
+
exception = copyException(e);
|
303
|
+
}
|
304
|
+
if (componentInfos.empty() && exception == NULL) {
|
305
|
+
string message = "The directory " +
|
306
|
+
options.appRoot +
|
307
|
+
" does not seem to contain a web application.";
|
308
|
+
exception = make_shared<SpawnException>(
|
309
|
+
message, message, false);
|
310
|
+
}
|
311
|
+
|
312
|
+
PoolPtr pool = getPool();
|
313
|
+
if (OXT_UNLIKELY(pool == NULL)) {
|
314
|
+
return;
|
315
|
+
}
|
316
|
+
|
317
|
+
vector<Callback> actions;
|
318
|
+
{
|
319
|
+
unique_lock<boost::mutex> lock(getPoolSyncher(pool));
|
320
|
+
this_thread::disable_interruption di;
|
321
|
+
this_thread::disable_syscall_interruption dsi;
|
322
|
+
NOT_EXPECTING_EXCEPTIONS();
|
323
|
+
if (OXT_UNLIKELY(getPool() == NULL || generation != this->generation)) {
|
324
|
+
return;
|
325
|
+
}
|
326
|
+
P_TRACE(2, "Initialization of SuperGroup " << inspect() << " almost done; grabbed lock");
|
327
|
+
P_ASSERT(state == INITIALIZING);
|
328
|
+
verifyInvariants();
|
329
|
+
|
330
|
+
if (componentInfos.empty()) {
|
331
|
+
/* Somehow initialization failed. Maybe something has deleted
|
332
|
+
* the supergroup files while we're working.
|
333
|
+
*/
|
334
|
+
P_ASSERT(exception != NULL);
|
335
|
+
setState(DESTROYED);
|
336
|
+
|
337
|
+
actions.reserve(getWaitlist.size());
|
338
|
+
while (!getWaitlist.empty()) {
|
339
|
+
const GetWaiter &waiter = getWaitlist.front();
|
340
|
+
actions.push_back(boost::bind(waiter.callback,
|
341
|
+
SessionPtr(), exception));
|
342
|
+
getWaitlist.pop();
|
343
|
+
}
|
344
|
+
} else {
|
345
|
+
for (it = componentInfos.begin(); it != componentInfos.end(); it++) {
|
346
|
+
const ComponentInfo &info = *it;
|
347
|
+
GroupPtr group = make_shared<Group>(shared_from_this(),
|
348
|
+
options, info);
|
349
|
+
groups.push_back(group);
|
350
|
+
if (info.isDefault) {
|
351
|
+
defaultGroup = group.get();
|
352
|
+
}
|
353
|
+
}
|
354
|
+
|
355
|
+
setState(READY);
|
356
|
+
assignGetWaitlistToGroups(actions);
|
357
|
+
}
|
358
|
+
|
359
|
+
verifyInvariants();
|
360
|
+
P_TRACE(2, "Done initializing SuperGroup " << inspect());
|
361
|
+
}
|
362
|
+
runAllActions(actions);
|
363
|
+
}
|
364
|
+
|
365
|
+
void doRestart(SuperGroupPtr self, Options options, unsigned int generation) {
|
366
|
+
try {
|
367
|
+
realDoRestart(options, generation);
|
368
|
+
} catch (const thread_interrupted &) {
|
369
|
+
// Return.
|
370
|
+
}
|
371
|
+
}
|
372
|
+
|
373
|
+
void realDoRestart(const Options &options, unsigned int generation) {
|
374
|
+
TRACE_POINT();
|
375
|
+
vector<ComponentInfo> componentInfos = loadComponentInfos(options);
|
376
|
+
vector<ComponentInfo>::const_iterator it;
|
377
|
+
|
378
|
+
PoolPtr pool = getPool();
|
379
|
+
if (OXT_UNLIKELY(pool == NULL)) {
|
380
|
+
return;
|
381
|
+
}
|
382
|
+
|
383
|
+
unique_lock<boost::mutex> lock(getPoolSyncher(pool));
|
384
|
+
if (OXT_UNLIKELY(getPool() == NULL || this->generation != generation)) {
|
385
|
+
return;
|
386
|
+
}
|
387
|
+
P_ASSERT(state == RESTARTING);
|
388
|
+
verifyInvariants();
|
389
|
+
|
390
|
+
vector<GroupPtr> allGroups;
|
391
|
+
vector<GroupPtr> updatedGroups;
|
392
|
+
vector<GroupPtr> newGroups;
|
393
|
+
vector<GroupPtr>::const_iterator g_it;
|
394
|
+
vector<Callback> actions;
|
395
|
+
this->options = options;
|
396
|
+
|
397
|
+
// Update the component information for existing groups.
|
398
|
+
UPDATE_TRACE_POINT();
|
399
|
+
for (it = componentInfos.begin(); it != componentInfos.end(); it++) {
|
400
|
+
const ComponentInfo &info = *it;
|
401
|
+
pair<GroupPtr, unsigned int> result =
|
402
|
+
findGroupCorrespondingToComponent(groups, info);
|
403
|
+
GroupPtr &group = result.first;
|
404
|
+
if (group != NULL) {
|
405
|
+
unsigned int index = result.second;
|
406
|
+
group->componentInfo = info;
|
407
|
+
updatedGroups.push_back(group);
|
408
|
+
groups[index].reset();
|
409
|
+
} else {
|
410
|
+
// This is not an existing group but a new one,
|
411
|
+
// so create it.
|
412
|
+
group = make_shared<Group>(shared_from_this(),
|
413
|
+
options, info);
|
414
|
+
newGroups.push_back(group);
|
415
|
+
}
|
416
|
+
// allGroups must be in the same order as componentInfos.
|
417
|
+
allGroups.push_back(group);
|
418
|
+
}
|
419
|
+
|
420
|
+
// Some components might have been deleted, so delete the
|
421
|
+
// corresponding groups.
|
422
|
+
detachGroups(groups, actions);
|
423
|
+
|
424
|
+
// Tell all previous existing groups to restart.
|
425
|
+
for (g_it = updatedGroups.begin(); g_it != updatedGroups.end(); g_it++) {
|
426
|
+
GroupPtr group = *g_it;
|
427
|
+
group->restart(options);
|
428
|
+
}
|
429
|
+
|
430
|
+
groups = allGroups;
|
431
|
+
defaultGroup = findDefaultGroup(allGroups);
|
432
|
+
setState(READY);
|
433
|
+
assignGetWaitlistToGroups(actions);
|
434
|
+
|
435
|
+
UPDATE_TRACE_POINT();
|
436
|
+
verifyInvariants();
|
437
|
+
lock.unlock();
|
438
|
+
runAllActions(actions);
|
439
|
+
}
|
440
|
+
|
441
|
+
void doDestroy(SuperGroupPtr self, unsigned int generation) {
|
442
|
+
TRACE_POINT();
|
443
|
+
PoolPtr pool = getPool();
|
444
|
+
if (OXT_UNLIKELY(pool == NULL)) {
|
445
|
+
return;
|
446
|
+
}
|
447
|
+
|
448
|
+
// In the future we can run more destruction code here,
|
449
|
+
// without holding the lock. Note that any destruction
|
450
|
+
// code may not interfere with doInitialize().
|
451
|
+
|
452
|
+
lock_guard<boost::mutex> lock(getPoolSyncher(pool));
|
453
|
+
if (OXT_UNLIKELY(getPool() == NULL || this->generation != generation)) {
|
454
|
+
return;
|
455
|
+
}
|
456
|
+
|
457
|
+
UPDATE_TRACE_POINT();
|
458
|
+
P_ASSERT(state == DESTROYING);
|
459
|
+
verifyInvariants();
|
460
|
+
state = DESTROYED;
|
461
|
+
verifyInvariants();
|
462
|
+
}
|
463
|
+
|
464
|
+
/*********************/
|
465
|
+
|
466
|
+
/*********************/
|
467
|
+
|
468
|
+
public:
|
469
|
+
mutable boost::mutex backrefSyncher;
|
470
|
+
weak_ptr<Pool> pool;
|
471
|
+
|
472
|
+
State state;
|
473
|
+
string name;
|
474
|
+
string secret;
|
475
|
+
|
476
|
+
/** Invariant:
|
477
|
+
* groups.empty() == (state == INITIALIZING || state == DESTROYING || state == DESTROYED)
|
478
|
+
*/
|
479
|
+
vector<GroupPtr> groups;
|
480
|
+
|
481
|
+
/** Invariant:
|
482
|
+
* (defaultGroup == NULL) == (state == INITIALIZING || state == DESTROYING || state == DESTROYED)
|
483
|
+
*/
|
484
|
+
Group *defaultGroup;
|
485
|
+
|
486
|
+
/**
|
487
|
+
* get() requests for this super group that cannot be immediately satisfied
|
488
|
+
* are put on this wait list, which must be processed as soon as the
|
489
|
+
* necessary resources have become free.
|
490
|
+
*
|
491
|
+
* Invariant:
|
492
|
+
* if state == READY || state == RESTARTING || state == DESTROYING || state == DESTROYED:
|
493
|
+
* getWaitlist.empty()
|
494
|
+
* Equivalently:
|
495
|
+
* if state != INITIALIZING:
|
496
|
+
* getWaitlist.empty()
|
497
|
+
* Equivalently:
|
498
|
+
* if !getWaitlist.empty():
|
499
|
+
* state == INITIALIZING
|
500
|
+
*/
|
501
|
+
queue<GetWaiter> getWaitlist;
|
502
|
+
|
503
|
+
/** One MUST call initialize() after construction because shared_from_this()
|
504
|
+
* is not available in the constructor.
|
505
|
+
*/
|
506
|
+
SuperGroup(const PoolPtr &pool, const Options &options) {
|
507
|
+
this->pool = pool;
|
508
|
+
this->options = options.copyAndPersist();
|
509
|
+
this->name = options.getAppGroupName();
|
510
|
+
secret = generateSecret();
|
511
|
+
state = INITIALIZING;
|
512
|
+
defaultGroup = NULL;
|
513
|
+
generation = 0;
|
514
|
+
}
|
515
|
+
|
516
|
+
void initialize() {
|
517
|
+
createNonInterruptableThread(
|
518
|
+
boost::bind(
|
519
|
+
&SuperGroup::doInitialize,
|
520
|
+
this,
|
521
|
+
// Keep reference to self to prevent destruction.
|
522
|
+
shared_from_this(),
|
523
|
+
options.copyAndPersist(),
|
524
|
+
generation),
|
525
|
+
"SuperGroup initializer: " + name,
|
526
|
+
POOL_HELPER_THREAD_STACK_SIZE);
|
527
|
+
}
|
528
|
+
|
529
|
+
// Thread-safe.
|
530
|
+
PoolPtr getPool() const {
|
531
|
+
lock_guard<boost::mutex> lock(backrefSyncher);
|
532
|
+
return pool.lock();
|
533
|
+
}
|
534
|
+
|
535
|
+
// Thread-safe.
|
536
|
+
void setPool(const PoolPtr &pool) {
|
537
|
+
lock_guard<boost::mutex> lock(backrefSyncher);
|
538
|
+
this->pool = pool;
|
539
|
+
}
|
540
|
+
|
541
|
+
// Thread-safe.
|
542
|
+
bool detached() const {
|
543
|
+
return getPool() == NULL;
|
544
|
+
}
|
545
|
+
|
546
|
+
const char *getStateName() const {
|
547
|
+
switch (state) {
|
548
|
+
case INITIALIZING:
|
549
|
+
return "INITIALIZING";
|
550
|
+
case READY:
|
551
|
+
return "READY";
|
552
|
+
case RESTARTING:
|
553
|
+
return "RESTARTING";
|
554
|
+
case DESTROYING:
|
555
|
+
return "DESTROYING";
|
556
|
+
case DESTROYED:
|
557
|
+
return "DESTROYED";
|
558
|
+
default:
|
559
|
+
abort();
|
560
|
+
}
|
561
|
+
}
|
562
|
+
|
563
|
+
/**
|
564
|
+
* If `allowReinitialization` is true then destroying a SuperGroup that
|
565
|
+
* has get waiters will make it reinitialize. Otherwise this SuperGroup
|
566
|
+
* will be forcefully set to the `DESTROYING` state and `getWaitlist` will be
|
567
|
+
* left untouched; in this case it is up to the caller to empty
|
568
|
+
* the `getWaitlist` and do something with it, otherwise the invariant
|
569
|
+
* will be broken.
|
570
|
+
*/
|
571
|
+
void destroy(vector<Callback> &postLockActions, bool allowReinitialization = true) {
|
572
|
+
verifyInvariants();
|
573
|
+
switch (state) {
|
574
|
+
case INITIALIZING:
|
575
|
+
case READY:
|
576
|
+
case RESTARTING:
|
577
|
+
detachGroups(groups, postLockActions);
|
578
|
+
defaultGroup = NULL;
|
579
|
+
if (getWaitlist.empty() || !allowReinitialization) {
|
580
|
+
setState(DESTROYING);
|
581
|
+
createNonInterruptableThread(
|
582
|
+
boost::bind(
|
583
|
+
&SuperGroup::doDestroy,
|
584
|
+
this,
|
585
|
+
// Keep reference to self to prevent destruction.
|
586
|
+
shared_from_this(),
|
587
|
+
generation),
|
588
|
+
"SuperGroup destroyer: " + name,
|
589
|
+
POOL_HELPER_THREAD_STACK_SIZE + 1024 * 256);
|
590
|
+
} else {
|
591
|
+
// Spawning this thread before setState() so that
|
592
|
+
// it doesn't change the state when done.
|
593
|
+
createNonInterruptableThread(
|
594
|
+
boost::bind(
|
595
|
+
&SuperGroup::doDestroy,
|
596
|
+
this,
|
597
|
+
// Keep reference to self to prevent destruction.
|
598
|
+
shared_from_this(),
|
599
|
+
generation),
|
600
|
+
"SuperGroup destroyer: " + name,
|
601
|
+
POOL_HELPER_THREAD_STACK_SIZE + 1024 * 256);
|
602
|
+
setState(INITIALIZING);
|
603
|
+
createNonInterruptableThread(
|
604
|
+
boost::bind(
|
605
|
+
&SuperGroup::doInitialize,
|
606
|
+
this,
|
607
|
+
// Keep reference to self to prevent destruction.
|
608
|
+
shared_from_this(),
|
609
|
+
options.copyAndPersist(),
|
610
|
+
generation),
|
611
|
+
"SuperGroup initializer: " + name,
|
612
|
+
1024 * 64);
|
613
|
+
}
|
614
|
+
break;
|
615
|
+
case DESTROYING:
|
616
|
+
case DESTROYED:
|
617
|
+
break;
|
618
|
+
default:
|
619
|
+
abort();
|
620
|
+
}
|
621
|
+
if (allowReinitialization) {
|
622
|
+
verifyInvariants();
|
623
|
+
}
|
624
|
+
}
|
625
|
+
|
626
|
+
/**
|
627
|
+
* @post
|
628
|
+
* if result:
|
629
|
+
* getWaitlist.empty()
|
630
|
+
*/
|
631
|
+
bool garbageCollectable(unsigned long long now = 0) const {
|
632
|
+
/* if (state == READY) {
|
633
|
+
vector<GroupPtr>::const_iterator it, end = groups.end();
|
634
|
+
bool result = true;
|
635
|
+
|
636
|
+
for (it = groups.begin(); result && it != end; it++) {
|
637
|
+
result = result && (*it)->garbageCollectable(now);
|
638
|
+
}
|
639
|
+
P_ASSERT(!result || getWaitlist.empty());
|
640
|
+
return result;
|
641
|
+
} else {
|
642
|
+
P_ASSERT(!(state == DESTROYED) || getWaitlist.empty());
|
643
|
+
return state == DESTROYED;
|
644
|
+
} */
|
645
|
+
return false;
|
646
|
+
}
|
647
|
+
|
648
|
+
SessionPtr get(const Options &newOptions, const GetCallback &callback) {
|
649
|
+
switch (state) {
|
650
|
+
case INITIALIZING:
|
651
|
+
getWaitlist.push(GetWaiter(newOptions, callback));
|
652
|
+
verifyInvariants();
|
653
|
+
return SessionPtr();
|
654
|
+
case READY:
|
655
|
+
case RESTARTING:
|
656
|
+
if (needsRestart()) {
|
657
|
+
restart(newOptions);
|
658
|
+
}
|
659
|
+
if (groups.size() > 1) {
|
660
|
+
Group *group = route(newOptions);
|
661
|
+
Options adjustedOptions = newOptions;
|
662
|
+
adjustOptions(adjustedOptions, group);
|
663
|
+
verifyInvariants();
|
664
|
+
return group->get(adjustedOptions, callback);
|
665
|
+
} else {
|
666
|
+
verifyInvariants();
|
667
|
+
return defaultGroup->get(newOptions, callback);
|
668
|
+
}
|
669
|
+
case DESTROYING:
|
670
|
+
case DESTROYED:
|
671
|
+
getWaitlist.push(GetWaiter(newOptions, callback));
|
672
|
+
setState(INITIALIZING);
|
673
|
+
createNonInterruptableThread(
|
674
|
+
boost::bind(
|
675
|
+
&SuperGroup::doInitialize,
|
676
|
+
this,
|
677
|
+
// Keep reference to self to prevent destruction.
|
678
|
+
shared_from_this(),
|
679
|
+
newOptions.copyAndPersist(),
|
680
|
+
generation),
|
681
|
+
"SuperGroup initializer: " + name,
|
682
|
+
POOL_HELPER_THREAD_STACK_SIZE);
|
683
|
+
verifyInvariants();
|
684
|
+
return SessionPtr();
|
685
|
+
default:
|
686
|
+
abort();
|
687
|
+
return SessionPtr(); // Shut up compiler warning.
|
688
|
+
};
|
689
|
+
}
|
690
|
+
|
691
|
+
Group *route(const Options &options) const {
|
692
|
+
return defaultGroup;
|
693
|
+
}
|
694
|
+
|
695
|
+
unsigned int utilization() const {
|
696
|
+
vector<GroupPtr>::const_iterator it, end = groups.end();
|
697
|
+
unsigned int result = 0;
|
698
|
+
|
699
|
+
for (it = groups.begin(); it != end; it++) {
|
700
|
+
result += (*it)->utilization();
|
701
|
+
}
|
702
|
+
if (state == INITIALIZING || state == RESTARTING) {
|
703
|
+
result++;
|
704
|
+
}
|
705
|
+
return result;
|
706
|
+
}
|
707
|
+
|
708
|
+
bool needsRestart() const {
|
709
|
+
return false;
|
710
|
+
}
|
711
|
+
|
712
|
+
void restart(const Options &options) {
|
713
|
+
verifyInvariants();
|
714
|
+
if (state == READY) {
|
715
|
+
createInterruptableThread(
|
716
|
+
boost::bind(
|
717
|
+
&SuperGroup::doRestart,
|
718
|
+
this,
|
719
|
+
// Keep reference to self to prevent destruction.
|
720
|
+
shared_from_this(),
|
721
|
+
options.copyAndPersist(),
|
722
|
+
generation),
|
723
|
+
"SuperGroup restarter: " + name,
|
724
|
+
POOL_HELPER_THREAD_STACK_SIZE);
|
725
|
+
state = RESTARTING;
|
726
|
+
}
|
727
|
+
verifyInvariants();
|
728
|
+
}
|
729
|
+
|
730
|
+
unsigned int getProcessCount() const {
|
731
|
+
unsigned int result = 0;
|
732
|
+
vector<GroupPtr>::const_iterator g_it, g_end = groups.end();
|
733
|
+
for (g_it = groups.begin(); g_it != g_end; g_it++) {
|
734
|
+
const GroupPtr &group = *g_it;
|
735
|
+
result += group->count;
|
736
|
+
}
|
737
|
+
return result;
|
738
|
+
}
|
739
|
+
|
740
|
+
string inspect() const {
|
741
|
+
return name;
|
742
|
+
}
|
743
|
+
};
|
744
|
+
|
745
|
+
|
746
|
+
} // namespace ApplicationPool2
|
747
|
+
} // namespace Passenger
|
748
|
+
|
749
|
+
#endif /* _PASSENGER_APPLICATION_POOL2_SUPER_GROUP_H_ */
|