passenger 4.0.60 → 5.0.0.beta1
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.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +5 -0
- data/.travis.yml +3 -2
- data/CHANGELOG +31 -53
- data/CONTRIBUTING.md +4 -4
- data/CONTRIBUTORS +0 -1
- data/Gemfile +18 -0
- data/Gemfile.lock +41 -0
- data/Rakefile +16 -0
- data/bin/passenger +2 -2
- data/bin/passenger-install-apache2-module +12 -12
- data/bin/passenger-install-nginx-module +9 -14
- data/bin/passenger-status +125 -87
- data/build/agents.rb +112 -140
- data/build/apache2.rb +4 -9
- data/build/basics.rb +5 -3
- data/build/common_library.rb +1 -0
- data/build/cxx_tests.rb +69 -47
- data/build/debian.rb +4 -2
- data/build/documentation.rb +1 -0
- data/build/integration_tests.rb +28 -43
- data/build/misc.rb +0 -18
- data/build/nginx.rb +2 -6
- data/build/packaging.rb +33 -22
- data/build/preprocessor.rb +2 -4
- data/build/ruby_tests.rb +7 -26
- data/build/test_basics.rb +24 -25
- data/debian.template/control.template +2 -2
- data/debian.template/locations.ini.template +2 -3
- data/debian.template/passenger.install.template +2 -2
- data/debian.template/rules.template +1 -1
- data/dev/ci/run_jenkins.sh +0 -1
- data/dev/ci/run_rpm_tests.sh +3 -0
- data/dev/ci/run_travis.sh +63 -17
- data/dev/copy_boost_headers +22 -6
- data/dev/ruby_server.rb +244 -0
- data/dev/vagrant/provision.sh +3 -1
- data/doc/DebuggingAndStressTesting.md +3 -3
- data/doc/Design and Architecture.txt +5 -6
- data/doc/Packaging.txt.md +35 -6
- data/doc/ServerOptimizationGuide.txt.md +339 -0
- data/doc/Users guide Apache.idmap.txt +177 -187
- data/doc/Users guide Apache.txt +143 -219
- data/doc/Users guide Nginx.idmap.txt +166 -166
- data/doc/Users guide Nginx.txt +265 -223
- data/doc/Users guide Standalone.txt +3 -3
- data/doc/templates/markdown.html.erb +37 -6
- data/doc/users_guide_snippets/environment_variables.txt +1 -1
- data/doc/users_guide_snippets/support_information.txt +1 -1
- data/doc/users_guide_snippets/tips.txt +2 -2
- data/ext/apache2/Configuration.cpp +23 -81
- data/ext/apache2/Configuration.hpp +18 -92
- data/ext/apache2/ConfigurationCommands.cpp +64 -15
- data/ext/apache2/ConfigurationCommands.cpp.erb +8 -4
- data/ext/apache2/ConfigurationFields.hpp +12 -0
- data/ext/apache2/ConfigurationSetters.cpp +73 -1
- data/ext/apache2/ConfigurationSetters.cpp.erb +3 -2
- data/ext/apache2/CreateDirConfig.cpp +6 -0
- data/ext/apache2/DirectoryMapper.h +11 -6
- data/ext/apache2/Hooks.cpp +291 -408
- data/ext/apache2/MergeDirConfig.cpp +42 -0
- data/ext/apache2/SetHeaders.cpp +61 -16
- data/ext/apache2/SetHeaders.cpp.erb +9 -7
- data/ext/boost/container/allocator_traits.hpp +400 -0
- data/ext/boost/container/deque.hpp +2012 -0
- data/ext/boost/container/detail/adaptive_node_pool_impl.hpp +874 -0
- data/ext/boost/container/detail/advanced_insert_int.hpp +369 -0
- data/ext/boost/container/detail/algorithms.hpp +84 -0
- data/ext/boost/container/detail/allocation_type.hpp +54 -0
- data/ext/boost/container/detail/allocator_version_traits.hpp +163 -0
- data/ext/boost/container/detail/config_begin.hpp +49 -0
- data/ext/boost/container/detail/config_end.hpp +17 -0
- data/ext/boost/container/detail/destroyers.hpp +365 -0
- data/ext/boost/container/detail/flat_tree.hpp +1055 -0
- data/ext/boost/container/detail/function_detector.hpp +88 -0
- data/ext/boost/container/detail/iterators.hpp +611 -0
- data/ext/boost/container/detail/math_functions.hpp +113 -0
- data/ext/boost/container/detail/memory_util.hpp +83 -0
- data/ext/boost/container/detail/mpl.hpp +160 -0
- data/ext/boost/container/detail/multiallocation_chain.hpp +286 -0
- data/ext/boost/container/detail/node_alloc_holder.hpp +386 -0
- data/ext/boost/container/detail/node_pool_impl.hpp +365 -0
- data/ext/boost/container/detail/pair.hpp +354 -0
- data/ext/boost/container/detail/pool_common.hpp +52 -0
- data/ext/boost/container/detail/preprocessor.hpp +232 -0
- data/ext/boost/container/detail/transform_iterator.hpp +176 -0
- data/ext/boost/container/detail/tree.hpp +1134 -0
- data/ext/boost/container/detail/type_traits.hpp +210 -0
- data/ext/boost/container/detail/utilities.hpp +1141 -0
- data/ext/boost/container/detail/value_init.hpp +45 -0
- data/ext/boost/container/detail/variadic_templates_tools.hpp +153 -0
- data/ext/boost/container/detail/version_type.hpp +92 -0
- data/ext/boost/container/detail/workaround.hpp +44 -0
- data/ext/boost/container/flat_map.hpp +1674 -0
- data/ext/boost/container/flat_set.hpp +1408 -0
- data/ext/boost/container/list.hpp +1475 -0
- data/ext/boost/container/map.hpp +1508 -0
- data/ext/boost/container/scoped_allocator.hpp +1503 -0
- data/ext/boost/container/scoped_allocator_fwd.hpp +83 -0
- data/ext/boost/container/set.hpp +1280 -0
- data/ext/boost/container/slist.hpp +1706 -0
- data/ext/boost/container/stable_vector.hpp +1869 -0
- data/ext/boost/container/static_vector.hpp +1053 -0
- data/ext/boost/container/string.hpp +2856 -0
- data/ext/boost/container/throw_exception.hpp +110 -0
- data/ext/boost/container/vector.hpp +2671 -0
- data/ext/boost/detail/is_xxx.hpp +61 -0
- data/ext/boost/intrusive/any_hook.hpp +344 -0
- data/ext/boost/intrusive/avl_set.hpp +2528 -0
- data/ext/boost/intrusive/avl_set_hook.hpp +297 -0
- data/ext/boost/intrusive/avltree.hpp +1786 -0
- data/ext/boost/intrusive/avltree_algorithms.hpp +968 -0
- data/ext/boost/intrusive/bs_set_hook.hpp +296 -0
- data/ext/boost/intrusive/circular_list_algorithms.hpp +413 -0
- data/ext/boost/intrusive/circular_slist_algorithms.hpp +404 -0
- data/ext/boost/intrusive/derivation_value_traits.hpp +70 -0
- data/ext/boost/intrusive/detail/any_node_and_algorithms.hpp +297 -0
- data/ext/boost/intrusive/detail/assert.hpp +41 -0
- data/ext/boost/intrusive/detail/avltree_node.hpp +197 -0
- data/ext/boost/intrusive/detail/clear_on_destructor_base.hpp +36 -0
- data/ext/boost/intrusive/detail/common_slist_algorithms.hpp +102 -0
- data/ext/boost/intrusive/detail/config_begin.hpp +52 -0
- data/ext/boost/intrusive/detail/config_end.hpp +15 -0
- data/ext/boost/intrusive/detail/ebo_functor_holder.hpp +95 -0
- data/ext/boost/intrusive/detail/function_detector.hpp +88 -0
- data/ext/boost/intrusive/detail/generic_hook.hpp +209 -0
- data/ext/boost/intrusive/detail/has_member_function_callable_with.hpp +357 -0
- data/ext/boost/intrusive/detail/hashtable_node.hpp +249 -0
- data/ext/boost/intrusive/detail/is_stateful_value_traits.hpp +77 -0
- data/ext/boost/intrusive/detail/list_node.hpp +196 -0
- data/ext/boost/intrusive/detail/memory_util.hpp +288 -0
- data/ext/boost/intrusive/detail/mpl.hpp +383 -0
- data/ext/boost/intrusive/detail/parent_from_member.hpp +97 -0
- data/ext/boost/intrusive/detail/preprocessor.hpp +52 -0
- data/ext/boost/intrusive/detail/rbtree_node.hpp +201 -0
- data/ext/boost/intrusive/detail/slist_node.hpp +166 -0
- data/ext/boost/intrusive/detail/transform_iterator.hpp +173 -0
- data/ext/boost/intrusive/detail/tree_algorithms.hpp +1742 -0
- data/ext/boost/intrusive/detail/tree_node.hpp +199 -0
- data/ext/boost/intrusive/detail/utilities.hpp +858 -0
- data/ext/boost/intrusive/detail/workaround.hpp +22 -0
- data/ext/boost/intrusive/hashtable.hpp +3110 -0
- data/ext/boost/intrusive/intrusive_fwd.hpp +542 -0
- data/ext/boost/intrusive/linear_slist_algorithms.hpp +327 -0
- data/ext/boost/intrusive/link_mode.hpp +46 -0
- data/ext/boost/intrusive/list.hpp +1525 -0
- data/ext/boost/intrusive/list_hook.hpp +290 -0
- data/ext/boost/intrusive/member_value_traits.hpp +70 -0
- data/ext/boost/intrusive/options.hpp +810 -0
- data/ext/boost/intrusive/parent_from_member.hpp +42 -0
- data/ext/boost/intrusive/pointer_plus_bits.hpp +86 -0
- data/ext/boost/intrusive/pointer_traits.hpp +265 -0
- data/ext/boost/intrusive/priority_compare.hpp +39 -0
- data/ext/boost/intrusive/rbtree.hpp +1785 -0
- data/ext/boost/intrusive/rbtree_algorithms.hpp +934 -0
- data/ext/boost/intrusive/set.hpp +2554 -0
- data/ext/boost/intrusive/set_hook.hpp +300 -0
- data/ext/boost/intrusive/sg_set.hpp +2601 -0
- data/ext/boost/intrusive/sgtree.hpp +2009 -0
- data/ext/boost/intrusive/sgtree_algorithms.hpp +807 -0
- data/ext/boost/intrusive/slist.hpp +2219 -0
- data/ext/boost/intrusive/slist_hook.hpp +294 -0
- data/ext/boost/intrusive/splay_set.hpp +2575 -0
- data/ext/boost/intrusive/splay_set_hook.hpp +292 -0
- data/ext/boost/intrusive/splaytree.hpp +1784 -0
- data/ext/boost/intrusive/splaytree_algorithms.hpp +1008 -0
- data/ext/boost/intrusive/treap.hpp +1882 -0
- data/ext/boost/intrusive/treap_algorithms.hpp +919 -0
- data/ext/boost/intrusive/treap_set.hpp +2751 -0
- data/ext/boost/intrusive/trivial_value_traits.hpp +46 -0
- data/ext/boost/intrusive/unordered_set.hpp +2115 -0
- data/ext/boost/intrusive/unordered_set_hook.hpp +434 -0
- data/ext/boost/intrusive_ptr.hpp +18 -0
- data/ext/boost/math/common_factor_ct.hpp +180 -0
- data/ext/boost/math_fwd.hpp +108 -0
- data/ext/boost/move/detail/move_helpers.hpp +175 -0
- data/ext/boost/parameter.hpp +21 -0
- data/ext/boost/parameter/aux_/arg_list.hpp +459 -0
- data/ext/boost/parameter/aux_/cast.hpp +143 -0
- data/ext/boost/parameter/aux_/default.hpp +69 -0
- data/ext/boost/parameter/aux_/is_maybe.hpp +26 -0
- data/ext/boost/parameter/aux_/maybe.hpp +120 -0
- data/ext/boost/parameter/aux_/overloads.hpp +88 -0
- data/ext/boost/parameter/aux_/parameter_requirements.hpp +25 -0
- data/ext/boost/parameter/aux_/parenthesized_type.hpp +119 -0
- data/ext/boost/parameter/aux_/preprocessor/flatten.hpp +115 -0
- data/ext/boost/parameter/aux_/preprocessor/for_each.hpp +103 -0
- data/ext/boost/parameter/aux_/python/invoker.hpp +132 -0
- data/ext/boost/parameter/aux_/python/invoker_iterate.hpp +93 -0
- data/ext/boost/parameter/aux_/result_of0.hpp +36 -0
- data/ext/boost/parameter/aux_/set.hpp +67 -0
- data/ext/boost/parameter/aux_/tag.hpp +38 -0
- data/ext/boost/parameter/aux_/tagged_argument.hpp +188 -0
- data/ext/boost/parameter/aux_/template_keyword.hpp +47 -0
- data/ext/boost/parameter/aux_/unwrap_cv_reference.hpp +97 -0
- data/ext/boost/parameter/aux_/void.hpp +29 -0
- data/ext/boost/parameter/aux_/yesno.hpp +26 -0
- data/ext/boost/parameter/binding.hpp +106 -0
- data/ext/boost/parameter/config.hpp +14 -0
- data/ext/boost/parameter/keyword.hpp +152 -0
- data/ext/boost/parameter/macros.hpp +99 -0
- data/ext/boost/parameter/match.hpp +55 -0
- data/ext/boost/parameter/name.hpp +156 -0
- data/ext/boost/parameter/parameters.hpp +931 -0
- data/ext/boost/parameter/preprocessor.hpp +1178 -0
- data/ext/boost/parameter/python.hpp +735 -0
- data/ext/boost/parameter/value_type.hpp +108 -0
- data/ext/boost/pool/detail/for.m4 +107 -0
- data/ext/boost/pool/detail/guard.hpp +69 -0
- data/ext/boost/pool/detail/mutex.hpp +42 -0
- data/ext/boost/pool/detail/pool_construct.bat +24 -0
- data/ext/boost/pool/detail/pool_construct.ipp +852 -0
- data/ext/boost/pool/detail/pool_construct.m4 +84 -0
- data/ext/boost/pool/detail/pool_construct.sh +12 -0
- data/ext/boost/pool/detail/pool_construct_simple.bat +25 -0
- data/ext/boost/pool/detail/pool_construct_simple.ipp +43 -0
- data/ext/boost/pool/detail/pool_construct_simple.m4 +72 -0
- data/ext/boost/pool/detail/pool_construct_simple.sh +12 -0
- data/ext/boost/pool/object_pool.hpp +287 -0
- data/ext/boost/pool/pool.hpp +1024 -0
- data/ext/boost/pool/pool_alloc.hpp +488 -0
- data/ext/boost/pool/poolfwd.hpp +82 -0
- data/ext/boost/pool/simple_segregated_storage.hpp +377 -0
- data/ext/boost/pool/singleton_pool.hpp +251 -0
- data/ext/boost/preprocessor/arithmetic.hpp +25 -0
- data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
- data/ext/boost/preprocessor/arithmetic/div.hpp +39 -0
- data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
- data/ext/boost/preprocessor/arithmetic/mul.hpp +53 -0
- data/ext/boost/preprocessor/array.hpp +32 -0
- data/ext/boost/preprocessor/array/enum.hpp +33 -0
- data/ext/boost/preprocessor/array/insert.hpp +55 -0
- data/ext/boost/preprocessor/array/pop_back.hpp +37 -0
- data/ext/boost/preprocessor/array/pop_front.hpp +38 -0
- data/ext/boost/preprocessor/array/push_back.hpp +33 -0
- data/ext/boost/preprocessor/array/push_front.hpp +33 -0
- data/ext/boost/preprocessor/array/remove.hpp +54 -0
- data/ext/boost/preprocessor/array/replace.hpp +49 -0
- data/ext/boost/preprocessor/array/reverse.hpp +29 -0
- data/ext/boost/preprocessor/array/to_list.hpp +33 -0
- data/ext/boost/preprocessor/array/to_seq.hpp +33 -0
- data/ext/boost/preprocessor/array/to_tuple.hpp +22 -0
- data/ext/boost/preprocessor/assert_msg.hpp +17 -0
- data/ext/boost/preprocessor/comma.hpp +17 -0
- data/ext/boost/preprocessor/comparison.hpp +24 -0
- data/ext/boost/preprocessor/comparison/equal.hpp +34 -0
- data/ext/boost/preprocessor/comparison/greater.hpp +38 -0
- data/ext/boost/preprocessor/comparison/greater_equal.hpp +38 -0
- data/ext/boost/preprocessor/comparison/less.hpp +46 -0
- data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
- data/ext/boost/preprocessor/comparison/not_equal.hpp +814 -0
- data/ext/boost/preprocessor/config/limits.hpp +30 -0
- data/ext/boost/preprocessor/control.hpp +22 -0
- data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
- data/ext/boost/preprocessor/control/detail/dmc/while.hpp +536 -0
- data/ext/boost/preprocessor/control/detail/edg/while.hpp +534 -0
- data/ext/boost/preprocessor/control/detail/msvc/while.hpp +277 -0
- data/ext/boost/preprocessor/control/expr_if.hpp +30 -0
- data/ext/boost/preprocessor/debug.hpp +18 -0
- data/ext/boost/preprocessor/debug/assert.hpp +44 -0
- data/ext/boost/preprocessor/debug/line.hpp +35 -0
- data/ext/boost/preprocessor/detail/dmc/auto_rec.hpp +286 -0
- data/ext/boost/preprocessor/detail/is_nullary.hpp +30 -0
- data/ext/boost/preprocessor/detail/is_unary.hpp +30 -0
- data/ext/boost/preprocessor/detail/null.hpp +17 -0
- data/ext/boost/preprocessor/detail/split.hpp +35 -0
- data/ext/boost/preprocessor/enum_params_with_defaults.hpp +17 -0
- data/ext/boost/preprocessor/enum_shifted.hpp +17 -0
- data/ext/boost/preprocessor/expand.hpp +17 -0
- data/ext/boost/preprocessor/expr_if.hpp +17 -0
- data/ext/boost/preprocessor/facilities.hpp +23 -0
- data/ext/boost/preprocessor/facilities/apply.hpp +34 -0
- data/ext/boost/preprocessor/facilities/expand.hpp +28 -0
- data/ext/boost/preprocessor/facilities/is_1.hpp +23 -0
- data/ext/boost/preprocessor/facilities/is_empty.hpp +43 -0
- data/ext/boost/preprocessor/facilities/is_empty_or_1.hpp +30 -0
- data/ext/boost/preprocessor/for.hpp +17 -0
- data/ext/boost/preprocessor/if.hpp +17 -0
- data/ext/boost/preprocessor/iteration.hpp +19 -0
- data/ext/boost/preprocessor/iteration/detail/bounds/lower3.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/bounds/lower4.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/bounds/lower5.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/bounds/upper3.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/bounds/upper4.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/bounds/upper5.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/finish.hpp +99 -0
- data/ext/boost/preprocessor/iteration/detail/iter/forward3.hpp +1338 -0
- data/ext/boost/preprocessor/iteration/detail/iter/forward4.hpp +1338 -0
- data/ext/boost/preprocessor/iteration/detail/iter/forward5.hpp +1338 -0
- data/ext/boost/preprocessor/iteration/detail/iter/reverse2.hpp +1296 -0
- data/ext/boost/preprocessor/iteration/detail/iter/reverse3.hpp +1296 -0
- data/ext/boost/preprocessor/iteration/detail/iter/reverse4.hpp +1296 -0
- data/ext/boost/preprocessor/iteration/detail/iter/reverse5.hpp +1296 -0
- data/ext/boost/preprocessor/iteration/detail/local.hpp +812 -0
- data/ext/boost/preprocessor/iteration/detail/rlocal.hpp +782 -0
- data/ext/boost/preprocessor/iteration/detail/self.hpp +21 -0
- data/ext/boost/preprocessor/iteration/detail/start.hpp +99 -0
- data/ext/boost/preprocessor/iteration/local.hpp +26 -0
- data/ext/boost/preprocessor/iteration/self.hpp +19 -0
- data/ext/boost/preprocessor/library.hpp +36 -0
- data/ext/boost/preprocessor/limits.hpp +17 -0
- data/ext/boost/preprocessor/list.hpp +37 -0
- data/ext/boost/preprocessor/list/at.hpp +39 -0
- data/ext/boost/preprocessor/list/cat.hpp +42 -0
- data/ext/boost/preprocessor/list/detail/dmc/fold_left.hpp +279 -0
- data/ext/boost/preprocessor/list/detail/edg/fold_left.hpp +536 -0
- data/ext/boost/preprocessor/list/detail/edg/fold_right.hpp +794 -0
- data/ext/boost/preprocessor/list/enum.hpp +41 -0
- data/ext/boost/preprocessor/list/filter.hpp +54 -0
- data/ext/boost/preprocessor/list/first_n.hpp +58 -0
- data/ext/boost/preprocessor/list/for_each.hpp +49 -0
- data/ext/boost/preprocessor/list/for_each_product.hpp +141 -0
- data/ext/boost/preprocessor/list/rest_n.hpp +55 -0
- data/ext/boost/preprocessor/list/size.hpp +58 -0
- data/ext/boost/preprocessor/list/to_array.hpp +123 -0
- data/ext/boost/preprocessor/list/to_seq.hpp +32 -0
- data/ext/boost/preprocessor/list/to_tuple.hpp +38 -0
- data/ext/boost/preprocessor/logical.hpp +29 -0
- data/ext/boost/preprocessor/logical/bitnor.hpp +38 -0
- data/ext/boost/preprocessor/logical/bitor.hpp +38 -0
- data/ext/boost/preprocessor/logical/bitxor.hpp +38 -0
- data/ext/boost/preprocessor/logical/nor.hpp +30 -0
- data/ext/boost/preprocessor/logical/not.hpp +30 -0
- data/ext/boost/preprocessor/logical/or.hpp +30 -0
- data/ext/boost/preprocessor/logical/xor.hpp +30 -0
- data/ext/boost/preprocessor/max.hpp +17 -0
- data/ext/boost/preprocessor/min.hpp +17 -0
- data/ext/boost/preprocessor/punctuation.hpp +20 -0
- data/ext/boost/preprocessor/punctuation/paren_if.hpp +38 -0
- data/ext/boost/preprocessor/repeat_3rd.hpp +17 -0
- data/ext/boost/preprocessor/repeat_from_to.hpp +17 -0
- data/ext/boost/preprocessor/repeat_from_to_2nd.hpp +17 -0
- data/ext/boost/preprocessor/repeat_from_to_3rd.hpp +17 -0
- data/ext/boost/preprocessor/repetition.hpp +32 -0
- data/ext/boost/preprocessor/repetition/deduce_r.hpp +22 -0
- data/ext/boost/preprocessor/repetition/deduce_z.hpp +22 -0
- data/ext/boost/preprocessor/repetition/detail/dmc/for.hpp +536 -0
- data/ext/boost/preprocessor/repetition/detail/edg/for.hpp +534 -0
- data/ext/boost/preprocessor/repetition/detail/msvc/for.hpp +277 -0
- data/ext/boost/preprocessor/repetition/enum_params_with_defaults.hpp +24 -0
- data/ext/boost/preprocessor/repetition/enum_shifted.hpp +68 -0
- data/ext/boost/preprocessor/repetition/enum_shifted_binary_params.hpp +51 -0
- data/ext/boost/preprocessor/repetition/enum_trailing.hpp +63 -0
- data/ext/boost/preprocessor/repetition/enum_trailing_binary_params.hpp +53 -0
- data/ext/boost/preprocessor/selection.hpp +18 -0
- data/ext/boost/preprocessor/selection/max.hpp +39 -0
- data/ext/boost/preprocessor/selection/min.hpp +39 -0
- data/ext/boost/preprocessor/seq.hpp +43 -0
- data/ext/boost/preprocessor/seq/cat.hpp +49 -0
- data/ext/boost/preprocessor/seq/detail/binary_transform.hpp +40 -0
- data/ext/boost/preprocessor/seq/detail/split.hpp +284 -0
- data/ext/boost/preprocessor/seq/filter.hpp +54 -0
- data/ext/boost/preprocessor/seq/first_n.hpp +30 -0
- data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
- data/ext/boost/preprocessor/seq/fold_right.hpp +288 -0
- data/ext/boost/preprocessor/seq/for_each.hpp +60 -0
- data/ext/boost/preprocessor/seq/for_each_product.hpp +126 -0
- data/ext/boost/preprocessor/seq/insert.hpp +28 -0
- data/ext/boost/preprocessor/seq/pop_back.hpp +29 -0
- data/ext/boost/preprocessor/seq/pop_front.hpp +27 -0
- data/ext/boost/preprocessor/seq/push_back.hpp +19 -0
- data/ext/boost/preprocessor/seq/push_front.hpp +19 -0
- data/ext/boost/preprocessor/seq/remove.hpp +29 -0
- data/ext/boost/preprocessor/seq/replace.hpp +29 -0
- data/ext/boost/preprocessor/seq/rest_n.hpp +30 -0
- data/ext/boost/preprocessor/seq/reverse.hpp +39 -0
- data/ext/boost/preprocessor/seq/subseq.hpp +28 -0
- data/ext/boost/preprocessor/seq/to_array.hpp +28 -0
- data/ext/boost/preprocessor/seq/to_list.hpp +29 -0
- data/ext/boost/preprocessor/seq/to_tuple.hpp +27 -0
- data/ext/boost/preprocessor/seq/transform.hpp +48 -0
- data/ext/boost/preprocessor/slot.hpp +17 -0
- data/ext/boost/preprocessor/slot/counter.hpp +25 -0
- data/ext/boost/preprocessor/slot/detail/counter.hpp +269 -0
- data/ext/boost/preprocessor/slot/detail/slot1.hpp +267 -0
- data/ext/boost/preprocessor/slot/detail/slot2.hpp +267 -0
- data/ext/boost/preprocessor/slot/detail/slot3.hpp +267 -0
- data/ext/boost/preprocessor/slot/detail/slot4.hpp +267 -0
- data/ext/boost/preprocessor/slot/detail/slot5.hpp +267 -0
- data/ext/boost/preprocessor/tuple.hpp +28 -0
- data/ext/boost/preprocessor/tuple/enum.hpp +22 -0
- data/ext/boost/preprocessor/tuple/reverse.hpp +114 -0
- data/ext/boost/preprocessor/tuple/size.hpp +28 -0
- data/ext/boost/preprocessor/tuple/to_array.hpp +37 -0
- data/ext/boost/preprocessor/tuple/to_seq.hpp +114 -0
- data/ext/boost/preprocessor/variadic.hpp +23 -0
- data/ext/boost/preprocessor/variadic/to_array.hpp +32 -0
- data/ext/boost/preprocessor/variadic/to_list.hpp +25 -0
- data/ext/boost/preprocessor/variadic/to_seq.hpp +25 -0
- data/ext/boost/preprocessor/variadic/to_tuple.hpp +24 -0
- data/ext/boost/preprocessor/while.hpp +17 -0
- data/ext/boost/preprocessor/wstringize.hpp +29 -0
- data/ext/boost/smart_ptr/intrusive_ptr.hpp +324 -0
- data/ext/common/AccountsDatabase.h +3 -4
- data/ext/common/AgentsStarter.cpp +12 -15
- data/ext/common/AgentsStarter.h +54 -120
- data/ext/common/ApplicationPool2/AppTypes.cpp +12 -5
- data/ext/common/ApplicationPool2/AppTypes.h +21 -14
- data/ext/common/ApplicationPool2/Common.h +36 -19
- data/ext/common/ApplicationPool2/DirectSpawner.h +15 -16
- data/ext/common/ApplicationPool2/DummySpawner.h +9 -8
- data/ext/common/ApplicationPool2/ErrorRenderer.h +1 -1
- data/ext/common/ApplicationPool2/Group.h +304 -171
- data/ext/common/ApplicationPool2/Implementation.cpp +234 -125
- data/ext/common/ApplicationPool2/Options.h +50 -62
- data/ext/common/ApplicationPool2/Pool.h +285 -189
- data/ext/common/ApplicationPool2/Process.h +126 -115
- data/ext/common/ApplicationPool2/Session.h +70 -30
- data/ext/common/ApplicationPool2/SmartSpawner.h +19 -18
- data/ext/common/ApplicationPool2/Socket.h +57 -43
- data/ext/common/ApplicationPool2/SpawnObject.h +83 -0
- data/ext/common/ApplicationPool2/Spawner.h +59 -38
- data/ext/common/ApplicationPool2/SpawnerFactory.h +8 -14
- data/ext/common/ApplicationPool2/SuperGroup.h +69 -40
- data/ext/common/BackgroundEventLoop.cpp +48 -1
- data/ext/common/BackgroundEventLoop.h +3 -1
- data/ext/common/Constants.h +30 -8
- data/ext/common/DataStructures/HashedStaticString.h +103 -0
- data/ext/common/DataStructures/LString.h +396 -0
- data/ext/common/DataStructures/StringKeyTable.h +588 -0
- data/ext/common/EventedMessageServer.h +1 -0
- data/ext/common/FileDescriptor.h +5 -0
- data/ext/common/InstanceDirectory.h +240 -0
- data/ext/common/Logging.cpp +38 -13
- data/ext/common/Logging.h +53 -22
- data/ext/common/MemoryKit/mbuf.cpp +413 -0
- data/ext/common/MemoryKit/mbuf.h +266 -0
- data/ext/common/MemoryKit/palloc.cpp +337 -0
- data/ext/common/MemoryKit/palloc.h +121 -0
- data/ext/common/ResourceLocator.h +62 -6
- data/ext/common/SafeLibev.h +4 -4
- data/ext/common/ServerKit/AcceptLoadBalancer.h +275 -0
- data/ext/common/ServerKit/Channel.h +747 -0
- data/ext/common/ServerKit/Client.h +166 -0
- data/ext/common/ServerKit/ClientRef.h +130 -0
- data/ext/common/ServerKit/Context.h +129 -0
- data/ext/common/ServerKit/Errors.h +103 -0
- data/ext/common/ServerKit/FdSinkChannel.h +206 -0
- data/ext/common/ServerKit/FdSourceChannel.h +230 -0
- data/ext/common/ServerKit/FileBufferedChannel.h +1399 -0
- data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +228 -0
- data/ext/common/ServerKit/HeaderTable.h +472 -0
- data/ext/common/ServerKit/Hooks.h +79 -0
- data/ext/common/ServerKit/HttpChunkedBodyParser.h +289 -0
- data/ext/common/ServerKit/HttpChunkedBodyParserState.h +70 -0
- data/ext/common/ServerKit/HttpClient.h +94 -0
- data/ext/common/ServerKit/HttpHeaderParser.h +477 -0
- data/ext/common/ServerKit/HttpHeaderParserState.h +60 -0
- data/ext/common/ServerKit/HttpRequest.h +276 -0
- data/ext/common/ServerKit/HttpRequestRef.h +130 -0
- data/ext/common/ServerKit/HttpServer.h +1152 -0
- data/ext/common/ServerKit/Implementation.cpp +47 -0
- data/ext/common/ServerKit/Server.h +1040 -0
- data/ext/common/ServerKit/http_parser.cpp +2259 -0
- data/ext/common/ServerKit/http_parser.h +330 -0
- data/ext/common/StaticString.h +8 -0
- data/ext/common/Utils.cpp +14 -12
- data/ext/common/Utils.h +9 -103
- data/ext/common/Utils/BufferedIO.h +1 -0
- data/ext/common/Utils/CachedFileStat.hpp +1 -7
- data/ext/common/Utils/DateParsing.h +379 -0
- data/ext/common/Utils/FileChangeChecker.h +3 -9
- data/ext/common/Utils/Hasher.cpp +52 -0
- data/ext/common/Utils/Hasher.h +58 -0
- data/ext/common/Utils/IOUtils.cpp +62 -62
- data/ext/common/Utils/JsonUtils.h +21 -0
- data/ext/common/Utils/OptionParsing.h +75 -0
- data/ext/common/Utils/StrIntUtils.cpp +112 -19
- data/ext/common/Utils/StrIntUtils.h +52 -12
- data/ext/common/Utils/StrIntUtilsNoStrictAliasing.cpp +174 -0
- data/ext/common/Utils/VariantMap.h +18 -7
- data/ext/common/Utils/modp_b64.cpp +290 -0
- data/ext/common/Utils/modp_b64.h +241 -0
- data/ext/common/Utils/modp_b64_data.h +479 -0
- data/ext/common/Utils/sysqueue.h +811 -0
- data/ext/common/agents/Base.cpp +71 -98
- data/ext/common/agents/Base.h +11 -3
- data/ext/common/agents/HelperAgent/AdminServer.h +690 -0
- data/ext/common/agents/HelperAgent/Main.cpp +899 -487
- data/ext/common/agents/HelperAgent/OptionParser.h +311 -0
- data/ext/common/agents/HelperAgent/RequestHandler.h +315 -2548
- data/ext/common/agents/HelperAgent/RequestHandler/AppResponse.h +225 -0
- data/ext/common/agents/HelperAgent/RequestHandler/BufferBody.cpp +93 -0
- data/ext/common/agents/HelperAgent/RequestHandler/CheckoutSession.cpp +346 -0
- data/ext/common/agents/HelperAgent/RequestHandler/Client.h +54 -0
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +846 -0
- data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +231 -0
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +434 -0
- data/ext/common/agents/HelperAgent/RequestHandler/Request.h +149 -0
- data/ext/common/agents/HelperAgent/RequestHandler/SendRequest.cpp +887 -0
- data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +293 -0
- data/ext/common/agents/HelperAgent/RequestHandler/Utils.cpp +301 -0
- data/ext/common/agents/HelperAgent/ResponseCache.h +624 -0
- data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +21 -23
- data/ext/common/agents/LoggingAgent/AdminServer.h +369 -0
- data/ext/common/agents/LoggingAgent/LoggingServer.h +1 -0
- data/ext/common/agents/LoggingAgent/Main.cpp +422 -215
- data/ext/common/agents/LoggingAgent/OptionParser.h +167 -0
- data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
- data/ext/common/agents/Main.cpp +107 -0
- data/ext/common/agents/SpawnPreparer/Main.cpp +207 -0
- data/ext/common/agents/TempDirToucher/Main.cpp +429 -0
- data/ext/common/agents/Watchdog/AdminServer.h +390 -0
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +7 -5
- data/ext/common/agents/Watchdog/HelperAgentWatcher.cpp +18 -39
- data/ext/common/agents/Watchdog/InstanceDirToucher.cpp +116 -0
- data/ext/common/agents/Watchdog/LoggingAgentWatcher.cpp +13 -17
- data/ext/common/agents/Watchdog/Main.cpp +743 -202
- data/ext/libeio/eio.c +17 -0
- data/ext/libeio/eio.h +2 -0
- data/ext/nginx/CacheLocationConfig.c +177 -198
- data/ext/nginx/CacheLocationConfig.c.erb +35 -22
- data/ext/nginx/Configuration.c +402 -236
- data/ext/nginx/Configuration.h +12 -5
- data/ext/nginx/ConfigurationCommands.c +35 -15
- data/ext/nginx/ConfigurationCommands.c.erb +4 -4
- data/ext/nginx/ConfigurationFields.h +9 -5
- data/ext/nginx/ConfigurationFields.h.erb +3 -1
- data/ext/nginx/ContentHandler.c +393 -362
- data/ext/nginx/CreateLocationConfig.c +8 -4
- data/ext/nginx/CreateLocationConfig.c.erb +8 -3
- data/ext/nginx/MergeLocationConfig.c +36 -6
- data/ext/nginx/MergeLocationConfig.c.erb +42 -1
- data/ext/nginx/ngx_http_passenger_module.c +28 -15
- data/ext/oxt/detail/backtrace_disabled.hpp +2 -1
- data/ext/oxt/detail/backtrace_enabled.hpp +15 -2
- data/ext/oxt/implementation.cpp +92 -20
- data/ext/oxt/thread.hpp +5 -0
- data/ext/ruby/extconf.rb +3 -6
- data/ext/ruby/passenger_native_support.c +13 -40
- data/helper-scripts/download_binaries/extconf.rb +4 -4
- data/helper-scripts/meteor-loader.rb +12 -112
- data/helper-scripts/node-loader.js +3 -91
- data/helper-scripts/rack-loader.rb +13 -14
- data/helper-scripts/rack-preloader.rb +16 -17
- data/helper-scripts/wsgi-loader.py +11 -7
- data/lib/phusion_passenger.rb +100 -79
- data/lib/phusion_passenger/abstract_installer.rb +28 -3
- data/lib/phusion_passenger/admin_tools.rb +3 -3
- data/lib/phusion_passenger/admin_tools/instance.rb +207 -0
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +98 -0
- data/lib/phusion_passenger/apache2/config_options.rb +72 -22
- data/lib/phusion_passenger/common_library.rb +79 -14
- data/lib/phusion_passenger/config/about_command.rb +17 -23
- data/lib/phusion_passenger/config/admin_command_command.rb +175 -0
- data/lib/phusion_passenger/config/agent_compiler.rb +170 -0
- data/lib/phusion_passenger/config/command.rb +1 -4
- data/lib/phusion_passenger/config/compile_agent_command.rb +102 -0
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +112 -0
- data/lib/phusion_passenger/config/detach_process_command.rb +32 -10
- data/lib/phusion_passenger/config/download_agent_command.rb +285 -0
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +281 -0
- data/lib/phusion_passenger/config/install_agent_command.rb +174 -0
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +231 -0
- data/lib/phusion_passenger/config/installation_utils.rb +241 -0
- data/lib/phusion_passenger/config/list_instances_command.rb +13 -25
- data/lib/phusion_passenger/config/main.rb +43 -14
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +337 -0
- data/lib/phusion_passenger/config/reopen_logs_command.rb +110 -0
- data/lib/phusion_passenger/config/restart_app_command.rb +61 -14
- data/lib/phusion_passenger/config/system_metrics_command.rb +2 -1
- data/lib/phusion_passenger/config/utils.rb +64 -39
- data/lib/phusion_passenger/config/validate_install_command.rb +2 -2
- data/lib/phusion_passenger/constants.rb +27 -6
- data/lib/phusion_passenger/debug_logging.rb +32 -15
- data/lib/phusion_passenger/loader_shared_helpers.rb +2 -5
- data/lib/phusion_passenger/message_client.rb +21 -22
- data/lib/phusion_passenger/native_support.rb +26 -31
- data/lib/phusion_passenger/nginx/config_options.rb +32 -19
- data/lib/phusion_passenger/packaging.rb +7 -3
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +1 -2
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +3 -4
- data/lib/phusion_passenger/platform_info/operating_system.rb +6 -6
- data/lib/phusion_passenger/preloader_shared_helpers.rb +2 -2
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +2 -2
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +168 -65
- data/lib/phusion_passenger/request_handler.rb +47 -82
- data/lib/phusion_passenger/request_handler/thread_handler.rb +46 -10
- data/lib/phusion_passenger/ruby_core_enhancements.rb +25 -77
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +108 -0
- data/lib/phusion_passenger/standalone/app_finder.rb +39 -59
- data/lib/phusion_passenger/standalone/command.rb +27 -275
- data/lib/phusion_passenger/standalone/command2.rb +292 -0
- data/lib/phusion_passenger/standalone/config_utils.rb +87 -0
- data/lib/phusion_passenger/standalone/control_utils.rb +88 -0
- data/lib/phusion_passenger/standalone/main.rb +69 -71
- data/lib/phusion_passenger/standalone/start2_command.rb +799 -0
- data/lib/phusion_passenger/standalone/start_command.rb +406 -467
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +167 -0
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +165 -0
- data/lib/phusion_passenger/standalone/status_command.rb +64 -23
- data/lib/phusion_passenger/standalone/stop_command.rb +69 -32
- data/lib/phusion_passenger/standalone/version_command.rb +1 -5
- data/lib/phusion_passenger/utils.rb +0 -4
- data/lib/phusion_passenger/utils/json.rb +70 -4
- data/lib/phusion_passenger/utils/progress_bar.rb +56 -0
- data/lib/phusion_passenger/utils/tee_input.rb +3 -3
- data/lib/phusion_passenger/utils/unseekable_socket.rb +30 -0
- data/packaging/rpm/nginx_spec/nginx.spec.template +4 -3
- data/packaging/rpm/passenger_spec/passenger.spec.template +6 -10
- data/packaging/rpm/setup-system +2 -1
- data/resources/oss-binaries.phusionpassenger.com.crt +208 -0
- data/resources/templates/config/agent_compiler/confirm_enable_optimizations.txt.erb +5 -0
- data/resources/templates/config/installation_utils/cannot_create_user_support_binaries_dir.txt.erb +15 -0
- data/resources/templates/config/installation_utils/download_tool_missing.txt.erb +7 -0
- data/resources/templates/config/installation_utils/passenger_not_installed_as_root.txt.erb +12 -0
- data/resources/templates/config/installation_utils/support_binaries_dir_not_writable_despite_running_as_root.txt.erb +13 -0
- data/resources/templates/config/installation_utils/unexpected_filesystem_problem.txt.erb +16 -0
- data/{packaging/debian/debian_specs/passenger/patches/series → resources/templates/config/installation_utils/user_support_binaries_dir_not_writable.txt.erb} +0 -0
- data/resources/templates/nginx/nginx_module_sources_not_available.txt.erb +2 -2
- data/resources/templates/standalone/config.erb +14 -16
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +1 -1
- data/test/.rspec +1 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +20 -17
- data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -14
- data/test/cxx/ApplicationPool2/PoolTest.cpp +113 -90
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +18 -27
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +51 -53
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +55 -57
- data/test/cxx/BufferedIOTest.cpp +40 -40
- data/test/cxx/CxxTestMain.cpp +4 -22
- data/test/cxx/DataStructures/LStringTest.cpp +275 -0
- data/test/cxx/DataStructures/StringKeyTableTest.cpp +199 -0
- data/test/cxx/MemoryKit/MbufTest.cpp +213 -0
- data/test/cxx/MessageServerTest.cpp +62 -55
- data/test/cxx/RequestHandlerTest.cpp +26 -27
- data/test/cxx/ServerKit/ChannelTest.cpp +1467 -0
- data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +817 -0
- data/test/cxx/ServerKit/HeaderTableTest.cpp +171 -0
- data/test/cxx/ServerKit/HttpServerTest.cpp +1503 -0
- data/test/cxx/ServerKit/ServerTest.cpp +408 -0
- data/test/cxx/TestSupport.cpp +51 -15
- data/test/cxx/TestSupport.h +31 -21
- data/test/cxx/UnionStationTest.cpp +121 -122
- data/test/cxx/UtilsTest.cpp +9 -33
- data/test/integration_tests/apache2_tests.rb +65 -27
- data/test/integration_tests/downloaded_binaries_tests.rb +30 -6
- data/test/integration_tests/native_packaging_spec.rb +32 -17
- data/test/integration_tests/nginx_tests.rb +28 -10
- data/test/integration_tests/shared/example_webapp_tests.rb +40 -27
- data/test/integration_tests/standalone_tests.rb +232 -169
- data/test/ruby/debug_logging_spec.rb +44 -40
- data/test/ruby/rails3.0/preloader_spec.rb +1 -1
- data/test/ruby/rails3.1/preloader_spec.rb +1 -1
- data/test/ruby/rails3.2/preloader_spec.rb +1 -1
- data/test/ruby/rails4.0/preloader_spec.rb +1 -1
- data/test/ruby/rails4.1/preloader_spec.rb +1 -1
- data/test/ruby/request_handler_spec.rb +62 -24
- data/test/ruby/shared/loader_sharedspec.rb +10 -9
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +23 -22
- data/test/ruby/spec_helper.rb +2 -11
- data/test/ruby/standalone/runtime_installer_spec.rb +15 -13
- data/test/ruby/union_station_spec.rb +45 -40
- data/test/ruby/utils/tee_input_spec.rb +5 -5
- data/test/ruby/utils_spec.rb +3 -39
- data/test/stub/apache2/httpd.conf.erb +5 -2
- data/test/stub/nginx/nginx.conf.erb +3 -1
- data/test/support/apache2_controller.rb +25 -25
- data/test/support/nginx_controller.rb +14 -14
- data/test/support/test_helper.rb +74 -75
- metadata +439 -643
- metadata.gz.asc +7 -7
- data/ext/common/MultiLibeio.cpp +0 -204
- data/ext/common/MultiLibeio.h +0 -67
- data/ext/common/ServerInstanceDir.h +0 -402
- data/ext/common/Utils/Base64.cpp +0 -143
- data/ext/common/Utils/Base64.h +0 -83
- data/ext/common/Utils/HttpHeaderBufferer.h +0 -184
- data/ext/common/Utils/PriorityQueue.h +0 -54
- data/ext/common/Utils/StreamBoyerMooreHorspool.h +0 -512
- data/ext/common/Utils/fib.c +0 -699
- data/ext/common/Utils/fib.h +0 -101
- data/ext/common/Utils/fibpriv.h +0 -67
- data/ext/common/agents/EnvPrinter.c +0 -16
- data/ext/common/agents/HelperAgent/AgentOptions.h +0 -109
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +0 -732
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +0 -294
- data/ext/common/agents/HelperAgent/ScgiRequestParser.h +0 -457
- data/ext/common/agents/LoggingAgent/AdminController.h +0 -96
- data/ext/common/agents/SpawnPreparer.cpp +0 -206
- data/ext/common/agents/TempDirToucher.c +0 -383
- data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +0 -116
- data/helper-scripts/classic-rails-loader.rb +0 -166
- data/helper-scripts/classic-rails-preloader.rb +0 -193
- data/lib/phusion_passenger/admin_tools/server_instance.rb +0 -339
- data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +0 -68
- data/lib/phusion_passenger/classic_rails/thread_handler_extension.rb +0 -40
- data/lib/phusion_passenger/platform_info/openssl.rb +0 -61
- data/lib/phusion_passenger/standalone/config_file.rb +0 -119
- data/lib/phusion_passenger/standalone/help_command.rb +0 -57
- data/lib/phusion_passenger/standalone/runtime_installer.rb +0 -712
- data/lib/phusion_passenger/standalone/runtime_locator.rb +0 -170
- data/lib/phusion_passenger/standalone/utils.rb +0 -58
- data/lib/phusion_passenger/utils/tmpdir.rb +0 -69
- data/packaging/debian/LICENSE.md +0 -19
- data/packaging/debian/README.md +0 -320
- data/packaging/debian/Vagrantfile +0 -25
- data/packaging/debian/build +0 -210
- data/packaging/debian/debian_specs/nginx/changelog +0 -1989
- data/packaging/debian/debian_specs/nginx/compat.erb +0 -5
- data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +0 -25
- data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +0 -24
- data/packaging/debian/debian_specs/nginx/conf/koi-utf +0 -109
- data/packaging/debian/debian_specs/nginx/conf/koi-win +0 -103
- data/packaging/debian/debian_specs/nginx/conf/mime.types +0 -89
- data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +0 -97
- data/packaging/debian/debian_specs/nginx/conf/proxy_params +0 -4
- data/packaging/debian/debian_specs/nginx/conf/scgi_params +0 -16
- data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +0 -93
- data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +0 -13
- data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +0 -5
- data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +0 -16
- data/packaging/debian/debian_specs/nginx/conf/win-utf +0 -125
- data/packaging/debian/debian_specs/nginx/control.erb +0 -226
- data/packaging/debian/debian_specs/nginx/copyright +0 -196
- data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +0 -1
- data/packaging/debian/debian_specs/nginx/gbp.conf +0 -2
- data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +0 -14
- data/packaging/debian/debian_specs/nginx/help/docs/php +0 -119
- data/packaging/debian/debian_specs/nginx/help/docs/support-irc +0 -28
- data/packaging/debian/debian_specs/nginx/help/docs/upstream +0 -51
- data/packaging/debian/debian_specs/nginx/help/examples/drupal +0 -114
- data/packaging/debian/debian_specs/nginx/help/examples/http +0 -59
- data/packaging/debian/debian_specs/nginx/help/examples/mail +0 -30
- data/packaging/debian/debian_specs/nginx/help/examples/mailman +0 -59
- data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +0 -34
- data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +0 -162
- data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +0 -155
- data/packaging/debian/debian_specs/nginx/help/examples/wordpress +0 -74
- data/packaging/debian/debian_specs/nginx/helpers.rb +0 -41
- data/packaging/debian/debian_specs/nginx/index-debian.html.in +0 -32
- data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +0 -32
- data/packaging/debian/debian_specs/nginx/index.html.erb +0 -10
- data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +0 -65
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +0 -510
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +0 -5
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +0 -395
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +0 -119
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +0 -348
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +0 -80
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +0 -826
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +0 -26
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +0 -716
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +0 -26
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +0 -380
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +0 -52
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +0 -32
- data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +0 -215
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +0 -35
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +0 -25
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +0 -93
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +0 -4
- data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +0 -462
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +0 -66
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +0 -26
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +0 -171
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +0 -7
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +0 -21
- data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +0 -1803
- data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +0 -29
- data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +0 -9
- data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +0 -824
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +0 -139
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +0 -395
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +0 -1
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +0 -10
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +0 -8
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +0 -597
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +0 -12
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +0 -25
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +0 -35
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +0 -3
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +0 -4
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +0 -15
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +0 -2
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +0 -7
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +0 -43
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +0 -78
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +0 -6
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +0 -12
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +0 -49
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +0 -63
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +0 -62
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +0 -124
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +0 -48
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +0 -45
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +0 -12
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +0 -4
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +0 -136
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +0 -797
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +0 -17
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +0 -24
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +0 -113
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +0 -2203
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +0 -5423
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +0 -227
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +0 -72
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +0 -98
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +0 -66
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +0 -112
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +0 -16
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +0 -291
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +0 -19
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +0 -117
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +0 -77
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +0 -200
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +0 -155
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +0 -58
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +0 -43
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +0 -129
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +0 -30
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +0 -192
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +0 -21
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +0 -396
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +0 -44
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +0 -72
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +0 -171
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +0 -57
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +0 -12
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +0 -82
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +0 -45
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +0 -138
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +0 -3
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +0 -35
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +0 -3
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +0 -165
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +0 -67
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +0 -583
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +0 -12
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +0 -215
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +0 -7
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +0 -103
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +0 -26
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +0 -602
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +0 -44
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +0 -434
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +0 -37
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +0 -14
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +0 -205
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +0 -27
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +0 -45
- data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +0 -6
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +0 -25
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +0 -1850
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +0 -1558
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +0 -109
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +0 -344
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +0 -25
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +0 -282
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +0 -15
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +0 -183
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +0 -16
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +0 -429
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +0 -18
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +0 -178
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +0 -13
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +0 -667
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +0 -137
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +0 -452
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +0 -31
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +0 -208
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +0 -16
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +0 -788
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +0 -19
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +0 -96
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +0 -13
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +0 -298
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +0 -58
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +0 -110
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +0 -9
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +0 -45
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +0 -8
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +0 -131
- data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +0 -38
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +0 -24
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +0 -206
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +0 -54
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +0 -26
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +0 -191
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +0 -59
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +0 -73
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +0 -783
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +0 -31
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +0 -361
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +0 -120
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +0 -1180
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +0 -1
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +0 -146
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +0 -51
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +0 -178
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +0 -246
- data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +0 -9
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +0 -51
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +0 -6954
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +0 -363
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +0 -5898
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +0 -61
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +0 -3
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +0 -138
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +0 -140
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +0 -52
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +0 -82
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +0 -377
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +0 -77
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +0 -537
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +0 -632
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +0 -31
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +0 -296
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +0 -24
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +0 -175
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +0 -887
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +0 -478
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +0 -67
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +0 -19
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +0 -148
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +0 -369
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +0 -26
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +0 -483
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +0 -379
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +0 -23
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +0 -216
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +0 -23
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +0 -1081
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +0 -56
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +0 -58
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +0 -33
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +0 -302
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +0 -29
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +0 -1370
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +0 -782
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +0 -625
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +0 -23
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +0 -42
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +0 -23
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +0 -320
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +0 -25
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +0 -300
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +0 -227
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +0 -252
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +0 -924
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +0 -184
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +0 -21
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +0 -794
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +0 -28
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +0 -106
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +0 -23
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +0 -94
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +0 -13
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +0 -85
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +0 -2468
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +0 -1169
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +0 -252
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +0 -19
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +0 -351
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +0 -22
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +0 -538
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +0 -86
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +0 -216
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +0 -15
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +0 -1844
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +0 -52
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +0 -191
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +0 -5314
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +0 -156
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +0 -1624
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +0 -56
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +0 -704
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +0 -1741
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +0 -46
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +0 -278
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +0 -21
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +0 -661
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +0 -110
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +0 -283
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +0 -36
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +0 -3972
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +0 -423
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +0 -499
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +0 -20
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +0 -64
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +0 -17
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +0 -5
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +0 -39
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +0 -55
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +0 -27
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +0 -415
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +0 -62
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +0 -64
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +0 -8
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +0 -8
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +0 -102
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +0 -10
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +0 -4
- data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +0 -144
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +0 -107
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +0 -25
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +0 -8
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +0 -329
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +0 -3
- data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +0 -1774
- data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +0 -53
- data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +0 -3
- data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +0 -1356
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +0 -37
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +0 -24
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +0 -20
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +0 -182
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +0 -8
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +0 -23
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +0 -1305
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +0 -52
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +0 -103
- data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +0 -102
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +0 -37
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +0 -141
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +0 -3
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +0 -120
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +0 -199
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +0 -123
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +0 -1298
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +0 -275
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +0 -820
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +0 -470
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +0 -82
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +0 -83
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +0 -81
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +0 -93
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +0 -34
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +0 -415
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +0 -716
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +0 -29
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +0 -64
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +0 -63
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +0 -539
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +0 -682
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +0 -341
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +0 -1413
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +0 -81
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +0 -735
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +0 -315
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +0 -524
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +0 -1749
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +0 -874
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +0 -136
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +0 -32
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +0 -32
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +0 -108
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +0 -59
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +0 -5
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +0 -7
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +0 -29
- data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +0 -129
- data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +0 -135
- data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +0 -45
- data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +0 -32
- data/packaging/debian/debian_specs/nginx/nginx-common.install +0 -3
- data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +0 -2
- data/packaging/debian/debian_specs/nginx/nginx-common.manpages +0 -1
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +0 -10
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +0 -214
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +0 -18
- data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +0 -37
- data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +0 -66
- data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +0 -46
- data/packaging/debian/debian_specs/nginx/nginx-common.preinst +0 -47
- data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +0 -28
- data/packaging/debian/debian_specs/nginx/nginx-doc.docs +0 -2
- data/packaging/debian/debian_specs/nginx/nginx-doc.examples +0 -1
- data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +0 -17
- data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +0 -1
- data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +0 -44
- data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +0 -22
- data/packaging/debian/debian_specs/nginx/nginx.1 +0 -47
- data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +0 -23
- data/packaging/debian/debian_specs/nginx/patches/series +0 -1
- data/packaging/debian/debian_specs/nginx/rules.erb +0 -185
- data/packaging/debian/debian_specs/nginx/source/format +0 -1
- data/packaging/debian/debian_specs/nginx/tests/control +0 -4
- data/packaging/debian/debian_specs/nginx/ufw/nginx +0 -14
- data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +0 -34
- data/packaging/debian/debian_specs/nginx/watch +0 -3
- data/packaging/debian/debian_specs/passenger/README.Debian +0 -12
- data/packaging/debian/debian_specs/passenger/changelog +0 -316
- data/packaging/debian/debian_specs/passenger/compat +0 -1
- data/packaging/debian/debian_specs/passenger/control.erb +0 -123
- data/packaging/debian/debian_specs/passenger/copyright +0 -385
- data/packaging/debian/debian_specs/passenger/helpers.rb +0 -24
- data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +0 -3
- data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +0 -36
- data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +0 -15
- data/packaging/debian/debian_specs/passenger/locations.ini.erb +0 -14
- data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +0 -3
- data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +0 -2
- data/packaging/debian/debian_specs/passenger/passenger.conf +0 -6
- data/packaging/debian/debian_specs/passenger/passenger.docs +0 -4
- data/packaging/debian/debian_specs/passenger/passenger.install.erb +0 -16
- data/packaging/debian/debian_specs/passenger/passenger.load +0 -3
- data/packaging/debian/debian_specs/passenger/passenger.manpages +0 -3
- data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +0 -29
- data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +0 -54
- data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +0 -37
- data/packaging/debian/debian_specs/passenger/rules.erb +0 -84
- data/packaging/debian/debian_specs/passenger/source/format +0 -1
- data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +0 -12
- data/packaging/debian/debian_specs/passenger_enterprise/changelog +0 -316
- data/packaging/debian/debian_specs/passenger_enterprise/compat +0 -1
- data/packaging/debian/debian_specs/passenger_enterprise/control.erb +0 -123
- data/packaging/debian/debian_specs/passenger_enterprise/copyright +0 -385
- data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +0 -2
- data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +0 -3
- data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +0 -36
- data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +0 -15
- data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +0 -14
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +0 -3
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +0 -2
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +0 -4
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +0 -14
- data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +0 -3
- data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +0 -6
- data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +0 -3
- data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +0 -1
- data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +0 -1
- data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +0 -1
- data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
- data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +0 -84
- data/packaging/debian/debian_specs/passenger_enterprise/source/format +0 -1
- data/packaging/debian/docker_images/Makefile +0 -38
- data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
- data/packaging/debian/docker_images/buildbox/Dockerfile +0 -3
- data/packaging/debian/docker_images/buildbox/Gemfile +0 -9
- data/packaging/debian/docker_images/buildbox/Gemfile.lock +0 -42
- data/packaging/debian/docker_images/buildbox/install.sh +0 -85
- data/packaging/debian/docker_images/buildbox/pbuilderrc +0 -4
- data/packaging/debian/docker_images/buildbox/sudoers.conf +0 -6
- data/packaging/debian/docker_images/setup-buildbox-docker-image +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +0 -7
- data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +0 -7
- data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-debian-6/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-debian-6/argparse.py +0 -2374
- data/packaging/debian/docker_images/testbox-debian-6/install.sh +0 -78
- data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-debian-7/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-debian-7/install.sh +0 -71
- data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-debian-8/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-debian-8/install.sh +0 -70
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +0 -69
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +0 -69
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +0 -69
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +0 -3
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +0 -2
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +0 -23
- data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +0 -69
- data/packaging/debian/internal/build/Rakefile +0 -235
- data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +0 -76
- data/packaging/debian/internal/build/build-source-package.rb +0 -121
- data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +0 -17
- data/packaging/debian/internal/build/rakefile_support.rb +0 -96
- data/packaging/debian/internal/build/setup-environment-essentials.sh +0 -15
- data/packaging/debian/internal/build/setup-environment.sh +0 -29
- data/packaging/debian/internal/lib/distro_info.rb +0 -82
- data/packaging/debian/internal/lib/distro_info.sh +0 -303
- data/packaging/debian/internal/lib/distro_info.sh.erb +0 -65
- data/packaging/debian/internal/lib/library.sh +0 -83
- data/packaging/debian/internal/lib/preprocessor.rb +0 -173
- data/packaging/debian/internal/lib/tracking.rb +0 -95
- data/packaging/debian/internal/lib/tracking_category.rb +0 -45
- data/packaging/debian/internal/lib/tracking_database.rb +0 -132
- data/packaging/debian/internal/lib/tracking_task.rb +0 -148
- data/packaging/debian/internal/lib/utils.rb +0 -78
- data/packaging/debian/internal/publish/Rakefile +0 -97
- data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +0 -1
- data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +0 -1
- data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +0 -1
- data/packaging/debian/internal/publish/preinit.sh +0 -7
- data/packaging/debian/internal/publish/rakefile_support.rb +0 -183
- data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +0 -11
- data/packaging/debian/internal/scripts/initccache.sh +0 -35
- data/packaging/debian/internal/scripts/inituidgid.sh +0 -19
- data/packaging/debian/internal/scripts/my_init +0 -340
- data/packaging/debian/internal/scripts/pin_certificates +0 -34
- data/packaging/debian/internal/scripts/regen_distro_info_script.sh +0 -3
- data/packaging/debian/internal/scripts/setup-vagrant.sh +0 -12
- data/packaging/debian/internal/scripts/setuser +0 -31
- data/packaging/debian/internal/shell/initpbuilder.sh +0 -3
- data/packaging/debian/internal/shell/preinit.sh +0 -28
- data/packaging/debian/internal/shell/sudoers.conf +0 -1
- data/packaging/debian/internal/test/apache/apache-24.conf +0 -5
- data/packaging/debian/internal/test/apache/apache-pre-24.conf +0 -4
- data/packaging/debian/internal/test/apache/vhost.conf +0 -17
- data/packaging/debian/internal/test/misc/config.json +0 -15
- data/packaging/debian/internal/test/misc/hosts.conf +0 -4
- data/packaging/debian/internal/test/misc/init.sh +0 -25
- data/packaging/debian/internal/test/misc/nodejs_test_app.js +0 -6
- data/packaging/debian/internal/test/misc/python_test_app.py +0 -3
- data/packaging/debian/internal/test/misc/ruby_test_app.rb +0 -5
- data/packaging/debian/internal/test/misc/test_support.rb +0 -61
- data/packaging/debian/internal/test/nginx/vhost.conf +0 -23
- data/packaging/debian/internal/test/system_web_server_test.rb +0 -126
- data/packaging/debian/internal/test/test.sh +0 -141
- data/packaging/debian/jenkins/publish/clear_caches.rb +0 -48
- data/packaging/debian/jenkins/publish/publish.sh +0 -69
- data/packaging/debian/jenkins/test/test.sh +0 -63
- data/packaging/debian/passenger_apt_automation.sublime-project +0 -14
- data/packaging/debian/publish +0 -172
- data/packaging/debian/shell +0 -116
- data/packaging/debian/test +0 -142
- data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-gcc47-include-sys_types.patch +0 -45
- data/test/cxx/Base64Test.cpp +0 -50
- data/test/cxx/FileBackedPipeTest.cpp +0 -626
- data/test/cxx/HttpHeaderBuffererTest.cpp +0 -257
- data/test/cxx/ScgiRequestParserTest.cpp +0 -423
- data/test/cxx/ServerInstanceDirTest.cpp +0 -175
- data/test/ruby/admin_tools_spec.rb +0 -360
- data/test/ruby/classic_rails/loader_spec.rb +0 -46
- data/test/ruby/classic_rails/preloader_spec.rb +0 -52
- data/test/ruby/standalone/runtime_locator_spec.rb +0 -214
- data/test/stub/rails2.3/Rakefile +0 -10
- data/test/stub/rails2.3/app/controllers/application_controller.rb +0 -10
- data/test/stub/rails2.3/app/controllers/bar_controller_1.rb +0 -5
- data/test/stub/rails2.3/app/controllers/bar_controller_2.rb +0 -5
- data/test/stub/rails2.3/app/controllers/foo_controller.rb +0 -21
- data/test/stub/rails2.3/app/helpers/application_helper.rb +0 -3
- data/test/stub/rails2.3/app/helpers/bar_helper.rb +0 -2
- data/test/stub/rails2.3/app/helpers/foo_helper.rb +0 -2
- data/test/stub/rails2.3/config/boot.rb +0 -110
- data/test/stub/rails2.3/config/database.yml +0 -19
- data/test/stub/rails2.3/config/environment.rb +0 -62
- data/test/stub/rails2.3/config/environments/development.rb +0 -17
- data/test/stub/rails2.3/config/environments/production.rb +0 -18
- data/test/stub/rails2.3/config/environments/staging.rb +0 -18
- data/test/stub/rails2.3/config/initializers/inflections.rb +0 -10
- data/test/stub/rails2.3/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails2.3/config/routes.rb +0 -35
- data/test/stub/rails2.3/log/.gitignore +0 -1
- data/test/stub/rails2.3/public/.gitignore +0 -1
- data/test/stub/rails2.3/script/about +0 -3
- data/test/stub/rails2.3/script/console +0 -3
- data/test/stub/rails2.3/script/dbconsole +0 -3
- data/test/stub/rails2.3/script/destroy +0 -3
- data/test/stub/rails2.3/script/generate +0 -3
- data/test/stub/rails2.3/script/performance/benchmarker +0 -3
- data/test/stub/rails2.3/script/performance/profiler +0 -3
- data/test/stub/rails2.3/script/performance/request +0 -3
- data/test/stub/rails2.3/script/plugin +0 -3
- data/test/stub/rails2.3/script/process/inspector +0 -3
- data/test/stub/rails2.3/script/process/reaper +0 -3
- data/test/stub/rails2.3/script/process/spawner +0 -3
- data/test/stub/rails2.3/script/runner +0 -3
- data/test/stub/rails2.3/script/server +0 -3
- data/test/stub/rails2.3/tmp/cache/.gitignore +0 -1
- data/test/stub/rails2.3/tmp/pids/.gitignore +0 -1
- data/test/stub/rails2.3/tmp/sessions/.gitignore +0 -1
- data/test/stub/rails2.3/tmp/sockets/.gitignore +0 -1
@@ -0,0 +1,206 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
+
* Copyright (c) 2014 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_SERVER_KIT_FD_SINK_CHANNEL_H_
|
26
|
+
#define _PASSENGER_SERVER_KIT_FD_SINK_CHANNEL_H_
|
27
|
+
|
28
|
+
#include <oxt/macros.hpp>
|
29
|
+
#include <cerrno>
|
30
|
+
#include <unistd.h>
|
31
|
+
#include <ev.h>
|
32
|
+
#include <ServerKit/Channel.h>
|
33
|
+
|
34
|
+
namespace Passenger {
|
35
|
+
namespace ServerKit {
|
36
|
+
|
37
|
+
using namespace oxt;
|
38
|
+
|
39
|
+
|
40
|
+
class FdSinkChannel: protected Channel {
|
41
|
+
private:
|
42
|
+
ev_io watcher;
|
43
|
+
|
44
|
+
static Result _onData(Channel *channel, const MemoryKit::mbuf &buffer, int errcode) {
|
45
|
+
return static_cast<FdSinkChannel *>(channel)->onData(buffer, errcode);
|
46
|
+
}
|
47
|
+
|
48
|
+
Result onData(const MemoryKit::mbuf &buffer, int errcode) {
|
49
|
+
if (buffer.size() > 0) {
|
50
|
+
// Data
|
51
|
+
ssize_t ret;
|
52
|
+
|
53
|
+
do {
|
54
|
+
ret = ::write(watcher.fd, buffer.start, buffer.size());
|
55
|
+
} while (ret == -1 && errno == EAGAIN);
|
56
|
+
if (ret == (ssize_t) buffer.size()) {
|
57
|
+
return Result(ret, false);
|
58
|
+
} else if (ret >= 0) {
|
59
|
+
ev_io_start(ctx->libev->getLoop(), &watcher);
|
60
|
+
stop();
|
61
|
+
return Result(ret, false);
|
62
|
+
} else if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
63
|
+
ev_io_start(ctx->libev->getLoop(), &watcher);
|
64
|
+
stop();
|
65
|
+
return Result(0, false);
|
66
|
+
} else {
|
67
|
+
Channel::feedError(errno);
|
68
|
+
return Result(0, false);
|
69
|
+
}
|
70
|
+
} else if (errcode == 0) {
|
71
|
+
// EOF
|
72
|
+
return Channel::Result(0, true);
|
73
|
+
} else {
|
74
|
+
// Error
|
75
|
+
// We do nothing here. The caller is responsible for handling the error.
|
76
|
+
return Channel::Result(0, false);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
static void _onWritable(EV_P_ ev_io *io, int revents) {
|
81
|
+
FdSinkChannel *self = static_cast<FdSinkChannel *>(io->data);
|
82
|
+
ev_io_stop(self->ctx->libev->getLoop(), &self->watcher);
|
83
|
+
self->start();
|
84
|
+
}
|
85
|
+
|
86
|
+
void initialize() {
|
87
|
+
dataCallback = _onData;
|
88
|
+
watcher.fd = -1;
|
89
|
+
watcher.data = this;
|
90
|
+
}
|
91
|
+
|
92
|
+
public:
|
93
|
+
FdSinkChannel() {
|
94
|
+
initialize();
|
95
|
+
}
|
96
|
+
|
97
|
+
FdSinkChannel(Context *context)
|
98
|
+
: Channel(context)
|
99
|
+
{
|
100
|
+
initialize();
|
101
|
+
}
|
102
|
+
|
103
|
+
~FdSinkChannel() {
|
104
|
+
if (ctx != NULL) {
|
105
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
// May only be called right after construction.
|
110
|
+
OXT_FORCE_INLINE
|
111
|
+
void setContext(Context *context) {
|
112
|
+
Channel::setContext(context);
|
113
|
+
}
|
114
|
+
|
115
|
+
void reinitialize(int fd) {
|
116
|
+
Channel::reinitialize();
|
117
|
+
ev_io_init(&watcher, _onWritable, fd, EV_WRITE);
|
118
|
+
}
|
119
|
+
|
120
|
+
void deinitialize() {
|
121
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
122
|
+
watcher.fd = -1;
|
123
|
+
Channel::deinitialize();
|
124
|
+
}
|
125
|
+
|
126
|
+
OXT_FORCE_INLINE
|
127
|
+
int feed(const MemoryKit::mbuf &mbuf) {
|
128
|
+
return Channel::feed(mbuf);
|
129
|
+
}
|
130
|
+
|
131
|
+
OXT_FORCE_INLINE
|
132
|
+
int feed(BOOST_RV_REF(MemoryKit::mbuf) mbuf) {
|
133
|
+
return Channel::feed(mbuf);
|
134
|
+
}
|
135
|
+
|
136
|
+
OXT_FORCE_INLINE
|
137
|
+
int feedWithoutRefGuard(const MemoryKit::mbuf &mbuf) {
|
138
|
+
return Channel::feedWithoutRefGuard(mbuf);
|
139
|
+
}
|
140
|
+
|
141
|
+
OXT_FORCE_INLINE
|
142
|
+
int feedWithoutRefGuard(BOOST_RV_REF(MemoryKit::mbuf) mbuf) {
|
143
|
+
return Channel::feedWithoutRefGuard(mbuf);
|
144
|
+
}
|
145
|
+
|
146
|
+
OXT_FORCE_INLINE
|
147
|
+
void feedError(int errcode) {
|
148
|
+
return Channel::feedError(errcode);
|
149
|
+
}
|
150
|
+
|
151
|
+
OXT_FORCE_INLINE
|
152
|
+
int getFd() const {
|
153
|
+
return watcher.fd;
|
154
|
+
}
|
155
|
+
|
156
|
+
OXT_FORCE_INLINE
|
157
|
+
bool acceptingInput() const {
|
158
|
+
return Channel::acceptingInput();
|
159
|
+
}
|
160
|
+
|
161
|
+
OXT_FORCE_INLINE
|
162
|
+
bool mayAcceptInputLater() const {
|
163
|
+
return Channel::mayAcceptInputLater();
|
164
|
+
}
|
165
|
+
|
166
|
+
OXT_FORCE_INLINE
|
167
|
+
bool hasError() const {
|
168
|
+
return Channel::hasError();
|
169
|
+
}
|
170
|
+
|
171
|
+
OXT_FORCE_INLINE
|
172
|
+
int getErrcode() const {
|
173
|
+
return Channel::getErrcode();
|
174
|
+
}
|
175
|
+
|
176
|
+
OXT_FORCE_INLINE
|
177
|
+
bool ended() const {
|
178
|
+
return Channel::ended();
|
179
|
+
}
|
180
|
+
|
181
|
+
OXT_FORCE_INLINE
|
182
|
+
bool endAcked() const {
|
183
|
+
return Channel::endAcked();
|
184
|
+
}
|
185
|
+
|
186
|
+
OXT_FORCE_INLINE
|
187
|
+
void setConsumedCallback(ConsumedCallback callback) {
|
188
|
+
Channel::consumedCallback = callback;
|
189
|
+
}
|
190
|
+
|
191
|
+
OXT_FORCE_INLINE
|
192
|
+
Hooks *getHooks() const {
|
193
|
+
return hooks;
|
194
|
+
}
|
195
|
+
|
196
|
+
OXT_FORCE_INLINE
|
197
|
+
void setHooks(Hooks *hooks) {
|
198
|
+
this->hooks = hooks;
|
199
|
+
}
|
200
|
+
};
|
201
|
+
|
202
|
+
|
203
|
+
} // namespace ServerKit
|
204
|
+
} // namespace Passenger
|
205
|
+
|
206
|
+
#endif /* _PASSENGER_SERVER_KIT_FD_SINK_CHANNEL_H_ */
|
@@ -0,0 +1,230 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
+
* Copyright (c) 2014 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_SERVER_KIT_FD_SOURCE_CHANNEL_H_
|
26
|
+
#define _PASSENGER_SERVER_KIT_FD_SOURCE_CHANNEL_H_
|
27
|
+
|
28
|
+
#include <oxt/macros.hpp>
|
29
|
+
#include <boost/move/move.hpp>
|
30
|
+
#include <sys/types.h>
|
31
|
+
#include <unistd.h>
|
32
|
+
#include <ev.h>
|
33
|
+
#include <MemoryKit/mbuf.h>
|
34
|
+
#include <ServerKit/Context.h>
|
35
|
+
#include <ServerKit/Channel.h>
|
36
|
+
|
37
|
+
namespace Passenger {
|
38
|
+
namespace ServerKit {
|
39
|
+
|
40
|
+
using namespace oxt;
|
41
|
+
|
42
|
+
|
43
|
+
class FdSourceChannel: protected Channel {
|
44
|
+
private:
|
45
|
+
ev_io watcher;
|
46
|
+
MemoryKit::mbuf buffer;
|
47
|
+
|
48
|
+
static void _onReadable(EV_P_ ev_io *io, int revents) {
|
49
|
+
static_cast<FdSourceChannel *>(io->data)->onReadable(io, revents);
|
50
|
+
}
|
51
|
+
|
52
|
+
void onReadable(ev_io *io, int revents) {
|
53
|
+
RefGuard guard(hooks, this, __FILE__, __LINE__);
|
54
|
+
onReadableWithoutRefGuard();
|
55
|
+
}
|
56
|
+
|
57
|
+
void onReadableWithoutRefGuard() {
|
58
|
+
unsigned int generation = this->generation;
|
59
|
+
unsigned int i, origBufferSize;
|
60
|
+
bool done = false;
|
61
|
+
ssize_t ret;
|
62
|
+
int e;
|
63
|
+
|
64
|
+
if (!acceptingInput()) {
|
65
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
66
|
+
if (mayAcceptInputLater()) {
|
67
|
+
consumedCallback = onChannelConsumed;
|
68
|
+
}
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
|
72
|
+
for (i = 0; i < burstReadCount && !done; i++) {
|
73
|
+
if (buffer.empty()) {
|
74
|
+
buffer = MemoryKit::mbuf_get(&ctx->mbuf_pool);
|
75
|
+
}
|
76
|
+
|
77
|
+
origBufferSize = buffer.size();
|
78
|
+
do {
|
79
|
+
ret = ::read(watcher.fd, buffer.start, buffer.size());
|
80
|
+
} while (OXT_UNLIKELY(ret == -1 && errno == EINTR));
|
81
|
+
if (ret > 0) {
|
82
|
+
MemoryKit::mbuf buffer2(buffer, 0, ret);
|
83
|
+
if (size_t(ret) == size_t(buffer.size())) {
|
84
|
+
// Unref mbuf_block
|
85
|
+
buffer = MemoryKit::mbuf();
|
86
|
+
} else {
|
87
|
+
buffer = MemoryKit::mbuf(buffer, ret);
|
88
|
+
}
|
89
|
+
feedWithoutRefGuard(boost::move(buffer2));
|
90
|
+
if (generation != this->generation) {
|
91
|
+
// Callback deinitialized this object.
|
92
|
+
return;
|
93
|
+
}
|
94
|
+
|
95
|
+
if (!acceptingInput()) {
|
96
|
+
done = true;
|
97
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
98
|
+
if (mayAcceptInputLater()) {
|
99
|
+
consumedCallback = onChannelConsumed;
|
100
|
+
}
|
101
|
+
} else {
|
102
|
+
// If we were unable to fill the entire buffer, then it's likely that
|
103
|
+
// the client is slow and that the next read() will fail with
|
104
|
+
// EAGAIN, so we stop looping and return to the event loop poller.
|
105
|
+
done = (size_t) ret < origBufferSize;
|
106
|
+
}
|
107
|
+
|
108
|
+
} else if (ret == 0) {
|
109
|
+
done = true;
|
110
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
111
|
+
buffer = MemoryKit::mbuf();
|
112
|
+
feedWithoutRefGuard(MemoryKit::mbuf());
|
113
|
+
|
114
|
+
} else {
|
115
|
+
e = errno;
|
116
|
+
done = true;
|
117
|
+
buffer = MemoryKit::mbuf();
|
118
|
+
if (e != EAGAIN && e != EWOULDBLOCK) {
|
119
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
120
|
+
feedError(e);
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
static void onChannelConsumed(Channel *channel, unsigned int size) {
|
127
|
+
FdSourceChannel *self = static_cast<FdSourceChannel *>(channel);
|
128
|
+
self->consumedCallback = NULL;
|
129
|
+
if (self->acceptingInput()) {
|
130
|
+
ev_io_start(self->ctx->libev->getLoop(), &self->watcher);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
void initialize() {
|
135
|
+
burstReadCount = 1;
|
136
|
+
watcher.fd = -1;
|
137
|
+
watcher.data = this;
|
138
|
+
}
|
139
|
+
|
140
|
+
public:
|
141
|
+
unsigned int burstReadCount;
|
142
|
+
|
143
|
+
FdSourceChannel() {
|
144
|
+
initialize();
|
145
|
+
}
|
146
|
+
|
147
|
+
FdSourceChannel(Context *context)
|
148
|
+
: Channel(context)
|
149
|
+
{
|
150
|
+
initialize();
|
151
|
+
}
|
152
|
+
|
153
|
+
~FdSourceChannel() {
|
154
|
+
if (ctx != NULL) {
|
155
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
// May only be called right after construction.
|
160
|
+
OXT_FORCE_INLINE
|
161
|
+
void setContext(Context *context) {
|
162
|
+
Channel::setContext(context);
|
163
|
+
}
|
164
|
+
|
165
|
+
void reinitialize(int fd) {
|
166
|
+
Channel::reinitialize();
|
167
|
+
ev_io_init(&watcher, _onReadable, fd, EV_READ);
|
168
|
+
}
|
169
|
+
|
170
|
+
void deinitialize() {
|
171
|
+
buffer = MemoryKit::mbuf();
|
172
|
+
ev_io_stop(ctx->libev->getLoop(), &watcher);
|
173
|
+
watcher.fd = -1;
|
174
|
+
consumedCallback = NULL;
|
175
|
+
Channel::deinitialize();
|
176
|
+
}
|
177
|
+
|
178
|
+
// May only be called right after the constructor or reinitialize().
|
179
|
+
void startReading() {
|
180
|
+
startReadingInNextTick();
|
181
|
+
onReadableWithoutRefGuard();
|
182
|
+
}
|
183
|
+
|
184
|
+
// May only be called right after the constructor or reinitialize().
|
185
|
+
void startReadingInNextTick() {
|
186
|
+
assert(Channel::acceptingInput());
|
187
|
+
ev_io_start(ctx->libev->getLoop(), &watcher);
|
188
|
+
}
|
189
|
+
|
190
|
+
OXT_FORCE_INLINE
|
191
|
+
void start() {
|
192
|
+
Channel::start();
|
193
|
+
}
|
194
|
+
|
195
|
+
OXT_FORCE_INLINE
|
196
|
+
void stop() {
|
197
|
+
Channel::stop();
|
198
|
+
}
|
199
|
+
|
200
|
+
OXT_FORCE_INLINE
|
201
|
+
void consumed(unsigned int size, bool end) {
|
202
|
+
Channel::consumed(size, end);
|
203
|
+
}
|
204
|
+
|
205
|
+
OXT_FORCE_INLINE
|
206
|
+
int getFd() const {
|
207
|
+
return watcher.fd;
|
208
|
+
}
|
209
|
+
|
210
|
+
OXT_FORCE_INLINE
|
211
|
+
void setDataCallback(DataCallback callback) {
|
212
|
+
Channel::dataCallback = callback;
|
213
|
+
}
|
214
|
+
|
215
|
+
OXT_FORCE_INLINE
|
216
|
+
Hooks *getHooks() const {
|
217
|
+
return hooks;
|
218
|
+
}
|
219
|
+
|
220
|
+
OXT_FORCE_INLINE
|
221
|
+
void setHooks(Hooks *hooks) {
|
222
|
+
this->hooks = hooks;
|
223
|
+
}
|
224
|
+
};
|
225
|
+
|
226
|
+
|
227
|
+
} // namespace ServerKit
|
228
|
+
} // namespace Passenger
|
229
|
+
|
230
|
+
#endif /* _PASSENGER_SERVER_KIT_FD_SOURCE_CHANNEL_H_ */
|
@@ -0,0 +1,1399 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
+
* Copyright (c) 2014 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_SERVER_KIT_FILE_BUFFERED_CHANNEL_H_
|
26
|
+
#define _PASSENGER_SERVER_KIT_FILE_BUFFERED_CHANNEL_H_
|
27
|
+
|
28
|
+
#include <boost/cstdint.hpp>
|
29
|
+
#include <boost/shared_ptr.hpp>
|
30
|
+
#include <boost/make_shared.hpp>
|
31
|
+
#include <boost/move/move.hpp>
|
32
|
+
#include <boost/atomic.hpp>
|
33
|
+
#include <sys/types.h>
|
34
|
+
#include <eio.h>
|
35
|
+
#include <cassert>
|
36
|
+
#include <cstddef>
|
37
|
+
#include <cstring>
|
38
|
+
#include <algorithm>
|
39
|
+
#include <utility>
|
40
|
+
#include <string>
|
41
|
+
#include <deque>
|
42
|
+
#include <Logging.h>
|
43
|
+
#include <ServerKit/Context.h>
|
44
|
+
#include <ServerKit/Errors.h>
|
45
|
+
#include <ServerKit/Channel.h>
|
46
|
+
|
47
|
+
namespace Passenger {
|
48
|
+
namespace ServerKit {
|
49
|
+
|
50
|
+
using namespace std;
|
51
|
+
|
52
|
+
#define FBC_DEBUG(expr) \
|
53
|
+
P_TRACE(3, "[FBC " << (void *) this << "] " << expr)
|
54
|
+
#define FBC_DEBUG_WITH_POS(file, line, expr) \
|
55
|
+
P_TRACE_WITH_POS(3, file, line, "[FBC " << (void *) this << "] " << expr)
|
56
|
+
#define FBC_DEBUG_FROM_STATIC(expr) \
|
57
|
+
P_TRACE(3, "[FBC " << (void *) self << "] " << expr)
|
58
|
+
|
59
|
+
|
60
|
+
/**
|
61
|
+
* Adds "unlimited" buffering capability to a Channel. A Channel has a buffer size
|
62
|
+
* of 1, which is why you can't write to a Channel until the previously written
|
63
|
+
* data is consumed. But with FileBufferedChannel, everything you write to it
|
64
|
+
* is either buffered to memory, or to disk. If the total amount of buffered data is
|
65
|
+
* below a threshold, everything is buffered in memory. Beyond the threshold, buffered
|
66
|
+
* data will be written to disk and freed from memory. This allows you to buffer
|
67
|
+
* a virtually unlimited amount of data, without using a lot of memory.
|
68
|
+
*
|
69
|
+
* FileBufferedChannel operates by default in the in-memory mode. All data is buffered
|
70
|
+
* in memory. Beyond a threshold (determined by `passedThreshold()`), it switches
|
71
|
+
* to in-file mode.
|
72
|
+
*/
|
73
|
+
class FileBufferedChannel: protected Channel {
|
74
|
+
public:
|
75
|
+
/***** Types and constants *****/
|
76
|
+
|
77
|
+
enum Mode {
|
78
|
+
/**
|
79
|
+
* The default mode. The reader is responsible for switching from
|
80
|
+
* in-file mode to in-memory mode.
|
81
|
+
*/
|
82
|
+
IN_MEMORY_MODE,
|
83
|
+
|
84
|
+
/**
|
85
|
+
* The `feed()` method is responsible for switching to
|
86
|
+
* in-file mode.
|
87
|
+
*/
|
88
|
+
IN_FILE_MODE,
|
89
|
+
|
90
|
+
/**
|
91
|
+
* If either the reader or writer encountered an error, it will
|
92
|
+
* cancel everything and switch to the error mode.
|
93
|
+
*
|
94
|
+
* @invariant
|
95
|
+
* readerState == RS_TERMINATED
|
96
|
+
* inFileMode == NULL
|
97
|
+
*/
|
98
|
+
ERROR,
|
99
|
+
|
100
|
+
/**
|
101
|
+
* When switching to the error made, an attempt is made to pass the
|
102
|
+
* error to the data callback. If the previous data callback isn't
|
103
|
+
* finsihed yet, then we'll switch to this state, wait until it
|
104
|
+
* becomes idle, then feed the error and switch to ERROR.
|
105
|
+
*
|
106
|
+
* @invariant
|
107
|
+
* readerState == RS_TERMINATED
|
108
|
+
* inFileMode == NULL
|
109
|
+
*/
|
110
|
+
ERROR_WAITING
|
111
|
+
};
|
112
|
+
|
113
|
+
enum ReaderState {
|
114
|
+
/** The reader isn't active. It will be activated next time a buffer
|
115
|
+
* is pushed to the queue.
|
116
|
+
*/
|
117
|
+
RS_INACTIVE,
|
118
|
+
|
119
|
+
/**
|
120
|
+
* The reader is feeding a buffer to the underlying channel.
|
121
|
+
*/
|
122
|
+
RS_FEEDING,
|
123
|
+
|
124
|
+
/**
|
125
|
+
* The reader is feeding an empty buffer to the underlying channel.
|
126
|
+
*/
|
127
|
+
RS_FEEDING_EOF,
|
128
|
+
|
129
|
+
/**
|
130
|
+
* The reader has just fed a buffer to the underlying channel,
|
131
|
+
* and is waiting for it to become idle.
|
132
|
+
*
|
133
|
+
* Invariant:
|
134
|
+
*
|
135
|
+
* mode < ERROR
|
136
|
+
*/
|
137
|
+
RS_WAITING_FOR_CHANNEL_IDLE,
|
138
|
+
|
139
|
+
/** The reader is reading from the file.
|
140
|
+
*
|
141
|
+
* Invariant:
|
142
|
+
*
|
143
|
+
* mode == IN_FILE_MODE
|
144
|
+
* inFileMode->readRequest != NULL
|
145
|
+
* inFileMode->written > 0
|
146
|
+
*/
|
147
|
+
RS_READING_FROM_FILE,
|
148
|
+
|
149
|
+
/**
|
150
|
+
* The reader has encountered EOF or an error. It cannot be reactivated
|
151
|
+
* until the FileBufferedChannel is deinitialized and reinitialized.
|
152
|
+
*/
|
153
|
+
RS_TERMINATED
|
154
|
+
};
|
155
|
+
|
156
|
+
enum WriterState {
|
157
|
+
/**
|
158
|
+
* The writer isn't active. It will be activated next time
|
159
|
+
* `feed()` notices that the threshold has passed.
|
160
|
+
*
|
161
|
+
* @invariant !passedThreshold()
|
162
|
+
*/
|
163
|
+
WS_INACTIVE,
|
164
|
+
|
165
|
+
/**
|
166
|
+
* The writer is creating a file.
|
167
|
+
*
|
168
|
+
* @invariant passedThreshold()
|
169
|
+
*/
|
170
|
+
WS_CREATING_FILE,
|
171
|
+
|
172
|
+
/**
|
173
|
+
* The writer is moving buffers to the file. It transitions to WS_INACTIVE
|
174
|
+
* when there are no more buffers to move.
|
175
|
+
*
|
176
|
+
* @invariant nbuffers > 0
|
177
|
+
*/
|
178
|
+
WS_MOVING,
|
179
|
+
|
180
|
+
/**
|
181
|
+
* The writer has encountered EOF or an error. It cannot be reactivated
|
182
|
+
* until the FileBufferedChannel is deinitialized and reinitialized.
|
183
|
+
*/
|
184
|
+
WS_TERMINATED
|
185
|
+
};
|
186
|
+
|
187
|
+
typedef Channel::DataCallback DataCallback;
|
188
|
+
typedef void (*Callback)(FileBufferedChannel *channel);
|
189
|
+
|
190
|
+
// `buffered` is 25-bit. This is 2^25-1, or 32 MB.
|
191
|
+
static const unsigned int MAX_MEMORY_BUFFERING = 33554431;
|
192
|
+
|
193
|
+
|
194
|
+
private:
|
195
|
+
struct IOContext {
|
196
|
+
FileBufferedChannel *self;
|
197
|
+
SafeLibevPtr libev;
|
198
|
+
eio_req *req;
|
199
|
+
boost::atomic<bool> canceled;
|
200
|
+
|
201
|
+
eio_ssize_t result;
|
202
|
+
int errcode;
|
203
|
+
|
204
|
+
IOContext(FileBufferedChannel *_self)
|
205
|
+
: self(_self),
|
206
|
+
libev(_self->ctx->libev),
|
207
|
+
req(NULL),
|
208
|
+
canceled(false),
|
209
|
+
result(-1),
|
210
|
+
errcode(-1)
|
211
|
+
{ }
|
212
|
+
|
213
|
+
virtual ~IOContext() { }
|
214
|
+
|
215
|
+
void cancel() {
|
216
|
+
if (req != NULL) {
|
217
|
+
eio_cancel(req);
|
218
|
+
}
|
219
|
+
canceled.store(true, boost::memory_order_release);
|
220
|
+
}
|
221
|
+
|
222
|
+
bool isCanceled() const {
|
223
|
+
return (req != NULL && EIO_CANCELLED(req))
|
224
|
+
|| canceled.load(boost::memory_order_acquire);
|
225
|
+
}
|
226
|
+
|
227
|
+
void eioFinished() {
|
228
|
+
result = req->result;
|
229
|
+
errcode = req->errorno;
|
230
|
+
req = NULL;
|
231
|
+
}
|
232
|
+
};
|
233
|
+
|
234
|
+
struct ReadContext;
|
235
|
+
|
236
|
+
/**
|
237
|
+
* Holds all states for the in-file mode. Reasons why this is a separate
|
238
|
+
* structure:
|
239
|
+
*
|
240
|
+
* - We can keep the size of the FileBufferedChannel small for the common,
|
241
|
+
* fast case where the consumer can keep up with the writes.
|
242
|
+
* - We improve the clarity of the code by clearly grouping variables
|
243
|
+
* that are only used in the in-file mode.
|
244
|
+
* - While eio operations are in progress, they hold a smart pointer to the
|
245
|
+
* InFileMode structure, which ensures that the file descriptor that they
|
246
|
+
* operate on stays open until all eio operations have finished (or until
|
247
|
+
* their cancellation have been acknowledged by their callbacks).
|
248
|
+
*
|
249
|
+
* The variables inside this structure point to different places in the file:
|
250
|
+
*
|
251
|
+
* +------------------------+
|
252
|
+
* | |
|
253
|
+
* | already read |
|
254
|
+
* | |
|
255
|
+
* +------------------------+ <------ readOffset
|
256
|
+
* | | \
|
257
|
+
* | written but not read | |----- written
|
258
|
+
* | | /
|
259
|
+
* +------------------------+ <------ readOffset + written
|
260
|
+
* | buffer being written | --+
|
261
|
+
* +------------------------+ |
|
262
|
+
* | unwritten buffer 1 | |
|
263
|
+
* +------------------------+ |
|
264
|
+
* | unwritten buffer 2 | |---- nbuffers,
|
265
|
+
* +------------------------+ | bytesBuffered
|
266
|
+
* | .... | --+
|
267
|
+
* +------------------------+
|
268
|
+
*/
|
269
|
+
struct InFileMode {
|
270
|
+
/***** Common state *****/
|
271
|
+
|
272
|
+
/**
|
273
|
+
* The file descriptor of the temp file. It's -1 if the file is being
|
274
|
+
* created.
|
275
|
+
*/
|
276
|
+
int fd;
|
277
|
+
|
278
|
+
|
279
|
+
/***** Reader state *****/
|
280
|
+
|
281
|
+
/**
|
282
|
+
* The read operation that the reader is currently performing.
|
283
|
+
*
|
284
|
+
* @invariant
|
285
|
+
* (readRequest != NULL) == (readerState == RS_READING_FROM_FILE)
|
286
|
+
*/
|
287
|
+
ReadContext *readRequest;
|
288
|
+
|
289
|
+
|
290
|
+
/***** Writer state *****/
|
291
|
+
|
292
|
+
WriterState writerState;
|
293
|
+
|
294
|
+
/**
|
295
|
+
* The write operation that the writer is currently performing. Might be
|
296
|
+
* an `eio_open()`, `eio_write()`, or whatever.
|
297
|
+
*
|
298
|
+
* @invariant
|
299
|
+
* (writerRequest != NULL) == (writerState == WS_CREATING_FILE || writerState == WS_MOVING)
|
300
|
+
*/
|
301
|
+
IOContext *writerRequest;
|
302
|
+
|
303
|
+
/**
|
304
|
+
* Number of bytes already read from the file by the reader.
|
305
|
+
*/
|
306
|
+
off_t readOffset;
|
307
|
+
/**
|
308
|
+
* Number of bytes written to the file by the writer (relative to `readOffset`),
|
309
|
+
* but not yet read by the reader.
|
310
|
+
*
|
311
|
+
* `written` can be _negative_, which means that the writer is still writing buffers to
|
312
|
+
* the file, but the reader has already fed one or more of those still-being-written
|
313
|
+
* buffers to the underlying channel.
|
314
|
+
*
|
315
|
+
* @invariant
|
316
|
+
* if written < 0:
|
317
|
+
* nbuffers > 0
|
318
|
+
*/
|
319
|
+
boost::int64_t written;
|
320
|
+
|
321
|
+
InFileMode()
|
322
|
+
: fd(-1),
|
323
|
+
readRequest(NULL),
|
324
|
+
writerState(WS_INACTIVE),
|
325
|
+
writerRequest(NULL),
|
326
|
+
readOffset(0),
|
327
|
+
written(0)
|
328
|
+
{ }
|
329
|
+
|
330
|
+
~InFileMode() {
|
331
|
+
P_ASSERT_EQ(readRequest, 0);
|
332
|
+
P_ASSERT_EQ(writerRequest, 0);
|
333
|
+
if (fd != -1) {
|
334
|
+
eio_close(fd, 0, NULL, NULL);
|
335
|
+
}
|
336
|
+
}
|
337
|
+
};
|
338
|
+
|
339
|
+
FileBufferedChannelConfig *config;
|
340
|
+
Mode mode;
|
341
|
+
ReaderState readerState;
|
342
|
+
/** Number of buffers in `firstBuffer` + `moreBuffers`. */
|
343
|
+
boost::uint16_t nbuffers;
|
344
|
+
|
345
|
+
/**
|
346
|
+
* If an error is encountered, its details are stored here.
|
347
|
+
*
|
348
|
+
* @invariant
|
349
|
+
* (errcode == 0) == (mode < ERROR)
|
350
|
+
*/
|
351
|
+
int errcode;
|
352
|
+
|
353
|
+
/**
|
354
|
+
* `firstBuffer` and `moreBuffers` together form a queue of buffers for the reader
|
355
|
+
* and the writer to process.
|
356
|
+
*
|
357
|
+
* A deque allocates memory on the heap. In the common case where the channel callback
|
358
|
+
* can keep up with the writes, we don't want to have any dynamic memory allocation
|
359
|
+
* at all. That's why we store the first buffer in an instance variable. Only when
|
360
|
+
* there is more than 1 buffer do we use the deque.
|
361
|
+
*
|
362
|
+
* Buffers are pushed to end of the queue, and popped from the beginning. In the in-memory
|
363
|
+
* mode, the reader is responsible for popping buffers. In the in-file mode, the writer
|
364
|
+
* is responsible for popping buffers (and writing them to the file).
|
365
|
+
*/
|
366
|
+
boost::uint32_t bytesBuffered;
|
367
|
+
MemoryKit::mbuf firstBuffer;
|
368
|
+
deque<MemoryKit::mbuf> moreBuffers;
|
369
|
+
|
370
|
+
/**
|
371
|
+
* @invariant
|
372
|
+
* (inFileMode != NULL) == (mode == IN_FILE_MODE)
|
373
|
+
*/
|
374
|
+
boost::shared_ptr<InFileMode> inFileMode;
|
375
|
+
|
376
|
+
|
377
|
+
/***** Buffer manipulation *****/
|
378
|
+
|
379
|
+
void clearBuffers() {
|
380
|
+
nbuffers = 0;
|
381
|
+
bytesBuffered = 0;
|
382
|
+
firstBuffer = MemoryKit::mbuf();
|
383
|
+
if (!moreBuffers.empty()) {
|
384
|
+
// Some STL implementations, like OS X's, iterate through
|
385
|
+
// the deque in its clear() implementation, so adding
|
386
|
+
// a conditional here improves performance slightly.
|
387
|
+
moreBuffers.clear();
|
388
|
+
}
|
389
|
+
}
|
390
|
+
|
391
|
+
void pushBuffer(const MemoryKit::mbuf &buffer) {
|
392
|
+
assert(bytesBuffered + buffer.size() <= MAX_MEMORY_BUFFERING);
|
393
|
+
if (nbuffers == 0) {
|
394
|
+
firstBuffer = buffer;
|
395
|
+
} else {
|
396
|
+
moreBuffers.push_back(buffer);
|
397
|
+
}
|
398
|
+
nbuffers++;
|
399
|
+
bytesBuffered += buffer.size();
|
400
|
+
FBC_DEBUG("pushBuffer() completed: nbuffers = " << nbuffers << ", bytesBuffered = " << bytesBuffered);
|
401
|
+
}
|
402
|
+
|
403
|
+
void popBuffer() {
|
404
|
+
assert(bytesBuffered >= firstBuffer.size());
|
405
|
+
bytesBuffered -= firstBuffer.size();
|
406
|
+
nbuffers--;
|
407
|
+
FBC_DEBUG("popBuffer() completed: nbuffers = " << nbuffers << ", bytesBuffered = " << bytesBuffered);
|
408
|
+
if (moreBuffers.empty()) {
|
409
|
+
firstBuffer = MemoryKit::mbuf();
|
410
|
+
P_ASSERT_EQ(nbuffers, 0);
|
411
|
+
callBuffersFlushedCallback();
|
412
|
+
} else {
|
413
|
+
firstBuffer = moreBuffers.front();
|
414
|
+
moreBuffers.pop_front();
|
415
|
+
}
|
416
|
+
}
|
417
|
+
|
418
|
+
OXT_FORCE_INLINE
|
419
|
+
bool hasBuffers() const {
|
420
|
+
return nbuffers > 0;
|
421
|
+
}
|
422
|
+
|
423
|
+
OXT_FORCE_INLINE
|
424
|
+
MemoryKit::mbuf &peekBuffer() {
|
425
|
+
return firstBuffer;
|
426
|
+
}
|
427
|
+
|
428
|
+
MemoryKit::mbuf &peekLastBuffer() {
|
429
|
+
if (nbuffers <= 1) {
|
430
|
+
return firstBuffer;
|
431
|
+
} else {
|
432
|
+
return moreBuffers.back();
|
433
|
+
}
|
434
|
+
}
|
435
|
+
|
436
|
+
const MemoryKit::mbuf &peekLastBuffer() const {
|
437
|
+
if (nbuffers <= 1) {
|
438
|
+
return firstBuffer;
|
439
|
+
} else {
|
440
|
+
return moreBuffers.back();
|
441
|
+
}
|
442
|
+
}
|
443
|
+
|
444
|
+
void callBuffersFlushedCallback() {
|
445
|
+
if (buffersFlushedCallback != NULL) {
|
446
|
+
FBC_DEBUG("Calling buffersFlushedCallback");
|
447
|
+
buffersFlushedCallback(this);
|
448
|
+
}
|
449
|
+
}
|
450
|
+
|
451
|
+
void callDataFlushedCallback() {
|
452
|
+
if (dataFlushedCallback != NULL) {
|
453
|
+
FBC_DEBUG("Calling dataFlushedCallback");
|
454
|
+
dataFlushedCallback(this);
|
455
|
+
}
|
456
|
+
}
|
457
|
+
|
458
|
+
|
459
|
+
/***** Reader *****/
|
460
|
+
|
461
|
+
void readNext() {
|
462
|
+
RefGuard guard(hooks, this, __FILE__, __LINE__);
|
463
|
+
readNextWithoutRefGuard();
|
464
|
+
}
|
465
|
+
|
466
|
+
void readNextWithoutRefGuard() {
|
467
|
+
begin:
|
468
|
+
FBC_DEBUG("Reader: reading next");
|
469
|
+
P_ASSERT_EQ(Channel::state, IDLE);
|
470
|
+
unsigned int generation = this->generation;
|
471
|
+
|
472
|
+
switch (mode) {
|
473
|
+
case IN_MEMORY_MODE:
|
474
|
+
if (!hasBuffers()) {
|
475
|
+
FBC_DEBUG("Reader: no more buffers. Transitioning to RS_INACTIVE");
|
476
|
+
readerState = RS_INACTIVE;
|
477
|
+
verifyInvariants();
|
478
|
+
callDataFlushedCallback();
|
479
|
+
} else if (peekBuffer().empty()) {
|
480
|
+
FBC_DEBUG("Reader: EOF encountered. Feeding EOF");
|
481
|
+
readerState = RS_FEEDING_EOF;
|
482
|
+
verifyInvariants();
|
483
|
+
{
|
484
|
+
// Make a copy of the buffer so that if the callback calls
|
485
|
+
// deinitialize(), it won't suddenly reset the buffer argument.
|
486
|
+
MemoryKit::mbuf buffer(peekBuffer());
|
487
|
+
Channel::feedWithoutRefGuard(buffer);
|
488
|
+
}
|
489
|
+
if (generation != this->generation || mode >= ERROR) {
|
490
|
+
// Callback deinitialized this object, or callback
|
491
|
+
// called a method that encountered an error.
|
492
|
+
return;
|
493
|
+
}
|
494
|
+
P_ASSERT_EQ(readerState, RS_FEEDING_EOF);
|
495
|
+
verifyInvariants();
|
496
|
+
FBC_DEBUG("Reader: EOF fed. Transitioning to RS_TERMINATED");
|
497
|
+
terminateReaderBecauseOfEOF();
|
498
|
+
} else {
|
499
|
+
MemoryKit::mbuf buffer(peekBuffer());
|
500
|
+
FBC_DEBUG("Reader: found buffer, " << buffer.size() << " bytes");
|
501
|
+
popBuffer();
|
502
|
+
if (generation != this->generation || mode >= ERROR) {
|
503
|
+
// buffersFlushedCallback deinitialized this object, or callback
|
504
|
+
// called a method that encountered an error.
|
505
|
+
return;
|
506
|
+
}
|
507
|
+
readerState = RS_FEEDING;
|
508
|
+
FBC_DEBUG("Reader: feeding buffer, " << buffer.size() << " bytes");
|
509
|
+
Channel::feedWithoutRefGuard(buffer);
|
510
|
+
if (generation != this->generation || mode >= ERROR) {
|
511
|
+
// Callback deinitialized this object, or callback
|
512
|
+
// called a method that encountered an error.
|
513
|
+
return;
|
514
|
+
}
|
515
|
+
P_ASSERT_EQ(readerState, RS_FEEDING);
|
516
|
+
verifyInvariants();
|
517
|
+
if (acceptingInput()) {
|
518
|
+
goto begin;
|
519
|
+
} else if (mayAcceptInputLater()) {
|
520
|
+
readNextWhenChannelIdle();
|
521
|
+
} else {
|
522
|
+
FBC_DEBUG("Reader: data callback no longer accepts further data");
|
523
|
+
terminateReaderBecauseOfEOF();
|
524
|
+
}
|
525
|
+
}
|
526
|
+
break;
|
527
|
+
case IN_FILE_MODE:
|
528
|
+
if (inFileMode->written > 0) {
|
529
|
+
// The file contains unread data. Read from
|
530
|
+
// file and feed to underlying channel.
|
531
|
+
readNextChunkFromFile();
|
532
|
+
} else {
|
533
|
+
// The file contains no unread data. Read next buffer
|
534
|
+
// from memory.
|
535
|
+
pair<MemoryKit::mbuf, bool> result = findBufferForReadProcessing();
|
536
|
+
|
537
|
+
if (!result.second) {
|
538
|
+
readerState = RS_INACTIVE;
|
539
|
+
if (config->autoTruncateFile) {
|
540
|
+
FBC_DEBUG("Reader: no more buffers. Transitioning to RS_INACTIVE, truncating file");
|
541
|
+
switchToInMemoryMode();
|
542
|
+
} else {
|
543
|
+
FBC_DEBUG("Reader: no more buffers. Transitioning to RS_INACTIVE, "
|
544
|
+
"not truncating file because config->autoTruncateFile is turned off");
|
545
|
+
}
|
546
|
+
verifyInvariants();
|
547
|
+
callDataFlushedCallback();
|
548
|
+
} else if (result.first.empty()) {
|
549
|
+
FBC_DEBUG("Reader: EOF encountered. Feeding EOF");
|
550
|
+
readerState = RS_FEEDING_EOF;
|
551
|
+
verifyInvariants();
|
552
|
+
Channel::feedWithoutRefGuard(result.first);
|
553
|
+
if (generation != this->generation || mode >= ERROR) {
|
554
|
+
// Callback deinitialized this object, or callback
|
555
|
+
// called a method that encountered an error.
|
556
|
+
return;
|
557
|
+
}
|
558
|
+
P_ASSERT_EQ(readerState, RS_FEEDING_EOF);
|
559
|
+
verifyInvariants();
|
560
|
+
FBC_DEBUG("Reader: EOF fed. Transitioning to RS_TERMINATED");
|
561
|
+
terminateReaderBecauseOfEOF();
|
562
|
+
} else {
|
563
|
+
FBC_DEBUG("Reader: found buffer, " << result.first.size() << " bytes");
|
564
|
+
inFileMode->readOffset += result.first.size();
|
565
|
+
inFileMode->written -= result.first.size();
|
566
|
+
readerState = RS_FEEDING;
|
567
|
+
FBC_DEBUG("Reader: feeding buffer, " << result.first.size() << " bytes");
|
568
|
+
Channel::feedWithoutRefGuard(result.first);
|
569
|
+
if (generation != this->generation || mode >= ERROR) {
|
570
|
+
// Callback deinitialized this object, or callback
|
571
|
+
// called a method that encountered an error.
|
572
|
+
return;
|
573
|
+
}
|
574
|
+
P_ASSERT_EQ(readerState, RS_FEEDING);
|
575
|
+
verifyInvariants();
|
576
|
+
if (acceptingInput()) {
|
577
|
+
goto begin;
|
578
|
+
} else if (mayAcceptInputLater()) {
|
579
|
+
readNextWhenChannelIdle();
|
580
|
+
} else {
|
581
|
+
FBC_DEBUG("Reader: data callback no longer accepts further data");
|
582
|
+
terminateReaderBecauseOfEOF();
|
583
|
+
}
|
584
|
+
}
|
585
|
+
}
|
586
|
+
break;
|
587
|
+
case ERROR:
|
588
|
+
case ERROR_WAITING:
|
589
|
+
P_BUG("Should never be reached");
|
590
|
+
break;
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
void terminateReaderBecauseOfEOF() {
|
595
|
+
readerState = RS_TERMINATED;
|
596
|
+
verifyInvariants();
|
597
|
+
callDataFlushedCallback();
|
598
|
+
}
|
599
|
+
|
600
|
+
void readNextWhenChannelIdle() {
|
601
|
+
FBC_DEBUG("Reader: waiting for underlying channel to become idle");
|
602
|
+
readerState = RS_WAITING_FOR_CHANNEL_IDLE;
|
603
|
+
verifyInvariants();
|
604
|
+
}
|
605
|
+
|
606
|
+
void channelHasBecomeIdle() {
|
607
|
+
FBC_DEBUG("Reader: underlying channel has become idle");
|
608
|
+
verifyInvariants();
|
609
|
+
//readerState = RS_INACTIVE;
|
610
|
+
readNext();
|
611
|
+
}
|
612
|
+
|
613
|
+
void channelEndedWhileWaitingForItToBecomeIdle() {
|
614
|
+
if (hasError()) {
|
615
|
+
FBC_DEBUG("Reader: error encountered while waiting for underlying channel to become idle");
|
616
|
+
} else {
|
617
|
+
FBC_DEBUG("Reader: underlying channel ended while waiting for it to become idle");
|
618
|
+
}
|
619
|
+
terminateReaderBecauseOfEOF();
|
620
|
+
}
|
621
|
+
|
622
|
+
struct ReadContext: public IOContext {
|
623
|
+
MemoryKit::mbuf buffer;
|
624
|
+
// Smart pointer to keep fd open until eio operation
|
625
|
+
// is finished.
|
626
|
+
boost::shared_ptr<InFileMode> inFileMode;
|
627
|
+
|
628
|
+
ReadContext(FileBufferedChannel *self)
|
629
|
+
: IOContext(self)
|
630
|
+
{ }
|
631
|
+
};
|
632
|
+
|
633
|
+
void readNextChunkFromFile() {
|
634
|
+
size_t size = std::min<size_t>(inFileMode->written,
|
635
|
+
ctx->mbuf_pool.mbuf_block_chunk_size -
|
636
|
+
ctx->mbuf_pool.mbuf_block_offset);
|
637
|
+
FBC_DEBUG("Reader: reading next chunk from file");
|
638
|
+
verifyInvariants();
|
639
|
+
ReadContext *readContext = new ReadContext(this);
|
640
|
+
readContext->buffer = MemoryKit::mbuf_get(&ctx->mbuf_pool);
|
641
|
+
readContext->inFileMode = inFileMode;
|
642
|
+
readerState = RS_READING_FROM_FILE;
|
643
|
+
inFileMode->readRequest = readContext;
|
644
|
+
readContext->req = eio_read(inFileMode->fd, readContext->buffer.start,
|
645
|
+
size, inFileMode->readOffset, 0, _nextChunkDoneReading, readContext);
|
646
|
+
verifyInvariants();
|
647
|
+
}
|
648
|
+
|
649
|
+
static int _nextChunkDoneReading(eio_req *req) {
|
650
|
+
ReadContext *readContext = (ReadContext *) req->data;
|
651
|
+
readContext->eioFinished();
|
652
|
+
if (readContext->isCanceled()) {
|
653
|
+
delete readContext;
|
654
|
+
return 0;
|
655
|
+
}
|
656
|
+
|
657
|
+
if (readContext->libev->onEventLoopThread()) {
|
658
|
+
_nextChunkDoneReading_onEventLoopThread(readContext);
|
659
|
+
} else {
|
660
|
+
readContext->libev->runLater(boost::bind(
|
661
|
+
_nextChunkDoneReading_onEventLoopThread,
|
662
|
+
readContext));
|
663
|
+
}
|
664
|
+
return 0;
|
665
|
+
}
|
666
|
+
|
667
|
+
static void _nextChunkDoneReading_onEventLoopThread(ReadContext *readContext) {
|
668
|
+
if (readContext->isCanceled()) {
|
669
|
+
delete readContext;
|
670
|
+
return;
|
671
|
+
}
|
672
|
+
|
673
|
+
FileBufferedChannel *self = readContext->self;
|
674
|
+
self->nextChunkDoneReading(readContext);
|
675
|
+
}
|
676
|
+
|
677
|
+
void nextChunkDoneReading(ReadContext *readContext) {
|
678
|
+
RefGuard guard(hooks, this, __FILE__, __LINE__);
|
679
|
+
|
680
|
+
FBC_DEBUG("Reader: done reading chunk");
|
681
|
+
P_ASSERT_EQ(readerState, RS_READING_FROM_FILE);
|
682
|
+
verifyInvariants();
|
683
|
+
int fd = readContext->result;
|
684
|
+
int errcode = readContext->errcode;
|
685
|
+
MemoryKit::mbuf buffer(boost::move(readContext->buffer));
|
686
|
+
delete readContext;
|
687
|
+
inFileMode->readRequest = NULL;
|
688
|
+
|
689
|
+
if (fd != -1) {
|
690
|
+
unsigned int generation = this->generation;
|
691
|
+
|
692
|
+
assert(fd <= inFileMode->written);
|
693
|
+
buffer = MemoryKit::mbuf(buffer, 0, fd);
|
694
|
+
inFileMode->readOffset += buffer.size();
|
695
|
+
inFileMode->written -= buffer.size();
|
696
|
+
|
697
|
+
FBC_DEBUG("Reader: feeding buffer, " << buffer.size() << " bytes");
|
698
|
+
readerState = RS_FEEDING;
|
699
|
+
Channel::feedWithoutRefGuard(buffer);
|
700
|
+
if (generation != this->generation || mode >= ERROR) {
|
701
|
+
// Callback deinitialized this object, or callback
|
702
|
+
// called a method that encountered an error.
|
703
|
+
return;
|
704
|
+
}
|
705
|
+
P_ASSERT_EQ(readerState, RS_FEEDING);
|
706
|
+
verifyInvariants();
|
707
|
+
if (acceptingInput()) {
|
708
|
+
readerState = RS_INACTIVE;
|
709
|
+
readNext();
|
710
|
+
} else if (mayAcceptInputLater()) {
|
711
|
+
readNextWhenChannelIdle();
|
712
|
+
} else {
|
713
|
+
FBC_DEBUG("Reader: data callback no longer accepts further data");
|
714
|
+
terminateReaderBecauseOfEOF();
|
715
|
+
}
|
716
|
+
} else {
|
717
|
+
setError(errcode, __FILE__, __LINE__);
|
718
|
+
}
|
719
|
+
}
|
720
|
+
|
721
|
+
// Returns (mbuf, found).
|
722
|
+
pair<MemoryKit::mbuf, bool> findBufferForReadProcessing() {
|
723
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
724
|
+
|
725
|
+
if (nbuffers == 0) {
|
726
|
+
return make_pair(MemoryKit::mbuf(), false);
|
727
|
+
}
|
728
|
+
|
729
|
+
boost::int32_t target = -inFileMode->written;
|
730
|
+
boost::int32_t offset = 0;
|
731
|
+
deque<MemoryKit::mbuf>::iterator it, end = moreBuffers.end();
|
732
|
+
|
733
|
+
if (offset == target) {
|
734
|
+
return make_pair(firstBuffer, true);
|
735
|
+
}
|
736
|
+
|
737
|
+
it = moreBuffers.begin();
|
738
|
+
offset += firstBuffer.size();
|
739
|
+
while (it != end) {
|
740
|
+
if (offset == target || it->empty()) {
|
741
|
+
return make_pair(*it, true);
|
742
|
+
} else {
|
743
|
+
offset += it->size();
|
744
|
+
it++;
|
745
|
+
}
|
746
|
+
}
|
747
|
+
|
748
|
+
return make_pair(MemoryKit::mbuf(), false);
|
749
|
+
}
|
750
|
+
|
751
|
+
|
752
|
+
/***** Switching to or resetting in-file mode *****/
|
753
|
+
|
754
|
+
void switchToInFileMode() {
|
755
|
+
P_ASSERT_EQ(mode, IN_MEMORY_MODE);
|
756
|
+
P_ASSERT_EQ(inFileMode, 0);
|
757
|
+
|
758
|
+
FBC_DEBUG("Switching to in-file mode");
|
759
|
+
mode = IN_FILE_MODE;
|
760
|
+
inFileMode = boost::make_shared<InFileMode>();
|
761
|
+
createBufferFile();
|
762
|
+
}
|
763
|
+
|
764
|
+
/**
|
765
|
+
* "Truncates" the the temp file by closing it and creating
|
766
|
+
* a new one, instead of calling `ftruncate()` or something.
|
767
|
+
* This way, any pending I/O operations in the background won't
|
768
|
+
* affect correctness.
|
769
|
+
*/
|
770
|
+
void switchToInMemoryMode() {
|
771
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
772
|
+
assert(inFileMode->written <= 0);
|
773
|
+
|
774
|
+
FBC_DEBUG("Recreating file, switching to in-memory mode");
|
775
|
+
cancelWriter();
|
776
|
+
clearBuffers();
|
777
|
+
mode = IN_MEMORY_MODE;
|
778
|
+
inFileMode.reset();
|
779
|
+
}
|
780
|
+
|
781
|
+
|
782
|
+
/***** File creator *****/
|
783
|
+
|
784
|
+
struct FileCreationContext: public IOContext {
|
785
|
+
string path;
|
786
|
+
|
787
|
+
FileCreationContext(FileBufferedChannel *self)
|
788
|
+
: IOContext(self)
|
789
|
+
{ }
|
790
|
+
};
|
791
|
+
|
792
|
+
void createBufferFile() {
|
793
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
794
|
+
P_ASSERT_EQ(inFileMode->writerState, WS_INACTIVE);
|
795
|
+
P_ASSERT_EQ(inFileMode->fd, -1);
|
796
|
+
|
797
|
+
FileCreationContext *fcContext = new FileCreationContext(this);
|
798
|
+
fcContext->path = config->bufferDir;
|
799
|
+
fcContext->path.append("/buffer.");
|
800
|
+
fcContext->path.append(toString(rand()));
|
801
|
+
|
802
|
+
inFileMode->writerState = WS_CREATING_FILE;
|
803
|
+
inFileMode->writerRequest = fcContext;
|
804
|
+
|
805
|
+
if (config->delayInFileModeSwitching == 0) {
|
806
|
+
FBC_DEBUG("Writer: creating file " << fcContext->path);
|
807
|
+
fcContext->req = eio_open(fcContext->path.c_str(),
|
808
|
+
O_RDWR | O_CREAT | O_EXCL, 0600, 0,
|
809
|
+
_bufferFileCreated, fcContext);
|
810
|
+
} else {
|
811
|
+
FBC_DEBUG("Writer: delaying in-file mode switching for " <<
|
812
|
+
config->delayInFileModeSwitching << "ms");
|
813
|
+
fcContext->req = eio_busy(
|
814
|
+
(eio_tstamp) config->delayInFileModeSwitching / 1000.0,
|
815
|
+
0, _bufferFileDoneDelaying, fcContext);
|
816
|
+
}
|
817
|
+
}
|
818
|
+
|
819
|
+
static int _bufferFileDoneDelaying(eio_req *req) {
|
820
|
+
FileCreationContext *fcContext = static_cast<FileCreationContext *>(req->data);
|
821
|
+
fcContext->eioFinished();
|
822
|
+
if (fcContext->isCanceled()) {
|
823
|
+
delete fcContext;
|
824
|
+
return 0;
|
825
|
+
}
|
826
|
+
|
827
|
+
if (fcContext->libev->onEventLoopThread()) {
|
828
|
+
_bufferFileDoneDelaying_onEventLoopThread(fcContext);
|
829
|
+
} else {
|
830
|
+
fcContext->libev->runLater(boost::bind(
|
831
|
+
_bufferFileDoneDelaying_onEventLoopThread,
|
832
|
+
fcContext));
|
833
|
+
}
|
834
|
+
return 0;
|
835
|
+
}
|
836
|
+
|
837
|
+
static void _bufferFileDoneDelaying_onEventLoopThread(FileCreationContext *fcContext) {
|
838
|
+
if (fcContext->isCanceled()) {
|
839
|
+
delete fcContext;
|
840
|
+
return;
|
841
|
+
}
|
842
|
+
|
843
|
+
FileBufferedChannel *self = fcContext->self;
|
844
|
+
self->bufferFileDoneDelaying(fcContext);
|
845
|
+
}
|
846
|
+
|
847
|
+
void bufferFileDoneDelaying(FileCreationContext *fcContext) {
|
848
|
+
FBC_DEBUG("Writer: done delaying in-file mode switching. "
|
849
|
+
"Creating file: " << fcContext->path);
|
850
|
+
fcContext->req = eio_open(fcContext->path.c_str(),
|
851
|
+
O_RDWR | O_CREAT | O_EXCL, 0600, 0,
|
852
|
+
_bufferFileCreated, fcContext);
|
853
|
+
}
|
854
|
+
|
855
|
+
static int _bufferFileCreated(eio_req *req) {
|
856
|
+
FileCreationContext *fcContext = static_cast<FileCreationContext *>(req->data);
|
857
|
+
fcContext->eioFinished();
|
858
|
+
if (fcContext->isCanceled()) {
|
859
|
+
if (req->result != -1) {
|
860
|
+
FileBufferedChannel *self = fcContext->self;
|
861
|
+
FBC_DEBUG_FROM_STATIC("Writer: creation of file " << fcContext->path <<
|
862
|
+
"canceled. Deleting file in the background");
|
863
|
+
eio_unlink(fcContext->path.c_str(), 0, bufferFileUnlinked, fcContext);
|
864
|
+
eio_close(req->result, 0, NULL, NULL);
|
865
|
+
} else {
|
866
|
+
delete fcContext;
|
867
|
+
}
|
868
|
+
return 0;
|
869
|
+
}
|
870
|
+
|
871
|
+
if (fcContext->libev->onEventLoopThread()) {
|
872
|
+
_bufferFileCreated_onEventLoopThread(fcContext);
|
873
|
+
} else {
|
874
|
+
fcContext->libev->runLater(boost::bind(
|
875
|
+
_bufferFileCreated_onEventLoopThread,
|
876
|
+
fcContext));
|
877
|
+
}
|
878
|
+
return 0;
|
879
|
+
}
|
880
|
+
|
881
|
+
static void _bufferFileCreated_onEventLoopThread(FileCreationContext *fcContext) {
|
882
|
+
if (fcContext->isCanceled()) {
|
883
|
+
if (fcContext->result != -1) {
|
884
|
+
FileBufferedChannel *self = fcContext->self;
|
885
|
+
FBC_DEBUG_FROM_STATIC("Writer: creation of file " << fcContext->path <<
|
886
|
+
"canceled. Deleting file in the background");
|
887
|
+
eio_unlink(fcContext->path.c_str(), 0, bufferFileUnlinked, fcContext);
|
888
|
+
eio_close(fcContext->result, 0, NULL, NULL);
|
889
|
+
} else {
|
890
|
+
delete fcContext;
|
891
|
+
}
|
892
|
+
return;
|
893
|
+
}
|
894
|
+
|
895
|
+
FileBufferedChannel *self = fcContext->self;
|
896
|
+
self->bufferFileCreated(fcContext);
|
897
|
+
}
|
898
|
+
|
899
|
+
void bufferFileCreated(FileCreationContext *fcContext) {
|
900
|
+
P_ASSERT_EQ(inFileMode->writerState, WS_CREATING_FILE);
|
901
|
+
verifyInvariants();
|
902
|
+
int fd = fcContext->result;
|
903
|
+
int errcode = fcContext->errcode;
|
904
|
+
inFileMode->writerRequest = NULL;
|
905
|
+
|
906
|
+
if (fd != -1) {
|
907
|
+
FBC_DEBUG("Writer: file created. Deleting file in the background");
|
908
|
+
eio_unlink(fcContext->path.c_str(), 0, bufferFileUnlinked, fcContext);
|
909
|
+
inFileMode->fd = fd;
|
910
|
+
moveNextBufferToFile();
|
911
|
+
} else {
|
912
|
+
delete fcContext;
|
913
|
+
if (errcode == EEXIST) {
|
914
|
+
FBC_DEBUG("Writer: file already exists, retrying");
|
915
|
+
inFileMode->writerState = WS_INACTIVE;
|
916
|
+
createBufferFile();
|
917
|
+
verifyInvariants();
|
918
|
+
} else {
|
919
|
+
setError(errcode, __FILE__, __LINE__);
|
920
|
+
}
|
921
|
+
}
|
922
|
+
}
|
923
|
+
|
924
|
+
static int bufferFileUnlinked(eio_req *req) {
|
925
|
+
FileCreationContext *fcContext = static_cast<FileCreationContext *>(req->data);
|
926
|
+
FileBufferedChannel *self = fcContext->self;
|
927
|
+
|
928
|
+
if (fcContext->isCanceled()) {
|
929
|
+
delete fcContext;
|
930
|
+
return 0;
|
931
|
+
}
|
932
|
+
|
933
|
+
if (req->result != -1) {
|
934
|
+
FBC_DEBUG_FROM_STATIC("Writer: file " << fcContext->path << " deleted");
|
935
|
+
} else {
|
936
|
+
FBC_DEBUG_FROM_STATIC("Writer: failed to delete " << fcContext->path <<
|
937
|
+
": errno=" << req->errorno << " (" << strerror(req->errorno) << ")");
|
938
|
+
}
|
939
|
+
|
940
|
+
delete fcContext;
|
941
|
+
return 0;
|
942
|
+
}
|
943
|
+
|
944
|
+
|
945
|
+
/***** Mover *****/
|
946
|
+
|
947
|
+
struct MoveContext: public IOContext {
|
948
|
+
// Smart pointer to keep fd open until eio operation
|
949
|
+
// is finished.
|
950
|
+
boost::shared_ptr<InFileMode> inFileMode;
|
951
|
+
MemoryKit::mbuf buffer;
|
952
|
+
size_t written;
|
953
|
+
|
954
|
+
MoveContext(FileBufferedChannel *self)
|
955
|
+
: IOContext(self)
|
956
|
+
{ }
|
957
|
+
};
|
958
|
+
|
959
|
+
void moveNextBufferToFile() {
|
960
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
961
|
+
assert(inFileMode->fd != -1);
|
962
|
+
verifyInvariants();
|
963
|
+
|
964
|
+
if (nbuffers == 0) {
|
965
|
+
FBC_DEBUG("Writer: no more buffers. Transitioning to WS_INACTIVE");
|
966
|
+
inFileMode->writerState = WS_INACTIVE;
|
967
|
+
return;
|
968
|
+
} else if (peekBuffer().empty()) {
|
969
|
+
FBC_DEBUG("Writer: EOF encountered. Transitioning to WS_TERMINATED");
|
970
|
+
inFileMode->writerState = WS_TERMINATED;
|
971
|
+
return;
|
972
|
+
}
|
973
|
+
|
974
|
+
FBC_DEBUG("Writer: moving next buffer to file: " <<
|
975
|
+
peekBuffer().size() << " bytes");
|
976
|
+
|
977
|
+
MoveContext *moveContext = new MoveContext(this);
|
978
|
+
moveContext->inFileMode = inFileMode;
|
979
|
+
moveContext->buffer = peekBuffer();
|
980
|
+
moveContext->written = 0;
|
981
|
+
|
982
|
+
inFileMode->writerState = WS_MOVING;
|
983
|
+
inFileMode->writerRequest = moveContext;
|
984
|
+
moveContext->req = eio_write(inFileMode->fd,
|
985
|
+
moveContext->buffer.start,
|
986
|
+
moveContext->buffer.size(),
|
987
|
+
inFileMode->readOffset + inFileMode->written,
|
988
|
+
0, _bufferWrittenToFile, moveContext);
|
989
|
+
verifyInvariants();
|
990
|
+
}
|
991
|
+
|
992
|
+
static int _bufferWrittenToFile(eio_req *req) {
|
993
|
+
MoveContext *moveContext = static_cast<MoveContext *>(req->data);
|
994
|
+
moveContext->eioFinished();
|
995
|
+
if (moveContext->isCanceled()) {
|
996
|
+
delete moveContext;
|
997
|
+
return 0;
|
998
|
+
}
|
999
|
+
|
1000
|
+
if (moveContext->libev->onEventLoopThread()) {
|
1001
|
+
_bufferWrittenToFile_onEventLoopThread(moveContext);
|
1002
|
+
} else {
|
1003
|
+
moveContext->libev->runLater(boost::bind(
|
1004
|
+
_bufferWrittenToFile_onEventLoopThread,
|
1005
|
+
moveContext));
|
1006
|
+
}
|
1007
|
+
return 0;
|
1008
|
+
}
|
1009
|
+
|
1010
|
+
static void _bufferWrittenToFile_onEventLoopThread(MoveContext *moveContext) {
|
1011
|
+
if (moveContext->isCanceled()) {
|
1012
|
+
delete moveContext;
|
1013
|
+
return;
|
1014
|
+
}
|
1015
|
+
|
1016
|
+
FileBufferedChannel *self = moveContext->self;
|
1017
|
+
self->bufferWrittenToFile(moveContext);
|
1018
|
+
}
|
1019
|
+
|
1020
|
+
void bufferWrittenToFile(MoveContext *moveContext) {
|
1021
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
1022
|
+
P_ASSERT_EQ(inFileMode->writerState, WS_MOVING);
|
1023
|
+
assert(!peekBuffer().empty());
|
1024
|
+
verifyInvariants();
|
1025
|
+
|
1026
|
+
if (moveContext->result != -1) {
|
1027
|
+
moveContext->written += moveContext->result;
|
1028
|
+
assert(moveContext->written <= moveContext->buffer.size());
|
1029
|
+
|
1030
|
+
if (moveContext->written == moveContext->buffer.size()) {
|
1031
|
+
// Write completed. Proceed with next buffer.
|
1032
|
+
RefGuard guard(hooks, this, __FILE__, __LINE__);
|
1033
|
+
unsigned int generation = this->generation;
|
1034
|
+
|
1035
|
+
FBC_DEBUG("Writer: move complete");
|
1036
|
+
assert(peekBuffer().size() == moveContext->buffer.size());
|
1037
|
+
inFileMode->written += moveContext->buffer.size();
|
1038
|
+
|
1039
|
+
popBuffer();
|
1040
|
+
if (generation != this->generation || mode >= ERROR) {
|
1041
|
+
// buffersFlushedCallback deinitialized this object, or callback
|
1042
|
+
// called a method that encountered an error.
|
1043
|
+
delete moveContext;
|
1044
|
+
return;
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
inFileMode->writerRequest = NULL;
|
1048
|
+
delete moveContext;
|
1049
|
+
moveNextBufferToFile();
|
1050
|
+
} else {
|
1051
|
+
FBC_DEBUG("Writer: move incomplete, proceeding " <<
|
1052
|
+
"with writing rest of buffer");
|
1053
|
+
moveContext->req = eio_write(inFileMode->fd,
|
1054
|
+
moveContext->buffer.start + moveContext->written,
|
1055
|
+
moveContext->buffer.size() - moveContext->written,
|
1056
|
+
inFileMode->readOffset + inFileMode->written,
|
1057
|
+
0, _bufferWrittenToFile, moveContext);
|
1058
|
+
verifyInvariants();
|
1059
|
+
}
|
1060
|
+
} else {
|
1061
|
+
FBC_DEBUG("Writer: file write failed");
|
1062
|
+
int errcode = moveContext->errcode;
|
1063
|
+
delete moveContext;
|
1064
|
+
inFileMode->writerRequest = NULL;
|
1065
|
+
inFileMode->writerState = WS_TERMINATED;
|
1066
|
+
setError(errcode, __FILE__, __LINE__);
|
1067
|
+
}
|
1068
|
+
}
|
1069
|
+
|
1070
|
+
|
1071
|
+
/***** Misc *****/
|
1072
|
+
|
1073
|
+
void setError(int errcode, const char *file, unsigned int line) {
|
1074
|
+
if (mode >= ERROR) {
|
1075
|
+
return;
|
1076
|
+
}
|
1077
|
+
|
1078
|
+
FBC_DEBUG_WITH_POS(file, line, "Setting error: errno=" <<
|
1079
|
+
errcode << " (" << getErrorDesc(errcode) << ")");
|
1080
|
+
cancelReader();
|
1081
|
+
if (mode == IN_FILE_MODE) {
|
1082
|
+
cancelWriter();
|
1083
|
+
}
|
1084
|
+
readerState = RS_TERMINATED;
|
1085
|
+
this->errcode = errcode;
|
1086
|
+
inFileMode.reset();
|
1087
|
+
if (acceptingInput()) {
|
1088
|
+
FBC_DEBUG("Feeding error");
|
1089
|
+
mode = ERROR;
|
1090
|
+
Channel::feedError(errcode);
|
1091
|
+
} else {
|
1092
|
+
FBC_DEBUG("Waiting until underlying channel becomes idle for error feeding");
|
1093
|
+
mode = ERROR_WAITING;
|
1094
|
+
}
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
void feedErrorWhenChannelIdleOrEnded() {
|
1098
|
+
assert(errcode != 0);
|
1099
|
+
if (isIdle()) {
|
1100
|
+
FBC_DEBUG("Channel has become idle. Feeding error");
|
1101
|
+
Channel::feedError(errcode);
|
1102
|
+
} else {
|
1103
|
+
FBC_DEBUG("Channel ended while trying to feed an error");
|
1104
|
+
}
|
1105
|
+
}
|
1106
|
+
|
1107
|
+
/**
|
1108
|
+
* Must be used in combination with `setError()`, so that the reader will
|
1109
|
+
* stop processing after returning from `Channel::feed()`.
|
1110
|
+
*/
|
1111
|
+
void cancelReader() {
|
1112
|
+
switch (readerState) {
|
1113
|
+
case RS_FEEDING:
|
1114
|
+
case RS_FEEDING_EOF:
|
1115
|
+
case RS_WAITING_FOR_CHANNEL_IDLE:
|
1116
|
+
break;
|
1117
|
+
case RS_READING_FROM_FILE:
|
1118
|
+
inFileMode->readRequest->cancel();
|
1119
|
+
inFileMode->readRequest = NULL;
|
1120
|
+
break;
|
1121
|
+
case RS_INACTIVE:
|
1122
|
+
case RS_TERMINATED:
|
1123
|
+
return;
|
1124
|
+
}
|
1125
|
+
}
|
1126
|
+
|
1127
|
+
void cancelWriter() {
|
1128
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
1129
|
+
|
1130
|
+
switch (inFileMode->writerState) {
|
1131
|
+
case WS_INACTIVE:
|
1132
|
+
break;
|
1133
|
+
case WS_CREATING_FILE:
|
1134
|
+
case WS_MOVING:
|
1135
|
+
inFileMode->writerRequest->cancel();
|
1136
|
+
inFileMode->writerRequest = NULL;
|
1137
|
+
break;
|
1138
|
+
case WS_TERMINATED:
|
1139
|
+
return;
|
1140
|
+
}
|
1141
|
+
inFileMode->writerState = WS_INACTIVE;
|
1142
|
+
}
|
1143
|
+
|
1144
|
+
void verifyInvariants() const {
|
1145
|
+
#ifndef NDEBUG
|
1146
|
+
if (mode >= ERROR) {
|
1147
|
+
P_ASSERT_EQ(readerState, RS_TERMINATED);
|
1148
|
+
P_ASSERT_EQ(inFileMode, 0);
|
1149
|
+
}
|
1150
|
+
|
1151
|
+
switch (readerState) {
|
1152
|
+
case RS_INACTIVE:
|
1153
|
+
case RS_FEEDING:
|
1154
|
+
case RS_FEEDING_EOF:
|
1155
|
+
break;
|
1156
|
+
case RS_WAITING_FOR_CHANNEL_IDLE:
|
1157
|
+
assert(mode < ERROR);
|
1158
|
+
break;
|
1159
|
+
case RS_READING_FROM_FILE:
|
1160
|
+
P_ASSERT_EQ(mode, IN_FILE_MODE);
|
1161
|
+
assert(inFileMode->readRequest != NULL);
|
1162
|
+
assert(inFileMode->written > 0);
|
1163
|
+
break;
|
1164
|
+
case RS_TERMINATED:
|
1165
|
+
break;
|
1166
|
+
}
|
1167
|
+
|
1168
|
+
assert((errcode == 0) == (mode < ERROR));
|
1169
|
+
assert((inFileMode != NULL) == (mode == IN_FILE_MODE));
|
1170
|
+
#endif
|
1171
|
+
}
|
1172
|
+
|
1173
|
+
static void onChannelConsumed(Channel *channel, unsigned int size) {
|
1174
|
+
FileBufferedChannel *self = static_cast<FileBufferedChannel *>(channel);
|
1175
|
+
if (self->readerState == RS_WAITING_FOR_CHANNEL_IDLE) {
|
1176
|
+
if (self->acceptingInput()) {
|
1177
|
+
self->channelHasBecomeIdle();
|
1178
|
+
} else {
|
1179
|
+
assert(self->Channel::ended());
|
1180
|
+
self->channelEndedWhileWaitingForItToBecomeIdle();
|
1181
|
+
}
|
1182
|
+
} else if (self->mode == ERROR_WAITING) {
|
1183
|
+
self->feedErrorWhenChannelIdleOrEnded();
|
1184
|
+
}
|
1185
|
+
}
|
1186
|
+
|
1187
|
+
public:
|
1188
|
+
/**
|
1189
|
+
* Called when all the in-memory buffers have been popped. This could happen
|
1190
|
+
* (when we're in the in-memory mode) because the last in-memory buffer is being
|
1191
|
+
* processed by the data callback. It could also happen (when we're in the in-file
|
1192
|
+
* mode) when the last in-memory buffer has sucessfully been written to disk.
|
1193
|
+
*
|
1194
|
+
* This event does not imply that the data callback has consumed all memory
|
1195
|
+
* buffers. For example, in case of FileBufferedFdSinkChannel, this event does
|
1196
|
+
* not imply that all the in-memory buffers have been written to the sink FD.
|
1197
|
+
* That's what `dataFlushedCallback` is for.
|
1198
|
+
*/
|
1199
|
+
Callback buffersFlushedCallback;
|
1200
|
+
/**
|
1201
|
+
* Called when all buffered data (whether in-memory or on-disk) has been consumed
|
1202
|
+
* by the data callback. In case of FileBufferedFdSinkChannel, this means that all
|
1203
|
+
* buffered data has been written out to the sink FD.
|
1204
|
+
*/
|
1205
|
+
Callback dataFlushedCallback;
|
1206
|
+
|
1207
|
+
FileBufferedChannel()
|
1208
|
+
: config(NULL),
|
1209
|
+
mode(IN_MEMORY_MODE),
|
1210
|
+
readerState(RS_INACTIVE),
|
1211
|
+
nbuffers(0),
|
1212
|
+
errcode(0),
|
1213
|
+
bytesBuffered(0),
|
1214
|
+
inFileMode(),
|
1215
|
+
buffersFlushedCallback(NULL),
|
1216
|
+
dataFlushedCallback(NULL)
|
1217
|
+
{
|
1218
|
+
Channel::consumedCallback = onChannelConsumed;
|
1219
|
+
}
|
1220
|
+
|
1221
|
+
FileBufferedChannel(Context *context)
|
1222
|
+
: Channel(context),
|
1223
|
+
config(&context->defaultFileBufferedChannelConfig),
|
1224
|
+
mode(IN_MEMORY_MODE),
|
1225
|
+
readerState(RS_INACTIVE),
|
1226
|
+
nbuffers(0),
|
1227
|
+
errcode(0),
|
1228
|
+
bytesBuffered(0),
|
1229
|
+
inFileMode(),
|
1230
|
+
buffersFlushedCallback(NULL),
|
1231
|
+
dataFlushedCallback(NULL)
|
1232
|
+
{
|
1233
|
+
Channel::consumedCallback = onChannelConsumed;
|
1234
|
+
}
|
1235
|
+
|
1236
|
+
~FileBufferedChannel() {
|
1237
|
+
cancelReader();
|
1238
|
+
if (mode == IN_FILE_MODE) {
|
1239
|
+
cancelWriter();
|
1240
|
+
}
|
1241
|
+
}
|
1242
|
+
|
1243
|
+
// May only be called right after construction.
|
1244
|
+
void setContext(Context *context) {
|
1245
|
+
Channel::setContext(context);
|
1246
|
+
if (config == NULL) {
|
1247
|
+
config = &context->defaultFileBufferedChannelConfig;
|
1248
|
+
}
|
1249
|
+
}
|
1250
|
+
|
1251
|
+
void feed(const MemoryKit::mbuf &buffer) {
|
1252
|
+
RefGuard guard(hooks, this, __FILE__, __LINE__);
|
1253
|
+
feedWithoutRefGuard(buffer);
|
1254
|
+
}
|
1255
|
+
|
1256
|
+
void feed(const char *data, unsigned int size) {
|
1257
|
+
feed(MemoryKit::mbuf(data, size));
|
1258
|
+
}
|
1259
|
+
|
1260
|
+
void feed(const char *data) {
|
1261
|
+
feed(MemoryKit::mbuf(data));
|
1262
|
+
}
|
1263
|
+
|
1264
|
+
void feedWithoutRefGuard(const MemoryKit::mbuf &buffer) {
|
1265
|
+
FBC_DEBUG("Feeding " << buffer.size() << " bytes");
|
1266
|
+
verifyInvariants();
|
1267
|
+
if (ended()) {
|
1268
|
+
FBC_DEBUG("Feeding aborted: EOF or error detected");
|
1269
|
+
return;
|
1270
|
+
}
|
1271
|
+
pushBuffer(buffer);
|
1272
|
+
if (mode == IN_MEMORY_MODE && passedThreshold()) {
|
1273
|
+
switchToInFileMode();
|
1274
|
+
} else if (mode == IN_FILE_MODE
|
1275
|
+
&& inFileMode->writerState == WS_INACTIVE
|
1276
|
+
&& config->autoStartMover)
|
1277
|
+
{
|
1278
|
+
moveNextBufferToFile();
|
1279
|
+
}
|
1280
|
+
if (readerState == RS_INACTIVE) {
|
1281
|
+
if (acceptingInput()) {
|
1282
|
+
readNextWithoutRefGuard();
|
1283
|
+
} else {
|
1284
|
+
readNextWhenChannelIdle();
|
1285
|
+
}
|
1286
|
+
}
|
1287
|
+
}
|
1288
|
+
|
1289
|
+
void feedWithoutRefGuard(const char *data, unsigned int size) {
|
1290
|
+
feedWithoutRefGuard(MemoryKit::mbuf(data, size));
|
1291
|
+
}
|
1292
|
+
|
1293
|
+
void feedError(int errcode, const char *file = NULL, unsigned int line = 0) {
|
1294
|
+
if (file == NULL) {
|
1295
|
+
file = __FILE__;
|
1296
|
+
}
|
1297
|
+
if (line == 0) {
|
1298
|
+
line = __LINE__;
|
1299
|
+
}
|
1300
|
+
setError(errcode, file, line);
|
1301
|
+
}
|
1302
|
+
|
1303
|
+
void reinitialize() {
|
1304
|
+
Channel::reinitialize();
|
1305
|
+
verifyInvariants();
|
1306
|
+
}
|
1307
|
+
|
1308
|
+
void deinitialize() {
|
1309
|
+
FBC_DEBUG("Deinitialize");
|
1310
|
+
cancelReader();
|
1311
|
+
if (mode == IN_FILE_MODE) {
|
1312
|
+
cancelWriter();
|
1313
|
+
}
|
1314
|
+
clearBuffers();
|
1315
|
+
mode = IN_MEMORY_MODE;
|
1316
|
+
readerState = RS_INACTIVE;
|
1317
|
+
errcode = 0;
|
1318
|
+
if (OXT_UNLIKELY(inFileMode != NULL)) {
|
1319
|
+
inFileMode.reset();
|
1320
|
+
}
|
1321
|
+
Channel::deinitialize();
|
1322
|
+
}
|
1323
|
+
|
1324
|
+
void start() {
|
1325
|
+
Channel::start();
|
1326
|
+
}
|
1327
|
+
|
1328
|
+
void stop() {
|
1329
|
+
Channel::stop();
|
1330
|
+
}
|
1331
|
+
|
1332
|
+
bool isStarted() const {
|
1333
|
+
return Channel::isStarted();
|
1334
|
+
}
|
1335
|
+
|
1336
|
+
void consumed(unsigned int size, bool end) {
|
1337
|
+
Channel::consumed(size, end);
|
1338
|
+
}
|
1339
|
+
|
1340
|
+
Channel::State getState() const {
|
1341
|
+
return state;
|
1342
|
+
}
|
1343
|
+
|
1344
|
+
Mode getMode() const {
|
1345
|
+
return mode;
|
1346
|
+
}
|
1347
|
+
|
1348
|
+
ReaderState getReaderState() const {
|
1349
|
+
return readerState;
|
1350
|
+
}
|
1351
|
+
|
1352
|
+
WriterState getWriterState() const {
|
1353
|
+
return inFileMode->writerState;
|
1354
|
+
}
|
1355
|
+
|
1356
|
+
unsigned int getBytesBuffered() const {
|
1357
|
+
return bytesBuffered;
|
1358
|
+
}
|
1359
|
+
|
1360
|
+
bool ended() const {
|
1361
|
+
return (hasBuffers() && peekLastBuffer().empty())
|
1362
|
+
|| mode >= ERROR || Channel::ended();
|
1363
|
+
}
|
1364
|
+
|
1365
|
+
bool endAcked() const {
|
1366
|
+
return Channel::endAcked();
|
1367
|
+
}
|
1368
|
+
|
1369
|
+
bool passedThreshold() const {
|
1370
|
+
return bytesBuffered >= config->threshold;
|
1371
|
+
}
|
1372
|
+
|
1373
|
+
void setDataCallback(DataCallback callback) {
|
1374
|
+
Channel::dataCallback = callback;
|
1375
|
+
}
|
1376
|
+
|
1377
|
+
void setBuffersFlushedCallback(Callback callback) {
|
1378
|
+
buffersFlushedCallback = callback;
|
1379
|
+
}
|
1380
|
+
|
1381
|
+
void setDataFlushedCallback(Callback callback) {
|
1382
|
+
dataFlushedCallback = callback;
|
1383
|
+
}
|
1384
|
+
|
1385
|
+
OXT_FORCE_INLINE
|
1386
|
+
Hooks *getHooks() const {
|
1387
|
+
return Channel::hooks;
|
1388
|
+
}
|
1389
|
+
|
1390
|
+
void setHooks(Hooks *hooks) {
|
1391
|
+
Channel::hooks = hooks;
|
1392
|
+
}
|
1393
|
+
};
|
1394
|
+
|
1395
|
+
|
1396
|
+
} // namespace ServerKit
|
1397
|
+
} // namespace Passenger
|
1398
|
+
|
1399
|
+
#endif /* _PASSENGER_SERVER_KIT_FILE_BUFFERED_CHANNEL_H_ */
|