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
data/bin/passenger-stress-test
DELETED
@@ -1,345 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# Phusion Passenger - http://www.modrails.com/
|
3
|
-
# Copyright (c) 2010 Phusion
|
4
|
-
#
|
5
|
-
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
-
#
|
7
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
-
# of this software and associated documentation files (the "Software"), to deal
|
9
|
-
# in the Software without restriction, including without limitation the rights
|
10
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
-
# copies of the Software, and to permit persons to whom the Software is
|
12
|
-
# furnished to do so, subject to the following conditions:
|
13
|
-
#
|
14
|
-
# The above copyright notice and this permission notice shall be included in
|
15
|
-
# all copies or substantial portions of the Software.
|
16
|
-
#
|
17
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
-
# THE SOFTWARE.
|
24
|
-
|
25
|
-
source_root = File.expand_path(File.dirname(__FILE__) + "/..")
|
26
|
-
$LOAD_PATH.unshift("#{source_root}/lib")
|
27
|
-
require 'phusion_passenger'
|
28
|
-
require 'rubygems'
|
29
|
-
require 'optparse'
|
30
|
-
require 'socket'
|
31
|
-
require 'thread'
|
32
|
-
require 'phusion_passenger/platform_info'
|
33
|
-
require 'phusion_passenger/message_channel'
|
34
|
-
require 'phusion_passenger/utils'
|
35
|
-
|
36
|
-
include PhusionPassenger
|
37
|
-
include PhusionPassenger::Utils
|
38
|
-
include PhusionPassenger::PlatformInfo
|
39
|
-
|
40
|
-
# A thread or a process, depending on the Ruby VM implementation.
|
41
|
-
class Subprocess
|
42
|
-
attr_accessor :channel
|
43
|
-
|
44
|
-
def initialize(name, &block)
|
45
|
-
if RUBY_PLATFORM == "java"
|
46
|
-
a, b = UNIXSocket.pair
|
47
|
-
@thread = Thread.new do
|
48
|
-
block.call(true, MessageChannel.new(b))
|
49
|
-
end
|
50
|
-
@channel = MessageChannel.new(a)
|
51
|
-
@thread_channel = b
|
52
|
-
else
|
53
|
-
a, b = UNIXSocket.pair
|
54
|
-
@pid = safe_fork(name) do
|
55
|
-
a.close
|
56
|
-
$0 = name
|
57
|
-
Process.setsid
|
58
|
-
block.call(false, MessageChannel.new(b))
|
59
|
-
end
|
60
|
-
b.close
|
61
|
-
@channel = MessageChannel.new(a)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def stop
|
66
|
-
if RUBY_PLATFORM == "java"
|
67
|
-
@thread.terminate
|
68
|
-
@channel.close
|
69
|
-
@thread_channel.close
|
70
|
-
else
|
71
|
-
Process.kill('SIGKILL', @pid) rescue nil
|
72
|
-
Process.waitpid(@pid) rescue nil
|
73
|
-
@channel.close
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
class StressTester
|
79
|
-
def start
|
80
|
-
@options = parse_options
|
81
|
-
load_hawler
|
82
|
-
|
83
|
-
Thread.abort_on_exception = true
|
84
|
-
if GC.respond_to?(:copy_on_write_friendly=)
|
85
|
-
GC.copy_on_write_friendly = true
|
86
|
-
end
|
87
|
-
@terminal_height = ENV['LINES'] ? ENV['LINES'].to_i : 24
|
88
|
-
@terminal_width = ENV['COLUMNS'] ? ENV['COLUMNS'].to_i : 80
|
89
|
-
|
90
|
-
if Process.euid != 0
|
91
|
-
puts "*** WARNING: This program might not be able to restart " <<
|
92
|
-
"Apache because it's not running as root. Please run " <<
|
93
|
-
"this tool as root."
|
94
|
-
puts
|
95
|
-
puts "Press Enter to continue..."
|
96
|
-
begin
|
97
|
-
STDIN.readline
|
98
|
-
rescue Interrupt
|
99
|
-
exit 1
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
run_crawlers
|
104
|
-
end
|
105
|
-
|
106
|
-
def parse_options
|
107
|
-
options = {
|
108
|
-
:concurrency => 20,
|
109
|
-
:depth => 20,
|
110
|
-
:nice => true,
|
111
|
-
:apache_restart_interval => 24 * 60,
|
112
|
-
:app_restart_interval => 55
|
113
|
-
}
|
114
|
-
parser = OptionParser.new do |opts|
|
115
|
-
opts.banner = "Usage: passenger-stress-test <hostname> <app_root> [options]\n\n" <<
|
116
|
-
"Stress test the given (Passenger-powered) website by:\n" <<
|
117
|
-
" * crawling it with multiple concurrently running crawlers.\n" <<
|
118
|
-
" * gracefully restarting Apache at random times (please point the 'APXS2'\n" <<
|
119
|
-
" variable to your Apache's 'apxs' binary).\n" <<
|
120
|
-
" * restarting the target (Passenger-powered) application at random time.\n" <<
|
121
|
-
"\n" <<
|
122
|
-
"Example:\n" <<
|
123
|
-
" passenger-stress-test mywebsite.com /webapps/mywebsite\n" <<
|
124
|
-
"\n"
|
125
|
-
|
126
|
-
opts.separator "Options:"
|
127
|
-
opts.on("-c", "--concurrency N", Integer,
|
128
|
-
"Number of crawlers to start (default = #{options[:concurrency]})") do |v|
|
129
|
-
options[:concurrency] = v
|
130
|
-
end
|
131
|
-
opts.on("-p", "--apache-restart-interval N", Integer,
|
132
|
-
"Gracefully restart Apache after N minutes\n" <<
|
133
|
-
(" " * 37) << "(default = #{options[:apache_restart_interval]})") do |v|
|
134
|
-
options[:apache_restart_interval] = v
|
135
|
-
end
|
136
|
-
opts.on("-a", "--app-restart-interval N", Integer,
|
137
|
-
"Restart the application after N minutes\n" <<
|
138
|
-
(" " * 37) << "(default = #{options[:app_restart_interval]})") do |v|
|
139
|
-
options[:app_restart_interval] = v
|
140
|
-
end
|
141
|
-
opts.on("-h", "--help", "Show this message") do
|
142
|
-
puts opts
|
143
|
-
exit
|
144
|
-
end
|
145
|
-
end
|
146
|
-
parser.parse!
|
147
|
-
|
148
|
-
options[:host] = ARGV[0]
|
149
|
-
options[:app_root] = ARGV[1]
|
150
|
-
if !options[:host] || !options[:app_root]
|
151
|
-
puts parser
|
152
|
-
exit 1
|
153
|
-
end
|
154
|
-
return options
|
155
|
-
end
|
156
|
-
|
157
|
-
def load_hawler
|
158
|
-
begin
|
159
|
-
require 'hawler'
|
160
|
-
rescue LoadError
|
161
|
-
STDERR.puts "This tool requires Hawler (http://tinyurl.com/ywgk6x). Please install it with:"
|
162
|
-
STDERR.puts
|
163
|
-
STDERR.puts " gem install --source http://spoofed.org/files/hawler/ hawler"
|
164
|
-
exit 1
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
def run_crawlers
|
169
|
-
@started = false
|
170
|
-
@crawlers = []
|
171
|
-
|
172
|
-
# Start crawler processes.
|
173
|
-
GC.start if GC.copy_on_write_friendly?
|
174
|
-
@options[:concurrency].times do |i|
|
175
|
-
STDOUT.write("Starting crawler #{i + 1} of #{@options[:concurrency]}...\n")
|
176
|
-
STDOUT.flush
|
177
|
-
process = Subprocess.new("crawler #{i + 1}") do |is_thread, channel|
|
178
|
-
if !is_thread && @options[:nice]
|
179
|
-
system("renice 1 #{Process.pid} >/dev/null 2>/dev/null")
|
180
|
-
end
|
181
|
-
while true
|
182
|
-
crawl!(i + 1, channel)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
@crawlers << {
|
186
|
-
:id => i + 1,
|
187
|
-
:process => process,
|
188
|
-
:channel => process.channel,
|
189
|
-
:mutex => Mutex.new,
|
190
|
-
:current_uri => nil,
|
191
|
-
:crawled => 0
|
192
|
-
}
|
193
|
-
end
|
194
|
-
|
195
|
-
puts
|
196
|
-
if RUBY_PLATFORM != "java"
|
197
|
-
# 'sleep' b0rks when running in JRuby?
|
198
|
-
sleep 1
|
199
|
-
end
|
200
|
-
begin
|
201
|
-
$0 = "Passenger Crawler: control process"
|
202
|
-
io_to_crawler = {}
|
203
|
-
ios = []
|
204
|
-
@crawlers.each do |crawler|
|
205
|
-
io_to_crawler[crawler[:channel].io] = crawler
|
206
|
-
ios << crawler[:channel].io
|
207
|
-
end
|
208
|
-
|
209
|
-
# Tell each crawler to start crawling.
|
210
|
-
@crawlers.each do |crawler|
|
211
|
-
crawler[:channel].write("start")
|
212
|
-
end
|
213
|
-
|
214
|
-
# Show progress periodically.
|
215
|
-
@start_time = Time.now
|
216
|
-
progress_reporter = Thread.new(&method(:report_progress))
|
217
|
-
@next_apache_restart = Time.now + @options[:apache_restart_interval] * 60
|
218
|
-
apache_restarter = Thread.new(&method(:restart_apache))
|
219
|
-
@next_app_restart = Time.now + @options[:app_restart_interval] * 60
|
220
|
-
app_restarter = Thread.new(&method(:restart_app))
|
221
|
-
|
222
|
-
while true
|
223
|
-
note_progress(ios, io_to_crawler)
|
224
|
-
end
|
225
|
-
rescue Interrupt
|
226
|
-
trap('SIGINT') {}
|
227
|
-
puts "Shutting down..."
|
228
|
-
@done = true
|
229
|
-
@crawlers.each do |crawler|
|
230
|
-
STDOUT.write("Stopping crawler #{crawler[:id]} of #{@options[:concurrency]}...\r")
|
231
|
-
STDOUT.flush
|
232
|
-
crawler[:process].stop
|
233
|
-
end
|
234
|
-
progress_reporter.join if progress_reporter
|
235
|
-
apache_restarter.join if apache_restarter
|
236
|
-
app_restarter.join if app_restarter
|
237
|
-
puts
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
def note_progress(ios, io_to_crawler)
|
242
|
-
select(ios)[0].each do |io|
|
243
|
-
crawler = io_to_crawler[io]
|
244
|
-
uri = crawler[:channel].read[0]
|
245
|
-
crawler[:mutex].synchronize do
|
246
|
-
crawler[:current_uri] = uri
|
247
|
-
crawler[:crawled] += 1
|
248
|
-
end
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
def report_progress
|
253
|
-
while !@done
|
254
|
-
output = "\n" * @terminal_height
|
255
|
-
output << "### Running for #{duration(Time.now.to_i - @start_time.to_i)}\n"
|
256
|
-
@crawlers.each do |crawler|
|
257
|
-
crawler[:mutex].synchronize do
|
258
|
-
line = sprintf("Crawler %-2d: %-3d -> %s",
|
259
|
-
crawler[:id],
|
260
|
-
crawler[:crawled],
|
261
|
-
crawler[:current_uri])
|
262
|
-
output << sprintf("%-#{@terminal_width}s\n", line)
|
263
|
-
end
|
264
|
-
end
|
265
|
-
output << "Next Apache restart: in #{duration(@next_apache_restart.to_i - Time.now.to_i)}\n"
|
266
|
-
output << "Next app restart : in #{duration(@next_app_restart.to_i - Time.now.to_i)}\n"
|
267
|
-
STDOUT.write(output)
|
268
|
-
sleep 0.5
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
def restart_apache
|
273
|
-
while !@done
|
274
|
-
if Time.now > @next_apache_restart
|
275
|
-
@next_apache_restart = Time.now + @options[:apache_restart_interval] * 60
|
276
|
-
system("#{HTTPD} -k graceful")
|
277
|
-
end
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
def restart_app
|
282
|
-
while !@done
|
283
|
-
if Time.now > @next_app_restart
|
284
|
-
@next_app_restart = Time.now + @options[:app_restart_interval] * 60
|
285
|
-
system("touch #{@options[:app_root]}/tmp/restart.txt")
|
286
|
-
end
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
def duration(seconds)
|
291
|
-
result = ""
|
292
|
-
if seconds >= 60
|
293
|
-
minutes = (seconds / 60)
|
294
|
-
if minutes >= 60
|
295
|
-
hours = minutes / 60
|
296
|
-
minutes = minutes % 60
|
297
|
-
if hours == 1
|
298
|
-
result << "#{hours} hour "
|
299
|
-
else
|
300
|
-
result << "#{hours} hours "
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
|
-
seconds = seconds % 60
|
305
|
-
if minutes == 1
|
306
|
-
result << "#{minutes} minute "
|
307
|
-
else
|
308
|
-
result << "#{minutes} minutes "
|
309
|
-
end
|
310
|
-
end
|
311
|
-
result << "#{seconds} seconds"
|
312
|
-
return result
|
313
|
-
end
|
314
|
-
|
315
|
-
def crawl!(id, channel)
|
316
|
-
progress_reporter = lambda do |uri, referer, response|
|
317
|
-
begin
|
318
|
-
if !@started
|
319
|
-
# At the beginning, wait until the control process
|
320
|
-
# tells us to start.
|
321
|
-
@started = true
|
322
|
-
channel.read
|
323
|
-
end
|
324
|
-
channel.write(uri, referer, response)
|
325
|
-
rescue
|
326
|
-
if RUBY_PLATFORM == "java"
|
327
|
-
Thread.current.terminate
|
328
|
-
else
|
329
|
-
Process.kill('SIGKILL', Process.pid)
|
330
|
-
end
|
331
|
-
end
|
332
|
-
end
|
333
|
-
crawler = Hawler.new(@options[:host], progress_reporter)
|
334
|
-
if RUBY_PLATFORM == "java"
|
335
|
-
trap('SIGINT') do
|
336
|
-
raise Interrupt, "Interrupted"
|
337
|
-
end
|
338
|
-
end
|
339
|
-
crawler.recurse = true
|
340
|
-
crawler.depth = @options[:depth]
|
341
|
-
crawler.start
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
|
-
StressTester.new.start
|
data/debian/postinst
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
#!/bin/sh
|
2
|
-
if ruby -e ''; then
|
3
|
-
if ! ruby -rphusion_passenger/native_support -e '' 2>/dev/null; then
|
4
|
-
export RUBYLIB=/usr/lib/ruby/1.8
|
5
|
-
fi
|
6
|
-
passenger-install-apache2-module
|
7
|
-
if ! ruby -rubygems -rfastthread -e '' 2>/dev/null; then
|
8
|
-
echo
|
9
|
-
echo
|
10
|
-
echo "****** WARNING WARNING WARNING WARNING WARNING WARNING WARNING ******"
|
11
|
-
echo
|
12
|
-
echo "Passenger requires the Ruby library 'fastthread', which does not seem to be installed. Since there's no native package for it in the Debian repository, you must install it via RubyGems:"
|
13
|
-
echo
|
14
|
-
echo " gem install fastthread"
|
15
|
-
echo
|
16
|
-
echo "Please install fastthread, otherwise Passenger won't work."
|
17
|
-
echo
|
18
|
-
echo "****** WARNING WARNING WARNING WARNING WARNING WARNING WARNING ******"
|
19
|
-
fi
|
20
|
-
else
|
21
|
-
echo "********* NOTE ***********"
|
22
|
-
echo "Ruby doesn't seem to be installed. Please install Ruby and RubyGems, because Passenger needs them."
|
23
|
-
fi
|
24
|
-
exit 0
|
@@ -1,215 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
-
<!DOCTYPE html
|
3
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
-
<html>
|
6
|
-
<head>
|
7
|
-
<title>Class: ConditionVariable</title>
|
8
|
-
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
9
|
-
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
10
|
-
|
11
|
-
<script language="JavaScript" type="text/javascript">
|
12
|
-
// <![CDATA[
|
13
|
-
|
14
|
-
function toggleSource( id )
|
15
|
-
{
|
16
|
-
var elem
|
17
|
-
var link
|
18
|
-
|
19
|
-
if( document.getElementById )
|
20
|
-
{
|
21
|
-
elem = document.getElementById( id )
|
22
|
-
link = document.getElementById( "l_" + id )
|
23
|
-
}
|
24
|
-
else if ( document.all )
|
25
|
-
{
|
26
|
-
elem = eval( "document.all." + id )
|
27
|
-
link = eval( "document.all.l_" + id )
|
28
|
-
}
|
29
|
-
else
|
30
|
-
return false;
|
31
|
-
|
32
|
-
if( elem.style.display == "block" )
|
33
|
-
{
|
34
|
-
elem.style.display = "none"
|
35
|
-
link.innerHTML = "show source"
|
36
|
-
}
|
37
|
-
else
|
38
|
-
{
|
39
|
-
elem.style.display = "block"
|
40
|
-
link.innerHTML = "hide source"
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
function openCode( url )
|
45
|
-
{
|
46
|
-
window.open( url, "SOURCE_CODE", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=480,width=750" ).focus();
|
47
|
-
}
|
48
|
-
// ]]>
|
49
|
-
</script>
|
50
|
-
</head>
|
51
|
-
|
52
|
-
<body>
|
53
|
-
<table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
|
54
|
-
<td class="file-title"><span class="file-title-prefix">Class</span><br />ConditionVariable</td>
|
55
|
-
<td align="right">
|
56
|
-
<table cellspacing="0" cellpadding="2">
|
57
|
-
<tr valign="top">
|
58
|
-
<td>In:</td>
|
59
|
-
<td>
|
60
|
-
<a href="../files/lib/phusion_passenger/utils_rb.html">lib/phusion_passenger/utils.rb</a>
|
61
|
-
</td>
|
62
|
-
</tr>
|
63
|
-
<tr>
|
64
|
-
<td>Parent:</td>
|
65
|
-
<td>
|
66
|
-
Object
|
67
|
-
</td>
|
68
|
-
</tr>
|
69
|
-
</table>
|
70
|
-
</td>
|
71
|
-
</tr>
|
72
|
-
</table>
|
73
|
-
<!-- banner header -->
|
74
|
-
|
75
|
-
<div id="bodyContent">
|
76
|
-
<div id="content">
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
<div class="sectiontitle">Methods</div>
|
82
|
-
<ul>
|
83
|
-
<li><a href="#M000003">timed_wait</a></li>
|
84
|
-
<li><a href="#M000004">timed_wait!</a></li>
|
85
|
-
</ul>
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
<div class="sectiontitle">Public Instance methods</div>
|
93
|
-
<div class="method">
|
94
|
-
<div class="title">
|
95
|
-
<a name="M000003"></a><b>timed_wait</b>(mutex, secs)
|
96
|
-
</div>
|
97
|
-
<div class="description">
|
98
|
-
<p>
|
99
|
-
This is like ConditionVariable.wait(), but allows one to wait a maximum
|
100
|
-
amount of time. Returns true if this condition was signaled, false if a
|
101
|
-
timeout occurred.
|
102
|
-
</p>
|
103
|
-
</div>
|
104
|
-
<div class="sourcecode">
|
105
|
-
<p class="source-link">[ <a href="javascript:toggleSource('M000003_source')" id="l_M000003_source">show source</a> ]</p>
|
106
|
-
<div id="M000003_source" class="dyn-source">
|
107
|
-
<pre>
|
108
|
-
<span class="ruby-comment cmt"># File lib/phusion_passenger/utils.rb, line 877</span>
|
109
|
-
877: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">timed_wait</span>(<span class="ruby-identifier">mutex</span>, <span class="ruby-identifier">secs</span>)
|
110
|
-
878: <span class="ruby-identifier">ruby_engine</span> = <span class="ruby-keyword kw">defined?</span>(<span class="ruby-constant">RUBY_ENGINE</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">RUBY_ENGINE</span> <span class="ruby-operator">:</span> <span class="ruby-value str">"ruby"</span>
|
111
|
-
879: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">100000000</span>
|
112
|
-
880: <span class="ruby-comment cmt"># NOTE: If one calls timeout() on FreeBSD 5 with an</span>
|
113
|
-
881: <span class="ruby-comment cmt"># argument of more than 100000000, then MRI will become</span>
|
114
|
-
882: <span class="ruby-comment cmt"># stuck in an infite loop, blocking all threads. It seems</span>
|
115
|
-
883: <span class="ruby-comment cmt"># that MRI uses select() to implement sleeping.</span>
|
116
|
-
884: <span class="ruby-comment cmt"># I think that a value of more than 100000000 overflows</span>
|
117
|
-
885: <span class="ruby-comment cmt"># select()'s data structures, causing it to behave incorrectly.</span>
|
118
|
-
886: <span class="ruby-comment cmt"># So we just make sure we can't sleep more than 100000000</span>
|
119
|
-
887: <span class="ruby-comment cmt"># seconds.</span>
|
120
|
-
888: <span class="ruby-identifier">secs</span> = <span class="ruby-value">100000000</span>
|
121
|
-
889: <span class="ruby-keyword kw">end</span>
|
122
|
-
890: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ruby_engine</span> <span class="ruby-operator">==</span> <span class="ruby-value str">"jruby"</span>
|
123
|
-
891: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
124
|
-
892: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>, <span class="ruby-identifier">secs</span>)
|
125
|
-
893: <span class="ruby-keyword kw">else</span>
|
126
|
-
894: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
127
|
-
895: <span class="ruby-keyword kw">end</span>
|
128
|
-
896: <span class="ruby-keyword kw">elsif</span> <span class="ruby-constant">RUBY_VERSION</span> <span class="ruby-operator">>=</span> <span class="ruby-value str">'1.9.2'</span>
|
129
|
-
897: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
130
|
-
898: <span class="ruby-identifier">t1</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
|
131
|
-
899: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>, <span class="ruby-identifier">secs</span>)
|
132
|
-
900: <span class="ruby-identifier">t2</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
|
133
|
-
901: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">t2</span>.<span class="ruby-identifier">to_f</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">t1</span>.<span class="ruby-identifier">to_f</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">secs</span>
|
134
|
-
902: <span class="ruby-keyword kw">else</span>
|
135
|
-
903: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
136
|
-
904: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
|
137
|
-
905: <span class="ruby-keyword kw">end</span>
|
138
|
-
906: <span class="ruby-keyword kw">else</span>
|
139
|
-
907: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
140
|
-
908: <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">secs</span>) <span class="ruby-keyword kw">do</span>
|
141
|
-
909: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
142
|
-
910: <span class="ruby-keyword kw">end</span>
|
143
|
-
911: <span class="ruby-keyword kw">else</span>
|
144
|
-
912: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
145
|
-
913: <span class="ruby-keyword kw">end</span>
|
146
|
-
914: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
|
147
|
-
915: <span class="ruby-keyword kw">end</span>
|
148
|
-
916: <span class="ruby-keyword kw">rescue</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>
|
149
|
-
917: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
|
150
|
-
918: <span class="ruby-keyword kw">end</span>
|
151
|
-
</pre>
|
152
|
-
</div>
|
153
|
-
</div>
|
154
|
-
</div>
|
155
|
-
<div class="method">
|
156
|
-
<div class="title">
|
157
|
-
<a name="M000004"></a><b>timed_wait!</b>(mutex, secs)
|
158
|
-
</div>
|
159
|
-
<div class="description">
|
160
|
-
<p>
|
161
|
-
This is like ConditionVariable.wait(), but allows one to wait a maximum
|
162
|
-
amount of time. Raises Timeout::Error if the timeout has elapsed.
|
163
|
-
</p>
|
164
|
-
</div>
|
165
|
-
<div class="sourcecode">
|
166
|
-
<p class="source-link">[ <a href="javascript:toggleSource('M000004_source')" id="l_M000004_source">show source</a> ]</p>
|
167
|
-
<div id="M000004_source" class="dyn-source">
|
168
|
-
<pre>
|
169
|
-
<span class="ruby-comment cmt"># File lib/phusion_passenger/utils.rb, line 922</span>
|
170
|
-
922: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">timed_wait!</span>(<span class="ruby-identifier">mutex</span>, <span class="ruby-identifier">secs</span>)
|
171
|
-
923: <span class="ruby-identifier">ruby_engine</span> = <span class="ruby-keyword kw">defined?</span>(<span class="ruby-constant">RUBY_ENGINE</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">RUBY_ENGINE</span> <span class="ruby-operator">:</span> <span class="ruby-value str">"ruby"</span>
|
172
|
-
924: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">100000000</span>
|
173
|
-
925: <span class="ruby-comment cmt"># See the corresponding note for timed_wait().</span>
|
174
|
-
926: <span class="ruby-identifier">secs</span> = <span class="ruby-value">100000000</span>
|
175
|
-
927: <span class="ruby-keyword kw">end</span>
|
176
|
-
928: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ruby_engine</span> <span class="ruby-operator">==</span> <span class="ruby-value str">"jruby"</span>
|
177
|
-
929: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
178
|
-
930: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>, <span class="ruby-identifier">secs</span>)
|
179
|
-
931: <span class="ruby-identifier">raise</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>, <span class="ruby-value str">"Timeout"</span>
|
180
|
-
932: <span class="ruby-keyword kw">end</span>
|
181
|
-
933: <span class="ruby-keyword kw">else</span>
|
182
|
-
934: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
183
|
-
935: <span class="ruby-keyword kw">end</span>
|
184
|
-
936: <span class="ruby-keyword kw">elsif</span> <span class="ruby-constant">RUBY_VERSION</span> <span class="ruby-operator">>=</span> <span class="ruby-value str">'1.9.2'</span>
|
185
|
-
937: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
186
|
-
938: <span class="ruby-identifier">t1</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
|
187
|
-
939: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>, <span class="ruby-identifier">secs</span>)
|
188
|
-
940: <span class="ruby-identifier">t2</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
|
189
|
-
941: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t2</span>.<span class="ruby-identifier">to_f</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">t1</span>.<span class="ruby-identifier">to_f</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">secs</span>
|
190
|
-
942: <span class="ruby-identifier">raise</span> <span class="ruby-constant">Timeout</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span>, <span class="ruby-value str">"Timeout"</span>
|
191
|
-
943: <span class="ruby-keyword kw">end</span>
|
192
|
-
944: <span class="ruby-keyword kw">else</span>
|
193
|
-
945: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
194
|
-
946: <span class="ruby-keyword kw">end</span>
|
195
|
-
947: <span class="ruby-keyword kw">else</span>
|
196
|
-
948: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">secs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
197
|
-
949: <span class="ruby-constant">Timeout</span>.<span class="ruby-identifier">timeout</span>(<span class="ruby-identifier">secs</span>) <span class="ruby-keyword kw">do</span>
|
198
|
-
950: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
199
|
-
951: <span class="ruby-keyword kw">end</span>
|
200
|
-
952: <span class="ruby-keyword kw">else</span>
|
201
|
-
953: <span class="ruby-identifier">wait</span>(<span class="ruby-identifier">mutex</span>)
|
202
|
-
954: <span class="ruby-keyword kw">end</span>
|
203
|
-
955: <span class="ruby-keyword kw">end</span>
|
204
|
-
956: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
|
205
|
-
957: <span class="ruby-keyword kw">end</span>
|
206
|
-
</pre>
|
207
|
-
</div>
|
208
|
-
</div>
|
209
|
-
</div>
|
210
|
-
</div>
|
211
|
-
|
212
|
-
</div>
|
213
|
-
|
214
|
-
</body>
|
215
|
-
</html>
|