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
@@ -54,6 +54,18 @@ struct remove_const_impl
|
|
54
54
|
>::type type;
|
55
55
|
};
|
56
56
|
|
57
|
+
#ifndef BOOST_NO_RVALUE_REFERENCES
|
58
|
+
//
|
59
|
+
// We can't filter out rvalue_references at the same level as
|
60
|
+
// references or we get ambiguities from msvc:
|
61
|
+
//
|
62
|
+
template <typename T>
|
63
|
+
struct remove_const_impl<T&&>
|
64
|
+
{
|
65
|
+
typedef T&& type;
|
66
|
+
};
|
67
|
+
#endif
|
68
|
+
|
57
69
|
} // namespace detail
|
58
70
|
|
59
71
|
// * convert a type T to non-const type - remove_const<T>
|
@@ -27,10 +27,32 @@
|
|
27
27
|
|
28
28
|
namespace boost {
|
29
29
|
|
30
|
+
namespace detail{
|
31
|
+
|
32
|
+
template <class T>
|
33
|
+
struct rvalue_ref_filter_rem_cv
|
34
|
+
{
|
35
|
+
typedef typename boost::detail::cv_traits_imp<T*>::unqualified_type type;
|
36
|
+
};
|
37
|
+
|
38
|
+
#ifndef BOOST_NO_RVALUE_REFERENCES
|
39
|
+
//
|
40
|
+
// We can't filter out rvalue_references at the same level as
|
41
|
+
// references or we get ambiguities from msvc:
|
42
|
+
//
|
43
|
+
template <class T>
|
44
|
+
struct rvalue_ref_filter_rem_cv<T&&>
|
45
|
+
{
|
46
|
+
typedef T&& type;
|
47
|
+
};
|
48
|
+
#endif
|
49
|
+
|
50
|
+
}
|
51
|
+
|
30
52
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
31
53
|
|
32
54
|
// convert a type T to a non-cv-qualified type - remove_cv<T>
|
33
|
-
BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_cv,T,typename boost::detail::
|
55
|
+
BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_cv,T,typename boost::detail::rvalue_ref_filter_rem_cv<T>::type)
|
34
56
|
BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_cv,T&,T&)
|
35
57
|
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
|
36
58
|
BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const[N],T type[N])
|
@@ -24,7 +24,27 @@ namespace boost {
|
|
24
24
|
|
25
25
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
26
26
|
|
27
|
-
|
27
|
+
namespace detail{
|
28
|
+
//
|
29
|
+
// We can't filter out rvalue_references at the same level as
|
30
|
+
// references or we get ambiguities from msvc:
|
31
|
+
//
|
32
|
+
template <class T>
|
33
|
+
struct remove_rvalue_ref
|
34
|
+
{
|
35
|
+
typedef T type;
|
36
|
+
};
|
37
|
+
#ifndef BOOST_NO_RVALUE_REFERENCES
|
38
|
+
template <class T>
|
39
|
+
struct remove_rvalue_ref<T&&>
|
40
|
+
{
|
41
|
+
typedef T type;
|
42
|
+
};
|
43
|
+
#endif
|
44
|
+
|
45
|
+
} // namespace detail
|
46
|
+
|
47
|
+
BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_reference,T,typename boost::detail::remove_rvalue_ref<T>::type)
|
28
48
|
BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T&,T)
|
29
49
|
|
30
50
|
#if defined(BOOST_ILLEGAL_CV_REFERENCES)
|
@@ -286,43 +286,43 @@ struct __declspec(align(128)) a128 {
|
|
286
286
|
template<> class type_with_alignment<8>
|
287
287
|
{
|
288
288
|
typedef mpl::if_c<
|
289
|
-
::boost::alignment_of<detail::max_align>::value < 8,
|
289
|
+
::boost::alignment_of<boost::detail::max_align>::value < 8,
|
290
290
|
align::a8,
|
291
|
-
detail::type_with_alignment_imp<8> >::type t1;
|
291
|
+
boost::detail::type_with_alignment_imp<8> >::type t1;
|
292
292
|
public:
|
293
293
|
typedef t1::type type;
|
294
294
|
};
|
295
295
|
template<> class type_with_alignment<16>
|
296
296
|
{
|
297
297
|
typedef mpl::if_c<
|
298
|
-
::boost::alignment_of<detail::max_align>::value < 16,
|
298
|
+
::boost::alignment_of<boost::detail::max_align>::value < 16,
|
299
299
|
align::a16,
|
300
|
-
detail::type_with_alignment_imp<16> >::type t1;
|
300
|
+
boost::detail::type_with_alignment_imp<16> >::type t1;
|
301
301
|
public:
|
302
302
|
typedef t1::type type;
|
303
303
|
};
|
304
304
|
template<> class type_with_alignment<32>
|
305
305
|
{
|
306
306
|
typedef mpl::if_c<
|
307
|
-
::boost::alignment_of<detail::max_align>::value < 32,
|
307
|
+
::boost::alignment_of<boost::detail::max_align>::value < 32,
|
308
308
|
align::a32,
|
309
|
-
detail::type_with_alignment_imp<32> >::type t1;
|
309
|
+
boost::detail::type_with_alignment_imp<32> >::type t1;
|
310
310
|
public:
|
311
311
|
typedef t1::type type;
|
312
312
|
};
|
313
313
|
template<> class type_with_alignment<64> {
|
314
314
|
typedef mpl::if_c<
|
315
|
-
::boost::alignment_of<detail::max_align>::value < 64,
|
315
|
+
::boost::alignment_of<boost::detail::max_align>::value < 64,
|
316
316
|
align::a64,
|
317
|
-
detail::type_with_alignment_imp<64> >::type t1;
|
317
|
+
boost::detail::type_with_alignment_imp<64> >::type t1;
|
318
318
|
public:
|
319
319
|
typedef t1::type type;
|
320
320
|
};
|
321
321
|
template<> class type_with_alignment<128> {
|
322
322
|
typedef mpl::if_c<
|
323
|
-
::boost::alignment_of<detail::max_align>::value < 128,
|
323
|
+
::boost::alignment_of<boost::detail::max_align>::value < 128,
|
324
324
|
align::a128,
|
325
|
-
detail::type_with_alignment_imp<128> >::type t1;
|
325
|
+
boost::detail::type_with_alignment_imp<128> >::type t1;
|
326
326
|
public:
|
327
327
|
typedef t1::type type;
|
328
328
|
};
|
@@ -0,0 +1,104 @@
|
|
1
|
+
// Boost.Units - A C++ library for zero-overhead dimensional analysis and
|
2
|
+
// unit/quantity manipulation and conversion
|
3
|
+
//
|
4
|
+
// Copyright (C) 2003-2008 Matthias Christian Schabel
|
5
|
+
// Copyright (C) 2008 Steven Watanabe
|
6
|
+
//
|
7
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
8
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
9
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
10
|
+
|
11
|
+
#ifndef BOOST_UNITS_UTILITY_HPP
|
12
|
+
#define BOOST_UNITS_UTILITY_HPP
|
13
|
+
|
14
|
+
#include <cstdlib>
|
15
|
+
#include <typeinfo>
|
16
|
+
#include <string>
|
17
|
+
|
18
|
+
#if defined(__GLIBCXX__) || defined(__GLIBCPP__)
|
19
|
+
#define BOOST_UNITS_USE_DEMANGLING
|
20
|
+
#include <cxxabi.h>
|
21
|
+
#endif // __GNUC__
|
22
|
+
|
23
|
+
#ifdef BOOST_UNITS_USE_DEMANGLING
|
24
|
+
|
25
|
+
#include <boost/algorithm/string/replace.hpp>
|
26
|
+
|
27
|
+
namespace boost {
|
28
|
+
|
29
|
+
namespace units {
|
30
|
+
|
31
|
+
namespace detail {
|
32
|
+
|
33
|
+
inline
|
34
|
+
std::string
|
35
|
+
demangle(const char* name)
|
36
|
+
{
|
37
|
+
// need to demangle C++ symbols
|
38
|
+
char* realname;
|
39
|
+
std::size_t len;
|
40
|
+
int stat;
|
41
|
+
|
42
|
+
realname = abi::__cxa_demangle(name,NULL,&len,&stat);
|
43
|
+
|
44
|
+
if (realname != NULL)
|
45
|
+
{
|
46
|
+
std::string out(realname);
|
47
|
+
|
48
|
+
std::free(realname);
|
49
|
+
|
50
|
+
boost::replace_all(out,"boost::units::","");
|
51
|
+
|
52
|
+
return out;
|
53
|
+
}
|
54
|
+
|
55
|
+
return std::string("demangle :: error - unable to demangle specified symbol");
|
56
|
+
}
|
57
|
+
|
58
|
+
} // namespace detail
|
59
|
+
|
60
|
+
template<class L>
|
61
|
+
std::string simplify_typename(const L& /*source*/)
|
62
|
+
{
|
63
|
+
const std::string demangled = detail::demangle(typeid(L).name());
|
64
|
+
|
65
|
+
return demangled;
|
66
|
+
}
|
67
|
+
|
68
|
+
} // namespace units
|
69
|
+
|
70
|
+
} // namespace boost
|
71
|
+
|
72
|
+
#else // BOOST_UNITS_USE_DEMANGLING
|
73
|
+
|
74
|
+
namespace boost {
|
75
|
+
|
76
|
+
namespace units {
|
77
|
+
|
78
|
+
namespace detail {
|
79
|
+
|
80
|
+
inline
|
81
|
+
std::string
|
82
|
+
demangle(const char* name)
|
83
|
+
{
|
84
|
+
return name;
|
85
|
+
}
|
86
|
+
|
87
|
+
} // namespace detail
|
88
|
+
|
89
|
+
template<class L>
|
90
|
+
std::string simplify_typename(const L& /*source*/)
|
91
|
+
{
|
92
|
+
return std::string(typeid(L).name());
|
93
|
+
}
|
94
|
+
|
95
|
+
} // namespace units
|
96
|
+
|
97
|
+
} // namespace boost
|
98
|
+
|
99
|
+
// To get system-specific predefined macros:
|
100
|
+
// gcc -arch ppc -dM -E - < /dev/null | sort
|
101
|
+
|
102
|
+
#endif // BOOST_UNITS_USE_DEMANGLING
|
103
|
+
|
104
|
+
#endif // BOOST_UNITS_UTILITY_HPP
|
@@ -4,7 +4,7 @@
|
|
4
4
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
5
5
|
// http://www.boost.org/LICENSE_1_0.txt)
|
6
6
|
//
|
7
|
-
// See http://www.boost.org/
|
7
|
+
// See http://www.boost.org/libs/optional for documentation.
|
8
8
|
//
|
9
9
|
// You are welcome to contact the author at:
|
10
10
|
// fernando_cacciola@hotmail.com
|
@@ -47,6 +47,7 @@
|
|
47
47
|
#include "Utils/IOUtils.h"
|
48
48
|
#include "Utils/Base64.h"
|
49
49
|
#include "Utils/Timer.h"
|
50
|
+
#include "Utils/ScopeGuard.h"
|
50
51
|
#include "Utils/VariantMap.h"
|
51
52
|
|
52
53
|
namespace Passenger {
|
@@ -117,12 +118,78 @@ private:
|
|
117
118
|
*/
|
118
119
|
ServerInstanceDir::GenerationPtr generation;
|
119
120
|
|
120
|
-
|
121
|
-
|
122
|
-
|
121
|
+
/**
|
122
|
+
* Safely dup2() the given file descriptor to 3 (FEEDBACK_FD).
|
123
|
+
*/
|
124
|
+
void installFeedbackFd(const FileDescriptor &fd) {
|
125
|
+
if (fd != FEEDBACK_FD && syscalls::dup2(fd, FEEDBACK_FD) == -1) {
|
126
|
+
int e = errno;
|
127
|
+
try {
|
128
|
+
MessageChannel channel(fd);
|
129
|
+
channel.write("system error",
|
130
|
+
"dup2() failed",
|
131
|
+
toString(e).c_str(),
|
132
|
+
NULL);
|
133
|
+
_exit(1);
|
134
|
+
} catch (...) {
|
135
|
+
fprintf(stderr, "Passenger AgentsStarter: dup2() failed: %s (%d)\n",
|
136
|
+
strerror(e), e);
|
137
|
+
fflush(stderr);
|
138
|
+
_exit(1);
|
139
|
+
}
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
/**
|
144
|
+
* Call this if the watchdog seems to have crashed. This function will try
|
145
|
+
* to determine whether the watchdog is still running, whether it crashed
|
146
|
+
* with a signal, etc. If it has detected that the watchdog is no longer running
|
147
|
+
* then it will set <em>pid</em> to -1.
|
148
|
+
*/
|
149
|
+
void inspectWatchdogCrashReason(pid_t &pid) {
|
150
|
+
this_thread::disable_interruption di;
|
151
|
+
this_thread::disable_syscall_interruption dsi;
|
152
|
+
int ret, status;
|
153
|
+
|
154
|
+
/* Upon noticing that something went wrong, the watchdog
|
155
|
+
* or its subprocesses might still be writing out an error
|
156
|
+
* report, so we wait a while before killing the watchdog.
|
157
|
+
*/
|
158
|
+
ret = timedWaitPid(pid, &status, 5000);
|
159
|
+
if (ret == 0) {
|
160
|
+
/* Looks like the watchdog didn't crash and is still running. */
|
161
|
+
throw RuntimeException(
|
162
|
+
"Unable to start the Phusion Passenger watchdog: "
|
163
|
+
"it froze during startup and reported an unknown error");
|
164
|
+
} else if (ret != -1 && WIFSIGNALED(status)) {
|
165
|
+
/* Looks like a crash which caused a signal. */
|
166
|
+
pid = -1;
|
167
|
+
throw RuntimeException(
|
168
|
+
"Unable to start the Phusion Passenger watchdog: "
|
169
|
+
"it seems to have been killed with signal " +
|
170
|
+
getSignalName(WTERMSIG(status)) + " during startup");
|
171
|
+
} else if (ret == -1) {
|
172
|
+
/* Looks like it exited for a different reason and has no exit code. */
|
173
|
+
pid = -1;
|
174
|
+
throw RuntimeException(
|
175
|
+
"Unable to start the Phusion Passenger watchdog: "
|
176
|
+
"it seems to have crashed during startup for an unknown reason");
|
177
|
+
} else {
|
178
|
+
/* Looks like it exited for a different reason, but has an exit code. */
|
179
|
+
pid = -1;
|
180
|
+
throw RuntimeException(
|
181
|
+
"Unable to start the Phusion Passenger watchdog: "
|
182
|
+
"it seems to have crashed during startup for an unknown reason, "
|
183
|
+
"with exit code " + toString(WEXITSTATUS(status)));
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
static void killProcessGroupAndWait(pid_t *pid, unsigned long long timeout = 0) {
|
188
|
+
if (*pid != -1 && (timeout == 0 || timedWaitPid(*pid, NULL, timeout) <= 0)) {
|
123
189
|
this_thread::disable_syscall_interruption dsi;
|
124
|
-
syscalls::
|
125
|
-
syscalls::waitpid(pid, NULL, 0);
|
190
|
+
syscalls::killpg(*pid, SIGKILL);
|
191
|
+
syscalls::waitpid(*pid, NULL, 0);
|
192
|
+
*pid = -1;
|
126
193
|
}
|
127
194
|
}
|
128
195
|
|
@@ -327,7 +394,7 @@ public:
|
|
327
394
|
|
328
395
|
string realUnionStationGatewayCert;
|
329
396
|
if (unionStationGatewayCert.empty()) {
|
330
|
-
realUnionStationGatewayCert = locator.
|
397
|
+
realUnionStationGatewayCert = locator.getResourcesDir() + "/union_station_gateway.crt";
|
331
398
|
} else if (unionStationGatewayCert != "-") {
|
332
399
|
realUnionStationGatewayCert = unionStationGatewayCert;
|
333
400
|
}
|
@@ -360,46 +427,33 @@ public:
|
|
360
427
|
.set ("union_station_gateway_cert", realUnionStationGatewayCert)
|
361
428
|
.set ("prestart_urls", serializePrestartURLs(prestartURLs));
|
362
429
|
|
363
|
-
|
430
|
+
SocketPair fds;
|
431
|
+
int e;
|
364
432
|
pid_t pid;
|
365
433
|
|
366
|
-
|
367
|
-
e = errno;
|
368
|
-
throw SystemException("Cannot create a Unix socket pair", e);
|
369
|
-
}
|
370
|
-
|
434
|
+
fds = createUnixSocketPair();
|
371
435
|
pid = syscalls::fork();
|
372
436
|
if (pid == 0) {
|
373
437
|
// Child
|
374
|
-
|
438
|
+
|
439
|
+
/* Become the session leader so that Apache can't kill the
|
440
|
+
* watchdog with killpg() during shutdown, so that a
|
441
|
+
* Ctrl-C only affects the web server, and so that
|
442
|
+
* we can kill all of our subprocesses in a single killpg().
|
443
|
+
*/
|
444
|
+
setsid();
|
375
445
|
|
376
446
|
// Make sure the feedback fd is 3 and close all file descriptors
|
377
447
|
// except stdin, stdout, stderr and 3.
|
378
448
|
syscalls::close(fds[0]);
|
449
|
+
installFeedbackFd(fds[1]);
|
450
|
+
closeAllFileDescriptors(FEEDBACK_FD);
|
379
451
|
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
"dup2() failed",
|
386
|
-
toString(e).c_str(),
|
387
|
-
NULL);
|
388
|
-
_exit(1);
|
389
|
-
} catch (...) {
|
390
|
-
fprintf(stderr, "Passenger AgentsStarter: dup2() failed: %s (%d)\n",
|
391
|
-
strerror(e), e);
|
392
|
-
fflush(stderr);
|
393
|
-
_exit(1);
|
394
|
-
}
|
395
|
-
}
|
396
|
-
}
|
397
|
-
max_fds = sysconf(_SC_OPEN_MAX);
|
398
|
-
for (i = FEEDBACK_FD + 1; i < max_fds; i++) {
|
399
|
-
if (i != fds[1]) {
|
400
|
-
syscalls::close(i);
|
401
|
-
}
|
402
|
-
}
|
452
|
+
/* We don't know how the web server or the environment affect
|
453
|
+
* signal handlers and the signal mask, so reset this stuff
|
454
|
+
* just in case.
|
455
|
+
*/
|
456
|
+
resetSignalHandlersAndMask();
|
403
457
|
|
404
458
|
if (afterFork) {
|
405
459
|
afterFork();
|
@@ -408,7 +462,8 @@ public:
|
|
408
462
|
execl(watchdogFilename.c_str(), "PassengerWatchdog", (char *) 0);
|
409
463
|
e = errno;
|
410
464
|
try {
|
411
|
-
MessageChannel
|
465
|
+
MessageChannel channel(FEEDBACK_FD);
|
466
|
+
channel.write("exec error", toString(e).c_str(), NULL);
|
412
467
|
_exit(1);
|
413
468
|
} catch (...) {
|
414
469
|
fprintf(stderr, "Passenger AgentsStarter: could not execute %s: %s (%d)\n",
|
@@ -419,64 +474,37 @@ public:
|
|
419
474
|
} else if (pid == -1) {
|
420
475
|
// Error
|
421
476
|
e = errno;
|
422
|
-
syscalls::close(fds[0]);
|
423
|
-
syscalls::close(fds[1]);
|
424
477
|
throw SystemException("Cannot fork a new process", e);
|
425
478
|
} else {
|
426
479
|
// Parent
|
427
480
|
UPDATE_TRACE_POINT();
|
428
|
-
FileDescriptor feedbackFd
|
481
|
+
FileDescriptor feedbackFd = fds[0];
|
429
482
|
MessageChannel feedbackChannel(fds[0]);
|
430
483
|
vector<string> args;
|
431
|
-
bool allAgentsStarted;
|
432
|
-
int status;
|
484
|
+
bool result, allAgentsStarted;
|
433
485
|
|
434
486
|
ServerInstanceDirPtr serverInstanceDir;
|
435
487
|
ServerInstanceDir::GenerationPtr generation;
|
488
|
+
ScopeGuard guard(boost::bind(&AgentsStarter::killProcessGroupAndWait, &pid, 0));
|
489
|
+
fds[1].close();
|
436
490
|
|
437
|
-
syscalls::close(fds[1]);
|
438
491
|
|
439
492
|
/****** Send arguments to watchdog through the feedback channel ******/
|
440
493
|
|
441
494
|
UPDATE_TRACE_POINT();
|
495
|
+
/* Here we don't care about EPIPE and ECONNRESET errors. The watchdog
|
496
|
+
* could have sent an error message over the feedback fd without
|
497
|
+
* reading the arguments. We'll notice that later.
|
498
|
+
*/
|
442
499
|
try {
|
443
500
|
watchdogArgs.writeToChannel(feedbackChannel);
|
444
|
-
} catch (const SystemException &) {
|
445
|
-
|
446
|
-
|
447
|
-
* exited yet so give it a short while to exit and to
|
448
|
-
* print an error.
|
449
|
-
*/
|
450
|
-
ret = timedWaitPid(pid, &status, 2000);
|
451
|
-
if (ret == 0) {
|
452
|
-
/* Doesn't look like it; it seems it's still running.
|
453
|
-
* We can't do anything in this state anyway, so
|
454
|
-
* throw an exception.
|
455
|
-
*/
|
456
|
-
killAndWait(pid);
|
457
|
-
throw RuntimeException(
|
458
|
-
"Unable to start the Phusion Passenger watchdog: "
|
459
|
-
"an unknown error occurred during its startup");
|
460
|
-
} else if (ret != -1 && WIFSIGNALED(status)) {
|
461
|
-
/* Looks like a crash which caused a signal. */
|
462
|
-
throw RuntimeException(
|
463
|
-
"Unable to start the Phusion Passenger watchdog: "
|
464
|
-
"it seems to have been killed with signal " +
|
465
|
-
getSignalName(WTERMSIG(status)) + " during startup");
|
466
|
-
} else if (ret == -1) {
|
467
|
-
/* Looks like it exited for a different reason and has no exit code. */
|
468
|
-
throw RuntimeException(
|
469
|
-
"Unable to start the Phusion Passenger watchdog: "
|
470
|
-
"it seems to have crashed during startup for an unknown reason");
|
471
|
-
} else {
|
472
|
-
/* Looks like it exited for a different reason, but has an exit code. */
|
473
|
-
throw RuntimeException(
|
474
|
-
"Unable to start the Phusion Passenger watchdog: "
|
475
|
-
"it seems to have crashed during startup for an unknown reason, "
|
476
|
-
"with exit code " + toString(WEXITSTATUS(status)));
|
501
|
+
} catch (const SystemException &e) {
|
502
|
+
if (e.code() != EPIPE && e.code() != ECONNRESET) {
|
503
|
+
inspectWatchdogCrashReason(pid);
|
477
504
|
}
|
478
505
|
}
|
479
506
|
|
507
|
+
|
480
508
|
/****** Read basic startup information ******/
|
481
509
|
|
482
510
|
this_thread::restore_interruption ri(di);
|
@@ -484,49 +512,21 @@ public:
|
|
484
512
|
UPDATE_TRACE_POINT();
|
485
513
|
|
486
514
|
try {
|
487
|
-
|
488
|
-
this_thread::disable_interruption di2;
|
489
|
-
this_thread::disable_syscall_interruption dsi2;
|
490
|
-
|
491
|
-
/* The feedback fd was closed for an unknown reason.
|
492
|
-
* Did the watchdog crash?
|
493
|
-
*/
|
494
|
-
ret = timedWaitPid(pid, &status, 2000);
|
495
|
-
if (ret == 0) {
|
496
|
-
/* Doesn't look like it; it seems it's still running.
|
497
|
-
* We can't do anything without proper feedback so kill
|
498
|
-
* the watchdog and throw an exception.
|
499
|
-
*/
|
500
|
-
killAndWait(pid);
|
501
|
-
throw RuntimeException("Unable to start the Phusion Passenger watchdog: "
|
502
|
-
"an unknown error occurred during its startup");
|
503
|
-
} else if (ret != -1 && WIFSIGNALED(status)) {
|
504
|
-
/* Looks like a crash which caused a signal. */
|
505
|
-
throw RuntimeException("Unable to start the Phusion Passenger watchdog: "
|
506
|
-
"it seems to have been killed with signal " +
|
507
|
-
getSignalName(WTERMSIG(status)) + " during startup");
|
508
|
-
} else if (ret == -1) {
|
509
|
-
/* Looks like it exited after detecting an error. */
|
510
|
-
throw RuntimeException("Unable to start the Phusion Passenger watchdog: "
|
511
|
-
"it seems to have crashed during startup for an unknown reason");
|
512
|
-
} else {
|
513
|
-
throw RuntimeException(
|
514
|
-
"Unable to start the Phusion Passenger watchdog: "
|
515
|
-
"it seems to have crashed during startup for an unknown reason, "
|
516
|
-
"with exit code " + toString(WEXITSTATUS(status)));
|
517
|
-
}
|
518
|
-
}
|
515
|
+
result = feedbackChannel.read(args);
|
519
516
|
} catch (const SystemException &ex) {
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
517
|
+
if (ex.code() == ECONNRESET) {
|
518
|
+
inspectWatchdogCrashReason(pid);
|
519
|
+
} else {
|
520
|
+
killProcessGroupAndWait(&pid, 5000);
|
521
|
+
guard.clear();
|
522
|
+
throw SystemException("Unable to start the Phusion Passenger watchdog: "
|
523
|
+
"unable to read its startup information",
|
524
|
+
ex.code());
|
525
|
+
}
|
526
|
+
}
|
527
|
+
if (!result) {
|
528
|
+
UPDATE_TRACE_POINT();
|
529
|
+
inspectWatchdogCrashReason(pid);
|
530
530
|
}
|
531
531
|
|
532
532
|
UPDATE_TRACE_POINT();
|
@@ -535,24 +535,36 @@ public:
|
|
535
535
|
serverInstanceDir.reset(new ServerInstanceDir(args[1], false));
|
536
536
|
generation = serverInstanceDir->getGeneration(atoi(args[2]));
|
537
537
|
} else {
|
538
|
-
killAndWait(pid, 2000);
|
539
538
|
throw IOException("Unable to start the Phusion Passenger watchdog: "
|
540
539
|
"it returned an invalid basic startup information message");
|
541
540
|
}
|
542
541
|
} else if (args[0] == "Watchdog startup error") {
|
543
|
-
|
542
|
+
killProcessGroupAndWait(&pid, 5000);
|
543
|
+
guard.clear();
|
544
544
|
throw RuntimeException("Unable to start the Phusion Passenger watchdog "
|
545
545
|
"because it encountered the following error during startup: " +
|
546
546
|
args[1]);
|
547
547
|
} else if (args[0] == "system error") {
|
548
|
-
|
548
|
+
killProcessGroupAndWait(&pid, 5000);
|
549
|
+
guard.clear();
|
549
550
|
throw SystemException(args[1], atoi(args[2]));
|
550
551
|
} else if (args[0] == "exec error") {
|
551
|
-
|
552
|
-
|
553
|
-
|
552
|
+
e = atoi(args[1]);
|
553
|
+
killProcessGroupAndWait(&pid, 5000);
|
554
|
+
guard.clear();
|
555
|
+
if (e == ENOENT) {
|
556
|
+
throw RuntimeException("Unable to start the Phusion Passenger watchdog "
|
557
|
+
"because its executable (" + watchdogFilename + ") does "
|
558
|
+
"not exist. This probably means that your Phusion Passenger "
|
559
|
+
"installation is broken or incomplete. Please reinstall "
|
560
|
+
"Phusion Passenger");
|
561
|
+
} else {
|
562
|
+
throw SystemException("Unable to start the Phusion Passenger watchdog (" +
|
563
|
+
watchdogFilename + ")", e);
|
564
|
+
}
|
554
565
|
}
|
555
566
|
|
567
|
+
|
556
568
|
/****** Read agents startup information ******/
|
557
569
|
|
558
570
|
UPDATE_TRACE_POINT();
|
@@ -561,44 +573,17 @@ public:
|
|
561
573
|
while (!allAgentsStarted) {
|
562
574
|
try {
|
563
575
|
UPDATE_TRACE_POINT();
|
564
|
-
|
565
|
-
this_thread::disable_interruption di2;
|
566
|
-
this_thread::disable_syscall_interruption dsi2;
|
567
|
-
|
568
|
-
/* The feedback fd was closed for an unknown reason.
|
569
|
-
* Did the watchdog crash?
|
570
|
-
*/
|
571
|
-
ret = syscalls::waitpid(pid, &status, WNOHANG);
|
572
|
-
if (ret == 0) {
|
573
|
-
/* Doesn't look like it; it seems it's still running.
|
574
|
-
* We can't do anything without proper feedback so kill
|
575
|
-
* the watchdo and throw an exception.
|
576
|
-
*/
|
577
|
-
killAndWait(pid, 2000);
|
578
|
-
throw RuntimeException("Unable to start the Phusion Passenger watchdog: "
|
579
|
-
"an unknown error occurred during its startup");
|
580
|
-
} else if (ret != -1 && WIFSIGNALED(status)) {
|
581
|
-
/* Looks like a crash which caused a signal. */
|
582
|
-
throw RuntimeException("Unable to start the Phusion Passenger watchdog: "
|
583
|
-
"it seems to have been killed with signal " +
|
584
|
-
getSignalName(WTERMSIG(status)) + " during startup");
|
585
|
-
} else {
|
586
|
-
/* Looks like it exited after detecting an error. */
|
587
|
-
throw RuntimeException("Unable to start the Phusion Passenger watchdog: "
|
588
|
-
"it seems to have crashed during startup for an unknown reason");
|
589
|
-
}
|
590
|
-
}
|
576
|
+
result = feedbackChannel.read(args);
|
591
577
|
} catch (const SystemException &ex) {
|
592
|
-
|
578
|
+
killProcessGroupAndWait(&pid, 5000);
|
579
|
+
guard.clear();
|
593
580
|
throw SystemException("Unable to start the Phusion Passenger watchdog: "
|
594
581
|
"unable to read all agent startup information",
|
595
582
|
ex.code());
|
596
|
-
}
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
killAndWait(pid, 2000);
|
601
|
-
throw;
|
583
|
+
}
|
584
|
+
if (!result) {
|
585
|
+
UPDATE_TRACE_POINT();
|
586
|
+
inspectWatchdogCrashReason(pid);
|
602
587
|
}
|
603
588
|
|
604
589
|
if (args[0] == "HelperAgent info") {
|
@@ -613,7 +598,8 @@ public:
|
|
613
598
|
this->serverInstanceDir = serverInstanceDir;
|
614
599
|
this->generation = generation;
|
615
600
|
} else {
|
616
|
-
|
601
|
+
killProcessGroupAndWait(&pid, 5000);
|
602
|
+
guard.clear();
|
617
603
|
throw IOException("Unable to start the Phusion Passenger watchdog: "
|
618
604
|
"it returned an invalid initialization feedback message");
|
619
605
|
}
|
@@ -624,7 +610,8 @@ public:
|
|
624
610
|
loggingSocketAddress = args[1];
|
625
611
|
loggingSocketPassword = args[2];
|
626
612
|
} else {
|
627
|
-
|
613
|
+
killProcessGroupAndWait(&pid, 5000);
|
614
|
+
guard.clear();
|
628
615
|
throw IOException("Unable to start the Phusion Passenger watchdog: "
|
629
616
|
"it returned an invalid initialization feedback message");
|
630
617
|
}
|
@@ -632,10 +619,13 @@ public:
|
|
632
619
|
allAgentsStarted = true;
|
633
620
|
} else {
|
634
621
|
UPDATE_TRACE_POINT();
|
635
|
-
|
622
|
+
killProcessGroupAndWait(&pid, 5000);
|
623
|
+
guard.clear();
|
636
624
|
throw RuntimeException("One of the Passenger agents sent an unknown feedback message '" + args[0] + "'");
|
637
625
|
}
|
638
626
|
}
|
627
|
+
|
628
|
+
guard.clear();
|
639
629
|
}
|
640
630
|
}
|
641
631
|
|