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
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c) 2010 Phusion
|
3
|
+
* Copyright (c) 2010, 2011, 2012 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -31,8 +31,12 @@
|
|
31
31
|
|
32
32
|
namespace Passenger {
|
33
33
|
|
34
|
+
typedef void (*DiagnosticsDumper)(void *userData);
|
35
|
+
|
34
36
|
bool feedbackFdAvailable();
|
35
37
|
VariantMap initializeAgent(int argc, char *argv[], const char *processName);
|
38
|
+
void installAbortHandler();
|
39
|
+
void installDiagnosticsDumper(DiagnosticsDumper func, void *userData);
|
36
40
|
|
37
41
|
}
|
38
42
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#include <sys/types.h>
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <unistd.h>
|
4
|
+
#include <string.h>
|
5
|
+
|
6
|
+
extern char **environ;
|
7
|
+
|
8
|
+
int
|
9
|
+
main(int argc, char *argv[]) {
|
10
|
+
int i = 0;
|
11
|
+
while (environ[i] != NULL) {
|
12
|
+
write(STDOUT_FILENO, environ[i], strlen(environ[i]) + 1);
|
13
|
+
i++;
|
14
|
+
}
|
15
|
+
return 0;
|
16
|
+
}
|
@@ -0,0 +1,81 @@
|
|
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_HELPER_AGENT_OPTIONS_H_
|
26
|
+
#define _PASSENGER_HELPER_AGENT_OPTIONS_H_
|
27
|
+
|
28
|
+
#include <sys/types.h>
|
29
|
+
#include <string>
|
30
|
+
#include <Utils/VariantMap.h>
|
31
|
+
#include <Utils/Base64.h>
|
32
|
+
|
33
|
+
namespace Passenger {
|
34
|
+
|
35
|
+
using namespace std;
|
36
|
+
|
37
|
+
|
38
|
+
struct AgentOptions {
|
39
|
+
pid_t webServerPid;
|
40
|
+
string tempDir;
|
41
|
+
bool userSwitching;
|
42
|
+
string defaultUser;
|
43
|
+
string defaultGroup;
|
44
|
+
string passengerRoot;
|
45
|
+
string rubyCommand;
|
46
|
+
unsigned int generationNumber;
|
47
|
+
unsigned int maxPoolSize;
|
48
|
+
unsigned int maxInstancesPerApp;
|
49
|
+
unsigned int poolIdleTime;
|
50
|
+
string requestSocketPassword;
|
51
|
+
string messageSocketPassword;
|
52
|
+
string loggingAgentAddress;
|
53
|
+
string loggingAgentPassword;
|
54
|
+
string prestartUrls;
|
55
|
+
|
56
|
+
AgentOptions() { }
|
57
|
+
|
58
|
+
AgentOptions(const VariantMap &options) {
|
59
|
+
webServerPid = options.getPid("web_server_pid");
|
60
|
+
tempDir = options.get("temp_dir");
|
61
|
+
userSwitching = options.getBool("user_switching");
|
62
|
+
defaultUser = options.get("default_user");
|
63
|
+
defaultGroup = options.get("default_group");
|
64
|
+
passengerRoot = options.get("passenger_root");
|
65
|
+
rubyCommand = options.get("ruby");
|
66
|
+
generationNumber = options.getInt("generation_number");
|
67
|
+
maxPoolSize = options.getInt("max_pool_size");
|
68
|
+
maxInstancesPerApp = options.getInt("max_instances_per_app");
|
69
|
+
poolIdleTime = options.getInt("pool_idle_time");
|
70
|
+
requestSocketPassword = Base64::decode(options.get("request_socket_password"));
|
71
|
+
messageSocketPassword = Base64::decode(options.get("message_socket_password"));
|
72
|
+
loggingAgentAddress = options.get("logging_agent_address");
|
73
|
+
loggingAgentPassword = options.get("logging_agent_password");
|
74
|
+
prestartUrls = options.get("prestart_urls");
|
75
|
+
}
|
76
|
+
};
|
77
|
+
|
78
|
+
|
79
|
+
} // namespace Passenger
|
80
|
+
|
81
|
+
#endif /* _PASSENGER_HELPER_AGENT_OPTIONS_H_ */
|
@@ -27,7 +27,8 @@
|
|
27
27
|
|
28
28
|
#include <oxt/thread.hpp>
|
29
29
|
#include <oxt/backtrace.hpp>
|
30
|
-
#include
|
30
|
+
#include <MessageServer.h>
|
31
|
+
#include <Utils/MessageIO.h>
|
31
32
|
|
32
33
|
namespace Passenger {
|
33
34
|
|
@@ -46,7 +47,7 @@ public:
|
|
46
47
|
if (args[0] == "backtraces") {
|
47
48
|
UPDATE_TRACE_POINT();
|
48
49
|
commonContext.requireRights(Account::INSPECT_BACKTRACES);
|
49
|
-
commonContext.
|
50
|
+
writeScalarMessage(commonContext.fd, oxt::thread::all_backtraces());
|
50
51
|
return true;
|
51
52
|
} else {
|
52
53
|
return false;
|
@@ -0,0 +1,732 @@
|
|
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_FILE_BACKED_PIPE_H_
|
26
|
+
#define _PASSENGER_FILE_BACKED_PIPE_H_
|
27
|
+
|
28
|
+
#include <boost/shared_ptr.hpp>
|
29
|
+
#include <boost/weak_ptr.hpp>
|
30
|
+
#include <boost/enable_shared_from_this.hpp>
|
31
|
+
#include <boost/shared_array.hpp>
|
32
|
+
#include <boost/function.hpp>
|
33
|
+
#include <boost/bind.hpp>
|
34
|
+
#include <string>
|
35
|
+
#include <sstream>
|
36
|
+
#include <memory>
|
37
|
+
#include <cstdlib>
|
38
|
+
#include <cassert>
|
39
|
+
#include <cstring>
|
40
|
+
#include <unistd.h>
|
41
|
+
#include <pthread.h>
|
42
|
+
|
43
|
+
#include <oxt/macros.hpp>
|
44
|
+
#include <SafeLibev.h>
|
45
|
+
#include <MultiLibeio.h>
|
46
|
+
#include <StaticString.h>
|
47
|
+
#include <Exceptions.h>
|
48
|
+
#include <FileDescriptor.h>
|
49
|
+
#include <Utils/StrIntUtils.h>
|
50
|
+
|
51
|
+
namespace Passenger {
|
52
|
+
|
53
|
+
using namespace std;
|
54
|
+
using namespace boost;
|
55
|
+
|
56
|
+
|
57
|
+
/**
|
58
|
+
* A pipe which buffers data in memory, or if the data becomes too large, to disk.
|
59
|
+
* If you write some data to the pipe then the pipe will push some data to the
|
60
|
+
* 'onData' callback. This callback is allowed to take an arbitrary amount of time
|
61
|
+
* to consume the data. The pipe guarantees that, while the callback is busy
|
62
|
+
* consuming data, any newly written data will be buffered, either to memory
|
63
|
+
* or to disk. Thus, one can write a virtually unlimited amount of data into
|
64
|
+
* the pipe without filling up the system's RAM, even when the data is slowly
|
65
|
+
* consumed. FileBackedPipe is highly optimized: in case the 'onData' callback
|
66
|
+
* is fast enough, FileBackedPipe operates in an entirely zero-copy manner and
|
67
|
+
* without any kinds of heap allocations.
|
68
|
+
*
|
69
|
+
* By default, FileBackedPipe is stopped, meaning that when you write to it,
|
70
|
+
* the data will be buffered and the 'onData' callback will not be called.
|
71
|
+
* You must start it by calling start().
|
72
|
+
*
|
73
|
+
* When you're done writing data to the pipe, call end() to signal end-of-stream.
|
74
|
+
* Once all buffered data has been consumed, the 'onEnd' callback will be called.
|
75
|
+
*
|
76
|
+
* FileBackedPipe assumes the usage of an event loop. It is *not* thread-safe!
|
77
|
+
* All FileBackedPipe methods may only be called from the event loop on which it
|
78
|
+
* is installed.
|
79
|
+
*
|
80
|
+
* FileBackedPipe *must* be dynamically allocated and assigned to a shared_ptr.
|
81
|
+
*/
|
82
|
+
class FileBackedPipe: public enable_shared_from_this<FileBackedPipe> {
|
83
|
+
public:
|
84
|
+
class ConsumeCallback {
|
85
|
+
private:
|
86
|
+
mutable weak_ptr<FileBackedPipe> wself;
|
87
|
+
unsigned int generation;
|
88
|
+
|
89
|
+
public:
|
90
|
+
ConsumeCallback() { }
|
91
|
+
|
92
|
+
ConsumeCallback(const shared_ptr<FileBackedPipe> &self, unsigned int _generation)
|
93
|
+
: wself(self),
|
94
|
+
generation(_generation)
|
95
|
+
{ }
|
96
|
+
|
97
|
+
void operator()(size_t consumed, bool done) const {
|
98
|
+
shared_ptr<FileBackedPipe> self = wself.lock();
|
99
|
+
if (self != NULL) {
|
100
|
+
wself.reset();
|
101
|
+
self->dataConsumed(consumed, done, generation);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
function<void (size_t, bool)> toFunction() const {
|
106
|
+
shared_ptr<FileBackedPipe> self = wself.lock();
|
107
|
+
if (self != NULL) {
|
108
|
+
return boost::bind(&ConsumeCallback::operator(), this, _1, _2);
|
109
|
+
} else {
|
110
|
+
return function<void (size_t, bool)>();
|
111
|
+
}
|
112
|
+
}
|
113
|
+
};
|
114
|
+
|
115
|
+
typedef void (*DataCallback)(const shared_ptr<FileBackedPipe> &source, const char *data,
|
116
|
+
size_t size, const ConsumeCallback &consumed);
|
117
|
+
typedef void (*ErrorCallback)(const shared_ptr<FileBackedPipe> &source, int errorCode);
|
118
|
+
typedef void (*Callback)(const shared_ptr<FileBackedPipe> &source);
|
119
|
+
|
120
|
+
enum DataState {
|
121
|
+
IN_MEMORY,
|
122
|
+
OPENING_FILE,
|
123
|
+
IN_FILE
|
124
|
+
};
|
125
|
+
|
126
|
+
private:
|
127
|
+
typedef function<void (int err, const char *data, size_t size)> EioReadCallback;
|
128
|
+
|
129
|
+
// We already have a shared_ptr reference to libev through MultiLibeio.
|
130
|
+
const string dir;
|
131
|
+
size_t threshold;
|
132
|
+
|
133
|
+
const char *currentData;
|
134
|
+
size_t currentDataSize;
|
135
|
+
MultiLibeio libeio;
|
136
|
+
unsigned int consumedCallCount;
|
137
|
+
unsigned int generation;
|
138
|
+
|
139
|
+
bool started;
|
140
|
+
bool ended;
|
141
|
+
bool endReached;
|
142
|
+
bool hasError;
|
143
|
+
|
144
|
+
enum {
|
145
|
+
/* No data event handler is currently being called. */
|
146
|
+
NOT_CALLING_EVENT,
|
147
|
+
/* The data event handler is currently being called and it hasn't returned yet. */
|
148
|
+
CALLING_EVENT_NOW,
|
149
|
+
/* The data event handler was called and it returned, but it hasn't called its finish callback yet. */
|
150
|
+
WAITING_FOR_EVENT_FINISH,
|
151
|
+
/* The data event handler finish callback has been called and is
|
152
|
+
* fetching more buffered data so that it can call the data event
|
153
|
+
* handler again.
|
154
|
+
*/
|
155
|
+
PREPARING_NEXT_EVENT_CALL
|
156
|
+
} dataEventState;
|
157
|
+
|
158
|
+
DataState dataState;
|
159
|
+
|
160
|
+
struct {
|
161
|
+
char *data;
|
162
|
+
size_t size;
|
163
|
+
} memory;
|
164
|
+
struct {
|
165
|
+
FileDescriptor fd;
|
166
|
+
/* Whether there's currently an operation in progress to write the contents
|
167
|
+
* of the buffer to the file. */
|
168
|
+
bool writingToFile;
|
169
|
+
/* Number of bytes written to the file so far. This number is incremented
|
170
|
+
* *after* the file write operation has finished, not before. */
|
171
|
+
off_t writtenSize;
|
172
|
+
/* Offset in the file at which data should be read. This can be
|
173
|
+
* temporarily larger than 'writtenSize'. If this is the case then
|
174
|
+
* the data with offset past 'writtenSize' should be obtained from
|
175
|
+
* the writeBuffer.
|
176
|
+
*/
|
177
|
+
off_t readOffset;
|
178
|
+
/* Data buffered in memory, to be written to the file ASAP. Data is
|
179
|
+
* removed from the buffer *after* the file write operation has
|
180
|
+
* finished, not before.
|
181
|
+
*/
|
182
|
+
string writeBuffer;
|
183
|
+
} file;
|
184
|
+
|
185
|
+
bool callOnData(const char *data, size_t size, bool passDataToConsumedCallback) {
|
186
|
+
unsigned int oldConsumedCallCount = consumedCallCount;
|
187
|
+
dataEventState = CALLING_EVENT_NOW;
|
188
|
+
|
189
|
+
assert(currentData == NULL);
|
190
|
+
assert(currentDataSize == 0);
|
191
|
+
if (passDataToConsumedCallback) {
|
192
|
+
currentData = data;
|
193
|
+
}
|
194
|
+
currentDataSize = size;
|
195
|
+
|
196
|
+
if (OXT_LIKELY(onData != NULL)) {
|
197
|
+
onData(shared_from_this(), data, size, ConsumeCallback(shared_from_this(),
|
198
|
+
generation));
|
199
|
+
} else {
|
200
|
+
real_dataConsumed(0, true, generation);
|
201
|
+
}
|
202
|
+
|
203
|
+
if (consumedCallCount == oldConsumedCallCount) {
|
204
|
+
// 'consumed' callback not called.
|
205
|
+
dataEventState = WAITING_FOR_EVENT_FINISH;
|
206
|
+
return false;
|
207
|
+
} else {
|
208
|
+
// 'consumed' callback called.
|
209
|
+
assert(dataEventState == NOT_CALLING_EVENT
|
210
|
+
|| dataEventState == PREPARING_NEXT_EVENT_CALL);
|
211
|
+
return true;
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
void callOnEnd() {
|
216
|
+
assert(!endReached);
|
217
|
+
endReached = true;
|
218
|
+
if (onEnd != NULL) {
|
219
|
+
onEnd(shared_from_this());
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
void callOnCommit() {
|
224
|
+
if (onCommit != NULL) {
|
225
|
+
onCommit(shared_from_this());
|
226
|
+
}
|
227
|
+
}
|
228
|
+
|
229
|
+
void setError(int errorCode) {
|
230
|
+
hasError = true;
|
231
|
+
if (onError != NULL) {
|
232
|
+
onError(shared_from_this(), errorCode);
|
233
|
+
}
|
234
|
+
}
|
235
|
+
|
236
|
+
SafeLibev *getLibev() const {
|
237
|
+
return libeio.getLibev().get();
|
238
|
+
}
|
239
|
+
|
240
|
+
void addToBuffer(const char *data, size_t size) {
|
241
|
+
size_t bytesToCopy;
|
242
|
+
|
243
|
+
switch (dataState) {
|
244
|
+
case IN_MEMORY:
|
245
|
+
bytesToCopy = std::min(size, threshold - memory.size);
|
246
|
+
if (bytesToCopy == size) {
|
247
|
+
if (memory.data == NULL) {
|
248
|
+
assert(memory.size == 0);
|
249
|
+
memory.data = new char[threshold];
|
250
|
+
}
|
251
|
+
memcpy(memory.data + memory.size, data, bytesToCopy);
|
252
|
+
memory.size += size;
|
253
|
+
} else {
|
254
|
+
dataState = OPENING_FILE;
|
255
|
+
assert(file.fd == -1);
|
256
|
+
assert(file.writtenSize == 0);
|
257
|
+
assert(file.readOffset == 0);
|
258
|
+
file.writeBuffer.reserve(memory.size + size);
|
259
|
+
file.writeBuffer.append(memory.data, memory.size);
|
260
|
+
file.writeBuffer.append(data, size);
|
261
|
+
delete[] memory.data;
|
262
|
+
memory.data = NULL;
|
263
|
+
memory.size = 0;
|
264
|
+
|
265
|
+
stringstream filename;
|
266
|
+
filename << dir;
|
267
|
+
filename << "/buffer.";
|
268
|
+
filename << getpid();
|
269
|
+
filename << ".";
|
270
|
+
filename << pointerToIntString(this);
|
271
|
+
libeio.open(filename.str().c_str(), O_CREAT | O_RDWR | O_TRUNC, 0, 0,
|
272
|
+
boost::bind(&FileBackedPipe::openCallback, this,
|
273
|
+
_1, filename.str(), generation,
|
274
|
+
weak_ptr<FileBackedPipe>(shared_from_this())
|
275
|
+
)
|
276
|
+
);
|
277
|
+
}
|
278
|
+
break;
|
279
|
+
|
280
|
+
case OPENING_FILE:
|
281
|
+
file.writeBuffer.append(data, size);
|
282
|
+
break;
|
283
|
+
|
284
|
+
case IN_FILE:
|
285
|
+
file.writeBuffer.append(data, size);
|
286
|
+
writeBufferToFile();
|
287
|
+
break;
|
288
|
+
|
289
|
+
default:
|
290
|
+
abort();
|
291
|
+
}
|
292
|
+
}
|
293
|
+
|
294
|
+
void writeBufferToFile() {
|
295
|
+
assert(dataState == IN_FILE);
|
296
|
+
if (!file.writingToFile) {
|
297
|
+
shared_array<char> buffer(new char[file.writeBuffer.size()]);
|
298
|
+
memcpy(buffer.get(), file.writeBuffer.data(), file.writeBuffer.size());
|
299
|
+
file.writingToFile = true;
|
300
|
+
libeio.write(file.fd, buffer.get(), file.writeBuffer.size(),
|
301
|
+
file.writtenSize, 0, boost::bind(
|
302
|
+
&FileBackedPipe::writeBufferToFileCallback, this,
|
303
|
+
_1, file.fd, buffer, file.writeBuffer.size(),
|
304
|
+
generation,
|
305
|
+
weak_ptr<FileBackedPipe>(shared_from_this())
|
306
|
+
)
|
307
|
+
);
|
308
|
+
}
|
309
|
+
}
|
310
|
+
|
311
|
+
void writeBufferToFileCallback(eio_req req, FileDescriptor fd,
|
312
|
+
shared_array<char> buffer, size_t size,
|
313
|
+
unsigned int generation, weak_ptr<FileBackedPipe> wself)
|
314
|
+
{
|
315
|
+
shared_ptr<FileBackedPipe> self = wself.lock();
|
316
|
+
if (self == NULL || EIO_CANCELLED(&req) || generation != self->generation) {
|
317
|
+
return;
|
318
|
+
}
|
319
|
+
|
320
|
+
if (req.result < 0) {
|
321
|
+
setError(req.errorno);
|
322
|
+
} else {
|
323
|
+
assert(dataState == IN_FILE);
|
324
|
+
file.writeBuffer.erase(0, size);
|
325
|
+
file.writtenSize += size;
|
326
|
+
file.writingToFile = false;
|
327
|
+
if (file.writeBuffer.empty()) {
|
328
|
+
callOnCommit();
|
329
|
+
} else {
|
330
|
+
writeBufferToFile();
|
331
|
+
}
|
332
|
+
}
|
333
|
+
}
|
334
|
+
|
335
|
+
void openCallback(eio_req req, string filename, unsigned int generation,
|
336
|
+
weak_ptr<FileBackedPipe> &wself)
|
337
|
+
{
|
338
|
+
shared_ptr<FileBackedPipe> self = wself.lock();
|
339
|
+
if (self == NULL || EIO_CANCELLED(&req) || generation != self->generation) {
|
340
|
+
if (req.result != -1 || EIO_CANCELLED(&req)) {
|
341
|
+
eio_close(req.result, 0, successCallback, NULL);
|
342
|
+
eio_unlink(filename.c_str(), 0, successCallback, NULL);
|
343
|
+
}
|
344
|
+
return;
|
345
|
+
}
|
346
|
+
|
347
|
+
assert(dataState = OPENING_FILE);
|
348
|
+
if (req.result < 0) {
|
349
|
+
setError(req.errorno);
|
350
|
+
} else {
|
351
|
+
eio_unlink(filename.c_str(), 0, successCallback, NULL);
|
352
|
+
if (openTimeout == 0) {
|
353
|
+
finalizeOpenFile(FileDescriptor(req.result));
|
354
|
+
} else {
|
355
|
+
getLibev()->runAfter(openTimeout,
|
356
|
+
boost::bind(&FileBackedPipe::finalizeOpenFileAfterTimeout, this,
|
357
|
+
weak_ptr<FileBackedPipe>(shared_from_this()),
|
358
|
+
generation, FileDescriptor(req.result)));
|
359
|
+
}
|
360
|
+
}
|
361
|
+
}
|
362
|
+
|
363
|
+
void finalizeOpenFile(const FileDescriptor &fd) {
|
364
|
+
dataState = IN_FILE;
|
365
|
+
file.fd = fd;
|
366
|
+
writeBufferToFile();
|
367
|
+
}
|
368
|
+
|
369
|
+
void finalizeOpenFileAfterTimeout(weak_ptr<FileBackedPipe> wself,
|
370
|
+
unsigned int generation, FileDescriptor fd)
|
371
|
+
{
|
372
|
+
shared_ptr<FileBackedPipe> self = wself.lock();
|
373
|
+
if (self != NULL || generation != self->generation) {
|
374
|
+
self->finalizeOpenFile(fd);
|
375
|
+
}
|
376
|
+
}
|
377
|
+
|
378
|
+
static int successCallback(eio_req *req) {
|
379
|
+
return 0;
|
380
|
+
}
|
381
|
+
|
382
|
+
void readBlockFromFileOrWriteBuffer(const EioReadCallback &callback) {
|
383
|
+
if (file.readOffset >= file.writtenSize) {
|
384
|
+
StaticString data = StaticString(file.writeBuffer).substr(
|
385
|
+
file.readOffset - file.writtenSize, 1024 * 16);
|
386
|
+
callback(0, data.data(), data.size());
|
387
|
+
} else {
|
388
|
+
shared_array<char> buffer(new char[1024 * 16]);
|
389
|
+
eio_req *req = libeio.read(file.fd, buffer.get(), 1024 * 16, file.readOffset, 0,
|
390
|
+
boost::bind(
|
391
|
+
&FileBackedPipe::readCallback, this,
|
392
|
+
_1, file.fd, buffer, callback, generation,
|
393
|
+
weak_ptr<FileBackedPipe>(shared_from_this())
|
394
|
+
)
|
395
|
+
);
|
396
|
+
if (req == NULL) {
|
397
|
+
throw RuntimeException("eio_read() failed!");
|
398
|
+
}
|
399
|
+
}
|
400
|
+
}
|
401
|
+
|
402
|
+
void readCallback(eio_req req, FileDescriptor fd, shared_array<char> buffer,
|
403
|
+
EioReadCallback callback, unsigned int generation, weak_ptr<FileBackedPipe> wself)
|
404
|
+
{
|
405
|
+
shared_ptr<FileBackedPipe> self = wself.lock();
|
406
|
+
if (self == NULL || EIO_CANCELLED(&req) || generation != self->generation) {
|
407
|
+
return;
|
408
|
+
}
|
409
|
+
|
410
|
+
if (req.result < 0) {
|
411
|
+
callback(req.errorno, NULL, 0);
|
412
|
+
} else {
|
413
|
+
callback(0, buffer.get(), req.result);
|
414
|
+
}
|
415
|
+
}
|
416
|
+
|
417
|
+
void dataConsumed(size_t consumed, bool done, unsigned int oldGeneration) {
|
418
|
+
if (OXT_UNLIKELY(oldGeneration != generation)) {
|
419
|
+
throw RuntimeException("Don't call the consumed callback after you've reset the FileBackedPipe!");
|
420
|
+
}
|
421
|
+
|
422
|
+
if (pthread_equal(pthread_self(), getLibev()->getCurrentThread())) {
|
423
|
+
real_dataConsumed(consumed, done, oldGeneration);
|
424
|
+
} else {
|
425
|
+
getLibev()->runAsync(boost::bind(
|
426
|
+
&FileBackedPipe::real_dataConsumed, this,
|
427
|
+
consumed, done, oldGeneration));
|
428
|
+
}
|
429
|
+
}
|
430
|
+
|
431
|
+
void real_dataConsumed(size_t consumed, bool done, unsigned int oldGeneration) {
|
432
|
+
if (OXT_UNLIKELY(oldGeneration != generation)) {
|
433
|
+
throw RuntimeException("Don't call the consumed callback after you've reset the FileBackedPipe!");
|
434
|
+
}
|
435
|
+
|
436
|
+
const char *data = currentData;
|
437
|
+
size_t size = currentDataSize;
|
438
|
+
currentData = NULL;
|
439
|
+
currentDataSize = 0;
|
440
|
+
|
441
|
+
assert(consumed <= size);
|
442
|
+
consumedCallCount++;
|
443
|
+
if (done) {
|
444
|
+
started = false;
|
445
|
+
}
|
446
|
+
|
447
|
+
if (getBufferSize() == 0) {
|
448
|
+
// Data passed to write() was immediately consumed.
|
449
|
+
assert(dataEventState == CALLING_EVENT_NOW);
|
450
|
+
assert(data != NULL);
|
451
|
+
if (started) {
|
452
|
+
if (consumed < size) {
|
453
|
+
unsigned int oldGeneration = generation;
|
454
|
+
bool immediatelyConsumed = callOnData(
|
455
|
+
data + consumed,
|
456
|
+
size - consumed,
|
457
|
+
true);
|
458
|
+
if (generation == oldGeneration && !immediatelyConsumed) {
|
459
|
+
addToBuffer(data + consumed, size - consumed);
|
460
|
+
}
|
461
|
+
} else {
|
462
|
+
dataEventState = NOT_CALLING_EVENT;
|
463
|
+
if (ended) {
|
464
|
+
callOnEnd();
|
465
|
+
}
|
466
|
+
}
|
467
|
+
} else {
|
468
|
+
dataEventState = NOT_CALLING_EVENT;
|
469
|
+
addToBuffer(data + consumed, size - consumed);
|
470
|
+
}
|
471
|
+
|
472
|
+
} else {
|
473
|
+
/* Data passed to write() was either immediately consumed or was consumed later,
|
474
|
+
* but we don't care which of those situations occurred: the consumed data is
|
475
|
+
* in the buffer and we have to erase it.
|
476
|
+
*/
|
477
|
+
processBuffer(consumed);
|
478
|
+
}
|
479
|
+
}
|
480
|
+
|
481
|
+
void processBuffer(size_t consumed) {
|
482
|
+
assert(getBufferSize() > 0);
|
483
|
+
|
484
|
+
dataEventState = NOT_CALLING_EVENT;
|
485
|
+
|
486
|
+
switch (dataState) {
|
487
|
+
case IN_MEMORY:
|
488
|
+
memmove(memory.data, memory.data + consumed, memory.size - consumed);
|
489
|
+
memory.size -= consumed;
|
490
|
+
if (started) {
|
491
|
+
if (memory.size == 0) {
|
492
|
+
//callOnConsumed();
|
493
|
+
if (ended) {
|
494
|
+
callOnEnd();
|
495
|
+
}
|
496
|
+
} else {
|
497
|
+
callOnData(memory.data, memory.size, false);
|
498
|
+
}
|
499
|
+
}
|
500
|
+
break;
|
501
|
+
|
502
|
+
case OPENING_FILE:
|
503
|
+
case IN_FILE:
|
504
|
+
file.readOffset += consumed;
|
505
|
+
if (started) {
|
506
|
+
if (getBufferSize() == 0) {
|
507
|
+
//callOnConsumed();
|
508
|
+
if (ended) {
|
509
|
+
callOnEnd();
|
510
|
+
}
|
511
|
+
} else {
|
512
|
+
dataEventState = PREPARING_NEXT_EVENT_CALL;
|
513
|
+
readBlockFromFileOrWriteBuffer(boost::bind(
|
514
|
+
&FileBackedPipe::processBuffer_readCallback, this,
|
515
|
+
_1, _2, _3));
|
516
|
+
}
|
517
|
+
}
|
518
|
+
break;
|
519
|
+
|
520
|
+
default:
|
521
|
+
abort();
|
522
|
+
}
|
523
|
+
}
|
524
|
+
|
525
|
+
void processBuffer_readCallback(int err, const char *data, size_t size) {
|
526
|
+
if (err != 0) {
|
527
|
+
setError(err);
|
528
|
+
} else {
|
529
|
+
callOnData(data, size, false);
|
530
|
+
}
|
531
|
+
}
|
532
|
+
|
533
|
+
public:
|
534
|
+
DataCallback onData;
|
535
|
+
Callback onEnd;
|
536
|
+
ErrorCallback onError;
|
537
|
+
Callback onCommit;
|
538
|
+
void *userData;
|
539
|
+
|
540
|
+
// The amount of time, in milliseconds, that the open() operation
|
541
|
+
// should at least take before it finishes. For unit testing purposes.
|
542
|
+
unsigned int openTimeout;
|
543
|
+
|
544
|
+
FileBackedPipe(const string &_dir, size_t _threshold = 1024 * 8)
|
545
|
+
: dir(_dir),
|
546
|
+
threshold(_threshold),
|
547
|
+
openTimeout(0)
|
548
|
+
{
|
549
|
+
onData = NULL;
|
550
|
+
onEnd = NULL;
|
551
|
+
onError = NULL;
|
552
|
+
onCommit = NULL;
|
553
|
+
|
554
|
+
consumedCallCount = 0;
|
555
|
+
generation = 0;
|
556
|
+
currentData = NULL;
|
557
|
+
currentDataSize = 0;
|
558
|
+
started = false;
|
559
|
+
ended = false;
|
560
|
+
endReached = false;
|
561
|
+
hasError = false;
|
562
|
+
dataEventState = NOT_CALLING_EVENT;
|
563
|
+
dataState = IN_MEMORY;
|
564
|
+
memory.data = NULL;
|
565
|
+
memory.size = 0;
|
566
|
+
file.writingToFile = false;
|
567
|
+
file.readOffset = 0;
|
568
|
+
file.writtenSize = 0;
|
569
|
+
}
|
570
|
+
|
571
|
+
~FileBackedPipe() {
|
572
|
+
delete[] memory.data;
|
573
|
+
}
|
574
|
+
|
575
|
+
bool resetable() const {
|
576
|
+
//return dataState == IN_MEMORY;
|
577
|
+
return true;
|
578
|
+
}
|
579
|
+
|
580
|
+
void reset(const SafeLibevPtr &libev = SafeLibevPtr()) {
|
581
|
+
generation++;
|
582
|
+
libeio = MultiLibeio(libev);
|
583
|
+
currentData = NULL;
|
584
|
+
currentDataSize = 0;
|
585
|
+
started = false;
|
586
|
+
ended = false;
|
587
|
+
endReached = false;
|
588
|
+
hasError = false;
|
589
|
+
dataEventState = NOT_CALLING_EVENT;
|
590
|
+
dataState = IN_MEMORY;
|
591
|
+
delete[] memory.data;
|
592
|
+
memory.data = NULL;
|
593
|
+
memory.size = 0;
|
594
|
+
file.fd = FileDescriptor();
|
595
|
+
file.writingToFile = false;
|
596
|
+
file.readOffset = 0;
|
597
|
+
file.writtenSize = 0;
|
598
|
+
}
|
599
|
+
|
600
|
+
void setThreshold(size_t value) {
|
601
|
+
threshold = value;
|
602
|
+
}
|
603
|
+
|
604
|
+
/**
|
605
|
+
* Returns the amount of data that has been buffered, both in memory and on disk.
|
606
|
+
*/
|
607
|
+
size_t getBufferSize() const {
|
608
|
+
switch (dataState) {
|
609
|
+
case IN_MEMORY:
|
610
|
+
return memory.size;
|
611
|
+
|
612
|
+
case OPENING_FILE:
|
613
|
+
case IN_FILE:
|
614
|
+
return (ssize_t) file.writtenSize
|
615
|
+
- file.readOffset
|
616
|
+
+ file.writeBuffer.size();
|
617
|
+
|
618
|
+
default:
|
619
|
+
abort();
|
620
|
+
}
|
621
|
+
}
|
622
|
+
|
623
|
+
DataState getDataState() const {
|
624
|
+
return dataState;
|
625
|
+
}
|
626
|
+
|
627
|
+
/**
|
628
|
+
* Writes the given data to the pipe. Returns whether all data is immediately
|
629
|
+
* consumed by the 'onData' callback or whether the data buffered into a memory buffer.
|
630
|
+
* That is, if the data is not immediately consumed and it is queued to be written
|
631
|
+
* to disk, then false is returned. In the latter case, the 'onCommit' callback is
|
632
|
+
* called when all buffered data has been written to disk.
|
633
|
+
*
|
634
|
+
* Note that this method may invoke the 'onData' callback immediately.
|
635
|
+
*/
|
636
|
+
bool write(const char *data, size_t size) {
|
637
|
+
assert(!ended);
|
638
|
+
assert(!hasError);
|
639
|
+
|
640
|
+
if (OXT_UNLIKELY(dataEventState == CALLING_EVENT_NOW)) {
|
641
|
+
throw RuntimeException("This function may not be called within a FileBackedPipe event handler.");
|
642
|
+
|
643
|
+
} else if (!started || dataEventState != NOT_CALLING_EVENT) {
|
644
|
+
assert(!started || getBufferSize() > 0);
|
645
|
+
addToBuffer(data, size);
|
646
|
+
return dataState == IN_MEMORY;
|
647
|
+
|
648
|
+
} else {
|
649
|
+
assert(started);
|
650
|
+
assert(dataEventState == NOT_CALLING_EVENT);
|
651
|
+
assert(getBufferSize() == 0);
|
652
|
+
|
653
|
+
unsigned int oldGeneration = generation;
|
654
|
+
bool immediatelyConsumed = callOnData(data, size, true);
|
655
|
+
if (generation == oldGeneration) {
|
656
|
+
assert(dataEventState != CALLING_EVENT_NOW);
|
657
|
+
if (!immediatelyConsumed) {
|
658
|
+
addToBuffer(data, size);
|
659
|
+
return dataState == IN_MEMORY;
|
660
|
+
} else {
|
661
|
+
return true;
|
662
|
+
}
|
663
|
+
} else {
|
664
|
+
return true;
|
665
|
+
}
|
666
|
+
}
|
667
|
+
}
|
668
|
+
|
669
|
+
void end() {
|
670
|
+
assert(!ended);
|
671
|
+
assert(!hasError);
|
672
|
+
|
673
|
+
if (OXT_UNLIKELY(dataEventState == CALLING_EVENT_NOW)) {
|
674
|
+
throw RuntimeException("This function may not be called within a FileBackedPipe event handler.");
|
675
|
+
|
676
|
+
} else if (!started || dataEventState != NOT_CALLING_EVENT) {
|
677
|
+
assert(!started || getBufferSize() > 0);
|
678
|
+
ended = true;
|
679
|
+
|
680
|
+
} else {
|
681
|
+
assert(started);
|
682
|
+
assert(dataEventState == NOT_CALLING_EVENT);
|
683
|
+
assert(getBufferSize() == 0);
|
684
|
+
|
685
|
+
ended = true;
|
686
|
+
callOnEnd();
|
687
|
+
}
|
688
|
+
}
|
689
|
+
|
690
|
+
bool isStarted() const {
|
691
|
+
return started;
|
692
|
+
}
|
693
|
+
|
694
|
+
bool reachedEnd() const {
|
695
|
+
return endReached;
|
696
|
+
}
|
697
|
+
|
698
|
+
bool isCommittingToDisk() const {
|
699
|
+
return (dataState == OPENING_FILE || dataState == IN_FILE) && !file.writeBuffer.empty();
|
700
|
+
}
|
701
|
+
|
702
|
+
void start() {
|
703
|
+
assert(!hasError);
|
704
|
+
if (OXT_UNLIKELY(dataEventState == CALLING_EVENT_NOW)) {
|
705
|
+
throw RuntimeException("This function may not be called within a FileBackedPipe event handler.");
|
706
|
+
}
|
707
|
+
if (!started && !endReached) {
|
708
|
+
started = true;
|
709
|
+
if (dataEventState == NOT_CALLING_EVENT) {
|
710
|
+
if (getBufferSize() > 0) {
|
711
|
+
processBuffer(0);
|
712
|
+
} else if (ended) {
|
713
|
+
callOnEnd();
|
714
|
+
}
|
715
|
+
}
|
716
|
+
}
|
717
|
+
}
|
718
|
+
|
719
|
+
void stop() {
|
720
|
+
if (OXT_UNLIKELY(dataEventState == CALLING_EVENT_NOW)) {
|
721
|
+
throw RuntimeException("This function may not be called within a FileBackedPipe event handler.");
|
722
|
+
}
|
723
|
+
started = false;
|
724
|
+
}
|
725
|
+
};
|
726
|
+
|
727
|
+
typedef shared_ptr<FileBackedPipe> FileBackedPipePtr;
|
728
|
+
|
729
|
+
|
730
|
+
} // namespace Passenger
|
731
|
+
|
732
|
+
#endif /* _PASSENGER_FILE_BACKED_PIPE_H_ */
|