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
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c)
|
3
|
+
* Copyright (c) 2010 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -30,8 +30,9 @@
|
|
30
30
|
#include <cstring>
|
31
31
|
#include <unistd.h>
|
32
32
|
#include <errno.h>
|
33
|
-
#include <
|
33
|
+
#include <limits.h>
|
34
34
|
#include <pwd.h>
|
35
|
+
#include <grp.h>
|
35
36
|
|
36
37
|
#include <set>
|
37
38
|
#include <vector>
|
@@ -45,85 +46,56 @@
|
|
45
46
|
#include "ScgiRequestParser.h"
|
46
47
|
#include "HttpStatusExtractor.h"
|
47
48
|
|
48
|
-
#include "
|
49
|
-
#include "
|
50
|
-
#include "
|
49
|
+
#include "AgentBase.h"
|
50
|
+
#include "HelperAgent/BacktracesServer.h"
|
51
|
+
#include "Constants.h"
|
52
|
+
#include "ApplicationPool/Pool.h"
|
53
|
+
#include "ApplicationPool/Server.h"
|
54
|
+
#include "Session.h"
|
51
55
|
#include "PoolOptions.h"
|
56
|
+
#include "MessageServer.h"
|
57
|
+
#include "FileDescriptor.h"
|
58
|
+
#include "ResourceLocator.h"
|
59
|
+
#include "ServerInstanceDir.h"
|
52
60
|
#include "Exceptions.h"
|
53
61
|
#include "Utils.h"
|
62
|
+
#include "Utils/Timer.h"
|
54
63
|
|
55
64
|
using namespace boost;
|
56
65
|
using namespace oxt;
|
57
66
|
using namespace Passenger;
|
58
67
|
|
59
|
-
#define
|
68
|
+
#define REQUEST_SOCKET_PASSWORD_SIZE 64
|
60
69
|
|
70
|
+
struct ClientDisconnectedException { };
|
61
71
|
|
62
|
-
|
63
|
-
* Wrapper class around a file descriptor integer, for RAII behavior.
|
64
|
-
*
|
65
|
-
* A FileDescriptor object behaves just like an int, so that you can pass it to
|
66
|
-
* system calls such as read(). It performs reference counting. When the last
|
67
|
-
* copy of a FileDescriptor has been destroyed, the underlying file descriptor
|
68
|
-
* will be automatically closed.
|
69
|
-
*/
|
70
|
-
class FileDescriptor {
|
72
|
+
class ExitHandler: public MessageServer::Handler {
|
71
73
|
private:
|
72
|
-
|
73
|
-
int fd;
|
74
|
-
|
75
|
-
/**
|
76
|
-
* Constructor to assign this file descriptor's handle.
|
77
|
-
*/
|
78
|
-
SharedData(int fd) {
|
79
|
-
this->fd = fd;
|
80
|
-
}
|
81
|
-
|
82
|
-
/**
|
83
|
-
* Attempts to close this file descriptor. When created on the stack,
|
84
|
-
* this destructor will automatically be invoked as a result of C++
|
85
|
-
* semantics when exiting the scope this object was created in. This
|
86
|
-
* ensures that stack created objects with destructors like these will
|
87
|
-
* de-allocate their resources upon leaving their corresponding scope.
|
88
|
-
* This pattern is also known Resource Acquisition Is Initialization (RAII).
|
89
|
-
*
|
90
|
-
* @throws SystemException File descriptor could not be closed.
|
91
|
-
*/
|
92
|
-
~SharedData() {
|
93
|
-
if (syscalls::close(fd) == -1) {
|
94
|
-
throw SystemException("Cannot close file descriptor", errno);
|
95
|
-
}
|
96
|
-
}
|
97
|
-
};
|
98
|
-
|
99
|
-
/* Shared pointer for reference counting on this file descriptor */
|
100
|
-
shared_ptr<SharedData> data;
|
74
|
+
EventFd &exitEvent;
|
101
75
|
|
102
76
|
public:
|
103
|
-
|
104
|
-
|
105
|
-
}
|
77
|
+
ExitHandler(EventFd &_exitEvent)
|
78
|
+
: exitEvent(_exitEvent)
|
79
|
+
{ }
|
106
80
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
81
|
+
virtual bool processMessage(MessageServer::CommonClientContext &commonContext,
|
82
|
+
MessageServer::ClientContextPtr &handlerSpecificContext,
|
83
|
+
const vector<string> &args)
|
84
|
+
{
|
85
|
+
if (args[0] == "exit") {
|
86
|
+
TRACE_POINT();
|
87
|
+
commonContext.requireRights(Account::EXIT);
|
88
|
+
UPDATE_TRACE_POINT();
|
89
|
+
exitEvent.notify();
|
90
|
+
UPDATE_TRACE_POINT();
|
91
|
+
commonContext.channel.write("exit command received", NULL);
|
92
|
+
return true;
|
93
|
+
} else {
|
94
|
+
return false;
|
95
|
+
}
|
122
96
|
}
|
123
97
|
};
|
124
98
|
|
125
|
-
struct ClientDisconnectedException { };
|
126
|
-
|
127
99
|
/**
|
128
100
|
* A representation of a Client from the Server's point of view. This class
|
129
101
|
* contains the methods used to communicate from a server to a connected
|
@@ -138,37 +110,46 @@ struct ClientDisconnectedException { };
|
|
138
110
|
*/
|
139
111
|
class Client {
|
140
112
|
private:
|
113
|
+
/** Maximum allowed size of SCGI headers. */
|
114
|
+
static const unsigned int MAX_HEADER_SIZE = 1024 * 128;
|
141
115
|
/** The client thread stack size in bytes. */
|
142
116
|
static const int CLIENT_THREAD_STACK_SIZE =
|
117
|
+
// Give a small amount of normal stack space
|
143
118
|
#ifdef __FreeBSD__
|
144
119
|
// localtime() on FreeBSD needs some more stack space.
|
145
|
-
1024 * 96
|
120
|
+
1024 * 96
|
146
121
|
#else
|
147
|
-
1024 * 64
|
122
|
+
1024 * 64
|
148
123
|
#endif
|
124
|
+
// and some more stack space for storing the session header.
|
125
|
+
+ MAX_HEADER_SIZE + 1024;
|
149
126
|
|
150
127
|
/** The client number for this Client object, assigned by Server. */
|
151
128
|
unsigned int number;
|
152
129
|
|
153
130
|
/** The application pool to which this Client object belongs to. */
|
154
|
-
|
131
|
+
ApplicationPool::Ptr pool;
|
155
132
|
|
156
133
|
/** This client's password. */
|
157
134
|
string password;
|
158
135
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
/** The user that spawned processes should run as, if initial attempt
|
163
|
-
* at privilege lowering failed. */
|
164
|
-
string lowestUser;
|
136
|
+
string defaultUser;
|
137
|
+
string defaultGroup;
|
165
138
|
|
166
139
|
/** The server socket file descriptor. */
|
167
140
|
int serverSocket;
|
168
141
|
|
142
|
+
/** The analytics logger to use. */
|
143
|
+
AnalyticsLoggerPtr analyticsLogger;
|
144
|
+
|
169
145
|
/** This client's thread. */
|
170
146
|
oxt::thread *thr;
|
171
147
|
|
148
|
+
/** A timer for measuring how long this worker thread has been doing
|
149
|
+
* nothing (i.e. waiting for a connection).
|
150
|
+
*/
|
151
|
+
Timer inactivityTimer;
|
152
|
+
|
172
153
|
/**
|
173
154
|
* Attempts to accept a connection made by the client.
|
174
155
|
*
|
@@ -191,7 +172,7 @@ private:
|
|
191
172
|
|
192
173
|
/**
|
193
174
|
* Reads and checks the password of a client message channel identified by the given file descriptor.
|
194
|
-
* The
|
175
|
+
* The HelperAgent makes extensive use of Unix Sockets that would normally allow other processes to
|
195
176
|
* connect to it as well. In our case, we just want to limit this to Nginx and it is for this reason
|
196
177
|
* that we've secured communication channels between this server and its clients with passwords.
|
197
178
|
* This method indicates whether or not the password of this client channel matches the one known to
|
@@ -205,7 +186,7 @@ private:
|
|
205
186
|
bool readAndCheckPassword(FileDescriptor &fd) {
|
206
187
|
TRACE_POINT();
|
207
188
|
MessageChannel channel(fd);
|
208
|
-
char buf[
|
189
|
+
char buf[REQUEST_SOCKET_PASSWORD_SIZE];
|
209
190
|
|
210
191
|
if (channel.readRaw(buf, sizeof(buf))) {
|
211
192
|
const char *password_data;
|
@@ -247,7 +228,13 @@ private:
|
|
247
228
|
} while (parser.acceptingInput());
|
248
229
|
|
249
230
|
if (parser.getState() != ScgiRequestParser::DONE) {
|
250
|
-
|
231
|
+
if (parser.getState() == ScgiRequestParser::ERROR
|
232
|
+
&& parser.getErrorReason() == ScgiRequestParser::LIMIT_REACHED) {
|
233
|
+
P_ERROR("SCGI header too large.");
|
234
|
+
} else {
|
235
|
+
P_ERROR("Invalid SCGI header received: " <<
|
236
|
+
cEscapeString(parser.getHeaderData()));
|
237
|
+
}
|
251
238
|
return false;
|
252
239
|
} else if (!parser.hasHeader("DOCUMENT_ROOT")) {
|
253
240
|
P_ERROR("DOCUMENT_ROOT header is missing.");
|
@@ -273,7 +260,7 @@ private:
|
|
273
260
|
* @throws SystemException Request body could not be read from the specified
|
274
261
|
* <tt>clientFd</tt>.
|
275
262
|
*/
|
276
|
-
void sendRequestBody(
|
263
|
+
void sendRequestBody(SessionPtr &session,
|
277
264
|
FileDescriptor &clientFd,
|
278
265
|
const string &partialRequestBody,
|
279
266
|
unsigned long contentLength) {
|
@@ -326,7 +313,7 @@ private:
|
|
326
313
|
* before we were able to send back the
|
327
314
|
* full response.
|
328
315
|
*/
|
329
|
-
void forwardResponse(
|
316
|
+
void forwardResponse(SessionPtr &session, FileDescriptor &clientFd) {
|
330
317
|
TRACE_POINT();
|
331
318
|
HttpStatusExtractor ex;
|
332
319
|
int stream = session->getStream();
|
@@ -402,25 +389,34 @@ private:
|
|
402
389
|
* spawn exception <tt>e</tt> to.
|
403
390
|
* @param e The spawn exception to be written to the given <tt>fd</tt>'s message
|
404
391
|
* channel.
|
392
|
+
* @param friendly Whether to show a friendly error page.
|
405
393
|
*/
|
406
|
-
void handleSpawnException(FileDescriptor &fd, const SpawnException &e) {
|
394
|
+
void handleSpawnException(FileDescriptor &fd, const SpawnException &e, bool friendly) {
|
407
395
|
MessageChannel channel(fd);
|
408
396
|
channel.writeRaw("HTTP/1.1 500 Internal Server Error\x0D\x0A");
|
409
397
|
channel.writeRaw("Status: 500 Internal Server Error\x0D\x0A");
|
410
398
|
channel.writeRaw("Connection: close\x0D\x0A");
|
411
399
|
channel.writeRaw("Content-Type: text/html; charset=utf-8\x0D\x0A");
|
412
400
|
|
413
|
-
if (
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
401
|
+
if (friendly) {
|
402
|
+
if (e.hasErrorPage()) {
|
403
|
+
channel.writeRaw("Content-Length: " +
|
404
|
+
toString(e.getErrorPage().size()) +
|
405
|
+
"\x0D\x0A");
|
406
|
+
channel.writeRaw("\x0D\x0A");
|
407
|
+
channel.writeRaw(e.getErrorPage());
|
408
|
+
} else {
|
409
|
+
channel.writeRaw("Content-Length: " +
|
410
|
+
toString(strlen(e.what())) + "\x0D\x0A");
|
411
|
+
channel.writeRaw("\x0D\x0A");
|
412
|
+
channel.writeRaw(e.what());
|
413
|
+
}
|
419
414
|
} else {
|
415
|
+
const char body[] = "<h1>Internal Server Error (500)</h1>";
|
420
416
|
channel.writeRaw("Content-Length: " +
|
421
|
-
toString(strlen(
|
417
|
+
toString(strlen(body)) + "\x0D\x0A");
|
422
418
|
channel.writeRaw("\x0D\x0A");
|
423
|
-
channel.writeRaw(
|
419
|
+
channel.writeRaw(body);
|
424
420
|
}
|
425
421
|
}
|
426
422
|
|
@@ -431,9 +427,8 @@ private:
|
|
431
427
|
*/
|
432
428
|
void handleRequest(FileDescriptor &clientFd) {
|
433
429
|
TRACE_POINT();
|
434
|
-
ScgiRequestParser parser;
|
430
|
+
ScgiRequestParser parser(MAX_HEADER_SIZE);
|
435
431
|
string partialRequestBody;
|
436
|
-
unsigned long contentLength;
|
437
432
|
|
438
433
|
if (!readAndCheckPassword(clientFd)) {
|
439
434
|
P_ERROR("Client did not send a correct password.");
|
@@ -444,57 +439,147 @@ private:
|
|
444
439
|
}
|
445
440
|
|
446
441
|
try {
|
442
|
+
bool enableAnalytics = parser.getHeader("PASSENGER_ANALYTICS") == "true";
|
443
|
+
StaticString appGroupName = parser.getHeader("PASSENGER_APP_GROUP_NAME");
|
447
444
|
PoolOptions options;
|
445
|
+
|
448
446
|
if (parser.getHeader("SCRIPT_NAME").empty()) {
|
449
447
|
options.appRoot = extractDirName(parser.getHeader("DOCUMENT_ROOT"));
|
450
448
|
} else {
|
451
449
|
options.appRoot = extractDirName(resolveSymlink(parser.getHeader("DOCUMENT_ROOT")));
|
452
450
|
options.baseURI = parser.getHeader("SCRIPT_NAME");
|
453
451
|
}
|
452
|
+
if (appGroupName.empty()) {
|
453
|
+
options.appGroupName = options.appRoot;
|
454
|
+
} else {
|
455
|
+
options.appGroupName = appGroupName;
|
456
|
+
}
|
454
457
|
options.useGlobalQueue = parser.getHeader("PASSENGER_USE_GLOBAL_QUEUE") == "true";
|
455
458
|
options.environment = parser.getHeader("PASSENGER_ENVIRONMENT");
|
456
459
|
options.spawnMethod = parser.getHeader("PASSENGER_SPAWN_METHOD");
|
457
|
-
options.
|
458
|
-
options.
|
460
|
+
options.user = parser.getHeader("PASSENGER_USER");
|
461
|
+
options.group = parser.getHeader("PASSENGER_GROUP");
|
462
|
+
options.defaultUser = defaultUser;
|
463
|
+
options.defaultGroup = defaultGroup;
|
459
464
|
options.appType = parser.getHeader("PASSENGER_APP_TYPE");
|
465
|
+
options.rights = Account::parseRightsString(
|
466
|
+
parser.getHeader("PASSENGER_APP_RIGHTS"),
|
467
|
+
DEFAULT_BACKEND_ACCOUNT_RIGHTS);
|
468
|
+
options.minProcesses = atol(parser.getHeader("PASSENGER_MIN_INSTANCES"));
|
460
469
|
options.frameworkSpawnerTimeout = atol(parser.getHeader("PASSENGER_FRAMEWORK_SPAWNER_IDLE_TIME"));
|
461
470
|
options.appSpawnerTimeout = atol(parser.getHeader("PASSENGER_APP_SPAWNER_IDLE_TIME"));
|
471
|
+
options.debugger = parser.getHeader("PASSENGER_DEBUGGER") == "true";
|
472
|
+
options.showVersionInHeader = parser.getHeader("PASSENGER_SHOW_VERSION_IN_HEADER") == "true";
|
462
473
|
|
463
|
-
|
464
|
-
|
474
|
+
UPDATE_TRACE_POINT();
|
475
|
+
AnalyticsLogPtr log;
|
476
|
+
if (enableAnalytics) {
|
477
|
+
log = analyticsLogger->newTransaction(
|
478
|
+
options.getAppGroupName(),
|
479
|
+
"requests",
|
480
|
+
parser.getHeader("PASSENGER_UNION_STATION_KEY"));
|
481
|
+
options.analytics = true;
|
482
|
+
options.log = log;
|
483
|
+
} else {
|
484
|
+
log.reset(new AnalyticsLog());
|
485
|
+
}
|
465
486
|
|
466
|
-
|
467
|
-
|
468
|
-
parser.getHeaderData().size());
|
487
|
+
AnalyticsScopeLog requestProcessingScope(log, "request processing");
|
488
|
+
log->message("URI: " + parser.getHeader("REQUEST_URI"));
|
469
489
|
|
470
|
-
|
471
|
-
|
472
|
-
sendRequestBody(session,
|
473
|
-
clientFd,
|
474
|
-
partialRequestBody,
|
475
|
-
contentLength);
|
490
|
+
/***********************/
|
491
|
+
/***********************/
|
476
492
|
|
477
|
-
|
493
|
+
try {
|
494
|
+
SessionPtr session;
|
495
|
+
|
496
|
+
{
|
497
|
+
AnalyticsScopeLog scope(log, "get from pool");
|
498
|
+
session = pool->get(options);
|
499
|
+
scope.success();
|
500
|
+
log->message("Application PID: " + toString(session->getPid()) +
|
501
|
+
" (GUPID: " + session->getGupid() + ")");
|
502
|
+
}
|
503
|
+
|
504
|
+
UPDATE_TRACE_POINT();
|
505
|
+
AnalyticsScopeLog requestProxyingScope(log, "request proxying");
|
506
|
+
|
507
|
+
char headers[parser.getHeaderData().size() +
|
508
|
+
sizeof("PASSENGER_CONNECT_PASSWORD") +
|
509
|
+
session->getConnectPassword().size() + 1 +
|
510
|
+
sizeof("PASSENGER_GROUP_NAME") +
|
511
|
+
options.getAppGroupName().size() + 1 +
|
512
|
+
sizeof("PASSENGER_TXN_ID") +
|
513
|
+
log->getTxnId().size() + 1];
|
514
|
+
char *end = headers;
|
515
|
+
|
516
|
+
memcpy(end, parser.getHeaderData().c_str(), parser.getHeaderData().size());
|
517
|
+
end += parser.getHeaderData().size();
|
518
|
+
|
519
|
+
memcpy(end, "PASSENGER_CONNECT_PASSWORD", sizeof("PASSENGER_CONNECT_PASSWORD"));
|
520
|
+
end += sizeof("PASSENGER_CONNECT_PASSWORD");
|
521
|
+
|
522
|
+
memcpy(end, session->getConnectPassword().c_str(),
|
523
|
+
session->getConnectPassword().size() + 1);
|
524
|
+
end += session->getConnectPassword().size() + 1;
|
525
|
+
|
526
|
+
if (enableAnalytics) {
|
527
|
+
memcpy(end, "PASSENGER_GROUP_NAME", sizeof("PASSENGER_GROUP_NAME"));
|
528
|
+
end += sizeof("PASSENGER_GROUP_NAME");
|
529
|
+
|
530
|
+
memcpy(end, options.getAppGroupName().c_str(),
|
531
|
+
options.getAppGroupName().size() + 1);
|
532
|
+
end += options.getAppGroupName().size() + 1;
|
533
|
+
|
534
|
+
memcpy(end, "PASSENGER_TXN_ID", sizeof("PASSENGER_TXN_ID"));
|
535
|
+
end += sizeof("PASSENGER_TXN_ID");
|
536
|
+
|
537
|
+
memcpy(end, log->getTxnId().c_str(),
|
538
|
+
log->getTxnId().size() + 1);
|
539
|
+
end += log->getTxnId().size() + 1;
|
540
|
+
}
|
541
|
+
|
542
|
+
{
|
543
|
+
AnalyticsScopeLog scope(log, "send request headers");
|
544
|
+
session->sendHeaders(headers, end - headers);
|
545
|
+
scope.success();
|
546
|
+
}
|
547
|
+
{
|
548
|
+
AnalyticsScopeLog scope(log, "send request body");
|
549
|
+
unsigned long contentLength = atol(
|
550
|
+
parser.getHeader("CONTENT_LENGTH").c_str());
|
551
|
+
sendRequestBody(session,
|
552
|
+
clientFd,
|
553
|
+
partialRequestBody,
|
554
|
+
contentLength);
|
555
|
+
session->shutdownWriter();
|
556
|
+
scope.success();
|
557
|
+
}
|
558
|
+
|
478
559
|
forwardResponse(session, clientFd);
|
560
|
+
|
561
|
+
requestProxyingScope.success();
|
479
562
|
} catch (const SpawnException &e) {
|
480
|
-
handleSpawnException(clientFd, e
|
563
|
+
handleSpawnException(clientFd, e,
|
564
|
+
parser.getHeader("PASSENGER_FRIENDLY_ERROR_PAGES") == "true");
|
481
565
|
} catch (const ClientDisconnectedException &) {
|
482
566
|
P_WARN("Couldn't forward the HTTP response back to the HTTP client: "
|
483
567
|
"It seems the user clicked on the 'Stop' button in his "
|
484
568
|
"browser.");
|
485
569
|
}
|
570
|
+
|
571
|
+
requestProcessingScope.success();
|
572
|
+
clientFd.close();
|
486
573
|
} catch (const boost::thread_interrupted &) {
|
487
574
|
throw;
|
488
575
|
} catch (const tracable_exception &e) {
|
489
576
|
P_ERROR("Uncaught exception in PassengerServer client thread:\n"
|
490
577
|
<< " exception: " << e.what() << "\n"
|
491
578
|
<< " backtrace:\n" << e.backtrace());
|
492
|
-
} catch (const exception &e) {
|
579
|
+
} catch (const std::exception &e) {
|
493
580
|
P_ERROR("Uncaught exception in PassengerServer client thread:\n"
|
494
581
|
<< " exception: " << e.what() << "\n"
|
495
582
|
<< " backtrace: not available");
|
496
|
-
} catch (...) {
|
497
|
-
P_ERROR("Uncaught unknown exception in PassengerServer client thread.");
|
498
583
|
}
|
499
584
|
}
|
500
585
|
|
@@ -510,7 +595,9 @@ private:
|
|
510
595
|
try {
|
511
596
|
while (true) {
|
512
597
|
UPDATE_TRACE_POINT();
|
598
|
+
inactivityTimer.start();
|
513
599
|
FileDescriptor fd(acceptConnection());
|
600
|
+
inactivityTimer.stop();
|
514
601
|
handleRequest(fd);
|
515
602
|
}
|
516
603
|
} catch (const boost::thread_interrupted &) {
|
@@ -520,14 +607,10 @@ private:
|
|
520
607
|
<< " exception: " << e.what() << "\n"
|
521
608
|
<< " backtrace:\n" << e.backtrace());
|
522
609
|
abort();
|
523
|
-
} catch (const exception &e) {
|
610
|
+
} catch (const std::exception &e) {
|
524
611
|
P_ERROR("Uncaught exception in PassengerServer client thread:\n"
|
525
612
|
<< " exception: " << e.what() << "\n"
|
526
613
|
<< " backtrace: not available");
|
527
|
-
abort();
|
528
|
-
} catch (...) {
|
529
|
-
P_ERROR("Uncaught unknown exception in PassengerServer client thread.");
|
530
|
-
throw;
|
531
614
|
}
|
532
615
|
}
|
533
616
|
|
@@ -540,20 +623,21 @@ public:
|
|
540
623
|
* @param pool The application pool where this client belongs to.
|
541
624
|
* @param password The password that is required to connect to this client handler.
|
542
625
|
* This value is determined and assigned by the server.
|
543
|
-
* @param lowerPrivilege Whether privilege lowering should be used.
|
544
|
-
* @param lowestUser The user that spawned processes should run as, if
|
545
|
-
* initial attempt at privilege lowering failed.
|
546
626
|
* @param serverSocket The server socket to accept this clients connection from.
|
547
627
|
*/
|
548
|
-
Client(unsigned int number,
|
549
|
-
const string &password,
|
550
|
-
const string &
|
628
|
+
Client(unsigned int number, ApplicationPool::Ptr pool,
|
629
|
+
const string &password, const string &defaultUser,
|
630
|
+
const string &defaultGroup, int serverSocket,
|
631
|
+
const AnalyticsLoggerPtr &logger)
|
632
|
+
: inactivityTimer(false)
|
633
|
+
{
|
551
634
|
this->number = number;
|
552
635
|
this->pool = pool;
|
553
636
|
this->password = password;
|
554
|
-
this->
|
555
|
-
this->
|
637
|
+
this->defaultUser = defaultUser;
|
638
|
+
this->defaultGroup = defaultGroup;
|
556
639
|
this->serverSocket = serverSocket;
|
640
|
+
this->analyticsLogger = logger;
|
557
641
|
thr = new oxt::thread(
|
558
642
|
bind(&Client::threadMain, this),
|
559
643
|
"Client thread " + toString(number),
|
@@ -569,9 +653,23 @@ public:
|
|
569
653
|
this_thread::disable_syscall_interruption dsi;
|
570
654
|
this_thread::disable_interruption di;
|
571
655
|
|
572
|
-
thr->
|
656
|
+
if (thr->joinable()) {
|
657
|
+
thr->interrupt_and_join();
|
658
|
+
}
|
573
659
|
delete thr;
|
574
660
|
}
|
661
|
+
|
662
|
+
oxt::thread *getThread() const {
|
663
|
+
return thr;
|
664
|
+
}
|
665
|
+
|
666
|
+
unsigned long long inactivityTime() const {
|
667
|
+
return inactivityTimer.elapsed();
|
668
|
+
}
|
669
|
+
|
670
|
+
void resetInactivityTimer() {
|
671
|
+
inactivityTimer.start();
|
672
|
+
}
|
575
673
|
};
|
576
674
|
|
577
675
|
typedef shared_ptr<Client> ClientPtr;
|
@@ -583,33 +681,45 @@ typedef shared_ptr<Client> ClientPtr;
|
|
583
681
|
*/
|
584
682
|
class Server {
|
585
683
|
private:
|
586
|
-
|
587
|
-
|
588
|
-
|
684
|
+
static const int MESSAGE_SERVER_THREAD_STACK_SIZE = 64 * 128;
|
685
|
+
|
686
|
+
FileDescriptor feedbackFd;
|
589
687
|
bool userSwitching;
|
590
688
|
string defaultUser;
|
689
|
+
string defaultGroup;
|
591
690
|
unsigned int numberOfThreads;
|
691
|
+
FileDescriptor requestSocket;
|
692
|
+
string requestSocketPassword;
|
693
|
+
MessageChannel feedbackChannel;
|
694
|
+
ServerInstanceDir serverInstanceDir;
|
695
|
+
ServerInstanceDir::GenerationPtr generation;
|
592
696
|
set<ClientPtr> clients;
|
593
|
-
|
594
|
-
|
697
|
+
AnalyticsLoggerPtr analyticsLogger;
|
698
|
+
ApplicationPool::Ptr pool;
|
699
|
+
AccountsDatabasePtr accountsDatabase;
|
700
|
+
MessageServerPtr messageServer;
|
701
|
+
ResourceLocator resourceLocator;
|
702
|
+
shared_ptr<oxt::thread> prestarterThread;
|
703
|
+
shared_ptr<oxt::thread> messageServerThread;
|
704
|
+
EventFd exitEvent;
|
705
|
+
|
706
|
+
string getRequestSocketFilename() const {
|
707
|
+
return generation->getPath() + "/request.socket";
|
708
|
+
}
|
595
709
|
|
596
710
|
/**
|
597
|
-
* Starts listening for client connections
|
598
|
-
* This server will first attempt to create an unconnected Unix socket on which it will
|
599
|
-
* attempt to bind on. Once it is bound, it will start listening for incoming client
|
600
|
-
* activity.
|
711
|
+
* Starts listening for client connections on this server's request socket.
|
601
712
|
*
|
602
713
|
* @throws SystemException Something went wrong while trying to create and bind to the Unix socket.
|
603
714
|
* @throws RuntimeException Something went wrong.
|
604
715
|
*/
|
605
716
|
void startListening() {
|
606
717
|
this_thread::disable_syscall_interruption dsi;
|
607
|
-
|
608
|
-
serverSocket = createUnixServer(socketName.c_str());
|
718
|
+
requestSocket = createUnixServer(getRequestSocketFilename().c_str());
|
609
719
|
|
610
720
|
int ret;
|
611
721
|
do {
|
612
|
-
ret = chmod(
|
722
|
+
ret = chmod(getRequestSocketFilename().c_str(), S_ISVTX |
|
613
723
|
S_IRUSR | S_IWUSR | S_IXUSR |
|
614
724
|
S_IRGRP | S_IWGRP | S_IXGRP |
|
615
725
|
S_IROTH | S_IWOTH | S_IXOTH);
|
@@ -624,183 +734,217 @@ private:
|
|
624
734
|
*/
|
625
735
|
void startClientHandlerThreads() {
|
626
736
|
for (unsigned int i = 0; i < numberOfThreads; i++) {
|
627
|
-
ClientPtr client(new Client(i + 1, pool,
|
628
|
-
|
737
|
+
ClientPtr client(new Client(i + 1, pool, requestSocketPassword,
|
738
|
+
defaultUser, defaultGroup, requestSocket,
|
739
|
+
analyticsLogger));
|
629
740
|
clients.insert(client);
|
630
741
|
}
|
631
742
|
}
|
632
743
|
|
633
744
|
/**
|
634
|
-
* Lowers this process's privilege to that of <em>username</em>.
|
745
|
+
* Lowers this process's privilege to that of <em>username</em> and <em>groupname</em>.
|
635
746
|
*/
|
636
|
-
void lowerPrivilege(const string &username) {
|
637
|
-
struct passwd *
|
747
|
+
void lowerPrivilege(const string &username, const string &groupname) {
|
748
|
+
struct passwd *userEntry;
|
749
|
+
struct group *groupEntry;
|
750
|
+
int e;
|
638
751
|
|
639
|
-
|
640
|
-
if (
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
int e = errno;
|
650
|
-
P_WARN("WARNING: Unable to lower Passenger HelperServer's "
|
651
|
-
"privilege to that of user '" << username <<
|
652
|
-
"': cannot set group ID: " << strerror(e) <<
|
653
|
-
" (" << e << ")");
|
654
|
-
}
|
655
|
-
if (setuid(entry->pw_uid) != 0) {
|
656
|
-
int e = errno;
|
657
|
-
P_WARN("WARNING: Unable to lower Passenger HelperServer's "
|
658
|
-
"privilege to that of user '" << username <<
|
659
|
-
"': cannot set user ID: " << strerror(e) <<
|
660
|
-
" (" << e << ")");
|
661
|
-
}
|
662
|
-
} else {
|
663
|
-
P_WARN("WARNING: Unable to lower Passenger HelperServer's "
|
664
|
-
"privilege to that of user '" << username <<
|
752
|
+
userEntry = getpwnam(username.c_str());
|
753
|
+
if (userEntry == NULL) {
|
754
|
+
throw NonExistentUserException(string("Unable to lower Passenger "
|
755
|
+
"HelperAgent's privilege to that of user '") + username +
|
756
|
+
"': user does not exist.");
|
757
|
+
}
|
758
|
+
groupEntry = getgrnam(groupname.c_str());
|
759
|
+
if (groupEntry == NULL) {
|
760
|
+
throw NonExistentGroupException(string("Unable to lower Passenger "
|
761
|
+
"HelperAgent's privilege to that of user '") + username +
|
665
762
|
"': user does not exist.");
|
666
763
|
}
|
764
|
+
|
765
|
+
if (initgroups(username.c_str(), userEntry->pw_gid) != 0) {
|
766
|
+
e = errno;
|
767
|
+
throw SystemException(string("Unable to lower Passenger HelperAgent's "
|
768
|
+
"privilege to that of user '") + username +
|
769
|
+
"': cannot set supplementary groups for this user", e);
|
770
|
+
}
|
771
|
+
if (setgid(groupEntry->gr_gid) != 0) {
|
772
|
+
e = errno;
|
773
|
+
throw SystemException(string("Unable to lower Passenger HelperAgent's "
|
774
|
+
"privilege to that of user '") + username +
|
775
|
+
"': cannot set group ID", e);
|
776
|
+
}
|
777
|
+
if (setuid(userEntry->pw_uid) != 0) {
|
778
|
+
e = errno;
|
779
|
+
throw SystemException(string("Unable to lower Passenger HelperAgent's "
|
780
|
+
"privilege to that of user '") + username +
|
781
|
+
"': cannot set user ID", e);
|
782
|
+
}
|
667
783
|
}
|
668
|
-
|
784
|
+
|
785
|
+
void resetWorkerThreadInactivityTimers() {
|
786
|
+
set<ClientPtr>::iterator it;
|
787
|
+
|
788
|
+
for (it = clients.begin(); it != clients.end(); it++) {
|
789
|
+
ClientPtr client = *it;
|
790
|
+
client->resetInactivityTimer();
|
791
|
+
}
|
792
|
+
}
|
793
|
+
|
794
|
+
unsigned long long minWorkerThreadInactivityTime() const {
|
795
|
+
set<ClientPtr>::const_iterator it;
|
796
|
+
unsigned long long result = 0;
|
797
|
+
|
798
|
+
for (it = clients.begin(); it != clients.end(); it++) {
|
799
|
+
ClientPtr client = *it;
|
800
|
+
unsigned long long inactivityTime = client->inactivityTime();
|
801
|
+
if (inactivityTime < result || it == clients.begin()) {
|
802
|
+
result = inactivityTime;
|
803
|
+
}
|
804
|
+
}
|
805
|
+
return result;
|
806
|
+
}
|
807
|
+
|
669
808
|
public:
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
* a single Rails application may occupy.
|
684
|
-
* @param poolIdleTime The maximum number of seconds that an application may be idle before
|
685
|
-
* it gets terminated.
|
686
|
-
* @param userSwitching Whether user switching should be used.
|
687
|
-
* @param defaultUser If user switching is turned on, then this is the
|
688
|
-
* username that a process should lower its privilege to if the
|
689
|
-
* initial attempt at user switching fails. If user switching is off,
|
690
|
-
* then this is the username that HelperServer and all spawned
|
691
|
-
* processes should run as.
|
692
|
-
* @param workerUid The UID of the web server's worker processes. Used for determining
|
693
|
-
* the optimal permissions for some temp files.
|
694
|
-
* @param workerGid The GID of the web server's worker processes. Used for determining
|
695
|
-
* the optimal permissions for some temp files.
|
696
|
-
*/
|
697
|
-
Server(const string &password, const string &rootDir, const string &ruby,
|
698
|
-
int adminPipe, int feedbackPipe, unsigned int maxPoolSize,
|
699
|
-
unsigned int maxInstancesPerApp, unsigned int poolIdleTime,
|
700
|
-
bool userSwitching, const string &defaultUser, uid_t workerUid,
|
701
|
-
gid_t workerGid) {
|
702
|
-
this->password = password;
|
703
|
-
this->adminPipe = adminPipe;
|
809
|
+
Server(FileDescriptor feedbackFd, pid_t webServerPid, const string &tempDir,
|
810
|
+
bool userSwitching, const string &defaultUser, const string &defaultGroup,
|
811
|
+
const string &passengerRoot, const string &rubyCommand, unsigned int generationNumber,
|
812
|
+
unsigned int maxPoolSize, unsigned int maxInstancesPerApp, unsigned int poolIdleTime,
|
813
|
+
const VariantMap &options)
|
814
|
+
: serverInstanceDir(webServerPid, tempDir, false),
|
815
|
+
resourceLocator(passengerRoot)
|
816
|
+
{
|
817
|
+
string messageSocketPassword;
|
818
|
+
string loggingAgentPassword;
|
819
|
+
|
820
|
+
TRACE_POINT();
|
821
|
+
this->feedbackFd = feedbackFd;
|
704
822
|
this->userSwitching = userSwitching;
|
705
823
|
this->defaultUser = defaultUser;
|
824
|
+
this->defaultGroup = defaultGroup;
|
825
|
+
feedbackChannel = MessageChannel(feedbackFd);
|
706
826
|
numberOfThreads = maxPoolSize * 4;
|
707
827
|
|
708
|
-
|
709
|
-
|
710
|
-
|
828
|
+
UPDATE_TRACE_POINT();
|
829
|
+
requestSocketPassword = Base64::decode(options.get("request_socket_password"));
|
830
|
+
messageSocketPassword = Base64::decode(options.get("message_socket_password"));
|
831
|
+
loggingAgentPassword = options.get("logging_agent_password");
|
832
|
+
generation = serverInstanceDir.getGeneration(generationNumber);
|
711
833
|
startListening();
|
834
|
+
accountsDatabase = AccountsDatabase::createDefault(generation,
|
835
|
+
userSwitching, defaultUser, defaultGroup);
|
836
|
+
accountsDatabase->add("_web_server", messageSocketPassword, false, Account::EXIT);
|
837
|
+
messageServer = ptr(new MessageServer(generation->getPath() + "/socket", accountsDatabase));
|
712
838
|
|
713
|
-
if (
|
714
|
-
lowerPrivilege(defaultUser);
|
839
|
+
if (geteuid() == 0 && !userSwitching) {
|
840
|
+
lowerPrivilege(defaultUser, defaultGroup);
|
715
841
|
}
|
716
842
|
|
717
|
-
|
718
|
-
|
719
|
-
"",
|
843
|
+
UPDATE_TRACE_POINT();
|
844
|
+
analyticsLogger = ptr(new AnalyticsLogger(options.get("logging_agent_address"),
|
845
|
+
"logging", loggingAgentPassword));
|
846
|
+
|
847
|
+
pool = ptr(new ApplicationPool::Pool(
|
848
|
+
resourceLocator.getSpawnServerFilename(), generation,
|
849
|
+
accountsDatabase, rubyCommand,
|
850
|
+
analyticsLogger,
|
851
|
+
options.getInt("log_level"),
|
852
|
+
options.get("debug_log_file", false)
|
720
853
|
));
|
721
854
|
pool->setMax(maxPoolSize);
|
722
855
|
pool->setMaxPerApp(maxInstancesPerApp);
|
723
856
|
pool->setMaxIdleTime(poolIdleTime);
|
724
857
|
|
725
|
-
|
726
|
-
|
858
|
+
messageServer->addHandler(ptr(new ApplicationPool::Server(pool)));
|
859
|
+
messageServer->addHandler(ptr(new BacktracesServer()));
|
860
|
+
messageServer->addHandler(ptr(new ExitHandler(exitEvent)));
|
861
|
+
|
862
|
+
UPDATE_TRACE_POINT();
|
863
|
+
feedbackChannel.write("initialized",
|
864
|
+
getRequestSocketFilename().c_str(),
|
865
|
+
messageServer->getSocketFilename().c_str(),
|
866
|
+
NULL);
|
727
867
|
|
728
|
-
|
729
|
-
|
868
|
+
prestarterThread = ptr(new oxt::thread(
|
869
|
+
boost::bind(prestartWebApps, resourceLocator, options.get("prestart_urls"))
|
870
|
+
));
|
730
871
|
}
|
731
872
|
|
732
873
|
~Server() {
|
733
874
|
TRACE_POINT();
|
734
875
|
this_thread::disable_syscall_interruption dsi;
|
735
876
|
this_thread::disable_interruption di;
|
877
|
+
oxt::thread *threads[clients.size()];
|
878
|
+
set<ClientPtr>::iterator it;
|
879
|
+
unsigned int i = 0;
|
736
880
|
|
737
|
-
P_DEBUG("Shutting down helper
|
881
|
+
P_DEBUG("Shutting down helper agent...");
|
882
|
+
prestarterThread->interrupt_and_join();
|
883
|
+
if (messageServerThread != NULL) {
|
884
|
+
messageServerThread->interrupt_and_join();
|
885
|
+
}
|
886
|
+
|
887
|
+
for (it = clients.begin(); it != clients.end(); it++, i++) {
|
888
|
+
ClientPtr client = *it;
|
889
|
+
threads[i] = client->getThread();
|
890
|
+
}
|
891
|
+
oxt::thread::interrupt_and_join_multiple(threads, clients.size());
|
738
892
|
clients.clear();
|
893
|
+
|
739
894
|
P_TRACE(2, "All threads have been shut down.");
|
740
|
-
syscalls::close(serverSocket);
|
741
|
-
syscalls::close(adminPipe);
|
742
895
|
}
|
743
896
|
|
744
|
-
|
745
|
-
* Starts this server by starting the client handlers threads.
|
746
|
-
*
|
747
|
-
* @see startCientHandlerThreads
|
748
|
-
*/
|
749
|
-
void start() {
|
897
|
+
void mainLoop() {
|
750
898
|
TRACE_POINT();
|
751
|
-
char buf;
|
752
899
|
|
753
900
|
startClientHandlerThreads();
|
901
|
+
messageServerThread = ptr(new oxt::thread(
|
902
|
+
boost::bind(&MessageServer::mainLoop, messageServer.get()),
|
903
|
+
"MessageServer thread", MESSAGE_SERVER_THREAD_STACK_SIZE
|
904
|
+
));
|
754
905
|
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
906
|
+
/* Wait until the watchdog closes the feedback fd (meaning it
|
907
|
+
* was killed) or until we receive an exit message.
|
908
|
+
*/
|
909
|
+
this_thread::disable_syscall_interruption dsi;
|
910
|
+
fd_set fds;
|
911
|
+
int largestFd;
|
912
|
+
|
913
|
+
FD_ZERO(&fds);
|
914
|
+
FD_SET(feedbackFd, &fds);
|
915
|
+
FD_SET(exitEvent.fd(), &fds);
|
916
|
+
largestFd = (feedbackFd > exitEvent.fd()) ? (int) feedbackFd : exitEvent.fd();
|
917
|
+
UPDATE_TRACE_POINT();
|
918
|
+
if (syscalls::select(largestFd + 1, &fds, NULL, NULL, NULL) == -1) {
|
919
|
+
int e = errno;
|
920
|
+
throw SystemException("select() failed", e);
|
921
|
+
}
|
922
|
+
|
923
|
+
if (FD_ISSET(feedbackFd, &fds)) {
|
924
|
+
/* If the watchdog has been killed then we'll kill all descendant
|
925
|
+
* processes and exit. There's no point in keeping this helper
|
926
|
+
* server running because we can't detect when the web server exits,
|
927
|
+
* and because this helper agent doesn't own the server instance
|
928
|
+
* directory. As soon as passenger-status is run, the server
|
929
|
+
* instance directory will be cleaned up, making this helper agent
|
930
|
+
* inaccessible.
|
931
|
+
*/
|
932
|
+
syscalls::killpg(getpgrp(), SIGKILL);
|
933
|
+
_exit(2); // In case killpg() fails.
|
934
|
+
} else {
|
935
|
+
/* We received an exit command. We want to exit 5 seconds after
|
936
|
+
* all worker threads have become inactive.
|
937
|
+
*/
|
938
|
+
resetWorkerThreadInactivityTimers();
|
939
|
+
while (minWorkerThreadInactivityTime() < 5000) {
|
940
|
+
syscalls::usleep(250000);
|
941
|
+
}
|
760
942
|
}
|
761
943
|
}
|
762
944
|
};
|
763
945
|
|
764
946
|
/**
|
765
|
-
*
|
766
|
-
* to write to a pipe without a processes connected to the other end. This is used to
|
767
|
-
* prevent Nginx from getting killed by the default signal handler when it attempts to
|
768
|
-
* write the server password to the HelperServer in the situation that the HelperServer
|
769
|
-
* failed to start.
|
770
|
-
*/
|
771
|
-
static void
|
772
|
-
ignoreSigpipe() {
|
773
|
-
struct sigaction action;
|
774
|
-
action.sa_handler = SIG_IGN;
|
775
|
-
action.sa_flags = 0;
|
776
|
-
sigemptyset(&action.sa_mask);
|
777
|
-
sigaction(SIGPIPE, &action, NULL);
|
778
|
-
}
|
779
|
-
|
780
|
-
/**
|
781
|
-
* Extracts and returns the password from the given <tt>adminPipe</tt>. This password is
|
782
|
-
* used to determine which processes may connect with this server's Unix socket, as unix
|
783
|
-
* sockets would normally allow any process to connect to it. In this case, we strictly
|
784
|
-
* want Nginx to be able to connect to it, and it is for this reason that we maintain a
|
785
|
-
* password system.
|
786
|
-
*
|
787
|
-
* @param adminPipe The pipe used to read the password for this server from.
|
788
|
-
* @return The password for this server.
|
789
|
-
*/
|
790
|
-
static string
|
791
|
-
receivePassword(int adminPipe) {
|
792
|
-
TRACE_POINT();
|
793
|
-
MessageChannel channel(adminPipe);
|
794
|
-
char buf[HELPER_SERVER_PASSWORD_SIZE];
|
795
|
-
|
796
|
-
if (!channel.readRaw(buf, HELPER_SERVER_PASSWORD_SIZE)) {
|
797
|
-
throw IOException("Could not read password from the admin pipe.");
|
798
|
-
}
|
799
|
-
return string(buf, HELPER_SERVER_PASSWORD_SIZE);
|
800
|
-
}
|
801
|
-
|
802
|
-
/**
|
803
|
-
* Initializes and starts the helper server that is responsible for handling communication
|
947
|
+
* Initializes and starts the helper agent that is responsible for handling communication
|
804
948
|
* between Nginx and the backend Rails processes.
|
805
949
|
*
|
806
950
|
* @see Server
|
@@ -809,48 +953,38 @@ receivePassword(int adminPipe) {
|
|
809
953
|
int
|
810
954
|
main(int argc, char *argv[]) {
|
811
955
|
TRACE_POINT();
|
956
|
+
VariantMap options = initializeAgent(argc, argv, "PassengerHelperAgent");
|
957
|
+
pid_t webServerPid = options.getPid("web_server_pid");
|
958
|
+
string tempDir = options.get("temp_dir");
|
959
|
+
bool userSwitching = options.getBool("user_switching");
|
960
|
+
string defaultUser = options.get("default_user");
|
961
|
+
string defaultGroup = options.get("default_group");
|
962
|
+
string passengerRoot = options.get("passenger_root");
|
963
|
+
string rubyCommand = options.get("ruby");
|
964
|
+
unsigned int generationNumber = options.getInt("generation_number");
|
965
|
+
unsigned int maxPoolSize = options.getInt("max_pool_size");
|
966
|
+
unsigned int maxInstancesPerApp = options.getInt("max_instances_per_app");
|
967
|
+
unsigned int poolIdleTime = options.getInt("pool_idle_time");
|
968
|
+
|
812
969
|
try {
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
int feedbackPipe = atoi(argv[4]);
|
821
|
-
int logLevel = atoi(argv[5]);
|
822
|
-
int maxPoolSize = atoi(argv[6]);
|
823
|
-
int maxInstancesPerApp = atoi(argv[7]);
|
824
|
-
int poolIdleTime = atoi(argv[8]);
|
825
|
-
bool userSwitching = strcmp(argv[9], "1") == 0;
|
826
|
-
string defaultUser = argv[10];
|
827
|
-
uid_t workerUid = (uid_t) atoll(argv[11]);
|
828
|
-
gid_t workerGid = (gid_t) atoll(argv[12]);
|
829
|
-
string passengerTempDir = argv[13];
|
830
|
-
|
831
|
-
setLogLevel(logLevel);
|
832
|
-
P_DEBUG("Passenger helper server started on PID " << getpid());
|
833
|
-
|
834
|
-
setPassengerTempDir(passengerTempDir);
|
835
|
-
|
836
|
-
password = receivePassword(adminPipe);
|
837
|
-
P_TRACE(2, "Password received.");
|
970
|
+
UPDATE_TRACE_POINT();
|
971
|
+
Server server(FEEDBACK_FD, webServerPid, tempDir,
|
972
|
+
userSwitching, defaultUser, defaultGroup,
|
973
|
+
passengerRoot, rubyCommand, generationNumber,
|
974
|
+
maxPoolSize, maxInstancesPerApp, poolIdleTime,
|
975
|
+
options);
|
976
|
+
P_DEBUG("Passenger helper agent started on PID " << getpid());
|
838
977
|
|
839
|
-
|
840
|
-
|
841
|
-
defaultUser, workerUid, workerGid).start();
|
978
|
+
UPDATE_TRACE_POINT();
|
979
|
+
server.mainLoop();
|
842
980
|
} catch (const tracable_exception &e) {
|
843
981
|
P_ERROR(e.what() << "\n" << e.backtrace());
|
844
982
|
return 1;
|
845
|
-
} catch (const exception &e) {
|
983
|
+
} catch (const std::exception &e) {
|
846
984
|
P_ERROR(e.what());
|
847
985
|
return 1;
|
848
|
-
} catch (...) {
|
849
|
-
P_ERROR("Unknown exception thrown in main thread.");
|
850
|
-
throw;
|
851
986
|
}
|
852
987
|
|
853
|
-
P_TRACE(2, "Helper
|
988
|
+
P_TRACE(2, "Helper agent exited.");
|
854
989
|
return 0;
|
855
990
|
}
|
856
|
-
|