passenger 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/DEVELOPERS.TXT +9 -6
- data/NEWS +50 -0
- data/Rakefile +2 -1
- data/bin/passenger-install-apache2-module +4 -4
- data/bin/passenger-install-nginx-module +1 -1
- data/bin/passenger-make-enterprisey +1 -1
- data/build/agents.rb +26 -19
- data/build/apache2.rb +49 -46
- data/build/basics.rb +37 -13
- data/build/common_library.rb +134 -64
- data/build/config.rb +18 -11
- data/build/cplusplus_support.rb +4 -0
- data/build/cxx_tests.rb +26 -12
- data/build/documentation.rb +18 -11
- data/build/integration_tests.rb +18 -11
- data/build/misc.rb +18 -11
- data/build/nginx.rb +27 -19
- data/build/oxt_tests.rb +18 -11
- data/build/packaging.rb +45 -37
- data/build/rpm.rb +98 -0
- data/build/ruby_extension.rb +19 -13
- data/build/ruby_tests.rb +19 -12
- data/build/test_basics.rb +23 -11
- data/debian/README.Debian +15 -0
- data/debian/changelog +185 -0
- data/debian/control +47 -19
- data/debian/copyright +20 -0
- data/debian/libapache2-mod-passenger.install +1 -0
- data/debian/libapache2-mod-passenger.postinst +36 -0
- data/debian/libapache2-mod-passenger.prerm +15 -0
- data/debian/passenger-common.install +4 -0
- data/debian/passenger.conf +4 -0
- data/debian/passenger.load +1 -0
- data/debian/rules +37 -0
- data/debian/watch +3 -0
- data/{misc → dev}/copy_boost_headers.rb +3 -0
- data/{misc → dev}/find_owner_pipe_leaks.rb +0 -0
- data/{misc → dev}/render_error_pages.rb +0 -0
- data/doc/Users guide Apache.html +39 -1
- data/doc/Users guide Apache.txt +40 -0
- data/doc/Users guide Nginx.html +1 -1
- data/doc/Users guide Standalone.html +1 -1
- data/doc/cxxapi/Constants_8h_source.html +1 -1
- data/doc/cxxapi/DirectoryMapper_8h_source.html +6 -22
- data/doc/cxxapi/EventedClient_8h_source.html +572 -468
- data/doc/cxxapi/Exceptions_8h_source.html +142 -129
- data/doc/cxxapi/FileDescriptor_8h_source.html +263 -199
- data/doc/cxxapi/MessageChannel_8h_source.html +686 -770
- data/doc/cxxapi/MessageServer_8h_source.html +1 -1
- data/doc/cxxapi/PoolOptions_8h_source.html +79 -78
- data/doc/cxxapi/ResourceLocator_8h_source.html +105 -55
- data/doc/cxxapi/SafeLibev_8h_source.html +180 -0
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +114 -110
- data/doc/cxxapi/Session_8h_source.html +1 -1
- data/doc/cxxapi/SpawnManager_8h_source.html +208 -208
- data/doc/cxxapi/StaticString_8h_source.html +258 -183
- data/doc/cxxapi/Utils_8h_source.html +71 -54
- data/doc/cxxapi/annotated.html +3 -0
- data/doc/cxxapi/classAgentWatcher.html +2 -2
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -1
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -27
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +5 -0
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +102 -7
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +34 -8
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +52 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -3
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -120
- data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1SafeLibev.html +51 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +22 -0
- data/doc/cxxapi/classes.html +14 -14
- data/doc/cxxapi/files.html +2 -0
- data/doc/cxxapi/functions_0x63.html +6 -3
- data/doc/cxxapi/functions_0x64.html +9 -2
- data/doc/cxxapi/functions_0x67.html +6 -9
- data/doc/cxxapi/functions_0x69.html +3 -0
- data/doc/cxxapi/functions_0x77.html +8 -8
- data/doc/cxxapi/functions_eval.html +6 -0
- data/doc/cxxapi/functions_func.html +18 -17
- data/doc/cxxapi/functions_vars.html +8 -0
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/hierarchy.html +3 -0
- data/doc/cxxapi/inherit__graph__14.map +1 -1
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -3
- data/doc/cxxapi/inherit__graph__15.md5 +1 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +3 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +1 -1
- data/doc/cxxapi/inherit__graph__17.md5 +1 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +1 -2
- data/doc/cxxapi/inherit__graph__18.md5 +1 -1
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.map +2 -1
- data/doc/cxxapi/inherit__graph__19.md5 +1 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +1 -1
- data/doc/cxxapi/inherit__graph__20.md5 +1 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +1 -1
- data/doc/cxxapi/inherit__graph__22.md5 +1 -1
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +1 -1
- data/doc/cxxapi/inherit__graph__23.md5 +1 -1
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +1 -1
- data/doc/cxxapi/inherit__graph__24.md5 +1 -1
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +1 -1
- data/doc/cxxapi/inherit__graph__25.md5 +1 -1
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +1 -1
- data/doc/cxxapi/inherit__graph__26.md5 +1 -1
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +1 -1
- data/doc/cxxapi/inherit__graph__27.md5 +1 -1
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +1 -2
- data/doc/cxxapi/inherit__graph__28.md5 +1 -1
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +1 -1
- data/doc/cxxapi/inherit__graph__29.md5 +1 -1
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +1 -1
- data/doc/cxxapi/inherit__graph__30.md5 +1 -1
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +2 -1
- data/doc/cxxapi/inherit__graph__31.md5 +1 -1
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +1 -3
- data/doc/cxxapi/inherit__graph__32.md5 +1 -1
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +1 -1
- data/doc/cxxapi/inherit__graph__33.md5 +1 -1
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +1 -1
- data/doc/cxxapi/inherit__graph__34.md5 +1 -1
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +3 -1
- data/doc/cxxapi/inherit__graph__35.md5 +1 -1
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +1 -1
- data/doc/cxxapi/inherit__graph__36.md5 +1 -1
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__37.map +1 -1
- data/doc/cxxapi/inherit__graph__37.md5 +1 -1
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__38.map +3 -1
- data/doc/cxxapi/inherit__graph__38.md5 +1 -1
- data/doc/cxxapi/inherit__graph__38.png +0 -0
- data/doc/cxxapi/inherit__graph__39.map +3 -1
- data/doc/cxxapi/inherit__graph__39.md5 +1 -1
- data/doc/cxxapi/inherit__graph__39.png +0 -0
- data/doc/cxxapi/inherits.html +33 -24
- data/doc/cxxapi/namespacePassenger.html +52 -0
- data/doc/cxxapi/namespacemembers.html +6 -0
- data/doc/cxxapi/namespacemembers_func.html +6 -0
- data/doc/cxxapi/tree.html +8 -0
- data/ext/apache2/Configuration.cpp +30 -8
- data/ext/apache2/Configuration.hpp +15 -14
- data/ext/apache2/DirectoryMapper.h +0 -16
- data/ext/apache2/Hooks.cpp +30 -29
- data/ext/boost/algorithm/string/detail/case_conv.hpp +6 -6
- data/ext/boost/algorithm/string/detail/find_format.hpp +14 -4
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +13 -3
- data/ext/boost/algorithm/string/detail/find_format_store.hpp +11 -0
- data/ext/boost/algorithm/string/erase.hpp +2 -2
- data/ext/boost/bind/placeholders.hpp +2 -2
- data/ext/boost/concept/detail/backward_compatibility.hpp +16 -0
- data/ext/boost/concept/detail/general.hpp +15 -6
- data/ext/boost/concept/detail/has_constraints.hpp +5 -3
- data/ext/boost/concept/usage.hpp +5 -4
- data/ext/boost/concept_check.hpp +10 -1
- data/ext/boost/config/abi/borland_prefix.hpp +1 -1
- data/ext/boost/config/auto_link.hpp +68 -21
- data/ext/boost/config/compiler/borland.hpp +11 -3
- data/ext/boost/config/compiler/clang.hpp +62 -0
- data/ext/boost/config/compiler/codegear.hpp +21 -7
- data/ext/boost/config/compiler/common_edg.hpp +4 -2
- data/ext/boost/config/compiler/digitalmars.hpp +1 -1
- data/ext/boost/config/compiler/gcc.hpp +46 -7
- data/ext/boost/config/compiler/gcc_xml.hpp +25 -0
- data/ext/boost/config/compiler/intel.hpp +23 -0
- data/ext/boost/config/compiler/kai.hpp +1 -1
- data/ext/boost/config/compiler/metrowerks.hpp +1 -1
- data/ext/boost/config/compiler/nvcc.hpp +86 -0
- data/ext/boost/config/compiler/pgi.hpp +18 -3
- data/ext/boost/config/compiler/sunpro_cc.hpp +19 -5
- data/ext/boost/config/compiler/vacpp.hpp +8 -0
- data/ext/boost/config/compiler/visualc.hpp +27 -11
- data/ext/boost/config/platform/cygwin.hpp +0 -3
- data/ext/boost/config/platform/symbian.hpp +94 -0
- data/ext/boost/config/platform/win32.hpp +8 -1
- data/ext/boost/config/select_compiler_config.hpp +10 -0
- data/ext/boost/config/select_platform_config.hpp +4 -0
- data/ext/boost/config/stdlib/dinkumware.hpp +11 -1
- data/ext/boost/config/stdlib/libcomo.hpp +1 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +1 -0
- data/ext/boost/config/stdlib/modena.hpp +1 -0
- data/ext/boost/config/stdlib/msl.hpp +1 -0
- data/ext/boost/config/stdlib/roguewave.hpp +1 -0
- data/ext/boost/config/stdlib/sgi.hpp +1 -0
- data/ext/boost/config/stdlib/stlport.hpp +1 -0
- data/ext/boost/config/stdlib/vacpp.hpp +1 -0
- data/ext/boost/config/suffix.hpp +40 -2
- data/ext/boost/cstdint.hpp +36 -7
- data/ext/boost/date_time/gregorian/conversion.hpp +4 -2
- data/ext/boost/date_time/microsec_time_clock.hpp +7 -7
- data/ext/boost/date_time/posix_time/conversion.hpp +4 -2
- data/ext/boost/date_time/time_facet.hpp +43 -4
- data/ext/boost/detail/endian.hpp +5 -2
- data/ext/boost/detail/lcast_precision.hpp +2 -2
- data/ext/boost/detail/sp_typeinfo.hpp +1 -1
- data/ext/boost/detail/workaround.hpp +5 -0
- data/ext/boost/exception/detail/error_info_impl.hpp +3 -3
- data/ext/boost/exception/detail/exception_ptr.hpp +76 -135
- data/ext/boost/exception/detail/is_output_streamable.hpp +15 -2
- data/ext/boost/exception/detail/type_info.hpp +9 -5
- data/ext/boost/exception/diagnostic_information.hpp +5 -3
- data/ext/boost/exception/exception.hpp +60 -46
- data/ext/boost/exception/info.hpp +47 -14
- data/ext/boost/function/function_base.hpp +4 -4
- data/ext/boost/integer.hpp +4 -0
- data/ext/boost/integer_fwd.hpp +9 -3
- data/ext/boost/iterator/iterator_concepts.hpp +284 -0
- data/ext/boost/iterator/transform_iterator.hpp +0 -1
- data/ext/boost/make_shared.hpp +17 -0
- data/ext/boost/mpl/aux_/config/has_xxx.hpp +4 -3
- data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +2 -6
- data/ext/boost/mpl/aux_/template_arity.hpp +4 -4
- data/ext/boost/mpl/eval_if.hpp +3 -3
- data/ext/boost/mpl/has_xxx.hpp +369 -3
- data/ext/boost/optional/optional.hpp +3 -1
- data/ext/boost/optional/optional_fwd.hpp +1 -1
- data/ext/boost/preprocessor/repetition/enum_trailing_params.hpp +38 -0
- data/ext/boost/range/algorithm/equal.hpp +188 -0
- data/ext/boost/range/as_literal.hpp +15 -15
- data/ext/boost/range/concepts.hpp +331 -0
- data/ext/boost/range/const_iterator.hpp +7 -4
- data/ext/boost/range/detail/extract_optional_type.hpp +52 -0
- data/ext/boost/range/detail/implementation_help.hpp +7 -7
- data/ext/boost/range/detail/misc_concept.hpp +33 -0
- data/ext/boost/range/iterator.hpp +32 -32
- data/ext/boost/range/iterator_range.hpp +8 -651
- data/ext/boost/range/iterator_range_core.hpp +542 -0
- data/ext/boost/range/iterator_range_io.hpp +93 -0
- data/ext/boost/range/mutable_iterator.hpp +7 -4
- data/ext/boost/range/size.hpp +1 -1
- data/ext/boost/range/size_type.hpp +2 -1
- data/ext/boost/shared_array.hpp +19 -0
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +2 -2
- data/ext/boost/smart_ptr/detail/yield_k.hpp +1 -1
- data/ext/boost/smart_ptr/make_shared.hpp +508 -0
- data/ext/boost/smart_ptr/shared_array.hpp +147 -0
- data/ext/boost/src/pthread/thread.cpp +16 -21
- data/ext/boost/src/pthread/timeconv.inl +7 -4
- data/ext/boost/thread/barrier.hpp +2 -1
- data/ext/boost/thread/detail/config.hpp +7 -1
- data/ext/boost/thread/detail/platform.hpp +1 -1
- data/ext/boost/thread/detail/thread.hpp +62 -18
- data/ext/boost/thread/detail/thread_group.hpp +5 -2
- data/ext/boost/thread/detail/tss_hooks.hpp +8 -25
- data/ext/boost/thread/future.hpp +45 -34
- data/ext/boost/thread/locks.hpp +184 -55
- data/ext/boost/thread/pthread/condition_variable.hpp +7 -7
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +4 -2
- data/ext/boost/thread/pthread/mutex.hpp +29 -17
- data/ext/boost/thread/pthread/once.hpp +5 -0
- data/ext/boost/thread/pthread/recursive_mutex.hpp +97 -18
- data/ext/boost/thread/pthread/shared_mutex.hpp +1 -1
- data/ext/boost/thread/pthread/thread_heap_alloc.hpp +1 -1
- data/ext/boost/thread/tss.hpp +2 -0
- data/ext/boost/throw_exception.hpp +21 -5
- data/ext/boost/token_functions.hpp +111 -91
- data/ext/boost/type_traits/add_reference.hpp +19 -1
- data/ext/boost/type_traits/function_traits.hpp +2 -2
- data/ext/boost/type_traits/is_const.hpp +24 -5
- data/ext/boost/type_traits/is_convertible.hpp +1 -1
- data/ext/boost/type_traits/is_function.hpp +3 -0
- data/ext/boost/type_traits/is_lvalue_reference.hpp +118 -0
- data/ext/boost/type_traits/is_reference.hpp +8 -81
- data/ext/boost/type_traits/is_rvalue_reference.hpp +29 -0
- data/ext/boost/type_traits/is_same.hpp +2 -2
- data/ext/boost/type_traits/is_volatile.hpp +26 -7
- data/ext/boost/type_traits/remove_const.hpp +12 -0
- data/ext/boost/type_traits/remove_cv.hpp +23 -1
- data/ext/boost/type_traits/remove_reference.hpp +21 -1
- data/ext/boost/type_traits/type_with_alignment.hpp +10 -10
- data/ext/boost/units/detail/utility.hpp +104 -0
- data/ext/boost/utility/compare_pointees.hpp +1 -1
- data/ext/common/AgentsStarter.hpp +151 -161
- data/ext/common/ApplicationPool/Pool.h +16 -4
- data/ext/common/Constants.h +1 -1
- data/ext/common/EventedClient.h +130 -26
- data/ext/common/Exceptions.h +15 -2
- data/ext/common/FileDescriptor.h +76 -12
- data/ext/common/IniFile.h +488 -0
- data/ext/common/LoggingAgent/LoggingServer.h +2 -2
- data/ext/common/LoggingAgent/RemoteSender.h +15 -6
- data/ext/common/MessageChannel.h +17 -101
- data/ext/common/PoolOptions.h +1 -0
- data/ext/common/ResourceLocator.h +78 -28
- data/ext/common/SafeLibev.h +149 -0
- data/ext/common/ServerInstanceDir.h +11 -7
- data/ext/common/Session.h +1 -1
- data/ext/common/SpawnManager.h +14 -14
- data/ext/common/StaticString.h +75 -0
- data/ext/common/Utils.cpp +304 -12
- data/ext/common/Utils.h +17 -0
- data/ext/common/Utils/BufferedIO.h +196 -0
- data/ext/common/Utils/IOUtils.cpp +159 -0
- data/ext/common/Utils/IOUtils.h +118 -1
- data/ext/common/Utils/ProcessMetricsCollector.h +184 -56
- data/ext/common/Utils/StrIntUtils.cpp +45 -11
- data/ext/common/Utils/StrIntUtils.h +8 -5
- data/ext/common/Utils/Timer.h +22 -0
- data/ext/common/Utils/utf8.h +35 -0
- data/ext/common/Utils/utf8/checked.h +324 -0
- data/ext/common/Utils/utf8/core.h +359 -0
- data/ext/common/Utils/utf8/unchecked.h +229 -0
- data/ext/common/Watchdog.cpp +52 -85
- data/ext/libev/config.h +122 -0
- data/ext/nginx/Configuration.c +7 -1
- data/ext/nginx/HelperAgent.cpp +16 -18
- data/ext/nginx/config +6 -4
- data/ext/oxt/system_calls.cpp +10 -0
- data/ext/oxt/system_calls.hpp +2 -0
- data/lib/phusion_passenger.rb +6 -11
- data/lib/phusion_passenger/dependencies.rb +2 -0
- data/lib/phusion_passenger/packaging.rb +5 -5
- data/lib/phusion_passenger/platform_info.rb +88 -0
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +3 -17
- data/lib/phusion_passenger/platform_info/compiler.rb +14 -32
- data/lib/phusion_passenger/platform_info/curl.rb +6 -1
- data/lib/phusion_passenger/platform_info/operating_system.rb +107 -0
- data/lib/phusion_passenger/public_api.rb +2 -2
- data/lib/phusion_passenger/rails3_extensions/init.rb +5 -2
- data/lib/phusion_passenger/standalone/command.rb +6 -2
- data/lib/phusion_passenger/standalone/package_runtime_command.rb +2 -2
- data/lib/phusion_passenger/standalone/runtime_installer.rb +17 -5
- data/lib/phusion_passenger/standalone/start_command.rb +12 -12
- data/lib/phusion_passenger/standalone/stop_command.rb +3 -3
- data/lib/phusion_passenger/standalone/utils.rb +6 -2
- data/lib/phusion_passenger/templates/standalone/config.erb +37 -5
- data/lib/phusion_passenger/utils.rb +4 -7
- data/resources/mime.types +73 -0
- data/{misc → resources}/union_station_gateway.crt +0 -0
- data/test/cxx/BufferedIOTest.cpp +364 -0
- data/test/cxx/EventedClientTest.cpp +150 -13
- data/test/cxx/IOUtilsTest.cpp +399 -1
- data/test/cxx/MessageChannelTest.cpp +5 -120
- data/test/cxx/ProcessMetricsCollectorTest.cpp +121 -0
- data/test/cxx/StaticStringTest.cpp +134 -0
- data/test/cxx/UtilsTest.cpp +16 -46
- data/test/stub/rails_apps/2.3/mycook/public/dispatch.cgi +2 -2
- data/test/stub/rails_apps/2.3/mycook/public/dispatch.fcgi +1 -1
- data/test/stub/rails_apps/2.3/mycook/public/dispatch.rb +1 -1
- data/test/stub/rails_apps/3.0/empty/Gemfile.lock +73 -0
- data/test/support/allocate_memory.c +14 -0
- data/test/support/test_helper.rb +3 -0
- metadata +57 -174
- data/bin/passenger-stress-test +0 -345
- data/debian/postinst +0 -24
- data/doc/rdoc/classes/ConditionVariable.html +0 -215
- data/doc/rdoc/classes/Exception.html +0 -120
- data/doc/rdoc/classes/GC.html +0 -113
- data/doc/rdoc/classes/IO.html +0 -221
- data/doc/rdoc/classes/PhusionPassenger.html +0 -397
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -180
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -647
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -654
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -619
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -142
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +0 -231
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +0 -588
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +0 -147
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +0 -279
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +0 -123
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +0 -341
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +0 -294
- data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +0 -199
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -155
- data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +0 -367
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +0 -95
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +0 -351
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +0 -200
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +0 -410
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +0 -156
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +0 -115
- data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +0 -202
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
- data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +0 -273
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -162
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -673
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +0 -415
- data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +0 -134
- data/doc/rdoc/classes/PhusionPassenger/Packaging.html +0 -129
- data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +0 -1809
- data/doc/rdoc/classes/PhusionPassenger/Plugin.html +0 -237
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -312
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -218
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +0 -114
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +0 -256
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +0 -139
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +0 -118
- data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +0 -135
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -378
- data/doc/rdoc/classes/PhusionPassenger/Standalone.html +0 -111
- data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +0 -252
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +0 -161
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +0 -368
- data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +0 -132
- data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +0 -151
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +0 -189
- data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +0 -177
- data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +0 -341
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +0 -203
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +0 -156
- data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +0 -168
- data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +0 -86
- data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +0 -135
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -1550
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +0 -204
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +0 -171
- data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +0 -260
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -265
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
- data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +0 -561
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -182
- data/doc/rdoc/classes/Process.html +0 -115
- data/doc/rdoc/classes/Signal.html +0 -139
- data/doc/rdoc/created.rid +0 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -276
- data/doc/rdoc/files/README.html +0 -157
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -130
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -135
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +0 -141
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +0 -146
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -147
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +0 -132
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -137
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -160
- data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +0 -135
- data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +0 -133
- data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +0 -136
- data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
- data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -179
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -132
- data/doc/rdoc/fr_class_index.html +0 -138
- data/doc/rdoc/fr_file_index.html +0 -108
- data/doc/rdoc/fr_method_index.html +0 -430
- data/doc/rdoc/index.html +0 -26
- data/doc/rdoc/rdoc-style.css +0 -187
- data/ext/apache2/LICENSE-CNRI.TXT +0 -79
- data/ext/common/Utils/BlockingScalar.h +0 -50
- data/ext/common/Utils/FileHandleGuard.h +0 -81
@@ -0,0 +1,229 @@
|
|
1
|
+
// Copyright 2006 Nemanja Trifunovic
|
2
|
+
// UTF-8 CPP 2.3
|
3
|
+
|
4
|
+
/*
|
5
|
+
Permission is hereby granted, free of charge, to any person or organization
|
6
|
+
obtaining a copy of the software and accompanying documentation covered by
|
7
|
+
this license (the "Software") to use, reproduce, display, distribute,
|
8
|
+
execute, and transmit the Software, and to prepare derivative works of the
|
9
|
+
Software, and to permit third-parties to whom the Software is furnished to
|
10
|
+
do so, all subject to the following:
|
11
|
+
|
12
|
+
The copyright notices in the Software and this entire statement, including
|
13
|
+
the above license grant, this restriction and the following disclaimer,
|
14
|
+
must be included in all copies of the Software, in whole or in part, and
|
15
|
+
all derivative works of the Software, unless such copies or derivative
|
16
|
+
works are solely in the form of machine-executable object code generated by
|
17
|
+
a source language processor.
|
18
|
+
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
22
|
+
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
23
|
+
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
24
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
25
|
+
DEALINGS IN THE SOFTWARE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
|
29
|
+
#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
|
30
|
+
#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
|
31
|
+
|
32
|
+
#include <Utils/utf8/core.h>
|
33
|
+
|
34
|
+
namespace utf8
|
35
|
+
{
|
36
|
+
namespace unchecked
|
37
|
+
{
|
38
|
+
template <typename octet_iterator>
|
39
|
+
octet_iterator append(uint32_t cp, octet_iterator result)
|
40
|
+
{
|
41
|
+
if (cp < 0x80) // one octet
|
42
|
+
*(result++) = static_cast<uint8_t>(cp);
|
43
|
+
else if (cp < 0x800) { // two octets
|
44
|
+
*(result++) = static_cast<uint8_t>((cp >> 6) | 0xc0);
|
45
|
+
*(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
|
46
|
+
}
|
47
|
+
else if (cp < 0x10000) { // three octets
|
48
|
+
*(result++) = static_cast<uint8_t>((cp >> 12) | 0xe0);
|
49
|
+
*(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
|
50
|
+
*(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
|
51
|
+
}
|
52
|
+
else { // four octets
|
53
|
+
*(result++) = static_cast<uint8_t>((cp >> 18) | 0xf0);
|
54
|
+
*(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80);
|
55
|
+
*(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
|
56
|
+
*(result++) = static_cast<uint8_t>((cp & 0x3f) | 0x80);
|
57
|
+
}
|
58
|
+
return result;
|
59
|
+
}
|
60
|
+
|
61
|
+
template <typename octet_iterator>
|
62
|
+
uint32_t next(octet_iterator& it)
|
63
|
+
{
|
64
|
+
uint32_t cp = internal::mask8(*it);
|
65
|
+
typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);
|
66
|
+
switch (length) {
|
67
|
+
case 1:
|
68
|
+
break;
|
69
|
+
case 2:
|
70
|
+
it++;
|
71
|
+
cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
|
72
|
+
break;
|
73
|
+
case 3:
|
74
|
+
++it;
|
75
|
+
cp = ((cp << 12) & 0xffff) + ((internal::mask8(*it) << 6) & 0xfff);
|
76
|
+
++it;
|
77
|
+
cp += (*it) & 0x3f;
|
78
|
+
break;
|
79
|
+
case 4:
|
80
|
+
++it;
|
81
|
+
cp = ((cp << 18) & 0x1fffff) + ((internal::mask8(*it) << 12) & 0x3ffff);
|
82
|
+
++it;
|
83
|
+
cp += (internal::mask8(*it) << 6) & 0xfff;
|
84
|
+
++it;
|
85
|
+
cp += (*it) & 0x3f;
|
86
|
+
break;
|
87
|
+
}
|
88
|
+
++it;
|
89
|
+
return cp;
|
90
|
+
}
|
91
|
+
|
92
|
+
template <typename octet_iterator>
|
93
|
+
uint32_t peek_next(octet_iterator it)
|
94
|
+
{
|
95
|
+
return next(it);
|
96
|
+
}
|
97
|
+
|
98
|
+
template <typename octet_iterator>
|
99
|
+
uint32_t prior(octet_iterator& it)
|
100
|
+
{
|
101
|
+
while (internal::is_trail(*(--it))) ;
|
102
|
+
octet_iterator temp = it;
|
103
|
+
return next(temp);
|
104
|
+
}
|
105
|
+
|
106
|
+
// Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)
|
107
|
+
template <typename octet_iterator>
|
108
|
+
inline uint32_t previous(octet_iterator& it)
|
109
|
+
{
|
110
|
+
return prior(it);
|
111
|
+
}
|
112
|
+
|
113
|
+
template <typename octet_iterator, typename distance_type>
|
114
|
+
void advance (octet_iterator& it, distance_type n)
|
115
|
+
{
|
116
|
+
for (distance_type i = 0; i < n; ++i)
|
117
|
+
next(it);
|
118
|
+
}
|
119
|
+
|
120
|
+
template <typename octet_iterator>
|
121
|
+
typename std::iterator_traits<octet_iterator>::difference_type
|
122
|
+
distance (octet_iterator first, octet_iterator last)
|
123
|
+
{
|
124
|
+
typename std::iterator_traits<octet_iterator>::difference_type dist;
|
125
|
+
for (dist = 0; first < last; ++dist)
|
126
|
+
next(first);
|
127
|
+
return dist;
|
128
|
+
}
|
129
|
+
|
130
|
+
template <typename u16bit_iterator, typename octet_iterator>
|
131
|
+
octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
|
132
|
+
{
|
133
|
+
while (start != end) {
|
134
|
+
uint32_t cp = internal::mask16(*start++);
|
135
|
+
// Take care of surrogate pairs first
|
136
|
+
if (internal::is_lead_surrogate(cp)) {
|
137
|
+
uint32_t trail_surrogate = internal::mask16(*start++);
|
138
|
+
cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
|
139
|
+
}
|
140
|
+
result = append(cp, result);
|
141
|
+
}
|
142
|
+
return result;
|
143
|
+
}
|
144
|
+
|
145
|
+
template <typename u16bit_iterator, typename octet_iterator>
|
146
|
+
u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
|
147
|
+
{
|
148
|
+
while (start < end) {
|
149
|
+
uint32_t cp = next(start);
|
150
|
+
if (cp > 0xffff) { //make a surrogate pair
|
151
|
+
*result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET);
|
152
|
+
*result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
|
153
|
+
}
|
154
|
+
else
|
155
|
+
*result++ = static_cast<uint16_t>(cp);
|
156
|
+
}
|
157
|
+
return result;
|
158
|
+
}
|
159
|
+
|
160
|
+
template <typename octet_iterator, typename u32bit_iterator>
|
161
|
+
octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
|
162
|
+
{
|
163
|
+
while (start != end)
|
164
|
+
result = append(*(start++), result);
|
165
|
+
|
166
|
+
return result;
|
167
|
+
}
|
168
|
+
|
169
|
+
template <typename octet_iterator, typename u32bit_iterator>
|
170
|
+
u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
|
171
|
+
{
|
172
|
+
while (start < end)
|
173
|
+
(*result++) = next(start);
|
174
|
+
|
175
|
+
return result;
|
176
|
+
}
|
177
|
+
|
178
|
+
// The iterator class
|
179
|
+
template <typename octet_iterator>
|
180
|
+
class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
|
181
|
+
octet_iterator it;
|
182
|
+
public:
|
183
|
+
iterator () {};
|
184
|
+
explicit iterator (const octet_iterator& octet_it): it(octet_it) {}
|
185
|
+
// the default "big three" are OK
|
186
|
+
octet_iterator base () const { return it; }
|
187
|
+
uint32_t operator * () const
|
188
|
+
{
|
189
|
+
octet_iterator temp = it;
|
190
|
+
return next(temp);
|
191
|
+
}
|
192
|
+
bool operator == (const iterator& rhs) const
|
193
|
+
{
|
194
|
+
return (it == rhs.it);
|
195
|
+
}
|
196
|
+
bool operator != (const iterator& rhs) const
|
197
|
+
{
|
198
|
+
return !(operator == (rhs));
|
199
|
+
}
|
200
|
+
iterator& operator ++ ()
|
201
|
+
{
|
202
|
+
std::advance(it, internal::sequence_length(it));
|
203
|
+
return *this;
|
204
|
+
}
|
205
|
+
iterator operator ++ (int)
|
206
|
+
{
|
207
|
+
iterator temp = *this;
|
208
|
+
std::advance(it, internal::sequence_length(it));
|
209
|
+
return temp;
|
210
|
+
}
|
211
|
+
iterator& operator -- ()
|
212
|
+
{
|
213
|
+
prior(it);
|
214
|
+
return *this;
|
215
|
+
}
|
216
|
+
iterator operator -- (int)
|
217
|
+
{
|
218
|
+
iterator temp = *this;
|
219
|
+
prior(it);
|
220
|
+
return temp;
|
221
|
+
}
|
222
|
+
}; // class iterator
|
223
|
+
|
224
|
+
} // namespace utf8::unchecked
|
225
|
+
} // namespace utf8
|
226
|
+
|
227
|
+
|
228
|
+
#endif // header guard
|
229
|
+
|
data/ext/common/Watchdog.cpp
CHANGED
@@ -51,6 +51,7 @@
|
|
51
51
|
#include "Utils.h"
|
52
52
|
#include "Utils/Base64.h"
|
53
53
|
#include "Utils/Timer.h"
|
54
|
+
#include "Utils/ScopeGuard.h"
|
54
55
|
#include "Utils/IOUtils.h"
|
55
56
|
#include "Utils/VariantMap.h"
|
56
57
|
|
@@ -88,37 +89,6 @@ static EventFd *errorEvent;
|
|
88
89
|
#define REQUEST_SOCKET_PASSWORD_SIZE 64
|
89
90
|
|
90
91
|
|
91
|
-
class FailGuard {
|
92
|
-
private:
|
93
|
-
function<void ()> func;
|
94
|
-
public:
|
95
|
-
FailGuard() { }
|
96
|
-
FailGuard(const function<void ()> &_func): func(_func) { }
|
97
|
-
|
98
|
-
~FailGuard() {
|
99
|
-
if (func != NULL) {
|
100
|
-
func();
|
101
|
-
}
|
102
|
-
}
|
103
|
-
|
104
|
-
void runNow() {
|
105
|
-
if (func != NULL) {
|
106
|
-
function<void ()> func = this->func;
|
107
|
-
this->func = NULL;
|
108
|
-
func();
|
109
|
-
}
|
110
|
-
}
|
111
|
-
|
112
|
-
void set(const function<void ()> &func) {
|
113
|
-
this->func = func;
|
114
|
-
}
|
115
|
-
|
116
|
-
void clear() {
|
117
|
-
func = NULL;
|
118
|
-
}
|
119
|
-
};
|
120
|
-
|
121
|
-
|
122
92
|
/**
|
123
93
|
* Abstract base class for watching agent processes.
|
124
94
|
*/
|
@@ -137,6 +107,7 @@ private:
|
|
137
107
|
pid = this->pid;
|
138
108
|
lock.unlock();
|
139
109
|
|
110
|
+
// Process can be started before the watcher thread is launched.
|
140
111
|
if (pid == 0) {
|
141
112
|
pid = start();
|
142
113
|
}
|
@@ -301,22 +272,19 @@ public:
|
|
301
272
|
this_thread::disable_interruption di;
|
302
273
|
this_thread::disable_syscall_interruption dsi;
|
303
274
|
string exeFilename = getExeFilename();
|
304
|
-
|
275
|
+
SocketPair fds;
|
276
|
+
int e, ret;
|
305
277
|
pid_t pid;
|
306
278
|
|
307
279
|
/* Create feedback fd for this agent process. We'll send some startup
|
308
280
|
* arguments to this agent process through this fd, and we'll receive
|
309
281
|
* startup information through it as well.
|
310
282
|
*/
|
311
|
-
|
312
|
-
int e = errno;
|
313
|
-
throw SystemException("Cannot create a Unix socket pair", e);
|
314
|
-
}
|
283
|
+
fds = createUnixSocketPair();
|
315
284
|
|
316
285
|
pid = syscalls::fork();
|
317
286
|
if (pid == 0) {
|
318
287
|
// Child
|
319
|
-
long max_fds, i;
|
320
288
|
|
321
289
|
/* Make sure file descriptor FEEDBACK_FD refers to the newly created
|
322
290
|
* feedback fd (fds[1]) and close all other file descriptors.
|
@@ -345,11 +313,7 @@ public:
|
|
345
313
|
}
|
346
314
|
}
|
347
315
|
|
348
|
-
|
349
|
-
max_fds = sysconf(_SC_OPEN_MAX);
|
350
|
-
for (i = FEEDBACK_FD + 1; i < max_fds; i++) {
|
351
|
-
syscalls::close(i);
|
352
|
-
}
|
316
|
+
closeAllFileDescriptors(FEEDBACK_FD);
|
353
317
|
|
354
318
|
/* Become the process group leader so that the watchdog can kill the
|
355
319
|
* agent as well as all its descendant processes. */
|
@@ -366,49 +330,58 @@ public:
|
|
366
330
|
try {
|
367
331
|
MessageChannel(FEEDBACK_FD).write("exec error",
|
368
332
|
toString(e).c_str(), NULL);
|
369
|
-
_exit(1);
|
370
333
|
} catch (...) {
|
371
334
|
fprintf(stderr, "Passenger Watchdog: could not execute %s: %s (%d)\n",
|
372
335
|
exeFilename.c_str(), strerror(e), e);
|
373
336
|
fflush(stderr);
|
374
|
-
_exit(1);
|
375
337
|
}
|
338
|
+
_exit(1);
|
376
339
|
} else if (pid == -1) {
|
377
340
|
// Error
|
378
341
|
e = errno;
|
379
|
-
syscalls::close(fds[0]);
|
380
|
-
syscalls::close(fds[1]);
|
381
342
|
throw SystemException("Cannot fork a new process", e);
|
382
343
|
} else {
|
383
344
|
// Parent
|
384
|
-
FileDescriptor feedbackFd
|
345
|
+
FileDescriptor feedbackFd = fds[0];
|
385
346
|
vector<string> args;
|
386
347
|
|
387
|
-
|
348
|
+
fds[1].close();
|
388
349
|
this_thread::restore_interruption ri(di);
|
389
350
|
this_thread::restore_syscall_interruption rsi(dsi);
|
390
|
-
|
351
|
+
ScopeGuard failGuard(boost::bind(killAndWait, pid));
|
391
352
|
|
392
|
-
|
353
|
+
/* Send startup arguments. Ignore EPIPE and ECONNRESET here
|
354
|
+
* because the child process might have sent an feedback message
|
355
|
+
* without reading startup arguments.
|
356
|
+
*/
|
393
357
|
try {
|
394
358
|
sendStartupArguments(pid, feedbackFd);
|
395
359
|
} catch (const SystemException &ex) {
|
396
|
-
|
397
|
-
"
|
398
|
-
|
360
|
+
if (ex.code() != EPIPE && ex.code() != ECONNRESET) {
|
361
|
+
throw SystemException(string("Unable to start the ") + name() +
|
362
|
+
": an error occurred while sending startup arguments",
|
363
|
+
ex.code());
|
364
|
+
}
|
399
365
|
}
|
400
366
|
|
401
367
|
// Now read its feedback.
|
402
368
|
try {
|
403
|
-
|
404
|
-
|
369
|
+
ret = MessageChannel(feedbackFd).read(args);
|
370
|
+
} catch (const SystemException &e) {
|
371
|
+
if (e.code() == ECONNRESET) {
|
372
|
+
ret = false;
|
373
|
+
} else {
|
374
|
+
throw SystemException(string("Unable to start the ") + name() +
|
375
|
+
": unable to read its startup information",
|
376
|
+
e.code());
|
405
377
|
}
|
406
|
-
}
|
378
|
+
}
|
379
|
+
if (!ret) {
|
407
380
|
this_thread::disable_interruption di2;
|
408
381
|
this_thread::disable_syscall_interruption dsi2;
|
409
382
|
int status;
|
410
383
|
|
411
|
-
/* The feedback fd was closed for an unknown reason.
|
384
|
+
/* The feedback fd was prematurely closed for an unknown reason.
|
412
385
|
* Did the agent process crash?
|
413
386
|
*
|
414
387
|
* We use timedWaitPid() here because if the process crashed
|
@@ -417,7 +390,7 @@ public:
|
|
417
390
|
* message, so we give it some time to print the error
|
418
391
|
* before we kill it.
|
419
392
|
*/
|
420
|
-
ret = timedWaitPid(pid, &status,
|
393
|
+
ret = timedWaitPid(pid, &status, 5000);
|
421
394
|
if (ret == 0) {
|
422
395
|
/* Doesn't look like it; it seems it's still running.
|
423
396
|
* We can't do anything without proper feedback so kill
|
@@ -425,36 +398,40 @@ public:
|
|
425
398
|
*/
|
426
399
|
failGuard.runNow();
|
427
400
|
throw RuntimeException(string("Unable to start the ") + name() +
|
428
|
-
": an unknown error
|
401
|
+
": it froze and reported an unknown error during its startup");
|
429
402
|
} else if (ret != -1 && WIFSIGNALED(status)) {
|
430
403
|
/* Looks like a crash which caused a signal. */
|
431
404
|
throw RuntimeException(string("Unable to start the ") + name() +
|
432
405
|
": it seems to have been killed with signal " +
|
433
406
|
getSignalName(WTERMSIG(status)) + " during startup");
|
434
|
-
} else {
|
407
|
+
} else if (ret == -1) {
|
435
408
|
/* Looks like it exited after detecting an error. */
|
436
409
|
throw RuntimeException(string("Unable to start the ") + name() +
|
437
410
|
": it seems to have crashed during startup for an unknown reason");
|
411
|
+
} else {
|
412
|
+
/* Looks like it exited after detecting an error, but has an exit code. */
|
413
|
+
throw RuntimeException(string("Unable to start the ") + name() +
|
414
|
+
": it seems to have crashed during startup for an unknown reason, "
|
415
|
+
"with exit code " + toString(WEXITSTATUS(status)));
|
438
416
|
}
|
439
|
-
} catch (const SystemException &e) {
|
440
|
-
throw SystemException(string("Unable to start the ") + name() +
|
441
|
-
": unable to read its startup information",
|
442
|
-
e.code());
|
443
|
-
} catch (const RuntimeException &) {
|
444
|
-
/* Rethrow without killing the PID because the process
|
445
|
-
* is already dead.
|
446
|
-
*/
|
447
|
-
failGuard.clear();
|
448
|
-
throw;
|
449
417
|
}
|
450
418
|
|
451
419
|
if (args[0] == "system error before exec") {
|
452
420
|
throw SystemException(string("Unable to start the ") + name() +
|
453
421
|
": " + args[1], atoi(args[2]));
|
454
422
|
} else if (args[0] == "exec error") {
|
455
|
-
|
456
|
-
|
457
|
-
|
423
|
+
e = atoi(args[1]);
|
424
|
+
if (e == ENOENT) {
|
425
|
+
throw RuntimeException(string("Unable to start the ") + name() +
|
426
|
+
" because its executable (" + getExeFilename() + ") "
|
427
|
+
"doesn't exist. This probably means that your "
|
428
|
+
"Phusion Passenger installation is broken or "
|
429
|
+
"incomplete. Please reinstall Phusion Passenger");
|
430
|
+
} else {
|
431
|
+
throw SystemException(string("Unable to start the ") + name() +
|
432
|
+
" because exec(\"" + getExeFilename() + "\") failed",
|
433
|
+
atoi(args[1]));
|
434
|
+
}
|
458
435
|
} else if (!processStartupInfo(pid, feedbackFd, args)) {
|
459
436
|
throw RuntimeException(string("The ") + name() +
|
460
437
|
" sent an unknown startup info message '" +
|
@@ -540,7 +517,7 @@ public:
|
|
540
517
|
}
|
541
518
|
|
542
519
|
/**
|
543
|
-
* Returns the agent process feedback fd, or
|
520
|
+
* Returns the agent process feedback fd, or -1 if the agent process
|
544
521
|
* hasn't been started yet. Can be used to check whether this agent process
|
545
522
|
* has exited without using waitpid().
|
546
523
|
*/
|
@@ -681,13 +658,8 @@ private:
|
|
681
658
|
if (pid == 0) {
|
682
659
|
// Child
|
683
660
|
int prio, ret, e;
|
684
|
-
long max_fds, i;
|
685
661
|
|
686
|
-
|
687
|
-
max_fds = sysconf(_SC_OPEN_MAX);
|
688
|
-
for (i = 3; i < max_fds; i++) {
|
689
|
-
syscalls::close(i);
|
690
|
-
}
|
662
|
+
closeAllFileDescriptors(2);
|
691
663
|
|
692
664
|
// Make process nicer.
|
693
665
|
do {
|
@@ -919,11 +891,6 @@ forceAllAgentsShutdown(vector<AgentWatcher *> &watchers) {
|
|
919
891
|
|
920
892
|
int
|
921
893
|
main(int argc, char *argv[]) {
|
922
|
-
/* Become the session leader so that Apache can't kill this
|
923
|
-
* watchdog with killpg() during shutdown, and so that a
|
924
|
-
* Ctrl-C only affects the web server.
|
925
|
-
*/
|
926
|
-
setsid();
|
927
894
|
disableOomKiller();
|
928
895
|
|
929
896
|
agentsOptions = initializeAgent(argc, argv, "PassengerWatchdog");
|