passenger 2.2.15 → 3.0.0.pre1
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 +21 -12
- data/LICENSE +1 -1
- data/NEWS +8 -1
- data/PACKAGING.TXT +25 -0
- data/Rakefile +28 -891
- data/bin/passenger +32 -0
- data/bin/passenger-config +5 -5
- data/bin/passenger-install-apache2-module +37 -24
- data/bin/passenger-install-nginx-module +48 -46
- data/bin/passenger-make-enterprisey +8 -9
- data/bin/passenger-memory-stats +20 -150
- data/bin/passenger-status +130 -44
- data/bin/passenger-stress-test +5 -4
- data/build/agents.rb +73 -0
- data/build/apache2.rb +165 -0
- data/build/basics.rb +81 -0
- data/build/common_library.rb +198 -0
- data/build/config.rb +35 -0
- data/{misc/rake/cplusplus.rb → build/cplusplus_support.rb} +1 -1
- data/build/cxx_tests.rb +205 -0
- data/build/documentation.rb +77 -0
- data/{misc/rake → build}/gempackagetask.rb +1 -1
- data/build/integration_tests.rb +57 -0
- data/build/misc.rb +146 -0
- data/build/nginx.rb +64 -0
- data/build/oxt_tests.rb +52 -0
- data/{misc/rake → build}/packagetask.rb +0 -0
- data/build/packaging.rb +189 -0
- data/{misc/rake/extensions.rb → build/rake_extensions.rb} +1 -1
- data/{misc/rake → build}/rdoctask.rb +0 -0
- data/build/ruby_extension.rb +46 -0
- data/build/ruby_tests.rb +42 -0
- data/build/test_basics.rb +31 -0
- data/doc/ApplicationPool algorithm.txt +447 -234
- data/doc/Architectural overview.html +47 -56
- data/doc/Doxyfile +1 -1
- data/doc/Security of user switching support.html +46 -57
- data/doc/Users guide Apache.html +1033 -306
- data/doc/Users guide Apache.txt +419 -99
- data/doc/Users guide Nginx.html +1252 -253
- data/doc/Users guide Nginx.txt +711 -87
- data/doc/Users guide Standalone.html +603 -0
- data/doc/Users guide Standalone.txt +40 -0
- data/doc/cxxapi/AbstractSpawnManager_8h_source.html +141 -0
- data/doc/cxxapi/Account_8h_source.html +206 -0
- data/doc/cxxapi/AccountsDatabase_8h_source.html +161 -0
- data/doc/cxxapi/AgentBase_8h_source.html +70 -0
- data/doc/cxxapi/AgentsStarter_8h_source.html +112 -0
- data/doc/cxxapi/BCrypt_8h_source.html +104 -0
- data/doc/cxxapi/Blowfish_8h_source.html +134 -0
- data/doc/cxxapi/Bucket_8h_source.html +4 -3
- data/doc/cxxapi/Constants_8h_source.html +79 -0
- data/doc/cxxapi/ContentHandler_8h_source.html +95 -0
- data/doc/cxxapi/DirectoryMapper_8h_source.html +9 -8
- data/doc/cxxapi/EventedClient_8h_source.html +629 -0
- data/doc/cxxapi/EventedMessageServer_8h_source.html +358 -0
- data/doc/cxxapi/EventedServer_8h_source.html +326 -0
- data/doc/cxxapi/Exceptions_8h_source.html +366 -0
- data/doc/cxxapi/FileDescriptor_8h_source.html +260 -0
- data/doc/cxxapi/Hooks_8h_source.html +2 -1
- data/doc/cxxapi/HttpStatusExtractor_8h_source.html +382 -0
- data/doc/cxxapi/Logging_8h_source.html +726 -0
- data/doc/cxxapi/MessageChannel_8h_source.html +852 -0
- data/doc/cxxapi/MessageClient_8h_source.html +328 -0
- data/doc/cxxapi/MessageReadersWriters_8h_source.html +539 -0
- data/doc/cxxapi/MessageServer_8h_source.html +606 -0
- data/doc/cxxapi/PoolOptions_8h_source.html +548 -0
- data/doc/cxxapi/Process_8h_source.html +286 -0
- data/doc/cxxapi/RandomGenerator_8h_source.html +191 -0
- data/doc/cxxapi/ResourceLocator_8h_source.html +115 -0
- data/doc/cxxapi/ScgiRequestParser_8h_source.html +406 -0
- data/doc/cxxapi/ServerInstanceDir_8h_source.html +374 -0
- data/doc/cxxapi/Session_8h_source.html +501 -0
- data/doc/cxxapi/SpawnManager_8h_source.html +647 -0
- data/doc/cxxapi/StaticContentHandler_8h_source.html +68 -0
- data/doc/cxxapi/StaticString_8h_source.html +254 -0
- data/doc/cxxapi/StringListCreator_8h_source.html +114 -0
- data/doc/cxxapi/Utils_8h_source.html +442 -0
- data/doc/cxxapi/annotated.html +46 -0
- data/doc/cxxapi/apache2_2Configuration_8h_source.html +82 -0
- data/doc/cxxapi/classAgentWatcher-members.html +30 -26
- data/doc/cxxapi/classAgentWatcher.html +168 -194
- data/doc/cxxapi/classClient-members.html +14 -11
- data/doc/cxxapi/classClient.html +35 -35
- data/doc/cxxapi/classHooks-members.html +2 -0
- data/doc/cxxapi/classHooks.html +2 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +78 -82
- data/doc/cxxapi/classPassenger_1_1ArgumentException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +26 -22
- data/doc/cxxapi/classPassenger_1_1ArrayMessage-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1ArrayMessage.html +113 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +14 -11
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +41 -42
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1BusyException.html +24 -20
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +23 -19
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +2 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +8 -6
- data/doc/cxxapi/classPassenger_1_1EOFException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1EOFException.html +27 -23
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1EventFd.html +24 -21
- data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +54 -0
- data/doc/cxxapi/classPassenger_1_1EventedClient.html +436 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer.html +59 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1EventedMessageServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer.html +93 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.map +3 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1EventedServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +63 -70
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +26 -22
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +17 -14
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +32 -30
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor-members.html +15 -12
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +59 -59
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1IOException.html +27 -23
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +36 -33
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +326 -344
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +25 -22
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +160 -191
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +29 -27
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +3 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +17 -14
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +69 -79
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +3 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -1
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +15 -12
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +60 -63
- data/doc/cxxapi/classPassenger_1_1Process-members.html +20 -17
- data/doc/cxxapi/classPassenger_1_1Process.html +88 -95
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +13 -10
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +36 -35
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +24 -20
- data/doc/cxxapi/classPassenger_1_1ScalarMessage-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1ScalarMessage.html +76 -0
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +26 -23
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +121 -138
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +26 -22
- data/doc/cxxapi/classPassenger_1_1Session-members.html +29 -26
- data/doc/cxxapi/classPassenger_1_1Session.html +219 -240
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +14 -11
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +36 -37
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +18 -15
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +115 -110
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +30 -27
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +163 -184
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1StaticString.html +27 -25
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1SystemException.html +65 -67
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +16 -13
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +27 -23
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +12 -9
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +24 -20
- data/doc/cxxapi/classPassenger_1_1Uint16Message-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1Uint16Message.html +51 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Message-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1Uint32Message.html +51 -0
- data/doc/cxxapi/classServer-members.html +12 -9
- data/doc/cxxapi/classServer.html +23 -20
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +12 -9
- data/doc/cxxapi/classServerInstanceDirToucher.html +21 -17
- data/doc/cxxapi/classes.html +18 -4
- data/doc/cxxapi/definitions_8h_source.html +1 -0
- data/doc/cxxapi/files.html +36 -1
- data/doc/cxxapi/functions.html +53 -21
- data/doc/cxxapi/functions_0x62.html +82 -0
- data/doc/cxxapi/functions_0x63.html +99 -0
- data/doc/cxxapi/functions_0x64.html +95 -0
- data/doc/cxxapi/functions_0x65.html +88 -0
- data/doc/cxxapi/functions_0x66.html +100 -0
- data/doc/cxxapi/functions_0x67.html +170 -0
- data/doc/cxxapi/functions_0x68.html +88 -0
- data/doc/cxxapi/functions_0x69.html +93 -0
- data/doc/cxxapi/functions_0x6b.html +80 -0
- data/doc/cxxapi/functions_0x6c.html +88 -0
- data/doc/cxxapi/functions_0x6d.html +88 -0
- data/doc/cxxapi/functions_0x6e.html +86 -0
- data/doc/cxxapi/functions_0x6f.html +94 -0
- data/doc/cxxapi/functions_0x70.html +94 -0
- data/doc/cxxapi/functions_0x72.html +110 -0
- data/doc/cxxapi/functions_0x73.html +171 -0
- data/doc/cxxapi/functions_0x74.html +85 -0
- data/doc/cxxapi/functions_0x75.html +85 -0
- data/doc/cxxapi/functions_0x77.html +92 -0
- data/doc/cxxapi/functions_0x7e.html +79 -0
- data/doc/cxxapi/functions_enum.html +14 -12
- data/doc/cxxapi/functions_eval.html +22 -16
- data/doc/cxxapi/functions_func.html +460 -1
- data/doc/cxxapi/functions_vars.html +163 -63
- data/doc/cxxapi/graph_legend.html +1 -0
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Core.html +2 -2
- data/doc/cxxapi/group__Core.map +1 -2
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +32 -40
- data/doc/cxxapi/group__Hooks.html +2 -1
- data/doc/cxxapi/group__Hooks.map +1 -1
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +509 -0
- data/doc/cxxapi/hierarchy.html +66 -62
- data/doc/cxxapi/inherit__graph__10.map +3 -1
- data/doc/cxxapi/inherit__graph__10.md5 +1 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +4 -1
- data/doc/cxxapi/inherit__graph__11.md5 +1 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +3 -1
- data/doc/cxxapi/inherit__graph__12.md5 +1 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +3 -1
- data/doc/cxxapi/inherit__graph__13.md5 +1 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +3 -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 +5 -1
- 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 -3
- 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 +3 -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 +4 -1
- 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 +3 -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 +3 -2
- 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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +3 -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 +4 -1
- 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 +3 -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 +3 -2
- 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 +3 -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 +5 -1
- 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 +3 -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 +3 -3
- 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 +3 -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 +3 -1
- data/doc/cxxapi/inherit__graph__37.md5 +1 -1
- data/doc/cxxapi/inherit__graph__37.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +3 -1
- data/doc/cxxapi/inherit__graph__4.md5 +1 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +3 -1
- data/doc/cxxapi/inherit__graph__5.md5 +1 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +3 -1
- data/doc/cxxapi/inherit__graph__6.md5 +1 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +3 -1
- data/doc/cxxapi/inherit__graph__7.md5 +1 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +3 -1
- data/doc/cxxapi/inherit__graph__8.md5 +1 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +3 -1
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +123 -126
- data/doc/cxxapi/main.html +1 -0
- data/doc/cxxapi/modules.html +2 -1
- data/doc/cxxapi/namespacePassenger.html +263 -492
- data/doc/cxxapi/namespacemembers.html +68 -96
- data/doc/cxxapi/namespacemembers_enum.html +14 -12
- data/doc/cxxapi/namespacemembers_eval.html +20 -15
- data/doc/cxxapi/namespacemembers_func.html +52 -88
- data/doc/cxxapi/namespacemembers_type.html +18 -14
- data/doc/cxxapi/namespaces.html +12 -9
- data/doc/cxxapi/nginx_2Configuration_8h_source.html +125 -0
- data/doc/cxxapi/ngx__http__passenger__module_8h_source.html +94 -0
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +12 -9
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +24 -22
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +43 -38
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +275 -325
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +12 -9
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +24 -22
- data/doc/cxxapi/tree.html +152 -7
- data/doc/users_guide_snippets/{analysis_and_system_maintenance_tools.txt → analysis_and_system_maintenance.txt} +58 -1
- data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +1 -2
- data/doc/users_guide_snippets/global_queueing_explained.txt +1 -5
- data/doc/users_guide_snippets/{rails_spawn_method.txt → passenger_spawn_method.txt} +9 -8
- data/doc/users_guide_snippets/tips.txt +12 -6
- data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
- data/ext/apache2/Bucket.cpp +4 -4
- data/ext/apache2/Bucket.h +3 -3
- data/ext/apache2/Configuration.cpp +278 -381
- data/ext/apache2/Configuration.h +3 -357
- data/ext/apache2/Configuration.hpp +461 -0
- data/ext/apache2/DirectoryMapper.h +3 -3
- data/ext/apache2/HelperAgent.cpp +359 -0
- data/ext/apache2/Hooks.cpp +339 -226
- data/ext/apache2/Hooks.h +1 -1
- data/ext/apache2/mod_passenger.c +10 -4
- data/ext/boost/algorithm/string/case_conv.hpp +4 -4
- data/ext/boost/algorithm/string/concept.hpp +2 -2
- data/ext/boost/algorithm/string/detail/case_conv.hpp +18 -9
- data/ext/boost/algorithm/string/detail/find_format.hpp +44 -43
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +56 -56
- data/ext/boost/algorithm/string/detail/find_format_store.hpp +7 -0
- data/ext/boost/algorithm/string/detail/finder.hpp +14 -14
- data/ext/boost/algorithm/string/detail/formatter.hpp +2 -2
- data/ext/boost/algorithm/string/detail/replace_storage.hpp +3 -3
- data/ext/boost/algorithm/string/detail/sequence.hpp +3 -3
- data/ext/boost/algorithm/string/erase.hpp +98 -98
- data/ext/boost/algorithm/string/find_format.hpp +56 -38
- data/ext/boost/algorithm/string/finder.hpp +6 -6
- data/ext/boost/algorithm/string/formatter.hpp +1 -1
- data/ext/boost/algorithm/string/replace.hpp +99 -99
- data/ext/boost/bind.hpp +5 -1670
- data/ext/boost/bind/bind.hpp +1751 -0
- data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
- data/ext/boost/bind/mem_fn.hpp +389 -0
- data/ext/boost/bind/mem_fn_template.hpp +54 -27
- data/ext/boost/bind/placeholders.hpp +3 -2
- data/ext/boost/concept_check.hpp +10 -0
- data/ext/boost/config/abi/msvc_prefix.hpp +15 -1
- data/ext/boost/config/abi_prefix.hpp +1 -1
- data/ext/boost/config/abi_suffix.hpp +3 -2
- data/ext/boost/config/auto_link.hpp +6 -1
- data/ext/boost/config/compiler/borland.hpp +75 -17
- data/ext/boost/config/compiler/codegear.hpp +163 -0
- data/ext/boost/config/compiler/common_edg.hpp +35 -0
- data/ext/boost/config/compiler/digitalmars.hpp +26 -0
- data/ext/boost/config/compiler/gcc.hpp +69 -14
- data/ext/boost/config/compiler/hp_acc.hpp +32 -0
- data/ext/boost/config/compiler/intel.hpp +13 -2
- data/ext/boost/config/compiler/kai.hpp +0 -2
- data/ext/boost/config/compiler/metrowerks.hpp +29 -1
- data/ext/boost/config/compiler/mpw.hpp +30 -0
- data/ext/boost/config/compiler/pgi.hpp +37 -0
- data/ext/boost/config/compiler/sgi_mipspro.hpp +1 -0
- data/ext/boost/config/compiler/sunpro_cc.hpp +39 -7
- data/ext/boost/config/compiler/vacpp.hpp +31 -3
- data/ext/boost/config/compiler/visualc.hpp +72 -5
- data/ext/boost/config/no_tr1/cmath.hpp +28 -0
- data/ext/boost/config/platform/bsd.hpp +16 -3
- data/ext/boost/config/platform/hpux.hpp +3 -0
- data/ext/boost/config/platform/macos.hpp +8 -0
- data/ext/boost/config/platform/solaris.hpp +7 -0
- data/ext/boost/config/platform/vxworks.hpp +31 -0
- data/ext/boost/config/select_compiler_config.hpp +4 -0
- data/ext/boost/config/select_platform_config.hpp +6 -2
- data/ext/boost/config/select_stdlib_config.hpp +17 -8
- data/ext/boost/config/stdlib/dinkumware.hpp +34 -2
- data/ext/boost/config/stdlib/libcomo.hpp +25 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +56 -2
- data/ext/boost/config/stdlib/modena.hpp +25 -0
- data/ext/boost/config/stdlib/msl.hpp +24 -0
- data/ext/boost/config/stdlib/roguewave.hpp +26 -0
- data/ext/boost/config/stdlib/sgi.hpp +25 -0
- data/ext/boost/config/stdlib/stlport.hpp +36 -1
- data/ext/boost/config/stdlib/vacpp.hpp +25 -0
- data/ext/boost/config/suffix.hpp +67 -32
- data/ext/boost/config/warning_disable.hpp +47 -0
- data/ext/boost/cstdint.hpp +62 -36
- data/ext/boost/date_time/c_time.hpp +28 -12
- data/ext/boost/date_time/compiler_config.hpp +27 -5
- data/ext/boost/date_time/constrained_value.hpp +36 -13
- data/ext/boost/date_time/date.hpp +44 -33
- data/ext/boost/date_time/date_duration.hpp +13 -14
- data/ext/boost/date_time/date_facet.hpp +215 -226
- data/ext/boost/date_time/date_generator_formatter.hpp +22 -20
- data/ext/boost/date_time/date_generator_parser.hpp +52 -51
- data/ext/boost/date_time/date_generators.hpp +16 -16
- data/ext/boost/date_time/date_parsing.hpp +115 -98
- data/ext/boost/date_time/filetime_functions.hpp +133 -41
- data/ext/boost/date_time/format_date_parser.hpp +22 -10
- data/ext/boost/date_time/gregorian/conversion.hpp +32 -39
- data/ext/boost/date_time/gregorian/greg_calendar.hpp +15 -14
- data/ext/boost/date_time/gregorian/greg_date.hpp +19 -18
- data/ext/boost/date_time/gregorian/greg_duration.hpp +106 -10
- data/ext/boost/date_time/gregorian/greg_duration_types.hpp +16 -7
- data/ext/boost/date_time/gregorian/greg_weekday.hpp +2 -2
- data/ext/boost/date_time/gregorian/gregorian_io.hpp +11 -4
- data/ext/boost/date_time/gregorian_calendar.hpp +8 -8
- data/ext/boost/date_time/gregorian_calendar.ipp +30 -30
- data/ext/boost/date_time/int_adapter.hpp +4 -2
- data/ext/boost/date_time/microsec_time_clock.hpp +39 -117
- data/ext/boost/date_time/period_parser.hpp +17 -15
- data/ext/boost/date_time/posix_time/conversion.hpp +28 -29
- data/ext/boost/date_time/posix_time/posix_time_config.hpp +19 -19
- data/ext/boost/date_time/posix_time/posix_time_io.hpp +31 -38
- data/ext/boost/date_time/posix_time/time_formatters.hpp +32 -32
- data/ext/boost/date_time/string_parse_tree.hpp +46 -46
- data/ext/boost/date_time/strings_from_facet.hpp +7 -5
- data/ext/boost/date_time/time.hpp +7 -6
- data/ext/boost/date_time/time_defs.hpp +12 -2
- data/ext/boost/date_time/time_duration.hpp +27 -26
- data/ext/boost/date_time/time_facet.hpp +386 -321
- data/ext/boost/date_time/time_formatting_streams.hpp +8 -5
- data/ext/boost/date_time/time_resolution_traits.hpp +29 -25
- data/ext/boost/date_time/time_system_split.hpp +7 -13
- data/ext/boost/date_time/wrapping_int.hpp +21 -15
- data/ext/boost/detail/call_traits.hpp +1 -1
- data/ext/boost/detail/endian.hpp +4 -4
- data/ext/boost/detail/no_exceptions_support.hpp +87 -0
- data/ext/boost/detail/sp_typeinfo.hpp +50 -4
- data/ext/boost/detail/workaround.hpp +63 -3
- data/ext/boost/enable_shared_from_this.hpp +4 -59
- data/ext/boost/exception/current_exception_cast.hpp +43 -0
- data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
- data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
- data/ext/boost/exception/detail/exception_ptr.hpp +490 -0
- data/ext/boost/exception/detail/is_output_streamable.hpp +47 -0
- data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
- data/ext/boost/exception/detail/type_info.hpp +79 -0
- data/ext/boost/exception/diagnostic_information.hpp +182 -0
- data/ext/boost/exception/exception.hpp +422 -0
- data/ext/boost/exception/get_error_info.hpp +130 -0
- data/ext/boost/exception/info.hpp +167 -0
- data/ext/boost/exception/to_string.hpp +83 -0
- data/ext/boost/exception/to_string_stub.hpp +109 -0
- data/ext/boost/exception_ptr.hpp +11 -0
- data/ext/boost/function/detail/prologue.hpp +2 -1
- data/ext/boost/function/function_base.hpp +270 -128
- data/ext/boost/function/function_fwd.hpp +70 -0
- data/ext/boost/function/function_template.hpp +319 -130
- data/ext/boost/get_pointer.hpp +5 -1
- data/ext/boost/integer.hpp +253 -0
- data/ext/boost/integer_fwd.hpp +174 -0
- data/ext/boost/integer_traits.hpp +26 -1
- data/ext/boost/io/ios_state.hpp +8 -0
- data/ext/boost/iterator/detail/config_def.hpp +4 -2
- data/ext/boost/iterator/iterator_adaptor.hpp +7 -2
- data/ext/boost/iterator/iterator_facade.hpp +1 -2
- data/ext/boost/lexical_cast.hpp +113 -105
- data/ext/boost/limits.hpp +1 -1
- data/ext/boost/mem_fn.hpp +5 -370
- data/ext/boost/memory_order.hpp +53 -0
- data/ext/boost/mpl/always.hpp +3 -3
- data/ext/boost/mpl/and.hpp +3 -3
- data/ext/boost/mpl/apply.hpp +3 -3
- data/ext/boost/mpl/apply_fwd.hpp +3 -3
- data/ext/boost/mpl/apply_wrap.hpp +37 -6
- data/ext/boost/mpl/arg.hpp +3 -3
- data/ext/boost/mpl/arg_fwd.hpp +3 -3
- data/ext/boost/mpl/assert.hpp +6 -6
- data/ext/boost/mpl/aux_/adl_barrier.hpp +3 -3
- data/ext/boost/mpl/aux_/arg_typedef.hpp +3 -3
- data/ext/boost/mpl/aux_/arity.hpp +3 -3
- data/ext/boost/mpl/aux_/arity_spec.hpp +3 -3
- data/ext/boost/mpl/aux_/common_name_wknd.hpp +3 -3
- data/ext/boost/mpl/aux_/config/adl.hpp +4 -4
- data/ext/boost/mpl/aux_/config/arrays.hpp +4 -4
- data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
- data/ext/boost/mpl/aux_/config/bind.hpp +4 -4
- data/ext/boost/mpl/aux_/config/compiler.hpp +8 -6
- data/ext/boost/mpl/aux_/config/ctps.hpp +3 -3
- data/ext/boost/mpl/aux_/config/dtp.hpp +5 -5
- data/ext/boost/mpl/aux_/config/eti.hpp +3 -3
- data/ext/boost/mpl/aux_/config/gcc.hpp +3 -3
- data/ext/boost/mpl/aux_/config/has_apply.hpp +3 -3
- data/ext/boost/mpl/aux_/config/has_xxx.hpp +3 -3
- data/ext/boost/mpl/aux_/config/integral.hpp +4 -4
- data/ext/boost/mpl/aux_/config/intel.hpp +3 -3
- data/ext/boost/mpl/aux_/config/lambda.hpp +3 -3
- data/ext/boost/mpl/aux_/config/msvc.hpp +3 -3
- data/ext/boost/mpl/aux_/config/msvc_typename.hpp +3 -3
- data/ext/boost/mpl/aux_/config/nttp.hpp +3 -3
- data/ext/boost/mpl/aux_/config/overload_resolution.hpp +3 -3
- data/ext/boost/mpl/aux_/config/pp_counter.hpp +3 -3
- data/ext/boost/mpl/aux_/config/preprocessor.hpp +4 -4
- data/ext/boost/mpl/aux_/config/static_constant.hpp +3 -3
- data/ext/boost/mpl/aux_/config/ttp.hpp +4 -4
- data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +3 -3
- data/ext/boost/mpl/aux_/config/workaround.hpp +3 -3
- data/ext/boost/mpl/aux_/full_lambda.hpp +3 -3
- data/ext/boost/mpl/aux_/has_apply.hpp +3 -3
- data/ext/boost/mpl/aux_/has_type.hpp +3 -3
- data/ext/boost/mpl/aux_/include_preprocessed.hpp +3 -3
- data/ext/boost/mpl/aux_/integral_wrapper.hpp +3 -3
- data/ext/boost/mpl/aux_/lambda_arity_param.hpp +3 -3
- data/ext/boost/mpl/aux_/lambda_support.hpp +4 -4
- data/ext/boost/mpl/aux_/msvc_never_true.hpp +3 -3
- data/ext/boost/mpl/aux_/na.hpp +3 -3
- data/ext/boost/mpl/aux_/na_assert.hpp +3 -3
- data/ext/boost/mpl/aux_/na_fwd.hpp +3 -3
- data/ext/boost/mpl/aux_/na_spec.hpp +3 -3
- data/ext/boost/mpl/aux_/nested_type_wknd.hpp +3 -3
- data/ext/boost/mpl/aux_/nttp_decl.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/enum.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/params.hpp +3 -3
- data/ext/boost/mpl/aux_/preprocessor/sub.hpp +3 -3
- data/ext/boost/mpl/aux_/static_cast.hpp +3 -3
- data/ext/boost/mpl/aux_/template_arity.hpp +3 -3
- data/ext/boost/mpl/aux_/template_arity_fwd.hpp +3 -3
- data/ext/boost/mpl/aux_/type_wrapper.hpp +3 -3
- data/ext/boost/mpl/aux_/value_wknd.hpp +3 -3
- data/ext/boost/mpl/aux_/yes_no.hpp +3 -3
- data/ext/boost/mpl/bind.hpp +3 -3
- data/ext/boost/mpl/bind_fwd.hpp +3 -3
- data/ext/boost/mpl/bool.hpp +3 -3
- data/ext/boost/mpl/bool_fwd.hpp +3 -3
- data/ext/boost/mpl/eval_if.hpp +3 -3
- data/ext/boost/mpl/has_xxx.hpp +10 -8
- data/ext/boost/mpl/identity.hpp +3 -3
- data/ext/boost/mpl/if.hpp +3 -3
- data/ext/boost/mpl/int.hpp +3 -3
- data/ext/boost/mpl/int_fwd.hpp +3 -3
- data/ext/boost/mpl/integral_c.hpp +3 -3
- data/ext/boost/mpl/integral_c_fwd.hpp +3 -3
- data/ext/boost/mpl/integral_c_tag.hpp +3 -3
- data/ext/boost/mpl/lambda.hpp +3 -3
- data/ext/boost/mpl/lambda_fwd.hpp +3 -3
- data/ext/boost/mpl/limits/arity.hpp +3 -3
- data/ext/boost/mpl/logical.hpp +3 -3
- data/ext/boost/mpl/next.hpp +3 -3
- data/ext/boost/mpl/next_prior.hpp +3 -3
- data/ext/boost/mpl/not.hpp +3 -3
- data/ext/boost/mpl/or.hpp +3 -3
- data/ext/boost/mpl/placeholders.hpp +3 -3
- data/ext/boost/mpl/protect.hpp +3 -3
- data/ext/boost/mpl/quote.hpp +18 -7
- data/ext/boost/mpl/size_t.hpp +3 -3
- data/ext/boost/mpl/size_t_fwd.hpp +3 -3
- data/ext/boost/mpl/void.hpp +3 -3
- data/ext/boost/mpl/void_fwd.hpp +3 -3
- data/ext/boost/non_type.hpp +27 -27
- data/ext/boost/operators.hpp +51 -18
- data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
- data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
- data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
- data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
- data/ext/boost/preprocessor/logical/not.hpp +30 -0
- data/ext/boost/preprocessor/seq/cat.hpp +48 -0
- data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
- data/ext/boost/preprocessor/seq/transform.hpp +48 -0
- data/ext/boost/range/as_literal.hpp +10 -14
- data/ext/boost/range/begin.hpp +4 -4
- data/ext/boost/range/detail/implementation_help.hpp +4 -0
- data/ext/boost/range/end.hpp +4 -4
- data/ext/boost/range/iterator_range.hpp +31 -15
- data/ext/boost/ref.hpp +12 -1
- data/ext/boost/scoped_array.hpp +16 -0
- data/ext/boost/scoped_ptr.hpp +16 -0
- data/ext/boost/shared_ptr.hpp +2 -602
- data/ext/boost/{detail → smart_ptr}/bad_weak_ptr.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count.hpp +14 -19
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc.hpp +13 -9
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_gcc_x86.hpp +5 -12
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_pthreads.hpp +5 -5
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_solaris.hpp +3 -3
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_sync.hpp +9 -5
- data/ext/boost/{detail → smart_ptr/detail}/atomic_count_win32.hpp +3 -3
- data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
- data/ext/boost/{detail → smart_ptr/detail}/shared_count.hpp +86 -17
- data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_acc_ia64.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_ppc.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_cw_x86.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ia64.hpp +4 -4
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_ppc.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_sparc.hpp +7 -7
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_gcc_x86.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_nt.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_pt.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_solaris.hpp +4 -4
- data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_sync.hpp +8 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_base_w32.hpp +4 -4
- data/ext/boost/{detail → smart_ptr/detail}/sp_counted_impl.hpp +5 -5
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
- data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
- data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
- data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
- data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
- data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
- data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
- data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
- data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
- data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
- data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
- data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
- data/ext/boost/src/pthread/thread.cpp +115 -203
- data/ext/boost/src/tss_null.cpp +1 -1
- data/ext/boost/static_assert.hpp +14 -4
- data/ext/boost/thread.hpp +7 -2
- data/ext/boost/thread/barrier.hpp +63 -0
- data/ext/boost/thread/detail/force_cast.hpp +39 -0
- data/ext/boost/thread/detail/move.hpp +29 -2
- data/ext/boost/thread/detail/platform.hpp +3 -3
- data/ext/boost/thread/detail/singleton.hpp +59 -0
- data/ext/boost/thread/detail/thread.hpp +496 -0
- data/ext/boost/thread/detail/thread_group.hpp +105 -0
- data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
- data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
- data/ext/boost/thread/detail/tss_hooks.hpp +82 -0
- data/ext/boost/thread/exceptions.hpp +174 -60
- data/ext/boost/thread/future.hpp +1364 -0
- data/ext/boost/thread/locks.hpp +899 -32
- data/ext/boost/thread/once.hpp +4 -0
- data/ext/boost/thread/pthread/condition_variable.hpp +16 -21
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +37 -3
- data/ext/boost/thread/pthread/mutex.hpp +20 -7
- data/ext/boost/thread/pthread/once.hpp +7 -2
- data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +5 -1
- data/ext/boost/thread/pthread/recursive_mutex.hpp +22 -5
- data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
- data/ext/boost/thread/pthread/thread_data.hpp +37 -10
- data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
- data/ext/boost/thread/pthread/timespec.hpp +11 -3
- data/ext/boost/thread/shared_mutex.hpp +21 -0
- data/ext/boost/thread/thread.hpp +8 -3
- data/ext/boost/thread/thread_time.hpp +4 -0
- data/ext/boost/thread/tss.hpp +106 -13
- data/ext/boost/thread/xtime.hpp +6 -2
- data/ext/boost/throw_exception.hpp +36 -7
- data/ext/boost/token_functions.hpp +1 -1
- data/ext/boost/tokenizer.hpp +1 -1
- data/ext/boost/type_traits/add_pointer.hpp +1 -1
- data/ext/boost/type_traits/add_volatile.hpp +47 -0
- data/ext/boost/type_traits/alignment_of.hpp +29 -1
- data/ext/boost/type_traits/config.hpp +1 -1
- data/ext/boost/type_traits/conversion_traits.hpp +1 -1
- data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
- data/ext/boost/type_traits/intrinsics.hpp +88 -1
- data/ext/boost/type_traits/is_abstract.hpp +14 -5
- data/ext/boost/type_traits/is_arithmetic.hpp +8 -0
- data/ext/boost/type_traits/is_array.hpp +3 -2
- data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
- data/ext/boost/type_traits/is_base_of.hpp +51 -0
- data/ext/boost/type_traits/is_class.hpp +12 -0
- data/ext/boost/type_traits/is_const.hpp +6 -2
- data/ext/boost/type_traits/is_convertible.hpp +14 -2
- data/ext/boost/type_traits/is_enum.hpp +10 -1
- data/ext/boost/type_traits/is_function.hpp +11 -3
- data/ext/boost/type_traits/is_fundamental.hpp +45 -0
- data/ext/boost/type_traits/is_integral.hpp +5 -0
- data/ext/boost/type_traits/is_member_function_pointer.hpp +5 -3
- data/ext/boost/type_traits/is_member_pointer.hpp +4 -2
- data/ext/boost/type_traits/is_pointer.hpp +3 -1
- data/ext/boost/type_traits/is_reference.hpp +4 -2
- data/ext/boost/type_traits/is_signed.hpp +135 -0
- data/ext/boost/type_traits/is_unsigned.hpp +130 -0
- data/ext/boost/type_traits/is_void.hpp +5 -0
- data/ext/boost/type_traits/is_volatile.hpp +4 -2
- data/ext/boost/type_traits/make_unsigned.hpp +137 -0
- data/ext/boost/type_traits/remove_reference.hpp +1 -1
- data/ext/boost/type_traits/type_with_alignment.hpp +106 -1
- data/ext/boost/utility.hpp +2 -1
- data/ext/boost/utility/addressof.hpp +61 -17
- data/ext/boost/utility/binary.hpp +708 -0
- data/ext/boost/utility/enable_if.hpp +2 -2
- data/ext/boost/weak_ptr.hpp +4 -174
- data/ext/common/AbstractSpawnManager.h +110 -0
- data/ext/common/Account.h +175 -0
- data/ext/common/AccountsDatabase.cpp +81 -0
- data/ext/common/AccountsDatabase.h +130 -0
- data/ext/common/AgentBase.cpp +323 -0
- data/ext/common/{Version.h → AgentBase.h} +14 -6
- data/ext/common/AgentsStarter.cpp +154 -0
- data/ext/common/AgentsStarter.h +81 -0
- data/ext/common/AgentsStarter.hpp +619 -0
- data/ext/common/ApplicationPool/Client.h +796 -0
- data/ext/common/{ApplicationPool.h → ApplicationPool/Interface.h} +108 -18
- data/ext/common/ApplicationPool/Pool.h +1315 -0
- data/ext/common/ApplicationPool/Server.h +475 -0
- data/ext/common/BCrypt.cpp +343 -0
- data/ext/common/BCrypt.h +73 -0
- data/ext/common/Blowfish.c +685 -0
- data/ext/common/Blowfish.h +103 -0
- data/ext/common/Constants.h +48 -0
- data/ext/common/EventedClient.h +598 -0
- data/ext/common/EventedMessageServer.h +327 -0
- data/ext/common/EventedServer.h +295 -0
- data/ext/common/Exceptions.h +78 -1
- data/ext/common/FileDescriptor.h +229 -0
- data/ext/common/HelperAgent/BacktracesServer.h +59 -0
- data/ext/common/Logging.cpp +8 -9
- data/ext/common/Logging.h +593 -21
- data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
- data/ext/common/LoggingAgent/DataStoreId.h +177 -0
- data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
- data/ext/common/LoggingAgent/Main.cpp +278 -0
- data/ext/common/LoggingAgent/RemoteSender.h +457 -0
- data/ext/common/MessageChannel.h +196 -34
- data/ext/common/MessageClient.h +297 -0
- data/ext/common/MessageReadersWriters.h +508 -0
- data/ext/common/MessageServer.h +575 -0
- data/ext/common/PoolOptions.h +279 -117
- data/ext/common/Process.h +255 -0
- data/ext/common/RandomGenerator.h +160 -0
- data/ext/common/ResourceLocator.h +84 -0
- data/ext/common/ServerInstanceDir.h +343 -0
- data/ext/common/Session.h +470 -0
- data/ext/common/SpawnManager.h +256 -201
- data/ext/common/StaticString.h +79 -4
- data/ext/common/StringListCreator.h +2 -2
- data/ext/common/Utils.cpp +385 -397
- data/ext/common/Utils.h +79 -165
- data/ext/common/{Base64.cpp → Utils/Base64.cpp} +0 -0
- data/ext/common/{Base64.h → Utils/Base64.h} +27 -1
- data/ext/common/Utils/BlockingQueue.h +136 -0
- data/ext/common/Utils/BlockingScalar.h +50 -0
- data/ext/common/{CachedFileStat.cpp → Utils/CachedFileStat.cpp} +1 -1
- data/ext/common/{CachedFileStat.h → Utils/CachedFileStat.h} +1 -1
- data/ext/common/{CachedFileStat.hpp → Utils/CachedFileStat.hpp} +1 -1
- data/ext/common/{FileChangeChecker.h → Utils/FileChangeChecker.h} +1 -1
- data/ext/common/Utils/FileHandleGuard.h +81 -0
- data/ext/common/Utils/IOUtils.cpp +754 -0
- data/ext/common/Utils/IOUtils.h +253 -0
- data/ext/common/Utils/MD5.cpp +406 -0
- data/ext/common/Utils/MD5.h +98 -0
- data/ext/common/Utils/MemZeroGuard.h +103 -0
- data/ext/common/Utils/ProcessMetricsCollector.h +462 -0
- data/ext/common/Utils/ScopeGuard.h +72 -0
- data/ext/common/Utils/StrIntUtils.cpp +329 -0
- data/ext/common/Utils/StrIntUtils.h +228 -0
- data/ext/common/{SystemTime.cpp → Utils/SystemTime.cpp} +5 -1
- data/ext/common/Utils/SystemTime.h +201 -0
- data/ext/common/{Timer.h → Utils/Timer.h} +58 -18
- data/ext/common/Utils/VariantMap.h +363 -0
- data/ext/common/Utils/foo.cpp +10 -0
- data/ext/common/Watchdog.cpp +1034 -0
- data/ext/google/COPYING +28 -0
- data/ext/google/ChangeLog +167 -0
- data/ext/google/dense_hash_map +310 -0
- data/ext/google/dense_hash_set +287 -0
- data/ext/google/sparse_hash_map +294 -0
- data/ext/google/sparse_hash_set +275 -0
- data/ext/google/sparsehash/densehashtable.h +1062 -0
- data/ext/google/sparsehash/sparseconfig.h +55 -0
- data/ext/google/sparsehash/sparsehashtable.h +1015 -0
- data/ext/google/sparsetable +1468 -0
- data/ext/google/type_traits.h +250 -0
- data/ext/libev/Changes +302 -0
- data/ext/libev/LICENSE +36 -0
- data/ext/libev/Makefile.am +18 -0
- data/ext/libev/Makefile.in +685 -0
- data/ext/libev/README +58 -0
- data/ext/libev/aclocal.m4 +7549 -0
- data/ext/libev/autogen.sh +6 -0
- data/ext/libev/config.guess +1526 -0
- data/ext/libev/config.h +122 -0
- data/ext/libev/config.h.in +121 -0
- data/ext/libev/config.sub +1658 -0
- data/ext/libev/configure +22156 -0
- data/ext/libev/configure.ac +18 -0
- data/ext/libev/ev++.h +800 -0
- data/ext/libev/ev.c +3694 -0
- data/ext/libev/ev.h +705 -0
- data/ext/libev/ev_epoll.c +228 -0
- data/ext/libev/ev_kqueue.c +196 -0
- data/ext/libev/ev_poll.c +144 -0
- data/ext/libev/ev_port.c +165 -0
- data/ext/libev/ev_select.c +308 -0
- data/ext/libev/ev_vars.h +187 -0
- data/ext/libev/ev_win32.c +153 -0
- data/ext/libev/ev_wrap.h +178 -0
- data/ext/libev/event.c +401 -0
- data/ext/libev/event.h +158 -0
- data/ext/libev/install-sh +294 -0
- data/ext/libev/libev.m4 +38 -0
- data/ext/libev/ltmain.sh +6871 -0
- data/ext/libev/missing +336 -0
- data/ext/libev/mkinstalldirs +111 -0
- data/ext/nginx/Configuration.c +532 -182
- data/ext/nginx/Configuration.h +33 -10
- data/ext/nginx/ContentHandler.c +188 -53
- data/ext/nginx/ContentHandler.h +1 -1
- data/ext/nginx/{HelperServer.cpp → HelperAgent.cpp} +433 -299
- data/ext/nginx/HttpStatusExtractor.h +1 -1
- data/ext/nginx/ScgiRequestParser.h +68 -11
- data/ext/nginx/StaticContentHandler.c +4 -1
- data/ext/nginx/StaticContentHandler.h +1 -1
- data/ext/nginx/config +5 -5
- data/ext/nginx/ngx_http_passenger_module.c +315 -469
- data/ext/nginx/ngx_http_passenger_module.h +8 -17
- data/ext/oxt/backtrace.cpp +49 -41
- data/ext/oxt/backtrace.hpp +1 -1
- data/ext/oxt/detail/backtrace_disabled.hpp +1 -1
- data/ext/oxt/detail/backtrace_enabled.hpp +16 -15
- data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +3 -4
- data/ext/oxt/detail/spin_lock_portable.hpp +1 -1
- data/ext/oxt/detail/spin_lock_pthreads.hpp +1 -1
- data/ext/oxt/detail/tracable_exception_disabled.hpp +1 -1
- data/ext/oxt/detail/tracable_exception_enabled.hpp +1 -1
- data/ext/oxt/dynamic_thread_group.hpp +195 -0
- data/ext/oxt/macros.hpp +1 -1
- data/ext/oxt/spin_lock.hpp +4 -2
- data/ext/oxt/system_calls.cpp +129 -13
- data/ext/oxt/system_calls.hpp +16 -2
- data/ext/oxt/thread.cpp +1 -1
- data/ext/oxt/thread.hpp +49 -14
- data/ext/oxt/tracable_exception.cpp +5 -5
- data/ext/oxt/tracable_exception.hpp +1 -1
- data/ext/phusion_passenger/extconf.rb +7 -2
- data/ext/phusion_passenger/native_support.c +733 -33
- data/{bin → helper-scripts}/passenger-spawn-server +50 -12
- data/helper-scripts/prespawn +63 -0
- data/lib/phusion_passenger.rb +113 -0
- data/lib/phusion_passenger/abstract_installer.rb +50 -12
- data/lib/phusion_passenger/abstract_request_handler.rb +432 -171
- data/lib/phusion_passenger/abstract_server.rb +125 -122
- data/lib/phusion_passenger/abstract_server_collection.rb +51 -22
- data/lib/phusion_passenger/admin_tools.rb +1 -1
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
- data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
- data/lib/phusion_passenger/analytics_logger.rb +342 -0
- data/lib/phusion_passenger/{application.rb → app_process.rb} +73 -24
- data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
- data/lib/phusion_passenger/{railz → classic_rails}/cgi_fixed.rb +2 -2
- data/lib/phusion_passenger/{railz → classic_rails}/framework_spawner.rb +75 -98
- data/lib/phusion_passenger/{railz → classic_rails}/request_handler.rb +8 -6
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
- data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
- data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
- data/lib/phusion_passenger/console_text_template.rb +1 -1
- data/lib/phusion_passenger/constants.rb +9 -5
- data/lib/phusion_passenger/debug_logging.rb +104 -0
- data/lib/phusion_passenger/dependencies.rb +187 -4
- data/lib/phusion_passenger/exceptions.rb +4 -4
- data/lib/phusion_passenger/html_template.rb +6 -8
- data/lib/phusion_passenger/message_channel.rb +137 -21
- data/lib/phusion_passenger/message_client.rb +173 -0
- data/lib/phusion_passenger/native_support.rb +108 -0
- data/lib/phusion_passenger/packaging.rb +82 -13
- data/lib/phusion_passenger/platform_info.rb +84 -475
- data/lib/phusion_passenger/platform_info/apache.rb +329 -0
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +187 -0
- data/lib/phusion_passenger/platform_info/compiler.rb +154 -0
- data/lib/phusion_passenger/{events.rb → platform_info/curl.rb} +26 -23
- data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
- data/lib/phusion_passenger/platform_info/linux.rb +77 -0
- data/lib/phusion_passenger/platform_info/operating_system.rb +51 -0
- data/lib/phusion_passenger/platform_info/ruby.rb +198 -0
- data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
- data/lib/phusion_passenger/plugin.rb +96 -0
- data/lib/phusion_passenger/public_api.rb +112 -0
- data/lib/phusion_passenger/rack/application_spawner.rb +146 -71
- data/lib/phusion_passenger/rack/request_handler.rb +36 -13
- data/lib/phusion_passenger/rails3_extensions/init.rb +204 -0
- data/lib/phusion_passenger/simple_benchmarking.rb +1 -1
- data/lib/phusion_passenger/spawn_manager.rb +137 -141
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
- data/lib/phusion_passenger/standalone/command.rb +237 -0
- data/lib/phusion_passenger/standalone/config_file.rb +119 -0
- data/lib/phusion_passenger/standalone/help_command.rb +57 -0
- data/lib/phusion_passenger/standalone/main.rb +101 -0
- data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
- data/lib/phusion_passenger/standalone/runtime_installer.rb +466 -0
- data/lib/phusion_passenger/standalone/start_command.rb +510 -0
- data/lib/phusion_passenger/standalone/status_command.rb +62 -0
- data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
- data/lib/phusion_passenger/standalone/utils.rb +42 -0
- data/lib/phusion_passenger/standalone/version_command.rb +42 -0
- data/lib/phusion_passenger/templates/framework_init_error.html.erb +1 -1
- data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
- data/lib/phusion_passenger/templates/standalone/config.erb +69 -0
- data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
- data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
- data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
- data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
- data/lib/phusion_passenger/templates/version_not_found.html.erb +2 -2
- data/lib/phusion_passenger/utils.rb +476 -125
- data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
- data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
- data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
- data/lib/phusion_passenger/wsgi/application_spawner.rb +24 -20
- data/lib/phusion_passenger/wsgi/request_handler.py +1 -1
- data/misc/copy_boost_headers.rb +36 -9
- data/misc/find_owner_pipe_leaks.rb +1 -1
- data/misc/render_error_pages.rb +1 -1
- data/misc/union_station_gateway.crt +32 -0
- data/test/config.yml.example +24 -13
- data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
- data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
- data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
- data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
- data/test/{Base64Test.cpp → cxx/Base64Test.cpp} +4 -2
- data/test/{CachedFileStatTest.cpp → cxx/CachedFileStatTest.cpp} +3 -3
- data/test/{CxxTestMain.cpp → cxx/CxxTestMain.cpp} +6 -27
- data/test/cxx/EventedClientTest.cpp +386 -0
- data/test/{FileChangeCheckerTest.cpp → cxx/FileChangeCheckerTest.cpp} +3 -5
- data/test/cxx/FileDescriptorTest.cpp +69 -0
- data/test/{HttpStatusExtractorTest.cpp → cxx/HttpStatusExtractorTest.cpp} +1 -1
- data/test/cxx/IOUtilsTest.cpp +398 -0
- data/test/cxx/LoggingTest.cpp +914 -0
- data/test/cxx/MessageChannelTest.cpp +672 -0
- data/test/cxx/MessageReadersWritersTest.cpp +574 -0
- data/test/cxx/MessageServerTest.cpp +383 -0
- data/test/{PoolOptionsTest.cpp → cxx/PoolOptionsTest.cpp} +2 -3
- data/test/{ScgiRequestParserTest.cpp → cxx/ScgiRequestParserTest.cpp} +53 -1
- data/test/cxx/ServerInstanceDirTest.cpp +186 -0
- data/test/cxx/SpawnManagerTest.cpp +161 -0
- data/test/cxx/StaticStringTest.cpp +86 -0
- data/test/{SystemTimeTest.cpp → cxx/SystemTimeTest.cpp} +2 -2
- data/test/cxx/TestSupport.cpp +166 -0
- data/test/cxx/TestSupport.h +254 -0
- data/test/cxx/UtilsTest.cpp +521 -0
- data/test/cxx/VariantMapTest.cpp +179 -0
- data/test/integration_tests/apache2_tests.rb +198 -127
- data/test/integration_tests/cgi_environment_spec.rb +26 -0
- data/test/integration_tests/mycook_spec.rb +2 -28
- data/test/integration_tests/nginx_tests.rb +125 -16
- data/test/integration_tests/spec_helper.rb +19 -0
- data/test/oxt/backtrace_test.cpp +19 -59
- data/test/oxt/counter.hpp +55 -0
- data/test/oxt/dynamic_thread_group_test.cpp +131 -0
- data/test/oxt/oxt_test_main.cpp +2 -2
- data/test/oxt/spin_lock_test.cpp +59 -0
- data/test/oxt/syscall_interruption_test.cpp +1 -1
- data/test/ruby/abstract_request_handler_spec.rb +346 -25
- data/test/ruby/abstract_server_collection_spec.rb +4 -3
- data/test/ruby/abstract_server_spec.rb +37 -27
- data/test/ruby/admin_tools_spec.rb +362 -0
- data/test/ruby/analytics_logger_spec.rb +253 -0
- data/test/ruby/{application_spec.rb → app_process_spec.rb} +14 -14
- data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
- data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
- data/test/ruby/debug_logging_spec.rb +141 -0
- data/test/ruby/message_channel_spec.rb +51 -25
- data/test/ruby/rack/application_spawner_spec.rb +99 -82
- data/test/ruby/shared/abstract_server_spec.rb +23 -0
- data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
- data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
- data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
- data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
- data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
- data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
- data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
- data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
- data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
- data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
- data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
- data/test/ruby/spawn_manager_spec.rb +104 -175
- data/test/ruby/spec_helper.rb +104 -0
- data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
- data/test/ruby/utils/hosts_file_parser.rb +258 -0
- data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
- data/test/ruby/utils_spec.rb +410 -59
- data/test/ruby/wsgi/application_spawner_spec.rb +16 -20
- data/test/stub/apache2/httpd.conf.erb +11 -6
- data/test/stub/message_channel.rb +3 -1
- data/test/stub/message_channel_2.rb +3 -1
- data/test/stub/message_channel_3.rb +5 -3
- data/test/stub/nginx/nginx.conf.erb +3 -2
- data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
- data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
- data/test/stub/rails_apps/{foobar → 1.2/empty}/app/helpers/application_helper.rb +0 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/config/boot.rb +3 -3
- data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
- data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
- data/test/stub/rails_apps/{foobar → 1.2/empty}/config/environments/production.rb +0 -0
- data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
- data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
- data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
- data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/public/404.html +0 -0
- data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
- data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
- data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
- data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/public/favicon.ico +0 -0
- data/test/stub/rails_apps/{mycook → 1.2/empty}/public/images/rails.png +0 -0
- data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
- data/test/stub/rails_apps/1.2/empty/script/about +3 -0
- data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
- data/test/stub/rails_apps/1.2/empty/script/console +3 -0
- data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
- data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
- data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
- data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
- data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
- data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
- data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
- data/test/stub/rails_apps/1.2/empty/script/server +3 -0
- data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
- data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
- data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/app/helpers/application_helper.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/boot.rb +3 -3
- data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/config/environments/development.rb +1 -1
- data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
- data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
- data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/inflections.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/initializers/mime_types.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.0/empty}/config/routes.rb +0 -0
- data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/public/422.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/public/500.html +0 -0
- data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
- data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
- data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
- data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
- data/test/stub/rails_apps/{mycook → 2.0/empty}/public/robots.txt +0 -0
- data/test/stub/rails_apps/2.0/empty/script/about +3 -0
- data/test/stub/rails_apps/2.0/empty/script/console +3 -0
- data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
- data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
- data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
- data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
- data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
- data/test/stub/rails_apps/2.0/empty/script/server +3 -0
- data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
- data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
- data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
- data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
- data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
- data/test/stub/rails_apps/{foobar → 2.2/empty}/config/environments/development.rb +0 -0
- data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
- data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
- data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
- data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/{mycook → 2.2/empty}/config/initializers/mime_types.rb +0 -0
- data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
- data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
- data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
- data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
- data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
- data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
- data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
- data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
- data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
- data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
- data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
- data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
- data/test/stub/rails_apps/2.2/empty/script/about +4 -0
- data/test/stub/rails_apps/2.2/empty/script/console +3 -0
- data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
- data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
- data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
- data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
- data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
- data/test/stub/rails_apps/2.2/empty/script/server +3 -0
- data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
- data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
- data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
- data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
- data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
- data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
- data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
- data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
- data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
- data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
- data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
- data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
- data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
- data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
- data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
- data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
- data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
- data/test/stub/rails_apps/2.3/empty/script/about +4 -0
- data/test/stub/rails_apps/2.3/empty/script/console +3 -0
- data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
- data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
- data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
- data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
- data/test/stub/rails_apps/2.3/empty/script/server +3 -0
- data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
- data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
- data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
- data/test/stub/rails_apps/{foobar/app/controllers/application.rb → 2.3/foobar/app/controllers/application_controller.rb} +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/bar_controller_2.rb +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/app/controllers/foo_controller.rb +0 -0
- data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/database.yml +0 -0
- data/test/stub/rails_apps/{foobar → 2.3/foobar}/config/environment.rb +1 -1
- data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
- data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
- data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
- data/test/stub/rails_apps/{mycook → 2.3/foobar}/config/initializers/inflections.rb +0 -0
- data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
- data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
- data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
- data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
- data/test/stub/rails_apps/{mycook/app/controllers/application.rb → 2.3/mycook/app/controllers/application_controller.rb} +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/recipes_controller.rb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/uploads_controller.rb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/controllers/welcome_controller.rb +0 -0
- data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/layouts/default.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/create.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/index.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/recipes/new.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/index.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/uploads/new.html.erb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/cached.rhtml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/app/views/welcome/index.rhtml +0 -0
- data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/database.yml +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environment.rb +1 -1
- data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/environments/production.rb +0 -0
- data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/config/routes.rb +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/log/useless.txt +0 -0
- data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
- data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
- data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.cgi +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.fcgi +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/dispatch.rb +1 -1
- data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/angrywizard.gif +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/cookbook.gif +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/images/header.png +0 -0
- data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/application.js +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/controls.js +73 -73
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/dragdrop.js +166 -165
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/effects.js +174 -166
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/javascripts/prototype.js +362 -267
- data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/uploads.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/public/welcome/cached.html +0 -0
- data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
- data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/uploads.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/sites/some.site/public/welcome/cached.html +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/cache/useless.txt +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/pids/useless.txt +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sessions/useless.txt +0 -0
- data/test/stub/rails_apps/{mycook → 2.3/mycook}/tmp/sockets/useless.txt +0 -0
- data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
- data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
- data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
- data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
- data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
- data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
- data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
- data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
- data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
- data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
- data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
- data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
- data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
- data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
- data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
- data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
- data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
- data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
- data/test/stub/rails_apps/3.0/empty/log/development.log +3 -0
- data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
- data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
- data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
- data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
- data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
- data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
- data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
- data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
- data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
- data/test/stub/spawn_server.rb +4 -2
- data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +3 -0
- data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +7 -2
- data/test/support/apache2_controller.rb +10 -2
- data/test/support/nginx_controller.rb +3 -2
- data/test/support/test_helper.rb +282 -46
- data/test/{support → tut}/tut.h +6 -0
- data/test/{support → tut}/tut_reporter.h +0 -0
- metadata +824 -266
- data/benchmark/ApplicationPool.cpp +0 -52
- data/benchmark/accept_vs_socketpair_vs_named_pipes.rb +0 -126
- data/benchmark/dispatcher.rb +0 -42
- data/benchmark/overhead_of_password_checking.rb +0 -81
- data/benchmark/socket_connections_vs_persistent_pipe.rb +0 -99
- data/benchmark/unix_sockets_vs_pipes.rb +0 -83
- data/ext/boost/LICENSE.TXT +0 -23
- data/ext/boost/VERSION.TXT +0 -1
- data/ext/boost/detail/sp_counted_base.hpp +0 -81
- data/ext/boost/src/pthread/exceptions.cpp +0 -146
- data/ext/boost/src/win32/exceptions.cpp +0 -124
- data/ext/boost/src/win32/thread.cpp +0 -629
- data/ext/boost/src/win32/timeconv.inl +0 -130
- data/ext/boost/src/win32/tss_dll.cpp +0 -72
- data/ext/boost/src/win32/tss_pe.cpp +0 -269
- data/ext/boost/thread/pthread/thread.hpp +0 -339
- data/ext/boost/thread/pthread/tss.hpp +0 -103
- data/ext/common/Application.h +0 -511
- data/ext/common/ApplicationPoolServer.h +0 -794
- data/ext/common/ApplicationPoolServerExecutable.cpp +0 -743
- data/ext/common/ApplicationPoolStatusReporter.h +0 -336
- data/ext/common/DummySpawnManager.h +0 -108
- data/ext/common/StandardApplicationPool.h +0 -821
- data/ext/common/SystemTime.h +0 -88
- data/lib/phusion_passenger/admin_tools/control_process.rb +0 -150
- data/lib/phusion_passenger/railz/application_spawner.rb +0 -463
- data/lib/phusion_passenger/templates/invalid_app_root.html.erb +0 -9
- data/test/ApplicationPoolServerTest.cpp +0 -114
- data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +0 -33
- data/test/ApplicationPoolTest.cpp +0 -599
- data/test/MessageChannelTest.cpp +0 -320
- data/test/SpawnManagerTest.cpp +0 -64
- data/test/StandardApplicationPoolTest.cpp +0 -27
- data/test/StaticStringTest.cpp +0 -51
- data/test/UtilsTest.cpp +0 -257
- data/test/ruby/rails/application_spawner_spec.rb +0 -159
- data/test/ruby/rails/framework_spawner_spec.rb +0 -133
- data/test/ruby/rails/minimal_spawner_spec.rb +0 -93
- data/test/ruby/rails/spawner_error_handling_spec.rb +0 -107
- data/test/ruby/rails/spawner_privilege_lowering_spec.rb +0 -97
- data/test/ruby/spawn_server_spec.rb +0 -26
- data/test/stub/MessageServer.dSYM/Contents/Info.plist +0 -25
- data/test/stub/MessageServer.dSYM/Contents/Resources/DWARF/MessageServer +0 -0
- data/test/support/Support.cpp +0 -84
- data/test/support/Support.h +0 -118
- data/test/support/config.rb +0 -38
- data/test/support/run_rspec_tests.rb +0 -10
@@ -0,0 +1,1034 @@
|
|
1
|
+
/*
|
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
|
+
#include <oxt/thread.hpp>
|
26
|
+
#include <oxt/system_calls.hpp>
|
27
|
+
#include <boost/function.hpp>
|
28
|
+
#include <boost/bind.hpp>
|
29
|
+
#include <string>
|
30
|
+
|
31
|
+
#include <sys/select.h>
|
32
|
+
#include <sys/types.h>
|
33
|
+
#include <sys/time.h>
|
34
|
+
#include <sys/resource.h>
|
35
|
+
#include <unistd.h>
|
36
|
+
#include <cstdio>
|
37
|
+
#include <cstdlib>
|
38
|
+
#include <cstring>
|
39
|
+
#include <cerrno>
|
40
|
+
|
41
|
+
#include "Constants.h"
|
42
|
+
#include "AgentBase.h"
|
43
|
+
#include "ServerInstanceDir.h"
|
44
|
+
#include "FileDescriptor.h"
|
45
|
+
#include "MessageChannel.h"
|
46
|
+
#include "Constants.h"
|
47
|
+
#include "RandomGenerator.h"
|
48
|
+
#include "Logging.h"
|
49
|
+
#include "Exceptions.h"
|
50
|
+
#include "ResourceLocator.h"
|
51
|
+
#include "Utils.h"
|
52
|
+
#include "Utils/Base64.h"
|
53
|
+
#include "Utils/Timer.h"
|
54
|
+
#include "Utils/IOUtils.h"
|
55
|
+
#include "Utils/VariantMap.h"
|
56
|
+
|
57
|
+
using namespace std;
|
58
|
+
using namespace boost;
|
59
|
+
using namespace oxt;
|
60
|
+
using namespace Passenger;
|
61
|
+
|
62
|
+
|
63
|
+
/** The options that were passed to AgentsStarter. */
|
64
|
+
static VariantMap agentsOptions;
|
65
|
+
static string webServerType; // "apache" or "nginx"
|
66
|
+
static unsigned int logLevel;
|
67
|
+
static pid_t webServerPid;
|
68
|
+
static string tempDir;
|
69
|
+
static bool userSwitching;
|
70
|
+
static string defaultUser;
|
71
|
+
static string defaultGroup;
|
72
|
+
static uid_t webServerWorkerUid;
|
73
|
+
static gid_t webServerWorkerGid;
|
74
|
+
static string passengerRoot;
|
75
|
+
static string rubyCommand;
|
76
|
+
static unsigned int maxPoolSize;
|
77
|
+
static unsigned int maxInstancesPerApp;
|
78
|
+
static unsigned int poolIdleTime;
|
79
|
+
static string serializedPrestartURLs;
|
80
|
+
|
81
|
+
static ServerInstanceDirPtr serverInstanceDir;
|
82
|
+
static ServerInstanceDir::GenerationPtr generation;
|
83
|
+
static string loggingAgentAddress;
|
84
|
+
static string loggingAgentPassword;
|
85
|
+
static RandomGenerator *randomGenerator;
|
86
|
+
static EventFd *errorEvent;
|
87
|
+
|
88
|
+
#define REQUEST_SOCKET_PASSWORD_SIZE 64
|
89
|
+
|
90
|
+
|
91
|
+
class FailGuard {
|
92
|
+
private:
|
93
|
+
function<void ()> func;
|
94
|
+
public:
|
95
|
+
FailGuard() { }
|
96
|
+
FailGuard(const function<void ()> &_func): func(_func) { }
|
97
|
+
|
98
|
+
~FailGuard() {
|
99
|
+
if (func != NULL) {
|
100
|
+
func();
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
void runNow() {
|
105
|
+
if (func != NULL) {
|
106
|
+
function<void ()> func = this->func;
|
107
|
+
this->func = NULL;
|
108
|
+
func();
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
void set(const function<void ()> &func) {
|
113
|
+
this->func = func;
|
114
|
+
}
|
115
|
+
|
116
|
+
void clear() {
|
117
|
+
func = NULL;
|
118
|
+
}
|
119
|
+
};
|
120
|
+
|
121
|
+
|
122
|
+
/**
|
123
|
+
* Abstract base class for watching agent processes.
|
124
|
+
*/
|
125
|
+
class AgentWatcher {
|
126
|
+
private:
|
127
|
+
/** The watcher thread. */
|
128
|
+
oxt::thread *thr;
|
129
|
+
|
130
|
+
void threadMain() {
|
131
|
+
try {
|
132
|
+
pid_t pid, ret;
|
133
|
+
int status;
|
134
|
+
|
135
|
+
while (!this_thread::interruption_requested()) {
|
136
|
+
lock.lock();
|
137
|
+
pid = this->pid;
|
138
|
+
lock.unlock();
|
139
|
+
|
140
|
+
if (pid == 0) {
|
141
|
+
pid = start();
|
142
|
+
}
|
143
|
+
ret = syscalls::waitpid(pid, &status, 0);
|
144
|
+
|
145
|
+
lock.lock();
|
146
|
+
this->pid = 0;
|
147
|
+
lock.unlock();
|
148
|
+
|
149
|
+
this_thread::disable_interruption di;
|
150
|
+
this_thread::disable_syscall_interruption dsi;
|
151
|
+
if (ret == -1) {
|
152
|
+
P_WARN(name() << " crashed or killed for "
|
153
|
+
"an unknown reason, restarting it...");
|
154
|
+
} else if (WIFEXITED(status)) {
|
155
|
+
if (WEXITSTATUS(status) == 0) {
|
156
|
+
/* When the web server is gracefully exiting, it will
|
157
|
+
* tell one or more agents to gracefully exit with exit
|
158
|
+
* status 0. If we see this then it means the watchdog
|
159
|
+
* is gracefully shutting down too and we should stop
|
160
|
+
* watching.
|
161
|
+
*/
|
162
|
+
return;
|
163
|
+
} else {
|
164
|
+
P_WARN(name() << " crashed with exit status " <<
|
165
|
+
WEXITSTATUS(status) << ", restarting it...");
|
166
|
+
}
|
167
|
+
} else {
|
168
|
+
P_WARN(name() << " crashed with signal " <<
|
169
|
+
getSignalName(WTERMSIG(status)) <<
|
170
|
+
", restarting it...");
|
171
|
+
}
|
172
|
+
}
|
173
|
+
} catch (const boost::thread_interrupted &) {
|
174
|
+
} catch (const tracable_exception &e) {
|
175
|
+
lock_guard<boost::mutex> l(lock);
|
176
|
+
threadExceptionMessage = e.what();
|
177
|
+
threadExceptionBacktrace = e.backtrace();
|
178
|
+
errorEvent->notify();
|
179
|
+
} catch (const std::exception &e) {
|
180
|
+
lock_guard<boost::mutex> l(lock);
|
181
|
+
threadExceptionMessage = e.what();
|
182
|
+
errorEvent->notify();
|
183
|
+
} catch (...) {
|
184
|
+
lock_guard<boost::mutex> l(lock);
|
185
|
+
threadExceptionMessage = "Unknown error";
|
186
|
+
errorEvent->notify();
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
protected:
|
191
|
+
/** PID of the process we're watching. 0 if no process is started at this time. */
|
192
|
+
pid_t pid;
|
193
|
+
|
194
|
+
/** If the watcher thread threw an uncaught exception then its information will
|
195
|
+
* be stored here so that the main thread can check whether a watcher encountered
|
196
|
+
* an error. These are empty strings if everything is OK.
|
197
|
+
*/
|
198
|
+
string threadExceptionMessage;
|
199
|
+
string threadExceptionBacktrace;
|
200
|
+
|
201
|
+
/** The agent process's feedback fd. */
|
202
|
+
FileDescriptor feedbackFd;
|
203
|
+
|
204
|
+
/**
|
205
|
+
* Lock for protecting the exchange of data between the main thread and
|
206
|
+
* the watcher thread.
|
207
|
+
*/
|
208
|
+
mutable boost::mutex lock;
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Returns the filename of the agent process's executable. This method may be
|
212
|
+
* called in a forked child process and may therefore not allocate memory.
|
213
|
+
*/
|
214
|
+
virtual string getExeFilename() const = 0;
|
215
|
+
|
216
|
+
/**
|
217
|
+
* This method is to exec() the agent with the right arguments.
|
218
|
+
* It is called from within a forked child process, so don't do any dynamic
|
219
|
+
* memory allocations in here. It must also not throw any exceptions.
|
220
|
+
* It must also preserve the value of errno after exec() is called.
|
221
|
+
*/
|
222
|
+
virtual void execProgram() const {
|
223
|
+
execl(getExeFilename().c_str(),
|
224
|
+
getExeFilename().c_str(),
|
225
|
+
"3", // feedback fd
|
226
|
+
(char *) 0);
|
227
|
+
}
|
228
|
+
|
229
|
+
/**
|
230
|
+
* This method is to send startup arguments to the agent process through
|
231
|
+
* the given file descriptor, which is the agent process's feedback fd.
|
232
|
+
* May throw arbitrary exceptions.
|
233
|
+
*/
|
234
|
+
virtual void sendStartupArguments(pid_t pid, FileDescriptor &fd) = 0;
|
235
|
+
|
236
|
+
/**
|
237
|
+
* This method is to process the startup info that the agent process has
|
238
|
+
* sent back. May throw arbitrary exceptions.
|
239
|
+
*/
|
240
|
+
virtual bool processStartupInfo(pid_t pid, FileDescriptor &fd, const vector<string> &args) = 0;
|
241
|
+
|
242
|
+
/**
|
243
|
+
* Kill a process with SIGKILL, and attempt to kill its children too.
|
244
|
+
* Then wait until it has quit.
|
245
|
+
*/
|
246
|
+
static void killAndWait(pid_t pid) {
|
247
|
+
this_thread::disable_interruption di;
|
248
|
+
this_thread::disable_syscall_interruption dsi;
|
249
|
+
// If the process is a process group leader then killing the
|
250
|
+
// group will likely kill all its child processes too.
|
251
|
+
if (syscalls::killpg(pid, SIGKILL) == -1) {
|
252
|
+
syscalls::kill(pid, SIGKILL);
|
253
|
+
}
|
254
|
+
syscalls::waitpid(pid, NULL, 0);
|
255
|
+
}
|
256
|
+
|
257
|
+
/**
|
258
|
+
* Behaves like <tt>waitpid(pid, status, WNOHANG)</tt>, but waits at most
|
259
|
+
* <em>timeout</em> miliseconds for the process to exit.
|
260
|
+
*/
|
261
|
+
static int timedWaitPid(pid_t pid, int *status, unsigned long long timeout) {
|
262
|
+
Timer timer;
|
263
|
+
int ret;
|
264
|
+
|
265
|
+
do {
|
266
|
+
ret = syscalls::waitpid(pid, status, WNOHANG);
|
267
|
+
if (ret > 0 || ret == -1) {
|
268
|
+
return ret;
|
269
|
+
} else {
|
270
|
+
syscalls::usleep(10000);
|
271
|
+
}
|
272
|
+
} while (timer.elapsed() < timeout);
|
273
|
+
return 0; // timed out
|
274
|
+
}
|
275
|
+
|
276
|
+
public:
|
277
|
+
AgentWatcher() {
|
278
|
+
thr = NULL;
|
279
|
+
pid = 0;
|
280
|
+
}
|
281
|
+
|
282
|
+
virtual ~AgentWatcher() {
|
283
|
+
delete thr;
|
284
|
+
}
|
285
|
+
|
286
|
+
/**
|
287
|
+
* Send the started agent process's startup information over the given channel,
|
288
|
+
* to the starter process. May throw arbitrary exceptions.
|
289
|
+
*
|
290
|
+
* @pre start() has been called and succeeded.
|
291
|
+
*/
|
292
|
+
virtual void sendStartupInfo(MessageChannel &channel) = 0;
|
293
|
+
|
294
|
+
/** Returns the name of the agent that this class is watching. */
|
295
|
+
virtual const char *name() const = 0;
|
296
|
+
|
297
|
+
/**
|
298
|
+
* Starts the agent process. May throw arbitrary exceptions.
|
299
|
+
*/
|
300
|
+
virtual pid_t start() {
|
301
|
+
this_thread::disable_interruption di;
|
302
|
+
this_thread::disable_syscall_interruption dsi;
|
303
|
+
string exeFilename = getExeFilename();
|
304
|
+
int fds[2], e, ret;
|
305
|
+
pid_t pid;
|
306
|
+
|
307
|
+
/* Create feedback fd for this agent process. We'll send some startup
|
308
|
+
* arguments to this agent process through this fd, and we'll receive
|
309
|
+
* startup information through it as well.
|
310
|
+
*/
|
311
|
+
if (syscalls::socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
|
312
|
+
int e = errno;
|
313
|
+
throw SystemException("Cannot create a Unix socket pair", e);
|
314
|
+
}
|
315
|
+
|
316
|
+
pid = syscalls::fork();
|
317
|
+
if (pid == 0) {
|
318
|
+
// Child
|
319
|
+
long max_fds, i;
|
320
|
+
|
321
|
+
/* Make sure file descriptor FEEDBACK_FD refers to the newly created
|
322
|
+
* feedback fd (fds[1]) and close all other file descriptors.
|
323
|
+
* In this child process we don't care about the original FEEDBACK_FD
|
324
|
+
* (which is the Watchdog's communication channel to the agents starter.)
|
325
|
+
*
|
326
|
+
* fds[1] is guaranteed to be != FEEDBACK_FD because the watchdog
|
327
|
+
* is started with FEEDBACK_FD already assigned.
|
328
|
+
*/
|
329
|
+
syscalls::close(fds[0]);
|
330
|
+
|
331
|
+
if (syscalls::dup2(fds[1], FEEDBACK_FD) == -1) {
|
332
|
+
/* Something went wrong, report error through feedback fd. */
|
333
|
+
e = errno;
|
334
|
+
try {
|
335
|
+
MessageChannel(fds[1]).write("system error before exec",
|
336
|
+
"dup2() failed",
|
337
|
+
toString(e).c_str(),
|
338
|
+
NULL);
|
339
|
+
_exit(1);
|
340
|
+
} catch (...) {
|
341
|
+
fprintf(stderr, "Passenger Watchdog: dup2() failed: %s (%d)\n",
|
342
|
+
strerror(e), e);
|
343
|
+
fflush(stderr);
|
344
|
+
_exit(1);
|
345
|
+
}
|
346
|
+
}
|
347
|
+
|
348
|
+
/* Close all file descriptors except 0-FEEDBACK_FD. */
|
349
|
+
max_fds = sysconf(_SC_OPEN_MAX);
|
350
|
+
for (i = FEEDBACK_FD + 1; i < max_fds; i++) {
|
351
|
+
syscalls::close(i);
|
352
|
+
}
|
353
|
+
|
354
|
+
/* Become the process group leader so that the watchdog can kill the
|
355
|
+
* agent as well as all its descendant processes. */
|
356
|
+
setpgid(getpid(), getpid());
|
357
|
+
|
358
|
+
try {
|
359
|
+
execProgram();
|
360
|
+
} catch (...) {
|
361
|
+
fprintf(stderr, "PassengerWatchdog: execProgram() threw an exception\n");
|
362
|
+
fflush(stderr);
|
363
|
+
_exit(1);
|
364
|
+
}
|
365
|
+
e = errno;
|
366
|
+
try {
|
367
|
+
MessageChannel(FEEDBACK_FD).write("exec error",
|
368
|
+
toString(e).c_str(), NULL);
|
369
|
+
_exit(1);
|
370
|
+
} catch (...) {
|
371
|
+
fprintf(stderr, "Passenger Watchdog: could not execute %s: %s (%d)\n",
|
372
|
+
exeFilename.c_str(), strerror(e), e);
|
373
|
+
fflush(stderr);
|
374
|
+
_exit(1);
|
375
|
+
}
|
376
|
+
} else if (pid == -1) {
|
377
|
+
// Error
|
378
|
+
e = errno;
|
379
|
+
syscalls::close(fds[0]);
|
380
|
+
syscalls::close(fds[1]);
|
381
|
+
throw SystemException("Cannot fork a new process", e);
|
382
|
+
} else {
|
383
|
+
// Parent
|
384
|
+
FileDescriptor feedbackFd(fds[0]);
|
385
|
+
vector<string> args;
|
386
|
+
|
387
|
+
syscalls::close(fds[1]);
|
388
|
+
this_thread::restore_interruption ri(di);
|
389
|
+
this_thread::restore_syscall_interruption rsi(dsi);
|
390
|
+
FailGuard failGuard(boost::bind(killAndWait, pid));
|
391
|
+
|
392
|
+
// Send startup arguments.
|
393
|
+
try {
|
394
|
+
sendStartupArguments(pid, feedbackFd);
|
395
|
+
} catch (const SystemException &ex) {
|
396
|
+
throw SystemException(string("Unable to start the ") + name() +
|
397
|
+
": an error occurred while sending startup arguments",
|
398
|
+
ex.code());
|
399
|
+
}
|
400
|
+
|
401
|
+
// Now read its feedback.
|
402
|
+
try {
|
403
|
+
if (!MessageChannel(feedbackFd).read(args)) {
|
404
|
+
throw EOFException("");
|
405
|
+
}
|
406
|
+
} catch (const EOFException &e) {
|
407
|
+
this_thread::disable_interruption di2;
|
408
|
+
this_thread::disable_syscall_interruption dsi2;
|
409
|
+
int status;
|
410
|
+
|
411
|
+
/* The feedback fd was closed for an unknown reason.
|
412
|
+
* Did the agent process crash?
|
413
|
+
*
|
414
|
+
* We use timedWaitPid() here because if the process crashed
|
415
|
+
* because of an uncaught exception, the file descriptor
|
416
|
+
* might be closed before the process has printed an error
|
417
|
+
* message, so we give it some time to print the error
|
418
|
+
* before we kill it.
|
419
|
+
*/
|
420
|
+
ret = timedWaitPid(pid, &status, 1000);
|
421
|
+
if (ret == 0) {
|
422
|
+
/* Doesn't look like it; it seems it's still running.
|
423
|
+
* We can't do anything without proper feedback so kill
|
424
|
+
* the agent process and throw an exception.
|
425
|
+
*/
|
426
|
+
failGuard.runNow();
|
427
|
+
throw RuntimeException(string("Unable to start the ") + name() +
|
428
|
+
": an unknown error occurred during its startup");
|
429
|
+
} else if (ret != -1 && WIFSIGNALED(status)) {
|
430
|
+
/* Looks like a crash which caused a signal. */
|
431
|
+
throw RuntimeException(string("Unable to start the ") + name() +
|
432
|
+
": it seems to have been killed with signal " +
|
433
|
+
getSignalName(WTERMSIG(status)) + " during startup");
|
434
|
+
} else {
|
435
|
+
/* Looks like it exited after detecting an error. */
|
436
|
+
throw RuntimeException(string("Unable to start the ") + name() +
|
437
|
+
": it seems to have crashed during startup for an unknown reason");
|
438
|
+
}
|
439
|
+
} catch (const SystemException &e) {
|
440
|
+
throw SystemException(string("Unable to start the ") + name() +
|
441
|
+
": unable to read its startup information",
|
442
|
+
e.code());
|
443
|
+
} catch (const RuntimeException &) {
|
444
|
+
/* Rethrow without killing the PID because the process
|
445
|
+
* is already dead.
|
446
|
+
*/
|
447
|
+
failGuard.clear();
|
448
|
+
throw;
|
449
|
+
}
|
450
|
+
|
451
|
+
if (args[0] == "system error before exec") {
|
452
|
+
throw SystemException(string("Unable to start the ") + name() +
|
453
|
+
": " + args[1], atoi(args[2]));
|
454
|
+
} else if (args[0] == "exec error") {
|
455
|
+
throw SystemException(string("Unable to start the ") + name() +
|
456
|
+
" because exec(\"" + getExeFilename() + "\") failed",
|
457
|
+
atoi(args[1]));
|
458
|
+
} else if (!processStartupInfo(pid, feedbackFd, args)) {
|
459
|
+
throw RuntimeException(string("The ") + name() +
|
460
|
+
" sent an unknown startup info message '" +
|
461
|
+
args[0] + "'");
|
462
|
+
}
|
463
|
+
|
464
|
+
lock_guard<boost::mutex> l(lock);
|
465
|
+
this->feedbackFd = feedbackFd;
|
466
|
+
this->pid = pid;
|
467
|
+
failGuard.clear();
|
468
|
+
return pid;
|
469
|
+
}
|
470
|
+
}
|
471
|
+
|
472
|
+
/**
|
473
|
+
* Start watching the agent process.
|
474
|
+
*
|
475
|
+
* @pre start() has been called and succeeded.
|
476
|
+
* @pre This watcher isn't already watching.
|
477
|
+
* @throws RuntimeException If a precondition failed.
|
478
|
+
* @throws thread_interrupted
|
479
|
+
* @throws thread_resource_error
|
480
|
+
*/
|
481
|
+
virtual void startWatching() {
|
482
|
+
lock_guard<boost::mutex> l(lock);
|
483
|
+
if (pid == 0) {
|
484
|
+
throw RuntimeException("start() hasn't been called yet");
|
485
|
+
}
|
486
|
+
if (thr != NULL) {
|
487
|
+
throw RuntimeException("Already started watching.");
|
488
|
+
}
|
489
|
+
|
490
|
+
/* Don't make the stack any smaller, getpwnam() on OS
|
491
|
+
* X needs a lot of stack space.
|
492
|
+
*/
|
493
|
+
thr = new oxt::thread(boost::bind(&AgentWatcher::threadMain, this),
|
494
|
+
name(), 64 * 1024);
|
495
|
+
}
|
496
|
+
|
497
|
+
static void stopWatching(vector<AgentWatcher *> &watchers) {
|
498
|
+
vector<AgentWatcher *>::const_iterator it;
|
499
|
+
oxt::thread *threads[watchers.size()];
|
500
|
+
unsigned int i = 0;
|
501
|
+
|
502
|
+
for (it = watchers.begin(); it != watchers.end(); it++, i++) {
|
503
|
+
threads[i] = (*it)->thr;
|
504
|
+
}
|
505
|
+
|
506
|
+
oxt::thread::interrupt_and_join_multiple(threads, watchers.size());
|
507
|
+
}
|
508
|
+
|
509
|
+
/**
|
510
|
+
* Force the agent process to shut down. Returns true if it was shut down,
|
511
|
+
* or false if it wasn't started.
|
512
|
+
*/
|
513
|
+
virtual bool forceShutdown() {
|
514
|
+
lock_guard<boost::mutex> l(lock);
|
515
|
+
if (pid == 0) {
|
516
|
+
return false;
|
517
|
+
} else {
|
518
|
+
killAndWait(pid);
|
519
|
+
this->pid = 0;
|
520
|
+
return true;
|
521
|
+
}
|
522
|
+
}
|
523
|
+
|
524
|
+
/**
|
525
|
+
* If the watcher thread has encountered an error, then the error message
|
526
|
+
* will be stored here. If the error message is empty then it means
|
527
|
+
* everything is still OK.
|
528
|
+
*/
|
529
|
+
string getErrorMessage() const {
|
530
|
+
lock_guard<boost::mutex> l(lock);
|
531
|
+
return threadExceptionMessage;
|
532
|
+
}
|
533
|
+
|
534
|
+
/**
|
535
|
+
* The error backtrace, if applicable.
|
536
|
+
*/
|
537
|
+
string getErrorBacktrace() const {
|
538
|
+
lock_guard<boost::mutex> l(lock);
|
539
|
+
return threadExceptionBacktrace;
|
540
|
+
}
|
541
|
+
|
542
|
+
/**
|
543
|
+
* Returns the agent process feedback fd, or NULL if the agent process
|
544
|
+
* hasn't been started yet. Can be used to check whether this agent process
|
545
|
+
* has exited without using waitpid().
|
546
|
+
*/
|
547
|
+
const FileDescriptor getFeedbackFd() const {
|
548
|
+
lock_guard<boost::mutex> l(lock);
|
549
|
+
return feedbackFd;
|
550
|
+
}
|
551
|
+
};
|
552
|
+
|
553
|
+
|
554
|
+
class HelperAgentWatcher: public AgentWatcher {
|
555
|
+
protected:
|
556
|
+
string requestSocketFilename;
|
557
|
+
string messageSocketFilename;
|
558
|
+
string helperAgentFilename;
|
559
|
+
string requestSocketPassword;
|
560
|
+
string messageSocketPassword;
|
561
|
+
|
562
|
+
virtual const char *name() const {
|
563
|
+
return "Phusion Passenger helper agent";
|
564
|
+
}
|
565
|
+
|
566
|
+
virtual string getExeFilename() const {
|
567
|
+
return helperAgentFilename;
|
568
|
+
}
|
569
|
+
|
570
|
+
virtual void execProgram() const {
|
571
|
+
execl(helperAgentFilename.c_str(), "PassengerHelperAgent", (char *) 0);
|
572
|
+
}
|
573
|
+
|
574
|
+
virtual void sendStartupArguments(pid_t pid, FileDescriptor &fd) {
|
575
|
+
VariantMap options = agentsOptions;
|
576
|
+
options.set("request_socket_password", Base64::encode(requestSocketPassword)).
|
577
|
+
set("message_socket_password", Base64::encode(messageSocketPassword)).
|
578
|
+
set("logging_agent_address", loggingAgentAddress).
|
579
|
+
set("logging_agent_password", loggingAgentPassword);
|
580
|
+
options.writeToFd(fd);
|
581
|
+
}
|
582
|
+
|
583
|
+
virtual bool processStartupInfo(pid_t pid, FileDescriptor &fd, const vector<string> &args) {
|
584
|
+
if (args[0] == "initialized") {
|
585
|
+
requestSocketFilename = args[1];
|
586
|
+
messageSocketFilename = args[2];
|
587
|
+
return true;
|
588
|
+
} else {
|
589
|
+
return false;
|
590
|
+
}
|
591
|
+
}
|
592
|
+
|
593
|
+
public:
|
594
|
+
HelperAgentWatcher(const ResourceLocator &resourceLocator) {
|
595
|
+
if (agentsOptions.get("web_server_type") == "apache") {
|
596
|
+
helperAgentFilename = resourceLocator.getAgentsDir() + "/apache2/PassengerHelperAgent";
|
597
|
+
} else {
|
598
|
+
helperAgentFilename = resourceLocator.getAgentsDir() + "/nginx/PassengerHelperAgent";
|
599
|
+
}
|
600
|
+
requestSocketPassword = randomGenerator->generateByteString(REQUEST_SOCKET_PASSWORD_SIZE);
|
601
|
+
messageSocketPassword = randomGenerator->generateByteString(MESSAGE_SERVER_MAX_PASSWORD_SIZE);
|
602
|
+
}
|
603
|
+
|
604
|
+
virtual void sendStartupInfo(MessageChannel &channel) {
|
605
|
+
channel.write("HelperAgent info",
|
606
|
+
requestSocketFilename.c_str(),
|
607
|
+
Base64::encode(requestSocketPassword).c_str(),
|
608
|
+
messageSocketFilename.c_str(),
|
609
|
+
Base64::encode(messageSocketPassword).c_str(),
|
610
|
+
NULL);
|
611
|
+
}
|
612
|
+
};
|
613
|
+
|
614
|
+
|
615
|
+
class LoggingAgentWatcher: public AgentWatcher {
|
616
|
+
protected:
|
617
|
+
string agentFilename;
|
618
|
+
string socketAddress;
|
619
|
+
|
620
|
+
virtual const char *name() const {
|
621
|
+
return "Phusion Passenger logging agent";
|
622
|
+
}
|
623
|
+
|
624
|
+
virtual string getExeFilename() const {
|
625
|
+
return agentFilename;
|
626
|
+
}
|
627
|
+
|
628
|
+
virtual void execProgram() const {
|
629
|
+
execl(agentFilename.c_str(), "PassengerLoggingAgent", (char *) 0);
|
630
|
+
}
|
631
|
+
|
632
|
+
virtual void sendStartupArguments(pid_t pid, FileDescriptor &fd) {
|
633
|
+
VariantMap options = agentsOptions;
|
634
|
+
options.set("logging_agent_address", loggingAgentAddress);
|
635
|
+
options.set("logging_agent_password", loggingAgentPassword);
|
636
|
+
options.writeToFd(fd);
|
637
|
+
}
|
638
|
+
|
639
|
+
virtual bool processStartupInfo(pid_t pid, FileDescriptor &fd, const vector<string> &args) {
|
640
|
+
if (args[0] == "initialized") {
|
641
|
+
return true;
|
642
|
+
} else {
|
643
|
+
return false;
|
644
|
+
}
|
645
|
+
}
|
646
|
+
|
647
|
+
public:
|
648
|
+
LoggingAgentWatcher(const ResourceLocator &resourceLocator) {
|
649
|
+
agentFilename = resourceLocator.getAgentsDir() + "/PassengerLoggingAgent";
|
650
|
+
}
|
651
|
+
|
652
|
+
virtual void sendStartupInfo(MessageChannel &channel) {
|
653
|
+
channel.write("LoggingServer info",
|
654
|
+
loggingAgentAddress.c_str(),
|
655
|
+
loggingAgentPassword.c_str(),
|
656
|
+
NULL);
|
657
|
+
}
|
658
|
+
};
|
659
|
+
|
660
|
+
|
661
|
+
/**
|
662
|
+
* Touch all files in the server instance dir every 6 hours in order to prevent /tmp
|
663
|
+
* cleaners from weaking havoc:
|
664
|
+
* http://code.google.com/p/phusion-passenger/issues/detail?id=365
|
665
|
+
*/
|
666
|
+
class ServerInstanceDirToucher {
|
667
|
+
private:
|
668
|
+
oxt::thread *thr;
|
669
|
+
|
670
|
+
static void
|
671
|
+
threadMain() {
|
672
|
+
while (!this_thread::interruption_requested()) {
|
673
|
+
syscalls::sleep(60 * 60 * 6);
|
674
|
+
|
675
|
+
begin_touch:
|
676
|
+
|
677
|
+
this_thread::disable_interruption di;
|
678
|
+
this_thread::disable_syscall_interruption dsi;
|
679
|
+
// Fork a process which touches everything in the server instance dir.
|
680
|
+
pid_t pid = syscalls::fork();
|
681
|
+
if (pid == 0) {
|
682
|
+
// Child
|
683
|
+
int prio, ret, e;
|
684
|
+
long max_fds, i;
|
685
|
+
|
686
|
+
// Close all unnecessary file descriptors.
|
687
|
+
max_fds = sysconf(_SC_OPEN_MAX);
|
688
|
+
for (i = 3; i < max_fds; i++) {
|
689
|
+
syscalls::close(i);
|
690
|
+
}
|
691
|
+
|
692
|
+
// Make process nicer.
|
693
|
+
do {
|
694
|
+
prio = getpriority(PRIO_PROCESS, getpid());
|
695
|
+
} while (prio == -1 && errno == EINTR);
|
696
|
+
if (prio != -1) {
|
697
|
+
prio++;
|
698
|
+
if (prio > 20) {
|
699
|
+
prio = 20;
|
700
|
+
}
|
701
|
+
do {
|
702
|
+
ret = setpriority(PRIO_PROCESS, getpid(), prio);
|
703
|
+
} while (ret == -1 && errno == EINTR);
|
704
|
+
} else {
|
705
|
+
perror("getpriority");
|
706
|
+
}
|
707
|
+
|
708
|
+
do {
|
709
|
+
ret = chdir(serverInstanceDir->getPath().c_str());
|
710
|
+
} while (ret == -1 && errno == EINTR);
|
711
|
+
if (ret == -1) {
|
712
|
+
e = errno;
|
713
|
+
fprintf(stderr, "chdir(\"%s\") failed: %s (%d)\n",
|
714
|
+
serverInstanceDir->getPath().c_str(),
|
715
|
+
strerror(e), e);
|
716
|
+
fflush(stderr);
|
717
|
+
_exit(1);
|
718
|
+
}
|
719
|
+
|
720
|
+
execlp("/bin/sh", "/bin/sh", "-c", "find . | xargs touch", (char *) 0);
|
721
|
+
e = errno;
|
722
|
+
fprintf(stderr, "Cannot execute 'find . | xargs touch': %s (%d)\n",
|
723
|
+
strerror(e), e);
|
724
|
+
fflush(stderr);
|
725
|
+
_exit(1);
|
726
|
+
} else if (pid == -1) {
|
727
|
+
// Error
|
728
|
+
P_WARN("Could touch the server instance directory because "
|
729
|
+
"fork() failed. Retrying in 2 minutes...");
|
730
|
+
this_thread::restore_interruption si(di);
|
731
|
+
this_thread::restore_syscall_interruption rsi(dsi);
|
732
|
+
syscalls::sleep(60 * 2);
|
733
|
+
goto begin_touch;
|
734
|
+
} else {
|
735
|
+
syscalls::waitpid(pid, NULL, 0);
|
736
|
+
}
|
737
|
+
}
|
738
|
+
}
|
739
|
+
|
740
|
+
public:
|
741
|
+
ServerInstanceDirToucher() {
|
742
|
+
thr = new oxt::thread(threadMain, "Server instance dir toucher", 96 * 1024);
|
743
|
+
}
|
744
|
+
|
745
|
+
~ServerInstanceDirToucher() {
|
746
|
+
thr->interrupt_and_join();
|
747
|
+
delete thr;
|
748
|
+
}
|
749
|
+
};
|
750
|
+
|
751
|
+
|
752
|
+
/**
|
753
|
+
* Most operating systems overcommit memory. We *know* that this watchdog process
|
754
|
+
* doesn't use much memory; on OS X it uses about 200 KB of private RSS. If the
|
755
|
+
* watchdog is killed by the system Out-Of-Memory Killer or then it's all over:
|
756
|
+
* the system administrator will have to restart the web server for Phusion
|
757
|
+
* Passenger to be usable again. So in this function we do whatever is necessary
|
758
|
+
* to prevent this watchdog process from becoming a candidate for the OS's
|
759
|
+
* Out-Of-Memory Killer.
|
760
|
+
*/
|
761
|
+
static void
|
762
|
+
disableOomKiller() {
|
763
|
+
// Linux-only way to disable OOM killer for current process. Requires root
|
764
|
+
// privileges, which we should have.
|
765
|
+
FILE *f = fopen("/proc/self/oom_adj", "w");
|
766
|
+
if (f != NULL) {
|
767
|
+
fprintf(f, "-17");
|
768
|
+
fclose(f);
|
769
|
+
}
|
770
|
+
}
|
771
|
+
|
772
|
+
/**
|
773
|
+
* Wait until the starter process has exited or sent us an exit command,
|
774
|
+
* or until one of the watcher threads encounter an error. If a thread
|
775
|
+
* encountered an error then the error message will be printed.
|
776
|
+
*
|
777
|
+
* Returns whether this watchdog should exit gracefully, which is only the
|
778
|
+
* case if the web server sent us an exit command and no thread encountered
|
779
|
+
* an error.
|
780
|
+
*/
|
781
|
+
static bool
|
782
|
+
waitForStarterProcessOrWatchers(vector<AgentWatcher *> &watchers) {
|
783
|
+
fd_set fds;
|
784
|
+
int max, ret;
|
785
|
+
char x;
|
786
|
+
|
787
|
+
FD_ZERO(&fds);
|
788
|
+
FD_SET(FEEDBACK_FD, &fds);
|
789
|
+
FD_SET(errorEvent->fd(), &fds);
|
790
|
+
|
791
|
+
if (FEEDBACK_FD > errorEvent->fd()) {
|
792
|
+
max = FEEDBACK_FD;
|
793
|
+
} else {
|
794
|
+
max = errorEvent->fd();
|
795
|
+
}
|
796
|
+
|
797
|
+
ret = syscalls::select(max + 1, &fds, NULL, NULL, NULL);
|
798
|
+
if (ret == -1) {
|
799
|
+
int e = errno;
|
800
|
+
P_ERROR("select() failed: " << strerror(e));
|
801
|
+
return false;
|
802
|
+
}
|
803
|
+
|
804
|
+
if (FD_ISSET(errorEvent->fd(), &fds)) {
|
805
|
+
vector<AgentWatcher *>::const_iterator it;
|
806
|
+
string message, backtrace, watcherName;
|
807
|
+
|
808
|
+
for (it = watchers.begin(); it != watchers.end() && message.empty(); it++) {
|
809
|
+
message = (*it)->getErrorMessage();
|
810
|
+
backtrace = (*it)->getErrorBacktrace();
|
811
|
+
watcherName = (*it)->name();
|
812
|
+
}
|
813
|
+
|
814
|
+
if (!message.empty() && backtrace.empty()) {
|
815
|
+
P_ERROR("Error in " << watcherName << " watcher:\n " << message);
|
816
|
+
} else if (!message.empty() && !backtrace.empty()) {
|
817
|
+
P_ERROR("Error in " << watcherName << " watcher:\n " <<
|
818
|
+
message << "\n" << backtrace);
|
819
|
+
}
|
820
|
+
return false;
|
821
|
+
} else {
|
822
|
+
ret = syscalls::read(FEEDBACK_FD, &x, 1);
|
823
|
+
return ret == 1 && x == 'c';
|
824
|
+
}
|
825
|
+
}
|
826
|
+
|
827
|
+
static void
|
828
|
+
cleanupAgentsInBackground(vector<AgentWatcher *> &watchers) {
|
829
|
+
this_thread::disable_interruption di;
|
830
|
+
this_thread::disable_syscall_interruption dsi;
|
831
|
+
pid_t pid;
|
832
|
+
int e;
|
833
|
+
|
834
|
+
pid = fork();
|
835
|
+
if (pid == 0) {
|
836
|
+
// Child
|
837
|
+
vector<AgentWatcher *>::const_iterator it;
|
838
|
+
Timer timer(false);
|
839
|
+
fd_set fds, fds2;
|
840
|
+
int max, agentProcessesDone;
|
841
|
+
unsigned long long deadline = 30000; // miliseconds
|
842
|
+
|
843
|
+
// Wait until all agent processes have exited.
|
844
|
+
|
845
|
+
max = 0;
|
846
|
+
FD_ZERO(&fds);
|
847
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
848
|
+
FD_SET((*it)->getFeedbackFd(), &fds);
|
849
|
+
if ((*it)->getFeedbackFd() > max) {
|
850
|
+
max = (*it)->getFeedbackFd();
|
851
|
+
}
|
852
|
+
}
|
853
|
+
|
854
|
+
timer.start();
|
855
|
+
agentProcessesDone = 0;
|
856
|
+
while (agentProcessesDone != -1
|
857
|
+
&& agentProcessesDone < (int) watchers.size()
|
858
|
+
&& timer.elapsed() < deadline)
|
859
|
+
{
|
860
|
+
struct timeval timeout;
|
861
|
+
|
862
|
+
#ifdef FD_COPY
|
863
|
+
FD_COPY(&fds, &fds2);
|
864
|
+
#else
|
865
|
+
FD_ZERO(&fds2);
|
866
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
867
|
+
FD_SET((*it)->getFeedbackFd(), &fds2);
|
868
|
+
}
|
869
|
+
#endif
|
870
|
+
|
871
|
+
timeout.tv_sec = 0;
|
872
|
+
timeout.tv_usec = 10000;
|
873
|
+
agentProcessesDone = syscalls::select(max + 1, &fds2, NULL, NULL, &timeout);
|
874
|
+
if (agentProcessesDone > 0 && timer.elapsed() < deadline) {
|
875
|
+
usleep(10000);
|
876
|
+
}
|
877
|
+
}
|
878
|
+
|
879
|
+
if (agentProcessesDone == -1 || timer.elapsed() >= deadline) {
|
880
|
+
// An error occurred or we've waited long enough. Kill all the
|
881
|
+
// processes.
|
882
|
+
P_WARN("Some Phusion Passenger agent processes did not exit " <<
|
883
|
+
"in time, forcefully shutting down all.");
|
884
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
885
|
+
(*it)->forceShutdown();
|
886
|
+
}
|
887
|
+
} else {
|
888
|
+
P_DEBUG("All Phusion Passenger agent processes have exited.");
|
889
|
+
}
|
890
|
+
|
891
|
+
// Now clean up the server instance directory.
|
892
|
+
delete generation.get();
|
893
|
+
delete serverInstanceDir.get();
|
894
|
+
|
895
|
+
_exit(0);
|
896
|
+
|
897
|
+
} else if (pid == -1) {
|
898
|
+
// Error
|
899
|
+
e = errno;
|
900
|
+
throw SystemException("fork() failed", errno);
|
901
|
+
|
902
|
+
} else {
|
903
|
+
// Parent
|
904
|
+
|
905
|
+
// Let child process handle cleanup.
|
906
|
+
serverInstanceDir->detach();
|
907
|
+
generation->detach();
|
908
|
+
}
|
909
|
+
}
|
910
|
+
|
911
|
+
static void
|
912
|
+
forceAllAgentsShutdown(vector<AgentWatcher *> &watchers) {
|
913
|
+
vector<AgentWatcher *>::iterator it;
|
914
|
+
|
915
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
916
|
+
(*it)->forceShutdown();
|
917
|
+
}
|
918
|
+
}
|
919
|
+
|
920
|
+
int
|
921
|
+
main(int argc, char *argv[]) {
|
922
|
+
/* Become the session leader so that Apache can't kill this
|
923
|
+
* watchdog with killpg() during shutdown, and so that a
|
924
|
+
* Ctrl-C only affects the web server.
|
925
|
+
*/
|
926
|
+
setsid();
|
927
|
+
disableOomKiller();
|
928
|
+
|
929
|
+
agentsOptions = initializeAgent(argc, argv, "PassengerWatchdog");
|
930
|
+
logLevel = agentsOptions.getInt("log_level");
|
931
|
+
webServerPid = agentsOptions.getPid("web_server_pid");
|
932
|
+
tempDir = agentsOptions.get("temp_dir");
|
933
|
+
userSwitching = agentsOptions.getBool("user_switching");
|
934
|
+
defaultUser = agentsOptions.get("default_user");
|
935
|
+
defaultGroup = agentsOptions.get("default_group");
|
936
|
+
webServerWorkerUid = agentsOptions.getUid("web_server_worker_uid");
|
937
|
+
webServerWorkerGid = agentsOptions.getGid("web_server_worker_gid");
|
938
|
+
passengerRoot = agentsOptions.get("passenger_root");
|
939
|
+
rubyCommand = agentsOptions.get("ruby");
|
940
|
+
maxPoolSize = agentsOptions.getInt("max_pool_size");
|
941
|
+
maxInstancesPerApp = agentsOptions.getInt("max_instances_per_app");
|
942
|
+
poolIdleTime = agentsOptions.getInt("pool_idle_time");
|
943
|
+
serializedPrestartURLs = agentsOptions.get("prestart_urls");
|
944
|
+
|
945
|
+
try {
|
946
|
+
randomGenerator = new RandomGenerator();
|
947
|
+
errorEvent = new EventFd();
|
948
|
+
|
949
|
+
MessageChannel feedbackChannel(FEEDBACK_FD);
|
950
|
+
serverInstanceDir.reset(new ServerInstanceDir(webServerPid, tempDir));
|
951
|
+
generation = serverInstanceDir->newGeneration(userSwitching, defaultUser,
|
952
|
+
defaultGroup, webServerWorkerUid, webServerWorkerGid);
|
953
|
+
agentsOptions.set("server_instance_dir", serverInstanceDir->getPath());
|
954
|
+
agentsOptions.setInt("generation_number", generation->getNumber());
|
955
|
+
|
956
|
+
ServerInstanceDirToucher serverInstanceDirToucher;
|
957
|
+
ResourceLocator resourceLocator(passengerRoot);
|
958
|
+
if (agentsOptions.get("analytics_server", false).empty()) {
|
959
|
+
// Using local, server instance specific logging agent.
|
960
|
+
loggingAgentAddress = "unix:" + generation->getPath() + "/logging.socket";
|
961
|
+
loggingAgentPassword = randomGenerator->generateAsciiString(64);
|
962
|
+
} else {
|
963
|
+
// Using remote logging agent.
|
964
|
+
loggingAgentAddress = agentsOptions.get("analytics_server");
|
965
|
+
}
|
966
|
+
|
967
|
+
HelperAgentWatcher helperAgentWatcher(resourceLocator);
|
968
|
+
LoggingAgentWatcher loggingAgentWatcher(resourceLocator);
|
969
|
+
|
970
|
+
vector<AgentWatcher *> watchers;
|
971
|
+
vector<AgentWatcher *>::iterator it;
|
972
|
+
watchers.push_back(&helperAgentWatcher);
|
973
|
+
if (agentsOptions.get("analytics_server", false).empty()) {
|
974
|
+
watchers.push_back(&loggingAgentWatcher);
|
975
|
+
}
|
976
|
+
|
977
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
978
|
+
try {
|
979
|
+
(*it)->start();
|
980
|
+
} catch (const std::exception &e) {
|
981
|
+
feedbackChannel.write("Watchdog startup error",
|
982
|
+
e.what(), NULL);
|
983
|
+
forceAllAgentsShutdown(watchers);
|
984
|
+
return 1;
|
985
|
+
}
|
986
|
+
// Allow other exceptions to propagate and crash the watchdog.
|
987
|
+
}
|
988
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
989
|
+
try {
|
990
|
+
(*it)->startWatching();
|
991
|
+
} catch (const std::exception &e) {
|
992
|
+
feedbackChannel.write("Watchdog startup error",
|
993
|
+
e.what(), NULL);
|
994
|
+
forceAllAgentsShutdown(watchers);
|
995
|
+
return 1;
|
996
|
+
}
|
997
|
+
// Allow other exceptions to propagate and crash the watchdog.
|
998
|
+
}
|
999
|
+
|
1000
|
+
feedbackChannel.write("Basic startup info",
|
1001
|
+
serverInstanceDir->getPath().c_str(),
|
1002
|
+
toString(generation->getNumber()).c_str(),
|
1003
|
+
NULL);
|
1004
|
+
|
1005
|
+
for (it = watchers.begin(); it != watchers.end(); it++) {
|
1006
|
+
(*it)->sendStartupInfo(feedbackChannel);
|
1007
|
+
}
|
1008
|
+
|
1009
|
+
feedbackChannel.write("All agents started", NULL);
|
1010
|
+
|
1011
|
+
this_thread::disable_interruption di;
|
1012
|
+
this_thread::disable_syscall_interruption dsi;
|
1013
|
+
bool exitGracefully = waitForStarterProcessOrWatchers(watchers);
|
1014
|
+
AgentWatcher::stopWatching(watchers);
|
1015
|
+
if (exitGracefully) {
|
1016
|
+
/* Fork a child process which cleans up all the agent processes in
|
1017
|
+
* the background and exit this watchdog process so that we don't block
|
1018
|
+
* the web server.
|
1019
|
+
*/
|
1020
|
+
cleanupAgentsInBackground(watchers);
|
1021
|
+
return 0;
|
1022
|
+
} else {
|
1023
|
+
P_DEBUG("Web server did not exit gracefully, forcing shutdown of all service processes...");
|
1024
|
+
forceAllAgentsShutdown(watchers);
|
1025
|
+
return 1;
|
1026
|
+
}
|
1027
|
+
} catch (const tracable_exception &e) {
|
1028
|
+
P_ERROR(e.what() << "\n" << e.backtrace());
|
1029
|
+
return 1;
|
1030
|
+
} catch (const std::exception &e) {
|
1031
|
+
P_ERROR(e.what());
|
1032
|
+
return 1;
|
1033
|
+
}
|
1034
|
+
}
|