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,336 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c) 2008, 2009 Phusion
|
4
|
-
*
|
5
|
-
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
-
*
|
7
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
-
* of this software and associated documentation files (the "Software"), to deal
|
9
|
-
* in the Software without restriction, including without limitation the rights
|
10
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
-
* copies of the Software, and to permit persons to whom the Software is
|
12
|
-
* furnished to do so, subject to the following conditions:
|
13
|
-
*
|
14
|
-
* The above copyright notice and this permission notice shall be included in
|
15
|
-
* all copies or substantial portions of the Software.
|
16
|
-
*
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
-
* THE SOFTWARE.
|
24
|
-
*/
|
25
|
-
#ifndef _PASSENGER_APPLICATION_POOL_STATUS_REPORTER_H_
|
26
|
-
#define _PASSENGER_APPLICATION_POOL_STATUS_REPORTER_H_
|
27
|
-
|
28
|
-
#include <boost/bind.hpp>
|
29
|
-
#include <boost/thread.hpp>
|
30
|
-
#include <oxt/thread.hpp>
|
31
|
-
#include <oxt/backtrace.hpp>
|
32
|
-
#include <oxt/system_calls.hpp>
|
33
|
-
|
34
|
-
#include <string>
|
35
|
-
#include <sys/types.h>
|
36
|
-
#include <sys/socket.h>
|
37
|
-
#include <sys/un.h>
|
38
|
-
#include <sys/stat.h>
|
39
|
-
#include <cstdio>
|
40
|
-
#include <unistd.h>
|
41
|
-
#include <errno.h>
|
42
|
-
|
43
|
-
#include "StandardApplicationPool.h"
|
44
|
-
#include "MessageChannel.h"
|
45
|
-
#include "Exceptions.h"
|
46
|
-
#include "Logging.h"
|
47
|
-
#include "Utils.h"
|
48
|
-
|
49
|
-
namespace Passenger {
|
50
|
-
|
51
|
-
using namespace boost;
|
52
|
-
using namespace oxt;
|
53
|
-
using namespace std;
|
54
|
-
|
55
|
-
/**
|
56
|
-
* An ApplicationPoolStatusReporter allows commandline admin tools to inspect
|
57
|
-
* the status of a StandardApplicationPool. It does so by creating a Unix socket
|
58
|
-
* in the Passenger temp folder, which tools can connect to to query for
|
59
|
-
* information.
|
60
|
-
*
|
61
|
-
* An ApplicationPoolStatusReporter creates a background thread for handling
|
62
|
-
* connections on the socket. This thread will be automatically cleaned up upon
|
63
|
-
* destroying the ApplicationPoolStatusReporter object.
|
64
|
-
*/
|
65
|
-
class ApplicationPoolStatusReporter {
|
66
|
-
private:
|
67
|
-
/**
|
68
|
-
* Wrapper class around a file descriptor integer, for RAII behavior.
|
69
|
-
*
|
70
|
-
* A FileDescriptor object behaves just like an int, so that you can pass it to
|
71
|
-
* system calls such as read(). It performs reference counting. When the last
|
72
|
-
* copy of a FileDescriptor has been destroyed, the underlying file descriptor
|
73
|
-
* will be automatically closed.
|
74
|
-
*/
|
75
|
-
class FileDescriptor {
|
76
|
-
private:
|
77
|
-
struct SharedData {
|
78
|
-
int fd;
|
79
|
-
|
80
|
-
/**
|
81
|
-
* Constructor to assign this file descriptor's handle.
|
82
|
-
*/
|
83
|
-
SharedData(int fd) {
|
84
|
-
this->fd = fd;
|
85
|
-
}
|
86
|
-
|
87
|
-
/**
|
88
|
-
* Attempts to close this file descriptor. When created on the stack,
|
89
|
-
* this destructor will automatically be invoked as a result of C++
|
90
|
-
* semantics when exiting the scope this object was created in. This
|
91
|
-
* ensures that stack created objects with destructors like these will
|
92
|
-
* de-allocate their resources upon leaving their corresponding scope.
|
93
|
-
* This pattern is also known Resource Acquisition Is Initialization (RAII).
|
94
|
-
*
|
95
|
-
* @throws SystemException File descriptor could not be closed.
|
96
|
-
*/
|
97
|
-
~SharedData() {
|
98
|
-
this_thread::disable_syscall_interruption dsi;
|
99
|
-
if (syscalls::close(fd) == -1) {
|
100
|
-
throw SystemException("Cannot close file descriptor", errno);
|
101
|
-
}
|
102
|
-
}
|
103
|
-
};
|
104
|
-
|
105
|
-
/* Shared pointer for reference counting on this file descriptor */
|
106
|
-
shared_ptr<SharedData> data;
|
107
|
-
|
108
|
-
public:
|
109
|
-
FileDescriptor() {
|
110
|
-
// Do nothing.
|
111
|
-
}
|
112
|
-
|
113
|
-
/**
|
114
|
-
* Creates a new FileDescriptor instance with the given fd as a handle.
|
115
|
-
*/
|
116
|
-
FileDescriptor(int fd) {
|
117
|
-
data = ptr(new SharedData(fd));
|
118
|
-
}
|
119
|
-
|
120
|
-
/**
|
121
|
-
* Overloads the integer cast operator so that it will return the file
|
122
|
-
* descriptor handle as an integer.
|
123
|
-
*
|
124
|
-
* @return This file descriptor's handle as an integer.
|
125
|
-
*/
|
126
|
-
operator int () const {
|
127
|
-
return data->fd;
|
128
|
-
}
|
129
|
-
};
|
130
|
-
|
131
|
-
/** The application pool to monitor. */
|
132
|
-
StandardApplicationPoolPtr pool;
|
133
|
-
|
134
|
-
/** The socket's filename. */
|
135
|
-
char filename[PATH_MAX];
|
136
|
-
|
137
|
-
/** The socket's file descriptor. */
|
138
|
-
int serverFd;
|
139
|
-
|
140
|
-
/** The main thread. */
|
141
|
-
oxt::thread *mainThread;
|
142
|
-
|
143
|
-
/** The mutex which protects the 'threads' member. */
|
144
|
-
boost::mutex threadsLock;
|
145
|
-
|
146
|
-
/** A map which maps a client file descriptor to its handling thread. */
|
147
|
-
map< int, shared_ptr<oxt::thread> > threads;
|
148
|
-
|
149
|
-
void writeScalarAndIgnoreErrors(MessageChannel &channel, const string &data) {
|
150
|
-
try {
|
151
|
-
channel.writeScalar(data);
|
152
|
-
} catch (const SystemException &e) {
|
153
|
-
// Don't care about write errors.
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
void mainThreadFunction() {
|
158
|
-
TRACE_POINT();
|
159
|
-
try {
|
160
|
-
while (!this_thread::interruption_requested()) {
|
161
|
-
UPDATE_TRACE_POINT();
|
162
|
-
sockaddr_un addr;
|
163
|
-
socklen_t addr_len = sizeof(addr);
|
164
|
-
|
165
|
-
FileDescriptor fd(syscalls::accept(serverFd, (struct sockaddr *) &addr, &addr_len));
|
166
|
-
if (fd == -1) {
|
167
|
-
int e = errno;
|
168
|
-
P_ERROR("Cannot accept new client on status reporter socket: " <<
|
169
|
-
strerror(e) << " (" << e << ")");
|
170
|
-
break;
|
171
|
-
}
|
172
|
-
|
173
|
-
boost::lock_guard<boost::mutex> l(threadsLock);
|
174
|
-
this_thread::disable_syscall_interruption dsi;
|
175
|
-
this_thread::disable_interruption di;
|
176
|
-
shared_ptr<oxt::thread> thread(new oxt::thread(
|
177
|
-
bind(&ApplicationPoolStatusReporter::clientThreadFunction, this, fd),
|
178
|
-
"Status reporter client thread " + toString(fd),
|
179
|
-
1024 * 128
|
180
|
-
));
|
181
|
-
threads[fd] = thread;
|
182
|
-
}
|
183
|
-
} catch (const boost::thread_interrupted &) {
|
184
|
-
P_TRACE(2, "Status reporter main thread interrupted.");
|
185
|
-
} catch (const exception &e) {
|
186
|
-
P_ERROR("Error in status reporter main thread: " << e.what());
|
187
|
-
}
|
188
|
-
}
|
189
|
-
|
190
|
-
void clientThreadFunction(FileDescriptor fd) {
|
191
|
-
TRACE_POINT();
|
192
|
-
MessageChannel channel(fd);
|
193
|
-
|
194
|
-
try {
|
195
|
-
while (!this_thread::interruption_requested()) {
|
196
|
-
vector<string> args;
|
197
|
-
|
198
|
-
UPDATE_TRACE_POINT();
|
199
|
-
if (!channel.read(args) || args.size() < 1) {
|
200
|
-
break;
|
201
|
-
}
|
202
|
-
|
203
|
-
if (args[0] == "backtraces") {
|
204
|
-
UPDATE_TRACE_POINT();
|
205
|
-
writeScalarAndIgnoreErrors(channel, oxt::thread::all_backtraces());
|
206
|
-
} else if (args[0] == "status") {
|
207
|
-
UPDATE_TRACE_POINT();
|
208
|
-
writeScalarAndIgnoreErrors(channel, pool->toString());
|
209
|
-
} else if (args[0] == "status_xml") {
|
210
|
-
UPDATE_TRACE_POINT();
|
211
|
-
writeScalarAndIgnoreErrors(channel, pool->toXml());
|
212
|
-
} else {
|
213
|
-
P_ERROR("Error in status reporter client thread: unknown query '" <<
|
214
|
-
args[0] << "'.");
|
215
|
-
}
|
216
|
-
}
|
217
|
-
} catch (const boost::thread_interrupted &) {
|
218
|
-
P_TRACE(2, "Status reporter client thread " << fd << " interrupted.");
|
219
|
-
} catch (const exception &e) {
|
220
|
-
P_ERROR("Error in status reporter client thread: " << e.what());
|
221
|
-
}
|
222
|
-
|
223
|
-
boost::lock_guard<boost::mutex> l(threadsLock);
|
224
|
-
this_thread::disable_syscall_interruption dsi;
|
225
|
-
this_thread::disable_interruption di;
|
226
|
-
threads.erase(fd);
|
227
|
-
}
|
228
|
-
|
229
|
-
public:
|
230
|
-
/**
|
231
|
-
* Creates a new ApplicationPoolStatusReporter.
|
232
|
-
*
|
233
|
-
* @param pool The application pool to monitor.
|
234
|
-
* @param userSwitching Whether user switching is enabled. This is used
|
235
|
-
* for determining the optimal permissions for the
|
236
|
-
* FIFO file and the temp directory that might get
|
237
|
-
* created.
|
238
|
-
* @param permissions The permissions with which the FIFO should
|
239
|
-
* be created.
|
240
|
-
* @param uid The UID of the user who should own the FIFO file, or
|
241
|
-
* -1 if the current user should be set as owner.
|
242
|
-
* @param gid The GID of the user who should own the FIFO file, or
|
243
|
-
* -1 if the current group should be set as group.
|
244
|
-
* @throws RuntimeException An error occurred.
|
245
|
-
* @throws SystemException An error occurred while creating the server socket.
|
246
|
-
* @throws boost::thread_resource_error Something went wrong during
|
247
|
-
* creation of the thread.
|
248
|
-
* @throws boost::thread_interrupted A system call has been interrupted.
|
249
|
-
*/
|
250
|
-
ApplicationPoolStatusReporter(StandardApplicationPoolPtr &pool,
|
251
|
-
bool userSwitching,
|
252
|
-
mode_t permissions = S_IRUSR | S_IWUSR,
|
253
|
-
uid_t uid = -1, gid_t gid = -1) {
|
254
|
-
int ret;
|
255
|
-
|
256
|
-
this->pool = pool;
|
257
|
-
|
258
|
-
createPassengerTempDir(getSystemTempDir(), userSwitching,
|
259
|
-
"nobody", geteuid(), getegid());
|
260
|
-
|
261
|
-
snprintf(filename, sizeof(filename) - 1, "%s/info/status.socket",
|
262
|
-
getPassengerTempDir().c_str());
|
263
|
-
filename[PATH_MAX - 1] = '\0';
|
264
|
-
serverFd = createUnixServer(filename, 10);
|
265
|
-
|
266
|
-
/* Set the socket file's permissions... */
|
267
|
-
do {
|
268
|
-
ret = chmod(filename, permissions);
|
269
|
-
} while (ret == -1 && errno == EINTR);
|
270
|
-
|
271
|
-
/* ...and ownership. */
|
272
|
-
if (uid != (uid_t) -1 && gid != (gid_t) -1) {
|
273
|
-
do {
|
274
|
-
ret = chown(filename, uid, gid);
|
275
|
-
} while (ret == -1 && errno == EINTR);
|
276
|
-
if (errno == -1) {
|
277
|
-
int e = errno;
|
278
|
-
char message[1024];
|
279
|
-
|
280
|
-
snprintf(message, sizeof(message) - 1,
|
281
|
-
"Cannot set the owner for socket file '%s' to %lld and its group to %lld",
|
282
|
-
filename, (long long) uid, (long long) gid);
|
283
|
-
message[sizeof(message) - 1] = '\0';
|
284
|
-
do {
|
285
|
-
ret = close(serverFd);
|
286
|
-
} while (ret == -1 && errno == EINTR);
|
287
|
-
throw SystemException(message, e);
|
288
|
-
}
|
289
|
-
}
|
290
|
-
|
291
|
-
try {
|
292
|
-
mainThread = new oxt::thread(
|
293
|
-
bind(&ApplicationPoolStatusReporter::mainThreadFunction, this),
|
294
|
-
"Status reporter main thread",
|
295
|
-
1024 * 128
|
296
|
-
);
|
297
|
-
} catch (...) {
|
298
|
-
do {
|
299
|
-
ret = close(serverFd);
|
300
|
-
} while (ret == -1 && errno == EINTR);
|
301
|
-
throw;
|
302
|
-
}
|
303
|
-
}
|
304
|
-
|
305
|
-
~ApplicationPoolStatusReporter() {
|
306
|
-
this_thread::disable_syscall_interruption dsi;
|
307
|
-
this_thread::disable_interruption di;
|
308
|
-
int ret;
|
309
|
-
|
310
|
-
do {
|
311
|
-
ret = unlink(filename);
|
312
|
-
} while (ret == -1 && errno == EINTR);
|
313
|
-
|
314
|
-
mainThread->interrupt_and_join();
|
315
|
-
delete mainThread;
|
316
|
-
|
317
|
-
do {
|
318
|
-
ret = close(serverFd);
|
319
|
-
} while (ret == -1 && errno == EINTR);
|
320
|
-
|
321
|
-
/* We make a copy of the data structure here to avoid deadlocks. */
|
322
|
-
map< int, shared_ptr<oxt::thread> > threadsCopy;
|
323
|
-
{
|
324
|
-
boost::lock_guard<boost::mutex> l(threadsLock);
|
325
|
-
threadsCopy = threads;
|
326
|
-
}
|
327
|
-
map< int, shared_ptr<oxt::thread> >::iterator it;
|
328
|
-
for (it = threadsCopy.begin(); it != threadsCopy.end(); it++) {
|
329
|
-
it->second->interrupt_and_join();
|
330
|
-
}
|
331
|
-
}
|
332
|
-
};
|
333
|
-
|
334
|
-
} // namespace Passenger
|
335
|
-
|
336
|
-
#endif /* _PASSENGER_APPLICATION_POOL_STATUS_REPORTER_H_ */
|
@@ -1,108 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c) 2008, 2009 Phusion
|
4
|
-
*
|
5
|
-
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
-
*
|
7
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
-
* of this software and associated documentation files (the "Software"), to deal
|
9
|
-
* in the Software without restriction, including without limitation the rights
|
10
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
-
* copies of the Software, and to permit persons to whom the Software is
|
12
|
-
* furnished to do so, subject to the following conditions:
|
13
|
-
*
|
14
|
-
* The above copyright notice and this permission notice shall be included in
|
15
|
-
* all copies or substantial portions of the Software.
|
16
|
-
*
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
-
* THE SOFTWARE.
|
24
|
-
*/
|
25
|
-
#ifndef _PASSENGER_DUMMY_SPAWN_MANAGER_H_
|
26
|
-
#define _PASSENGER_DUMMY_SPAWN_MANAGER_H_
|
27
|
-
|
28
|
-
// TODO: make this path not hardcoded
|
29
|
-
#define DUMMY_REQUEST_HANDLER_EXECUTABLE "/home/hongli/Projects/passenger/benchmark/DummyRequestHandler"
|
30
|
-
|
31
|
-
#include <string>
|
32
|
-
|
33
|
-
#include <sys/types.h>
|
34
|
-
#include <sys/wait.h>
|
35
|
-
#include <cstdio>
|
36
|
-
#include <unistd.h>
|
37
|
-
#include <errno.h>
|
38
|
-
|
39
|
-
#include "Application.h"
|
40
|
-
#include "Exceptions.h"
|
41
|
-
|
42
|
-
namespace Passenger {
|
43
|
-
|
44
|
-
using namespace std;
|
45
|
-
|
46
|
-
/**
|
47
|
-
* A dummy SpawnManager replacement for testing/debugging purposes.
|
48
|
-
*
|
49
|
-
* This class implements a dummy spawn manager, and is 100% interface-compatible with
|
50
|
-
* SpawnManager. This spawn manager will spawn <tt>benchmark/DummyRequestHandler</tt>,
|
51
|
-
* which is probably the fastest possible implementation of a request handler. The purpose
|
52
|
-
* of this class to benchmark the performance of the Apache module (i.e. not benchmarking
|
53
|
-
* the Ruby request handler or Rails itself).
|
54
|
-
*
|
55
|
-
* This header file is not used by default. Define the macro <tt>PASSENGER_USE_DUMMY_SPAWN_MANAGER</tt>
|
56
|
-
* to make ApplicationPool use DummySpawnManager instead of SpawnManager.
|
57
|
-
*
|
58
|
-
* Of course, don't forget to compile benchmark/DummyRequestHandler!
|
59
|
-
*
|
60
|
-
* @ingroup Support
|
61
|
-
*/
|
62
|
-
class DummySpawnManager {
|
63
|
-
public:
|
64
|
-
ApplicationPtr spawn(const string &appRoot, const string &user = "", const string &group = "") {
|
65
|
-
int fds[2];
|
66
|
-
pid_t pid;
|
67
|
-
|
68
|
-
if(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
|
69
|
-
throw SystemException("Cannot create a Unix socket", errno);
|
70
|
-
}
|
71
|
-
pid = fork();
|
72
|
-
if (pid == 0) {
|
73
|
-
pid = fork();
|
74
|
-
if (pid == 0) {
|
75
|
-
dup2(fds[0], STDIN_FILENO);
|
76
|
-
close(fds[0]);
|
77
|
-
close(fds[1]);
|
78
|
-
execlp(DUMMY_REQUEST_HANDLER_EXECUTABLE, DUMMY_REQUEST_HANDLER_EXECUTABLE, NULL);
|
79
|
-
int e = errno;
|
80
|
-
fprintf(stderr, "Unable to run %s: %s\n", DUMMY_REQUEST_HANDLER_EXECUTABLE, strerror(e));
|
81
|
-
fflush(stderr);
|
82
|
-
_exit(1);
|
83
|
-
} else if (pid == -1) {
|
84
|
-
perror("Cannot fork a new process");
|
85
|
-
fflush(stderr);
|
86
|
-
_exit(1);
|
87
|
-
} else {
|
88
|
-
_exit(0);
|
89
|
-
}
|
90
|
-
} else if (pid == -1) {
|
91
|
-
close(fds[0]);
|
92
|
-
close(fds[1]);
|
93
|
-
throw SystemException("Cannot fork a new process", errno);
|
94
|
-
} else {
|
95
|
-
close(fds[0]);
|
96
|
-
waitpid(pid, NULL, 0);
|
97
|
-
return ApplicationPtr(new Application(appRoot, pid, fds[1]));
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
pid_t getServerPid() const {
|
102
|
-
return 0;
|
103
|
-
}
|
104
|
-
};
|
105
|
-
|
106
|
-
} // namespace Passenger
|
107
|
-
|
108
|
-
#endif /* _PASSENGER_DUMMY_SPAWN_MANAGER_H_ */
|
@@ -1,821 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c) 2008, 2009 Phusion
|
4
|
-
*
|
5
|
-
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
-
*
|
7
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
-
* of this software and associated documentation files (the "Software"), to deal
|
9
|
-
* in the Software without restriction, including without limitation the rights
|
10
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
-
* copies of the Software, and to permit persons to whom the Software is
|
12
|
-
* furnished to do so, subject to the following conditions:
|
13
|
-
*
|
14
|
-
* The above copyright notice and this permission notice shall be included in
|
15
|
-
* all copies or substantial portions of the Software.
|
16
|
-
*
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
-
* THE SOFTWARE.
|
24
|
-
*/
|
25
|
-
#ifndef _PASSENGER_STANDARD_APPLICATION_POOL_H_
|
26
|
-
#define _PASSENGER_STANDARD_APPLICATION_POOL_H_
|
27
|
-
|
28
|
-
#include <boost/shared_ptr.hpp>
|
29
|
-
#include <boost/weak_ptr.hpp>
|
30
|
-
#include <boost/thread.hpp>
|
31
|
-
#include <boost/bind.hpp>
|
32
|
-
#include <boost/date_time/microsec_time_clock.hpp>
|
33
|
-
#include <boost/date_time/posix_time/posix_time.hpp>
|
34
|
-
|
35
|
-
#include <oxt/system_calls.hpp>
|
36
|
-
#include <oxt/backtrace.hpp>
|
37
|
-
#include <oxt/thread.hpp>
|
38
|
-
|
39
|
-
#include <string>
|
40
|
-
#include <sstream>
|
41
|
-
#include <map>
|
42
|
-
#include <list>
|
43
|
-
|
44
|
-
#include <sys/types.h>
|
45
|
-
#include <sys/stat.h>
|
46
|
-
#include <stdio.h>
|
47
|
-
#include <unistd.h>
|
48
|
-
#include <ctime>
|
49
|
-
#include <cerrno>
|
50
|
-
#ifdef TESTING_APPLICATION_POOL
|
51
|
-
#include <cstdlib>
|
52
|
-
#endif
|
53
|
-
|
54
|
-
#include "ApplicationPool.h"
|
55
|
-
#include "Logging.h"
|
56
|
-
#include "FileChangeChecker.h"
|
57
|
-
#include "CachedFileStat.hpp"
|
58
|
-
#ifdef PASSENGER_USE_DUMMY_SPAWN_MANAGER
|
59
|
-
#include "DummySpawnManager.h"
|
60
|
-
#else
|
61
|
-
#include "SpawnManager.h"
|
62
|
-
#endif
|
63
|
-
|
64
|
-
namespace Passenger {
|
65
|
-
|
66
|
-
using namespace std;
|
67
|
-
using namespace boost;
|
68
|
-
using namespace oxt;
|
69
|
-
|
70
|
-
class ApplicationPoolServer;
|
71
|
-
|
72
|
-
/****************************************************************
|
73
|
-
*
|
74
|
-
* See "doc/ApplicationPool algorithm.txt" for a more readable
|
75
|
-
* and detailed description of the algorithm implemented here.
|
76
|
-
*
|
77
|
-
****************************************************************/
|
78
|
-
|
79
|
-
/**
|
80
|
-
* A standard implementation of ApplicationPool for single-process environments.
|
81
|
-
*
|
82
|
-
* The environment may or may not be multithreaded - StandardApplicationPool is completely
|
83
|
-
* thread-safe. Apache with the threading MPM is an example of a multithreaded single-process
|
84
|
-
* environment.
|
85
|
-
*
|
86
|
-
* This class is unusable in multi-process environments such as Apache with the prefork MPM.
|
87
|
-
* The reasons are as follows:
|
88
|
-
* - StandardApplicationPool uses threads internally. Because threads disappear after a fork(),
|
89
|
-
* a StandardApplicationPool object will become unusable after a fork().
|
90
|
-
* - StandardApplicationPool stores its internal cache on the heap. Different processes
|
91
|
-
* cannot share their heaps, so they will not be able to access each others' pool cache.
|
92
|
-
* - StandardApplicationPool has a connection to the spawn server. If there are multiple
|
93
|
-
* processes, and they all use the spawn servers's connection at the same time without
|
94
|
-
* some sort of synchronization, then bad things will happen.
|
95
|
-
*
|
96
|
-
* (Of course, StandardApplicationPool <em>is</em> usable if each process creates its own
|
97
|
-
* StandardApplicationPool object, but that would defeat the point of having a shared pool.)
|
98
|
-
*
|
99
|
-
* For multi-process environments, one should use ApplicationPoolServer instead.
|
100
|
-
*
|
101
|
-
* @ingroup Support
|
102
|
-
*/
|
103
|
-
class StandardApplicationPool: public ApplicationPool {
|
104
|
-
private:
|
105
|
-
static const int DEFAULT_MAX_IDLE_TIME = 120;
|
106
|
-
static const int DEFAULT_MAX_POOL_SIZE = 20;
|
107
|
-
static const int DEFAULT_MAX_INSTANCES_PER_APP = 0;
|
108
|
-
static const int CLEANER_THREAD_STACK_SIZE = 1024 * 64;
|
109
|
-
static const unsigned int MAX_GET_ATTEMPTS = 10;
|
110
|
-
static const unsigned int GET_TIMEOUT = 5000; // In milliseconds.
|
111
|
-
|
112
|
-
friend class ApplicationPoolServer;
|
113
|
-
struct Domain;
|
114
|
-
struct AppContainer;
|
115
|
-
|
116
|
-
typedef shared_ptr<Domain> DomainPtr;
|
117
|
-
typedef shared_ptr<AppContainer> AppContainerPtr;
|
118
|
-
typedef list<AppContainerPtr> AppContainerList;
|
119
|
-
typedef map<string, DomainPtr> DomainMap;
|
120
|
-
|
121
|
-
struct Domain {
|
122
|
-
AppContainerList instances;
|
123
|
-
unsigned int size;
|
124
|
-
unsigned long maxRequests;
|
125
|
-
};
|
126
|
-
|
127
|
-
struct AppContainer {
|
128
|
-
ApplicationPtr app;
|
129
|
-
time_t startTime;
|
130
|
-
time_t lastUsed;
|
131
|
-
unsigned int sessions;
|
132
|
-
unsigned int processed;
|
133
|
-
AppContainerList::iterator iterator;
|
134
|
-
AppContainerList::iterator ia_iterator;
|
135
|
-
|
136
|
-
AppContainer() {
|
137
|
-
startTime = time(NULL);
|
138
|
-
processed = 0;
|
139
|
-
}
|
140
|
-
|
141
|
-
/**
|
142
|
-
* Returns the uptime of this AppContainer so far, as a string.
|
143
|
-
*/
|
144
|
-
string uptime() const {
|
145
|
-
time_t seconds = time(NULL) - startTime;
|
146
|
-
stringstream result;
|
147
|
-
|
148
|
-
if (seconds >= 60) {
|
149
|
-
time_t minutes = seconds / 60;
|
150
|
-
if (minutes >= 60) {
|
151
|
-
time_t hours = minutes / 60;
|
152
|
-
minutes = minutes % 60;
|
153
|
-
result << hours << "h ";
|
154
|
-
}
|
155
|
-
|
156
|
-
seconds = seconds % 60;
|
157
|
-
result << minutes << "m ";
|
158
|
-
}
|
159
|
-
result << seconds << "s";
|
160
|
-
return result.str();
|
161
|
-
}
|
162
|
-
};
|
163
|
-
|
164
|
-
/**
|
165
|
-
* A data structure which contains data that's shared between a
|
166
|
-
* StandardApplicationPool and a SessionCloseCallback object.
|
167
|
-
* This is because the StandardApplicationPool's life time could be
|
168
|
-
* different from a SessionCloseCallback's.
|
169
|
-
*/
|
170
|
-
struct SharedData {
|
171
|
-
boost::mutex lock;
|
172
|
-
condition activeOrMaxChanged;
|
173
|
-
|
174
|
-
DomainMap domains;
|
175
|
-
unsigned int max;
|
176
|
-
unsigned int count;
|
177
|
-
unsigned int active;
|
178
|
-
unsigned int maxPerApp;
|
179
|
-
AppContainerList inactiveApps;
|
180
|
-
map<string, unsigned int> appInstanceCount;
|
181
|
-
};
|
182
|
-
|
183
|
-
typedef shared_ptr<SharedData> SharedDataPtr;
|
184
|
-
|
185
|
-
/**
|
186
|
-
* Function object which will be called when a session has been closed.
|
187
|
-
*/
|
188
|
-
struct SessionCloseCallback {
|
189
|
-
SharedDataPtr data;
|
190
|
-
weak_ptr<AppContainer> container;
|
191
|
-
|
192
|
-
SessionCloseCallback(SharedDataPtr data,
|
193
|
-
const weak_ptr<AppContainer> &container) {
|
194
|
-
this->data = data;
|
195
|
-
this->container = container;
|
196
|
-
}
|
197
|
-
|
198
|
-
void operator()() {
|
199
|
-
boost::mutex::scoped_lock l(data->lock);
|
200
|
-
AppContainerPtr container(this->container.lock());
|
201
|
-
|
202
|
-
if (container == NULL) {
|
203
|
-
return;
|
204
|
-
}
|
205
|
-
|
206
|
-
DomainMap::iterator it;
|
207
|
-
it = data->domains.find(container->app->getAppRoot());
|
208
|
-
if (it != data->domains.end()) {
|
209
|
-
Domain *domain = it->second.get();
|
210
|
-
AppContainerList *instances = &domain->instances;
|
211
|
-
|
212
|
-
container->processed++;
|
213
|
-
if (domain->maxRequests > 0 && container->processed >= domain->maxRequests) {
|
214
|
-
instances->erase(container->iterator);
|
215
|
-
domain->size--;
|
216
|
-
if (instances->empty()) {
|
217
|
-
data->domains.erase(container->app->getAppRoot());
|
218
|
-
}
|
219
|
-
data->count--;
|
220
|
-
data->active--;
|
221
|
-
data->activeOrMaxChanged.notify_all();
|
222
|
-
} else {
|
223
|
-
container->lastUsed = time(NULL);
|
224
|
-
container->sessions--;
|
225
|
-
if (container->sessions == 0) {
|
226
|
-
instances->erase(container->iterator);
|
227
|
-
instances->push_front(container);
|
228
|
-
container->iterator = instances->begin();
|
229
|
-
data->inactiveApps.push_back(container);
|
230
|
-
container->ia_iterator = data->inactiveApps.end();
|
231
|
-
container->ia_iterator--;
|
232
|
-
data->active--;
|
233
|
-
data->activeOrMaxChanged.notify_all();
|
234
|
-
}
|
235
|
-
}
|
236
|
-
}
|
237
|
-
}
|
238
|
-
};
|
239
|
-
|
240
|
-
#ifdef PASSENGER_USE_DUMMY_SPAWN_MANAGER
|
241
|
-
DummySpawnManager spawnManager;
|
242
|
-
#else
|
243
|
-
SpawnManager spawnManager;
|
244
|
-
#endif
|
245
|
-
SharedDataPtr data;
|
246
|
-
oxt::thread *cleanerThread;
|
247
|
-
bool detached;
|
248
|
-
bool done;
|
249
|
-
unsigned int maxIdleTime;
|
250
|
-
unsigned int waitingOnGlobalQueue;
|
251
|
-
condition cleanerThreadSleeper;
|
252
|
-
CachedFileStat cstat;
|
253
|
-
FileChangeChecker fileChangeChecker;
|
254
|
-
|
255
|
-
// Shortcuts for instance variables in SharedData. Saves typing in get().
|
256
|
-
boost::mutex &lock;
|
257
|
-
condition &activeOrMaxChanged;
|
258
|
-
DomainMap &domains;
|
259
|
-
unsigned int &max;
|
260
|
-
unsigned int &count;
|
261
|
-
unsigned int &active;
|
262
|
-
unsigned int &maxPerApp;
|
263
|
-
AppContainerList &inactiveApps;
|
264
|
-
map<string, unsigned int> &appInstanceCount;
|
265
|
-
|
266
|
-
/**
|
267
|
-
* Verify that all the invariants are correct.
|
268
|
-
*/
|
269
|
-
bool inline verifyState() {
|
270
|
-
#if PASSENGER_DEBUG
|
271
|
-
// Invariants for _domains_.
|
272
|
-
DomainMap::const_iterator it;
|
273
|
-
unsigned int totalSize = 0;
|
274
|
-
for (it = domains.begin(); it != domains.end(); it++) {
|
275
|
-
const string &appRoot = it->first;
|
276
|
-
Domain *domain = it->second.get();
|
277
|
-
AppContainerList *instances = &domain->instances;
|
278
|
-
|
279
|
-
P_ASSERT(domain->size <= count, false,
|
280
|
-
"domains['" << appRoot << "'].size (" << domain->size <<
|
281
|
-
") <= count (" << count << ")");
|
282
|
-
totalSize += domain->size;
|
283
|
-
|
284
|
-
// Invariants for Domain.
|
285
|
-
|
286
|
-
P_ASSERT(!instances->empty(), false,
|
287
|
-
"domains['" << appRoot << "'].instances is nonempty.");
|
288
|
-
|
289
|
-
AppContainerList::const_iterator prev_lit;
|
290
|
-
AppContainerList::const_iterator lit;
|
291
|
-
prev_lit = instances->begin();
|
292
|
-
lit = prev_lit;
|
293
|
-
lit++;
|
294
|
-
for (; lit != instances->end(); lit++) {
|
295
|
-
if ((*prev_lit)->sessions > 0) {
|
296
|
-
P_ASSERT((*lit)->sessions > 0, false,
|
297
|
-
"domains['" << appRoot << "'].instances "
|
298
|
-
"is sorted from nonactive to active");
|
299
|
-
}
|
300
|
-
}
|
301
|
-
}
|
302
|
-
P_ASSERT(totalSize == count, false, "(sum of all d.size in domains) == count");
|
303
|
-
|
304
|
-
P_ASSERT(active <= count, false,
|
305
|
-
"active (" << active << ") < count (" << count << ")");
|
306
|
-
P_ASSERT(inactiveApps.size() == count - active, false,
|
307
|
-
"inactive_apps.size() == count - active");
|
308
|
-
#endif
|
309
|
-
return true;
|
310
|
-
}
|
311
|
-
|
312
|
-
string toStringWithoutLock() const {
|
313
|
-
stringstream result;
|
314
|
-
|
315
|
-
result << "----------- General information -----------" << endl;
|
316
|
-
result << "max = " << max << endl;
|
317
|
-
result << "count = " << count << endl;
|
318
|
-
result << "active = " << active << endl;
|
319
|
-
result << "inactive = " << inactiveApps.size() << endl;
|
320
|
-
result << "Waiting on global queue: " << waitingOnGlobalQueue << endl;
|
321
|
-
result << endl;
|
322
|
-
|
323
|
-
result << "----------- Domains -----------" << endl;
|
324
|
-
DomainMap::const_iterator it;
|
325
|
-
for (it = domains.begin(); it != domains.end(); it++) {
|
326
|
-
Domain *domain = it->second.get();
|
327
|
-
AppContainerList *instances = &domain->instances;
|
328
|
-
AppContainerList::const_iterator lit;
|
329
|
-
|
330
|
-
result << it->first << ": " << endl;
|
331
|
-
for (lit = instances->begin(); lit != instances->end(); lit++) {
|
332
|
-
AppContainer *container = lit->get();
|
333
|
-
char buf[128];
|
334
|
-
|
335
|
-
snprintf(buf, sizeof(buf),
|
336
|
-
"PID: %-5lu Sessions: %-2u Processed: %-5u Uptime: %s",
|
337
|
-
(unsigned long) container->app->getPid(),
|
338
|
-
container->sessions,
|
339
|
-
container->processed,
|
340
|
-
container->uptime().c_str());
|
341
|
-
result << " " << buf << endl;
|
342
|
-
}
|
343
|
-
result << endl;
|
344
|
-
}
|
345
|
-
return result.str();
|
346
|
-
}
|
347
|
-
|
348
|
-
/**
|
349
|
-
* Checks whether the given application domain needs to be restarted.
|
350
|
-
*
|
351
|
-
* @throws TimeRetrievalException Something went wrong while retrieving the system time.
|
352
|
-
* @throws boost::thread_interrupted
|
353
|
-
*/
|
354
|
-
bool needsRestart(const string &appRoot, const PoolOptions &options) {
|
355
|
-
string restartDir;
|
356
|
-
if (options.restartDir.empty()) {
|
357
|
-
restartDir = appRoot + "/tmp";
|
358
|
-
} else if (options.restartDir[0] == '/') {
|
359
|
-
restartDir = options.restartDir;
|
360
|
-
} else {
|
361
|
-
restartDir = appRoot + "/" + options.restartDir;
|
362
|
-
}
|
363
|
-
|
364
|
-
string alwaysRestartFile = restartDir + "/always_restart.txt";
|
365
|
-
string restartFile = restartDir + "/restart.txt";
|
366
|
-
struct stat buf;
|
367
|
-
return cstat.stat(alwaysRestartFile, &buf, options.statThrottleRate) == 0 ||
|
368
|
-
fileChangeChecker.changed(restartFile, options.statThrottleRate);
|
369
|
-
}
|
370
|
-
|
371
|
-
void cleanerThreadMainLoop() {
|
372
|
-
this_thread::disable_syscall_interruption dsi;
|
373
|
-
unique_lock<boost::mutex> l(lock);
|
374
|
-
try {
|
375
|
-
while (!done && !this_thread::interruption_requested()) {
|
376
|
-
xtime xt;
|
377
|
-
xtime_get(&xt, TIME_UTC);
|
378
|
-
xt.sec += maxIdleTime + 1;
|
379
|
-
if (cleanerThreadSleeper.timed_wait(l, xt)) {
|
380
|
-
// Condition was woken up.
|
381
|
-
if (done) {
|
382
|
-
// StandardApplicationPool is being destroyed.
|
383
|
-
break;
|
384
|
-
} else {
|
385
|
-
// maxIdleTime changed.
|
386
|
-
continue;
|
387
|
-
}
|
388
|
-
}
|
389
|
-
|
390
|
-
time_t now = syscalls::time(NULL);
|
391
|
-
AppContainerList::iterator it;
|
392
|
-
for (it = inactiveApps.begin(); it != inactiveApps.end(); it++) {
|
393
|
-
AppContainer &container(*it->get());
|
394
|
-
ApplicationPtr app(container.app);
|
395
|
-
Domain *domain = domains[app->getAppRoot()].get();
|
396
|
-
AppContainerList *instances = &domain->instances;
|
397
|
-
|
398
|
-
if (maxIdleTime > 0 &&
|
399
|
-
(now - container.lastUsed > (time_t) maxIdleTime)) {
|
400
|
-
P_DEBUG("Cleaning idle app " << app->getAppRoot() <<
|
401
|
-
" (PID " << app->getPid() << ")");
|
402
|
-
instances->erase(container.iterator);
|
403
|
-
|
404
|
-
AppContainerList::iterator prev = it;
|
405
|
-
prev--;
|
406
|
-
inactiveApps.erase(it);
|
407
|
-
it = prev;
|
408
|
-
|
409
|
-
domain->size--;
|
410
|
-
|
411
|
-
count--;
|
412
|
-
}
|
413
|
-
if (instances->empty()) {
|
414
|
-
domains.erase(app->getAppRoot());
|
415
|
-
}
|
416
|
-
}
|
417
|
-
}
|
418
|
-
} catch (const exception &e) {
|
419
|
-
P_ERROR("Uncaught exception: " << e.what());
|
420
|
-
}
|
421
|
-
}
|
422
|
-
|
423
|
-
/**
|
424
|
-
* Spawn a new application instance, or use an existing one that's in the pool.
|
425
|
-
*
|
426
|
-
* @throws boost::thread_interrupted
|
427
|
-
* @throws SpawnException
|
428
|
-
* @throws SystemException
|
429
|
-
* @throws TimeRetrievalException Something went wrong while retrieving the system time.
|
430
|
-
*/
|
431
|
-
pair<AppContainerPtr, Domain *>
|
432
|
-
spawnOrUseExisting(boost::mutex::scoped_lock &l, const PoolOptions &options) {
|
433
|
-
beginning_of_function:
|
434
|
-
|
435
|
-
TRACE_POINT();
|
436
|
-
this_thread::disable_interruption di;
|
437
|
-
this_thread::disable_syscall_interruption dsi;
|
438
|
-
const string &appRoot(options.appRoot);
|
439
|
-
AppContainerPtr container;
|
440
|
-
Domain *domain;
|
441
|
-
AppContainerList *instances;
|
442
|
-
|
443
|
-
try {
|
444
|
-
DomainMap::iterator it(domains.find(appRoot));
|
445
|
-
|
446
|
-
if (needsRestart(appRoot, options)) {
|
447
|
-
if (it != domains.end()) {
|
448
|
-
AppContainerList::iterator it2;
|
449
|
-
instances = &it->second->instances;
|
450
|
-
for (it2 = instances->begin(); it2 != instances->end(); it2++) {
|
451
|
-
container = *it2;
|
452
|
-
if (container->sessions == 0) {
|
453
|
-
inactiveApps.erase(container->ia_iterator);
|
454
|
-
} else {
|
455
|
-
active--;
|
456
|
-
}
|
457
|
-
it2--;
|
458
|
-
instances->erase(container->iterator);
|
459
|
-
count--;
|
460
|
-
}
|
461
|
-
domains.erase(appRoot);
|
462
|
-
}
|
463
|
-
P_DEBUG("Restarting " << appRoot);
|
464
|
-
spawnManager.reload(appRoot);
|
465
|
-
it = domains.end();
|
466
|
-
activeOrMaxChanged.notify_all();
|
467
|
-
}
|
468
|
-
|
469
|
-
if (it != domains.end()) {
|
470
|
-
domain = it->second.get();
|
471
|
-
instances = &domain->instances;
|
472
|
-
|
473
|
-
if (instances->front()->sessions == 0) {
|
474
|
-
container = instances->front();
|
475
|
-
instances->pop_front();
|
476
|
-
instances->push_back(container);
|
477
|
-
container->iterator = instances->end();
|
478
|
-
container->iterator--;
|
479
|
-
inactiveApps.erase(container->ia_iterator);
|
480
|
-
active++;
|
481
|
-
activeOrMaxChanged.notify_all();
|
482
|
-
} else if (count >= max || (
|
483
|
-
maxPerApp != 0 && domain->size >= maxPerApp )
|
484
|
-
) {
|
485
|
-
if (options.useGlobalQueue) {
|
486
|
-
UPDATE_TRACE_POINT();
|
487
|
-
waitingOnGlobalQueue++;
|
488
|
-
activeOrMaxChanged.wait(l);
|
489
|
-
waitingOnGlobalQueue--;
|
490
|
-
goto beginning_of_function;
|
491
|
-
} else {
|
492
|
-
AppContainerList::iterator it(instances->begin());
|
493
|
-
AppContainerList::iterator smallest(instances->begin());
|
494
|
-
it++;
|
495
|
-
for (; it != instances->end(); it++) {
|
496
|
-
if ((*it)->sessions < (*smallest)->sessions) {
|
497
|
-
smallest = it;
|
498
|
-
}
|
499
|
-
}
|
500
|
-
container = *smallest;
|
501
|
-
instances->erase(smallest);
|
502
|
-
instances->push_back(container);
|
503
|
-
container->iterator = instances->end();
|
504
|
-
container->iterator--;
|
505
|
-
}
|
506
|
-
} else {
|
507
|
-
container = ptr(new AppContainer());
|
508
|
-
{
|
509
|
-
this_thread::restore_interruption ri(di);
|
510
|
-
this_thread::restore_syscall_interruption rsi(dsi);
|
511
|
-
container->app = spawnManager.spawn(options);
|
512
|
-
}
|
513
|
-
container->sessions = 0;
|
514
|
-
instances->push_back(container);
|
515
|
-
container->iterator = instances->end();
|
516
|
-
container->iterator--;
|
517
|
-
domain->size++;
|
518
|
-
count++;
|
519
|
-
active++;
|
520
|
-
activeOrMaxChanged.notify_all();
|
521
|
-
}
|
522
|
-
} else {
|
523
|
-
if (active >= max) {
|
524
|
-
UPDATE_TRACE_POINT();
|
525
|
-
activeOrMaxChanged.wait(l);
|
526
|
-
goto beginning_of_function;
|
527
|
-
} else if (count == max) {
|
528
|
-
container = inactiveApps.front();
|
529
|
-
inactiveApps.pop_front();
|
530
|
-
domain = domains[container->app->getAppRoot()].get();
|
531
|
-
instances = &domain->instances;
|
532
|
-
instances->erase(container->iterator);
|
533
|
-
if (instances->empty()) {
|
534
|
-
domains.erase(container->app->getAppRoot());
|
535
|
-
} else {
|
536
|
-
domain->size--;
|
537
|
-
}
|
538
|
-
count--;
|
539
|
-
}
|
540
|
-
|
541
|
-
UPDATE_TRACE_POINT();
|
542
|
-
container = ptr(new AppContainer());
|
543
|
-
{
|
544
|
-
this_thread::restore_interruption ri(di);
|
545
|
-
this_thread::restore_syscall_interruption rsi(dsi);
|
546
|
-
container->app = spawnManager.spawn(options);
|
547
|
-
}
|
548
|
-
container->sessions = 0;
|
549
|
-
it = domains.find(appRoot);
|
550
|
-
if (it == domains.end()) {
|
551
|
-
domain = new Domain();
|
552
|
-
domain->size = 1;
|
553
|
-
domain->maxRequests = options.maxRequests;
|
554
|
-
domains[appRoot] = ptr(domain);
|
555
|
-
} else {
|
556
|
-
domain = it->second.get();
|
557
|
-
domain->size++;
|
558
|
-
}
|
559
|
-
instances = &domain->instances;
|
560
|
-
instances->push_back(container);
|
561
|
-
container->iterator = instances->end();
|
562
|
-
container->iterator--;
|
563
|
-
count++;
|
564
|
-
active++;
|
565
|
-
activeOrMaxChanged.notify_all();
|
566
|
-
}
|
567
|
-
} catch (const SpawnException &e) {
|
568
|
-
string message("Cannot spawn application '");
|
569
|
-
message.append(appRoot);
|
570
|
-
message.append("': ");
|
571
|
-
message.append(e.what());
|
572
|
-
if (e.hasErrorPage()) {
|
573
|
-
throw SpawnException(message, e.getErrorPage());
|
574
|
-
} else {
|
575
|
-
throw SpawnException(message);
|
576
|
-
}
|
577
|
-
} catch (const exception &e) {
|
578
|
-
string message("Cannot spawn application '");
|
579
|
-
message.append(appRoot);
|
580
|
-
message.append("': ");
|
581
|
-
message.append(e.what());
|
582
|
-
throw SpawnException(message);
|
583
|
-
}
|
584
|
-
|
585
|
-
return make_pair(container, domain);
|
586
|
-
}
|
587
|
-
|
588
|
-
public:
|
589
|
-
/**
|
590
|
-
* Create a new StandardApplicationPool object.
|
591
|
-
*
|
592
|
-
* @param spawnServerCommand The filename of the spawn server to use.
|
593
|
-
* @param logFile Specify a log file that the spawn server should use.
|
594
|
-
* Messages on its standard output and standard error channels
|
595
|
-
* will be written to this log file. If an empty string is
|
596
|
-
* specified, no log file will be used, and the spawn server
|
597
|
-
* will use the same standard output/error channels as the
|
598
|
-
* current process.
|
599
|
-
* @param rubyCommand The Ruby interpreter's command.
|
600
|
-
* @param user The user that the spawn manager should run as. This
|
601
|
-
* parameter only has effect if the current process is
|
602
|
-
* running as root. If the empty string is given, or if
|
603
|
-
* the <tt>user</tt> is not a valid username, then
|
604
|
-
* the spawn manager will be run as the current user.
|
605
|
-
* @throws SystemException An error occured while trying to setup the spawn server.
|
606
|
-
* @throws IOException The specified log file could not be opened.
|
607
|
-
*/
|
608
|
-
StandardApplicationPool(const string &spawnServerCommand,
|
609
|
-
const string &logFile = "",
|
610
|
-
const string &rubyCommand = "ruby",
|
611
|
-
const string &user = "")
|
612
|
-
:
|
613
|
-
#ifndef PASSENGER_USE_DUMMY_SPAWN_MANAGER
|
614
|
-
spawnManager(spawnServerCommand, logFile, rubyCommand, user),
|
615
|
-
#endif
|
616
|
-
data(new SharedData()),
|
617
|
-
lock(data->lock),
|
618
|
-
activeOrMaxChanged(data->activeOrMaxChanged),
|
619
|
-
domains(data->domains),
|
620
|
-
max(data->max),
|
621
|
-
count(data->count),
|
622
|
-
active(data->active),
|
623
|
-
maxPerApp(data->maxPerApp),
|
624
|
-
inactiveApps(data->inactiveApps),
|
625
|
-
appInstanceCount(data->appInstanceCount)
|
626
|
-
{
|
627
|
-
TRACE_POINT();
|
628
|
-
detached = false;
|
629
|
-
done = false;
|
630
|
-
max = DEFAULT_MAX_POOL_SIZE;
|
631
|
-
count = 0;
|
632
|
-
active = 0;
|
633
|
-
waitingOnGlobalQueue = 0;
|
634
|
-
maxPerApp = DEFAULT_MAX_INSTANCES_PER_APP;
|
635
|
-
maxIdleTime = DEFAULT_MAX_IDLE_TIME;
|
636
|
-
cleanerThread = new oxt::thread(
|
637
|
-
bind(&StandardApplicationPool::cleanerThreadMainLoop, this),
|
638
|
-
"ApplicationPool cleaner",
|
639
|
-
CLEANER_THREAD_STACK_SIZE
|
640
|
-
);
|
641
|
-
}
|
642
|
-
|
643
|
-
virtual ~StandardApplicationPool() {
|
644
|
-
if (!detached) {
|
645
|
-
this_thread::disable_interruption di;
|
646
|
-
{
|
647
|
-
boost::mutex::scoped_lock l(lock);
|
648
|
-
done = true;
|
649
|
-
cleanerThreadSleeper.notify_one();
|
650
|
-
}
|
651
|
-
cleanerThread->join();
|
652
|
-
}
|
653
|
-
delete cleanerThread;
|
654
|
-
}
|
655
|
-
|
656
|
-
virtual Application::SessionPtr get(const string &appRoot) {
|
657
|
-
return ApplicationPool::get(appRoot);
|
658
|
-
}
|
659
|
-
|
660
|
-
virtual Application::SessionPtr get(const PoolOptions &options) {
|
661
|
-
TRACE_POINT();
|
662
|
-
using namespace boost::posix_time;
|
663
|
-
unsigned int attempt = 0;
|
664
|
-
// TODO: We should probably add a timeout to the following
|
665
|
-
// lock. This way we can fail gracefully if the server's under
|
666
|
-
// rediculous load. Though I'm not sure how much it really helps.
|
667
|
-
unique_lock<boost::mutex> l(lock);
|
668
|
-
|
669
|
-
while (true) {
|
670
|
-
attempt++;
|
671
|
-
|
672
|
-
pair<AppContainerPtr, Domain *> p(
|
673
|
-
spawnOrUseExisting(l, options)
|
674
|
-
);
|
675
|
-
AppContainerPtr &container = p.first;
|
676
|
-
Domain *domain = p.second;
|
677
|
-
|
678
|
-
container->lastUsed = time(NULL);
|
679
|
-
container->sessions++;
|
680
|
-
|
681
|
-
P_ASSERT(verifyState(), Application::SessionPtr(),
|
682
|
-
"State is valid:\n" << toString(false));
|
683
|
-
try {
|
684
|
-
UPDATE_TRACE_POINT();
|
685
|
-
return container->app->connect(SessionCloseCallback(data, container));
|
686
|
-
} catch (const exception &e) {
|
687
|
-
container->sessions--;
|
688
|
-
|
689
|
-
AppContainerList &instances(domain->instances);
|
690
|
-
instances.erase(container->iterator);
|
691
|
-
domain->size--;
|
692
|
-
if (instances.empty()) {
|
693
|
-
domains.erase(options.appRoot);
|
694
|
-
}
|
695
|
-
count--;
|
696
|
-
active--;
|
697
|
-
activeOrMaxChanged.notify_all();
|
698
|
-
P_ASSERT(verifyState(), Application::SessionPtr(),
|
699
|
-
"State is valid: " << toString(false));
|
700
|
-
if (attempt == MAX_GET_ATTEMPTS) {
|
701
|
-
string message("Cannot connect to an existing "
|
702
|
-
"application instance for '");
|
703
|
-
message.append(options.appRoot);
|
704
|
-
message.append("': ");
|
705
|
-
try {
|
706
|
-
const SystemException &syse =
|
707
|
-
dynamic_cast<const SystemException &>(e);
|
708
|
-
message.append(syse.sys());
|
709
|
-
} catch (const bad_cast &) {
|
710
|
-
message.append(e.what());
|
711
|
-
}
|
712
|
-
throw IOException(message);
|
713
|
-
}
|
714
|
-
}
|
715
|
-
}
|
716
|
-
// Never reached; shut up compiler warning
|
717
|
-
return Application::SessionPtr();
|
718
|
-
}
|
719
|
-
|
720
|
-
virtual void clear() {
|
721
|
-
boost::mutex::scoped_lock l(lock);
|
722
|
-
domains.clear();
|
723
|
-
inactiveApps.clear();
|
724
|
-
appInstanceCount.clear();
|
725
|
-
count = 0;
|
726
|
-
active = 0;
|
727
|
-
activeOrMaxChanged.notify_all();
|
728
|
-
}
|
729
|
-
|
730
|
-
virtual void setMaxIdleTime(unsigned int seconds) {
|
731
|
-
boost::mutex::scoped_lock l(lock);
|
732
|
-
maxIdleTime = seconds;
|
733
|
-
cleanerThreadSleeper.notify_one();
|
734
|
-
}
|
735
|
-
|
736
|
-
virtual void setMax(unsigned int max) {
|
737
|
-
boost::mutex::scoped_lock l(lock);
|
738
|
-
this->max = max;
|
739
|
-
activeOrMaxChanged.notify_all();
|
740
|
-
}
|
741
|
-
|
742
|
-
virtual unsigned int getActive() const {
|
743
|
-
return active;
|
744
|
-
}
|
745
|
-
|
746
|
-
virtual unsigned int getCount() const {
|
747
|
-
return count;
|
748
|
-
}
|
749
|
-
|
750
|
-
virtual void setMaxPerApp(unsigned int maxPerApp) {
|
751
|
-
boost::mutex::scoped_lock l(lock);
|
752
|
-
this->maxPerApp = maxPerApp;
|
753
|
-
activeOrMaxChanged.notify_all();
|
754
|
-
}
|
755
|
-
|
756
|
-
virtual pid_t getSpawnServerPid() const {
|
757
|
-
return spawnManager.getServerPid();
|
758
|
-
}
|
759
|
-
|
760
|
-
/**
|
761
|
-
* Returns a textual description of the internal state of
|
762
|
-
* the application pool.
|
763
|
-
*/
|
764
|
-
virtual string toString(bool lockMutex = true) const {
|
765
|
-
if (lockMutex) {
|
766
|
-
unique_lock<boost::mutex> l(lock);
|
767
|
-
return toStringWithoutLock();
|
768
|
-
} else {
|
769
|
-
return toStringWithoutLock();
|
770
|
-
}
|
771
|
-
}
|
772
|
-
|
773
|
-
/**
|
774
|
-
* Returns an XML description of the internal state of the
|
775
|
-
* application pool.
|
776
|
-
*/
|
777
|
-
virtual string toXml() const {
|
778
|
-
unique_lock<boost::mutex> l(lock);
|
779
|
-
stringstream result;
|
780
|
-
DomainMap::const_iterator it;
|
781
|
-
|
782
|
-
result << "<?xml version=\"1.0\" encoding=\"iso8859-1\" ?>\n";
|
783
|
-
result << "<info>";
|
784
|
-
|
785
|
-
result << "<domains>";
|
786
|
-
for (it = domains.begin(); it != domains.end(); it++) {
|
787
|
-
Domain *domain = it->second.get();
|
788
|
-
AppContainerList *instances = &domain->instances;
|
789
|
-
AppContainerList::const_iterator lit;
|
790
|
-
|
791
|
-
result << "<domain>";
|
792
|
-
result << "<name>" << escapeForXml(it->first) << "</name>";
|
793
|
-
|
794
|
-
result << "<instances>";
|
795
|
-
for (lit = instances->begin(); lit != instances->end(); lit++) {
|
796
|
-
AppContainer *container = lit->get();
|
797
|
-
|
798
|
-
result << "<instance>";
|
799
|
-
result << "<pid>" << container->app->getPid() << "</pid>";
|
800
|
-
result << "<sessions>" << container->sessions << "</sessions>";
|
801
|
-
result << "<processed>" << container->processed << "</processed>";
|
802
|
-
result << "<uptime>" << container->uptime() << "</uptime>";
|
803
|
-
result << "</instance>";
|
804
|
-
}
|
805
|
-
result << "</instances>";
|
806
|
-
|
807
|
-
result << "</domain>";
|
808
|
-
}
|
809
|
-
result << "</domains>";
|
810
|
-
|
811
|
-
result << "</info>";
|
812
|
-
return result.str();
|
813
|
-
}
|
814
|
-
};
|
815
|
-
|
816
|
-
typedef shared_ptr<StandardApplicationPool> StandardApplicationPoolPtr;
|
817
|
-
|
818
|
-
} // namespace Passenger
|
819
|
-
|
820
|
-
#endif /* _PASSENGER_STANDARD_APPLICATION_POOL_H_ */
|
821
|
-
|