passenger 2.2.9 → 2.2.10
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/NEWS +10 -0
- data/doc/Architectural overview.html +202 -65
- data/doc/Security of user switching support.html +200 -63
- data/doc/Users guide Apache.html +266 -129
- data/doc/Users guide Nginx.html +234 -97
- data/doc/cxxapi/AbstractSpawnManager_8h-source.html +138 -0
- data/doc/cxxapi/Account_8h-source.html +202 -0
- data/doc/cxxapi/AccountsDatabase_8h-source.html +158 -0
- data/doc/cxxapi/AgentsStarter_8h-source.html +79 -0
- data/doc/cxxapi/BCrypt_8h-source.html +101 -0
- data/doc/cxxapi/BacktracesServer_8h-source.html +87 -0
- data/doc/cxxapi/Base64_8h-source.html +85 -0
- data/doc/cxxapi/Blowfish_8h-source.html +131 -0
- data/doc/cxxapi/Bucket_8h-source.html +1 -1
- data/doc/cxxapi/CachedFileStat_8h-source.html +49 -157
- data/doc/cxxapi/Configuration_8h-source.html +1 -1
- data/doc/cxxapi/Constants_8h-source.html +71 -0
- data/doc/cxxapi/ContentHandler_8h-source.html +92 -0
- data/doc/cxxapi/DirectoryMapper_8h-source.html +1 -1
- data/doc/cxxapi/Exceptions_8h-source.html +332 -236
- data/doc/cxxapi/FileChangeChecker_8h-source.html +237 -0
- data/doc/cxxapi/FileDescriptor_8h-source.html +206 -0
- data/doc/cxxapi/Hooks_8h-source.html +1 -1
- data/doc/cxxapi/HttpStatusExtractor_8h-source.html +378 -0
- data/doc/cxxapi/LoggingServer_8h-source.html +165 -0
- data/doc/cxxapi/Logging_8h-source.html +580 -112
- data/doc/cxxapi/MessageChannel_8h-source.html +789 -599
- data/doc/cxxapi/MessageClient_8h-source.html +297 -0
- data/doc/cxxapi/MessageServer_8h-source.html +607 -0
- data/doc/cxxapi/PoolOptions_8h-source.html +471 -278
- data/doc/cxxapi/Process_8h-source.html +272 -0
- data/doc/cxxapi/RandomGenerator_8h-source.html +156 -0
- data/doc/cxxapi/ResourceLocator_8h-source.html +104 -0
- data/doc/cxxapi/ScgiRequestParser_8h-source.html +399 -0
- data/doc/cxxapi/ServerInstanceDir_8h-source.html +356 -0
- data/doc/cxxapi/Session_8h-source.html +483 -0
- data/doc/cxxapi/SpawnManager_8h-source.html +590 -546
- data/doc/cxxapi/StaticContentHandler_8h-source.html +65 -0
- data/doc/cxxapi/StaticString_8h-source.html +214 -0
- data/doc/cxxapi/StringListCreator_8h-source.html +111 -0
- data/doc/cxxapi/SystemTime_8h-source.html +191 -78
- data/doc/cxxapi/Timer_8h-source.html +157 -0
- data/doc/cxxapi/Utils_8h-source.html +621 -434
- data/doc/cxxapi/Version_8h-source.html +59 -0
- data/doc/cxxapi/annotated.html +1 -1
- data/doc/cxxapi/apache2_2Configuration_8h-source.html +79 -0
- data/doc/cxxapi/classAgentWatcher-members.html +50 -0
- data/doc/cxxapi/classAgentWatcher.html +445 -0
- data/doc/cxxapi/classClient-members.html +4 -3
- data/doc/cxxapi/classClient.html +50 -46
- data/doc/cxxapi/classHooks-members.html +1 -1
- data/doc/cxxapi/classHooks.html +1 -1
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager.html +191 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1AbstractSpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/{classPassenger_1_1DummySpawnManager-members.html → classPassenger_1_1ArgumentException-members.html} +3 -2
- data/doc/cxxapi/classPassenger_1_1ArgumentException.html +52 -0
- data/doc/cxxapi/classPassenger_1_1BacktracesServer-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1BacktracesServer.html +107 -0
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1BacktracesServer__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1BufferedUpload-members.html +3 -3
- data/doc/cxxapi/classPassenger_1_1BufferedUpload.html +18 -34
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1BusyException.html +3 -2
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +3 -2
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +1 -1
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +1 -1
- data/doc/cxxapi/{classPassenger_1_1FileChecker-members.html → classPassenger_1_1EOFException-members.html} +3 -4
- data/doc/cxxapi/classPassenger_1_1EOFException.html +57 -0
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1EOFException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1EventFd-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1EventFd.html +49 -0
- data/doc/cxxapi/classPassenger_1_1FileChangeChecker-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1FileChangeChecker.html +166 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +159 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +3 -2
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +3 -2
- data/doc/cxxapi/{classPassenger_1_1ApplicationPoolServer-members.html → classPassenger_1_1HttpStatusExtractor-members.html} +6 -5
- data/doc/cxxapi/classPassenger_1_1HttpStatusExtractor.html +128 -0
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1IOException.html +4 -3
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.map +2 -1
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.md5 +1 -1
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1MemZeroGuard.html +147 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +12 -5
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +267 -34
- data/doc/cxxapi/classPassenger_1_1MessageServer-members.html +46 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer.html +438 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext.html +56 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1ClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext-members.html +38 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext.html +175 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1CommonClientContext__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler-members.html +36 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler.html +176 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1MessageServer_1_1Handler__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Process-members.html +40 -0
- data/doc/cxxapi/classPassenger_1_1Process.html +266 -0
- data/doc/cxxapi/classPassenger_1_1RandomGenerator-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1RandomGenerator.html +51 -0
- data/doc/cxxapi/classPassenger_1_1RuntimeException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1RuntimeException.html +3 -2
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser-members.html +47 -0
- data/doc/cxxapi/classPassenger_1_1ScgiRequestParser.html +302 -0
- data/doc/cxxapi/classPassenger_1_1SecurityException-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1SecurityException.html +52 -0
- data/doc/cxxapi/classPassenger_1_1Session-members.html +50 -0
- data/doc/cxxapi/classPassenger_1_1Session.html +577 -0
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1Session__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +5 -4
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +8 -5
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +127 -45
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1SpawnManager__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession-members.html +51 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession.html +415 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1StandardSession__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1StaticString-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1StaticString.html +54 -0
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -1
- data/doc/cxxapi/classPassenger_1_1SystemException.html +4 -3
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.md5 +1 -1
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SystemTime-members.html +9 -1
- data/doc/cxxapi/classPassenger_1_1SystemTime.html +92 -8
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException-members.html +37 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException.html +57 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.map +1 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.md5 +1 -0
- data/doc/cxxapi/classPassenger_1_1TimeRetrievalException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException-members.html +33 -0
- data/doc/cxxapi/classPassenger_1_1TimeoutException.html +50 -0
- data/doc/cxxapi/{classPassenger_1_1Application-members.html → classPassenger_1_1Timer-members.html} +8 -7
- data/doc/cxxapi/classPassenger_1_1Timer.html +163 -0
- data/doc/cxxapi/classServer-members.html +33 -0
- data/doc/cxxapi/classServer.html +46 -0
- data/doc/cxxapi/classServerInstanceDirToucher-members.html +33 -0
- data/doc/cxxapi/classServerInstanceDirToucher.html +43 -0
- data/doc/cxxapi/classes.html +1 -1
- data/doc/cxxapi/definitions_8h-source.html +1 -1
- data/doc/cxxapi/files.html +1 -1
- data/doc/cxxapi/functions.html +1 -1
- data/doc/cxxapi/{functions_type.html → functions_enum.html} +7 -5
- data/doc/cxxapi/functions_eval.html +55 -0
- data/doc/cxxapi/functions_func.html +1 -1
- data/doc/cxxapi/functions_vars.html +106 -9
- data/doc/cxxapi/graph_legend.html +1 -1
- data/doc/cxxapi/group__Configuration.html +1 -1
- data/doc/cxxapi/group__Core.html +1 -1
- data/doc/cxxapi/group__Exceptions.html +17 -1
- data/doc/cxxapi/group__Hooks.html +1 -1
- data/doc/cxxapi/group__Support.html +1 -1
- data/doc/cxxapi/hierarchy.html +34 -12
- data/doc/cxxapi/inherit__graph__0.map +1 -1
- data/doc/cxxapi/inherit__graph__0.md5 +1 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +1 -1
- data/doc/cxxapi/inherit__graph__1.md5 +1 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +1 -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 +1 -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 +1 -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 +1 -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 -2
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -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 +1 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.map +1 -1
- data/doc/cxxapi/inherit__graph__17.md5 +1 -1
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.map +2 -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 +1 -1
- data/doc/cxxapi/inherit__graph__19.md5 +1 -1
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +1 -1
- data/doc/cxxapi/inherit__graph__2.md5 +1 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +1 -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 +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__22.map +1 -0
- data/doc/cxxapi/inherit__graph__22.md5 +1 -0
- data/doc/cxxapi/inherit__graph__22.png +0 -0
- data/doc/cxxapi/inherit__graph__23.map +1 -0
- data/doc/cxxapi/inherit__graph__23.md5 +1 -0
- data/doc/cxxapi/inherit__graph__23.png +0 -0
- data/doc/cxxapi/inherit__graph__24.map +1 -0
- data/doc/cxxapi/inherit__graph__24.md5 +1 -0
- data/doc/cxxapi/inherit__graph__24.png +0 -0
- data/doc/cxxapi/inherit__graph__25.map +1 -0
- data/doc/cxxapi/inherit__graph__25.md5 +1 -0
- data/doc/cxxapi/inherit__graph__25.png +0 -0
- data/doc/cxxapi/inherit__graph__26.map +1 -0
- data/doc/cxxapi/inherit__graph__26.md5 +1 -0
- data/doc/cxxapi/inherit__graph__26.png +0 -0
- data/doc/cxxapi/inherit__graph__27.map +2 -0
- data/doc/cxxapi/inherit__graph__27.md5 +1 -0
- data/doc/cxxapi/inherit__graph__27.png +0 -0
- data/doc/cxxapi/inherit__graph__28.map +1 -0
- data/doc/cxxapi/inherit__graph__28.md5 +1 -0
- data/doc/cxxapi/inherit__graph__28.png +0 -0
- data/doc/cxxapi/inherit__graph__29.map +1 -0
- data/doc/cxxapi/inherit__graph__29.md5 +1 -0
- data/doc/cxxapi/inherit__graph__29.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +2 -1
- data/doc/cxxapi/inherit__graph__3.md5 +1 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__30.map +1 -0
- data/doc/cxxapi/inherit__graph__30.md5 +1 -0
- data/doc/cxxapi/inherit__graph__30.png +0 -0
- data/doc/cxxapi/inherit__graph__31.map +3 -0
- data/doc/cxxapi/inherit__graph__31.md5 +1 -0
- data/doc/cxxapi/inherit__graph__31.png +0 -0
- data/doc/cxxapi/inherit__graph__32.map +1 -0
- data/doc/cxxapi/inherit__graph__32.md5 +1 -0
- data/doc/cxxapi/inherit__graph__32.png +0 -0
- data/doc/cxxapi/inherit__graph__33.map +1 -0
- data/doc/cxxapi/inherit__graph__33.md5 +1 -0
- data/doc/cxxapi/inherit__graph__33.png +0 -0
- data/doc/cxxapi/inherit__graph__34.map +1 -0
- data/doc/cxxapi/inherit__graph__34.md5 +1 -0
- data/doc/cxxapi/inherit__graph__34.png +0 -0
- data/doc/cxxapi/inherit__graph__35.map +1 -0
- data/doc/cxxapi/inherit__graph__35.md5 +1 -0
- data/doc/cxxapi/inherit__graph__35.png +0 -0
- data/doc/cxxapi/inherit__graph__36.map +1 -0
- data/doc/cxxapi/inherit__graph__36.md5 +1 -0
- data/doc/cxxapi/inherit__graph__36.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +1 -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 +1 -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 +1 -2
- 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 +1 -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 +1 -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 +1 -1
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +81 -41
- data/doc/cxxapi/main.html +1 -1
- data/doc/cxxapi/md5_8h-source.html +121 -0
- data/doc/cxxapi/modules.html +1 -1
- data/doc/cxxapi/namespacePassenger.html +651 -0
- data/doc/cxxapi/namespacemembers.html +155 -0
- data/doc/cxxapi/namespacemembers_enum.html +46 -0
- data/doc/cxxapi/namespacemembers_eval.html +52 -0
- data/doc/cxxapi/namespacemembers_func.html +139 -0
- data/doc/cxxapi/namespacemembers_type.html +50 -0
- data/doc/cxxapi/namespaces.html +34 -0
- data/doc/cxxapi/nginx_2Configuration_8h-source.html +114 -0
- data/doc/cxxapi/ngx__http__passenger__module_8h-source.html +91 -0
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +2 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +3 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +2 -1
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +3 -2
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard-members.html +33 -0
- data/doc/cxxapi/structPassenger_1_1MessageServer_1_1DisconnectEventBroadcastGuard.html +49 -0
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +19 -7
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +323 -53
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash-members.html +33 -0
- data/doc/cxxapi/structPassenger_1_1StaticString_1_1Hash.html +49 -0
- data/ext/common/MessageChannel.h +48 -4
- data/ext/common/Version.h +1 -1
- data/ext/nginx/HttpStatusExtractor.h +1 -0
- data/ext/nginx/ScgiRequestParser.h +1 -0
- data/ext/phusion_passenger/native_support.c +5 -1
- data/lib/phusion_passenger/constants.rb +1 -1
- data/lib/phusion_passenger/message_channel.rb +45 -3
- data/lib/phusion_passenger/rack/application_spawner.rb +4 -0
- data/lib/phusion_passenger/railz/application_spawner.rb +19 -1
- data/lib/phusion_passenger/utils.rb +3 -3
- data/lib/phusion_passenger/utils/rewindable_input.rb +5 -0
- data/test/MessageChannelTest.cpp +9 -1
- data/test/stub/message_channel.rb +1 -1
- data/test/stub/message_channel_2.rb +1 -1
- data/test/stub/message_channel_3.rb +2 -2
- metadata +173 -113
- data/doc/cxxapi/ApplicationPoolServer_8h-source.html +0 -833
- data/doc/cxxapi/ApplicationPool_8h-source.html +0 -226
- data/doc/cxxapi/Application_8h-source.html +0 -553
- data/doc/cxxapi/DummySpawnManager_8h-source.html +0 -130
- data/doc/cxxapi/FileChecker_8h-source.html +0 -134
- data/doc/cxxapi/StandardApplicationPool_8h-source.html +0 -842
- data/doc/cxxapi/classPassenger_1_1Application.html +0 -231
- data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +0 -41
- data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +0 -323
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +0 -227
- data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +0 -44
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +0 -403
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +0 -53
- data/doc/cxxapi/classPassenger_1_1FileChecker.html +0 -124
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +0 -44
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +0 -342
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.map +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.md5 +0 -1
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
- data/doc/rdoc/classes/ConditionVariable.html +0 -194
- data/doc/rdoc/classes/Exception.html +0 -120
- data/doc/rdoc/classes/GC.html +0 -113
- data/doc/rdoc/classes/IO.html +0 -169
- data/doc/rdoc/classes/PhusionPassenger.html +0 -239
- data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -153
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -517
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -719
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
- data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -598
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +0 -317
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +0 -138
- data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -154
- data/doc/rdoc/classes/PhusionPassenger/Application.html +0 -283
- data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
- data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
- data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -175
- data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
- data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -489
- data/doc/rdoc/classes/PhusionPassenger/NativeSupport.html +0 -350
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -188
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -199
- data/doc/rdoc/classes/PhusionPassenger/Railz.html +0 -95
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +0 -438
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +0 -200
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +0 -436
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +0 -98
- data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +0 -155
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -402
- data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -805
- data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -247
- data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
- data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -188
- data/doc/rdoc/classes/PlatformInfo.html +0 -866
- data/doc/rdoc/classes/RakeExtensions.html +0 -197
- data/doc/rdoc/classes/Signal.html +0 -139
- data/doc/rdoc/created.rid +0 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -255
- data/doc/rdoc/files/README.html +0 -157
- data/doc/rdoc/files/ext/phusion_passenger/native_support_c.html +0 -92
- data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -129
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +0 -130
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/application_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -134
- data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
- data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -127
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -133
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/railz/application_spawner_rb.html +0 -140
- data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +0 -126
- data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +0 -145
- data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +0 -125
- data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
- data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -159
- data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -174
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -129
- data/doc/rdoc/files/misc/rake/extensions_rb.html +0 -130
- data/doc/rdoc/fr_class_index.html +0 -93
- data/doc/rdoc/fr_file_index.html +0 -77
- data/doc/rdoc/fr_method_index.html +0 -212
- data/doc/rdoc/index.html +0 -26
- data/doc/rdoc/rdoc-style.css +0 -187
@@ -1,130 +0,0 @@
|
|
1
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
-
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
3
|
-
<title>Passenger: DummySpawnManager.h Source File</title>
|
4
|
-
<link href="tabs.css" rel="stylesheet" type="text/css">
|
5
|
-
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
6
|
-
</head><body>
|
7
|
-
<!-- Generated by Doxygen 1.5.8 -->
|
8
|
-
<div class="navigation" id="top">
|
9
|
-
<div class="tabs">
|
10
|
-
<ul>
|
11
|
-
<li><a href="main.html"><span>Main Page</span></a></li>
|
12
|
-
<li><a href="modules.html"><span>Modules</span></a></li>
|
13
|
-
<li><a href="annotated.html"><span>Classes</span></a></li>
|
14
|
-
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
15
|
-
</ul>
|
16
|
-
</div>
|
17
|
-
<div class="tabs">
|
18
|
-
<ul>
|
19
|
-
<li><a href="files.html"><span>File List</span></a></li>
|
20
|
-
</ul>
|
21
|
-
</div>
|
22
|
-
<h1>DummySpawnManager.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
|
23
|
-
<a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
|
24
|
-
<a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
|
25
|
-
<a name="l00004"></a>00004 <span class="comment"> *</span>
|
26
|
-
<a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.</span>
|
27
|
-
<a name="l00006"></a>00006 <span class="comment"> *</span>
|
28
|
-
<a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
|
29
|
-
<a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
|
30
|
-
<a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
|
31
|
-
<a name="l00010"></a>00010 <span class="comment"> *</span>
|
32
|
-
<a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
|
33
|
-
<a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
|
34
|
-
<a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
|
35
|
-
<a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
|
36
|
-
<a name="l00015"></a>00015 <span class="comment"> *</span>
|
37
|
-
<a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
|
38
|
-
<a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
|
39
|
-
<a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
|
40
|
-
<a name="l00019"></a>00019 <span class="comment"> */</span>
|
41
|
-
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_DUMMY_SPAWN_MANAGER_H_</span>
|
42
|
-
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_DUMMY_SPAWN_MANAGER_H_</span>
|
43
|
-
<a name="l00022"></a>00022 <span class="preprocessor"></span>
|
44
|
-
<a name="l00023"></a>00023 <span class="comment">// TODO: make this path not hardcoded</span>
|
45
|
-
<a name="l00024"></a>00024 <span class="preprocessor">#define DUMMY_REQUEST_HANDLER_EXECUTABLE "/home/hongli/Projects/passenger/benchmark/DummyRequestHandler"</span>
|
46
|
-
<a name="l00025"></a>00025 <span class="preprocessor"></span>
|
47
|
-
<a name="l00026"></a>00026 <span class="preprocessor">#include <string></span>
|
48
|
-
<a name="l00027"></a>00027
|
49
|
-
<a name="l00028"></a>00028 <span class="preprocessor">#include <sys/types.h></span>
|
50
|
-
<a name="l00029"></a>00029 <span class="preprocessor">#include <sys/wait.h></span>
|
51
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include <cstdio></span>
|
52
|
-
<a name="l00031"></a>00031 <span class="preprocessor">#include <unistd.h></span>
|
53
|
-
<a name="l00032"></a>00032 <span class="preprocessor">#include <errno.h></span>
|
54
|
-
<a name="l00033"></a>00033
|
55
|
-
<a name="l00034"></a>00034 <span class="preprocessor">#include "Application.h"</span>
|
56
|
-
<a name="l00035"></a>00035 <span class="preprocessor">#include "Exceptions.h"</span>
|
57
|
-
<a name="l00036"></a>00036
|
58
|
-
<a name="l00037"></a>00037 <span class="keyword">namespace </span>Passenger {
|
59
|
-
<a name="l00038"></a>00038
|
60
|
-
<a name="l00039"></a>00039 <span class="keyword">using namespace </span>std;
|
61
|
-
<a name="l00040"></a>00040 <span class="comment"></span>
|
62
|
-
<a name="l00041"></a>00041 <span class="comment">/**</span>
|
63
|
-
<a name="l00042"></a>00042 <span class="comment"> * A dummy SpawnManager replacement for testing/debugging purposes.</span>
|
64
|
-
<a name="l00043"></a>00043 <span class="comment"> *</span>
|
65
|
-
<a name="l00044"></a>00044 <span class="comment"> * This class implements a dummy spawn manager, and is 100% interface-compatible with</span>
|
66
|
-
<a name="l00045"></a>00045 <span class="comment"> * SpawnManager. This spawn manager will spawn <tt>benchmark/DummyRequestHandler</tt>,</span>
|
67
|
-
<a name="l00046"></a>00046 <span class="comment"> * which is probably the fastest possible implementation of a request handler. The purpose</span>
|
68
|
-
<a name="l00047"></a>00047 <span class="comment"> * of this class to benchmark the performance of the Apache module (i.e. not benchmarking</span>
|
69
|
-
<a name="l00048"></a>00048 <span class="comment"> * the Ruby request handler or Rails itself).</span>
|
70
|
-
<a name="l00049"></a>00049 <span class="comment"> *</span>
|
71
|
-
<a name="l00050"></a>00050 <span class="comment"> * This header file is not used by default. Define the macro <tt>PASSENGER_USE_DUMMY_SPAWN_MANAGER</tt></span>
|
72
|
-
<a name="l00051"></a>00051 <span class="comment"> * to make ApplicationPool use DummySpawnManager instead of SpawnManager.</span>
|
73
|
-
<a name="l00052"></a>00052 <span class="comment"> *</span>
|
74
|
-
<a name="l00053"></a>00053 <span class="comment"> * Of course, don't forget to compile benchmark/DummyRequestHandler!</span>
|
75
|
-
<a name="l00054"></a>00054 <span class="comment"> *</span>
|
76
|
-
<a name="l00055"></a>00055 <span class="comment"> * @ingroup Support</span>
|
77
|
-
<a name="l00056"></a>00056 <span class="comment"> */</span>
|
78
|
-
<a name="l00057"></a><a class="code" href="classPassenger_1_1DummySpawnManager.html">00057</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1DummySpawnManager.html" title="A dummy SpawnManager replacement for testing/debugging purposes.">DummySpawnManager</a> {
|
79
|
-
<a name="l00058"></a>00058 <span class="keyword">public</span>:
|
80
|
-
<a name="l00059"></a>00059 ApplicationPtr spawn(<span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot, <span class="keyword">const</span> <span class="keywordtype">string</span> &user = <span class="stringliteral">""</span>, <span class="keyword">const</span> <span class="keywordtype">string</span> &group = <span class="stringliteral">""</span>) {
|
81
|
-
<a name="l00060"></a>00060 <span class="keywordtype">int</span> fds[2];
|
82
|
-
<a name="l00061"></a>00061 pid_t pid;
|
83
|
-
<a name="l00062"></a>00062
|
84
|
-
<a name="l00063"></a>00063 <span class="keywordflow">if</span>(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
|
85
|
-
<a name="l00064"></a>00064 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Cannot create a Unix socket"</span>, errno);
|
86
|
-
<a name="l00065"></a>00065 }
|
87
|
-
<a name="l00066"></a>00066 pid = fork();
|
88
|
-
<a name="l00067"></a>00067 <span class="keywordflow">if</span> (pid == 0) {
|
89
|
-
<a name="l00068"></a>00068 pid = fork();
|
90
|
-
<a name="l00069"></a>00069 <span class="keywordflow">if</span> (pid == 0) {
|
91
|
-
<a name="l00070"></a>00070 dup2(fds[0], STDIN_FILENO);
|
92
|
-
<a name="l00071"></a>00071 close(fds[0]);
|
93
|
-
<a name="l00072"></a>00072 close(fds[1]);
|
94
|
-
<a name="l00073"></a>00073 execlp(DUMMY_REQUEST_HANDLER_EXECUTABLE, DUMMY_REQUEST_HANDLER_EXECUTABLE, NULL);
|
95
|
-
<a name="l00074"></a>00074 <span class="keywordtype">int</span> e = errno;
|
96
|
-
<a name="l00075"></a>00075 fprintf(stderr, <span class="stringliteral">"Unable to run %s: %s\n"</span>, DUMMY_REQUEST_HANDLER_EXECUTABLE, strerror(e));
|
97
|
-
<a name="l00076"></a>00076 fflush(stderr);
|
98
|
-
<a name="l00077"></a>00077 _exit(1);
|
99
|
-
<a name="l00078"></a>00078 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pid == -1) {
|
100
|
-
<a name="l00079"></a>00079 perror(<span class="stringliteral">"Cannot fork a new process"</span>);
|
101
|
-
<a name="l00080"></a>00080 fflush(stderr);
|
102
|
-
<a name="l00081"></a>00081 _exit(1);
|
103
|
-
<a name="l00082"></a>00082 } <span class="keywordflow">else</span> {
|
104
|
-
<a name="l00083"></a>00083 _exit(0);
|
105
|
-
<a name="l00084"></a>00084 }
|
106
|
-
<a name="l00085"></a>00085 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pid == -1) {
|
107
|
-
<a name="l00086"></a>00086 close(fds[0]);
|
108
|
-
<a name="l00087"></a>00087 close(fds[1]);
|
109
|
-
<a name="l00088"></a>00088 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Cannot fork a new process"</span>, errno);
|
110
|
-
<a name="l00089"></a>00089 } <span class="keywordflow">else</span> {
|
111
|
-
<a name="l00090"></a>00090 close(fds[0]);
|
112
|
-
<a name="l00091"></a>00091 waitpid(pid, NULL, 0);
|
113
|
-
<a name="l00092"></a>00092 <span class="keywordflow">return</span> ApplicationPtr(<span class="keyword">new</span> <a class="code" href="classPassenger_1_1Application.html" title="Represents a single Ruby on Rails or Rack application instance.">Application</a>(appRoot, pid, fds[1]));
|
114
|
-
<a name="l00093"></a>00093 }
|
115
|
-
<a name="l00094"></a>00094 }
|
116
|
-
<a name="l00095"></a>00095
|
117
|
-
<a name="l00096"></a>00096 pid_t getServerPid()<span class="keyword"> const </span>{
|
118
|
-
<a name="l00097"></a>00097 <span class="keywordflow">return</span> 0;
|
119
|
-
<a name="l00098"></a>00098 }
|
120
|
-
<a name="l00099"></a>00099 };
|
121
|
-
<a name="l00100"></a>00100
|
122
|
-
<a name="l00101"></a>00101 } <span class="comment">// namespace Passenger</span>
|
123
|
-
<a name="l00102"></a>00102
|
124
|
-
<a name="l00103"></a>00103 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_DUMMY_SPAWN_MANAGER_H_ */</span>
|
125
|
-
</pre></div></div>
|
126
|
-
<hr size="1"><address style="text-align: right;"><small>Generated on Wed Apr 8 22:35:10 2009 for Passenger by
|
127
|
-
<a href="http://www.doxygen.org/index.html">
|
128
|
-
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
|
129
|
-
</body>
|
130
|
-
</html>
|
@@ -1,134 +0,0 @@
|
|
1
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
-
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
3
|
-
<title>Passenger: FileChecker.h Source File</title>
|
4
|
-
<link href="tabs.css" rel="stylesheet" type="text/css">
|
5
|
-
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
6
|
-
</head><body>
|
7
|
-
<!-- Generated by Doxygen 1.5.8 -->
|
8
|
-
<div class="navigation" id="top">
|
9
|
-
<div class="tabs">
|
10
|
-
<ul>
|
11
|
-
<li><a href="main.html"><span>Main Page</span></a></li>
|
12
|
-
<li><a href="modules.html"><span>Modules</span></a></li>
|
13
|
-
<li><a href="annotated.html"><span>Classes</span></a></li>
|
14
|
-
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
15
|
-
</ul>
|
16
|
-
</div>
|
17
|
-
<div class="tabs">
|
18
|
-
<ul>
|
19
|
-
<li><a href="files.html"><span>File List</span></a></li>
|
20
|
-
</ul>
|
21
|
-
</div>
|
22
|
-
<h1>FileChecker.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
|
23
|
-
<a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
|
24
|
-
<a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2009 Phusion</span>
|
25
|
-
<a name="l00004"></a>00004 <span class="comment"> *</span>
|
26
|
-
<a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.</span>
|
27
|
-
<a name="l00006"></a>00006 <span class="comment"> *</span>
|
28
|
-
<a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
|
29
|
-
<a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
|
30
|
-
<a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
|
31
|
-
<a name="l00010"></a>00010 <span class="comment"> *</span>
|
32
|
-
<a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
|
33
|
-
<a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
|
34
|
-
<a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
|
35
|
-
<a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
|
36
|
-
<a name="l00015"></a>00015 <span class="comment"> *</span>
|
37
|
-
<a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
|
38
|
-
<a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
|
39
|
-
<a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
|
40
|
-
<a name="l00019"></a>00019 <span class="comment"> */</span>
|
41
|
-
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_FILE_CHECKER_H_</span>
|
42
|
-
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_FILE_CHECKER_H_</span>
|
43
|
-
<a name="l00022"></a>00022 <span class="preprocessor"></span>
|
44
|
-
<a name="l00023"></a>00023 <span class="preprocessor">#include <string></span>
|
45
|
-
<a name="l00024"></a>00024
|
46
|
-
<a name="l00025"></a>00025 <span class="preprocessor">#include <oxt/system_calls.hpp></span>
|
47
|
-
<a name="l00026"></a>00026
|
48
|
-
<a name="l00027"></a>00027 <span class="preprocessor">#include <sys/stat.h></span>
|
49
|
-
<a name="l00028"></a>00028 <span class="preprocessor">#include <errno.h></span>
|
50
|
-
<a name="l00029"></a>00029
|
51
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include "CachedFileStat.h"</span>
|
52
|
-
<a name="l00031"></a>00031 <span class="preprocessor">#include "SystemTime.h"</span>
|
53
|
-
<a name="l00032"></a>00032
|
54
|
-
<a name="l00033"></a>00033 <span class="keyword">namespace </span>Passenger {
|
55
|
-
<a name="l00034"></a>00034
|
56
|
-
<a name="l00035"></a>00035 <span class="keyword">using namespace </span>std;
|
57
|
-
<a name="l00036"></a>00036 <span class="keyword">using namespace </span>oxt;
|
58
|
-
<a name="l00037"></a>00037 <span class="comment"></span>
|
59
|
-
<a name="l00038"></a>00038 <span class="comment">/**</span>
|
60
|
-
<a name="l00039"></a>00039 <span class="comment"> * Utility class for checking for file changes. Example:</span>
|
61
|
-
<a name="l00040"></a>00040 <span class="comment"> *</span>
|
62
|
-
<a name="l00041"></a>00041 <span class="comment"> * @code</span>
|
63
|
-
<a name="l00042"></a>00042 <span class="comment"> * FileChecker checker("foo.txt");</span>
|
64
|
-
<a name="l00043"></a>00043 <span class="comment"> * checker.changed(); // false</span>
|
65
|
-
<a name="l00044"></a>00044 <span class="comment"> * writeToFile("foo.txt");</span>
|
66
|
-
<a name="l00045"></a>00045 <span class="comment"> * checker.changed(); // true</span>
|
67
|
-
<a name="l00046"></a>00046 <span class="comment"> * checker.changed(); // false</span>
|
68
|
-
<a name="l00047"></a>00047 <span class="comment"> * @endcode</span>
|
69
|
-
<a name="l00048"></a>00048 <span class="comment"> *</span>
|
70
|
-
<a name="l00049"></a>00049 <span class="comment"> * FileChecker uses stat() to retrieve file information. FileChecker also</span>
|
71
|
-
<a name="l00050"></a>00050 <span class="comment"> * supports throttling in order to limit the number of stat() calls. This</span>
|
72
|
-
<a name="l00051"></a>00051 <span class="comment"> * can improve performance on systems where disk I/O is a problem.</span>
|
73
|
-
<a name="l00052"></a>00052 <span class="comment"> */</span>
|
74
|
-
<a name="l00053"></a><a class="code" href="classPassenger_1_1FileChecker.html">00053</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1FileChecker.html" title="Utility class for checking for file changes.">FileChecker</a> {
|
75
|
-
<a name="l00054"></a>00054 <span class="keyword">private</span>:
|
76
|
-
<a name="l00055"></a>00055 CachedFileStat cstat;
|
77
|
-
<a name="l00056"></a>00056 time_t lastMtime;
|
78
|
-
<a name="l00057"></a>00057 time_t lastCtime;
|
79
|
-
<a name="l00058"></a>00058
|
80
|
-
<a name="l00059"></a>00059 <span class="keyword">public</span>:<span class="comment"></span>
|
81
|
-
<a name="l00060"></a>00060 <span class="comment"> /**</span>
|
82
|
-
<a name="l00061"></a>00061 <span class="comment"> * Create a FileChecker object.</span>
|
83
|
-
<a name="l00062"></a>00062 <span class="comment"> *</span>
|
84
|
-
<a name="l00063"></a>00063 <span class="comment"> * @param filename The filename to check for.</span>
|
85
|
-
<a name="l00064"></a>00064 <span class="comment"> */</span>
|
86
|
-
<a name="l00065"></a><a class="code" href="classPassenger_1_1FileChecker.html#64556bc7e06a32363dbd87451d459b71">00065</a> <a class="code" href="classPassenger_1_1FileChecker.html#64556bc7e06a32363dbd87451d459b71" title="Create a FileChecker object.">FileChecker</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &filename)
|
87
|
-
<a name="l00066"></a>00066 : cstat(filename)
|
88
|
-
<a name="l00067"></a>00067 {
|
89
|
-
<a name="l00068"></a>00068 lastMtime = 0;
|
90
|
-
<a name="l00069"></a>00069 lastCtime = 0;
|
91
|
-
<a name="l00070"></a>00070 <a class="code" href="classPassenger_1_1FileChecker.html#832ff27b4b3e5db84a9d986285e7c270" title="Checks whether the file&#39;s timestamp has changed or has been created or removed...">changed</a>();
|
92
|
-
<a name="l00071"></a>00071 }
|
93
|
-
<a name="l00072"></a>00072 <span class="comment"></span>
|
94
|
-
<a name="l00073"></a>00073 <span class="comment"> /**</span>
|
95
|
-
<a name="l00074"></a>00074 <span class="comment"> * Checks whether the file's timestamp has changed or has been created</span>
|
96
|
-
<a name="l00075"></a>00075 <span class="comment"> * or removed since the last call to changed().</span>
|
97
|
-
<a name="l00076"></a>00076 <span class="comment"> *</span>
|
98
|
-
<a name="l00077"></a>00077 <span class="comment"> * @param throttleRate When set to a non-zero value, throttling will be</span>
|
99
|
-
<a name="l00078"></a>00078 <span class="comment"> * enabled. stat() will be called at most once per</span>
|
100
|
-
<a name="l00079"></a>00079 <span class="comment"> * throttleRate seconds.</span>
|
101
|
-
<a name="l00080"></a>00080 <span class="comment"> * @throws SystemException Something went wrong while retrieving the</span>
|
102
|
-
<a name="l00081"></a>00081 <span class="comment"> * system time. stat() errors will <em>not</em> result in SystemException</span>
|
103
|
-
<a name="l00082"></a>00082 <span class="comment"> * being thrown.</span>
|
104
|
-
<a name="l00083"></a>00083 <span class="comment"> * @throws boost::thread_interrupted</span>
|
105
|
-
<a name="l00084"></a>00084 <span class="comment"> */</span>
|
106
|
-
<a name="l00085"></a><a class="code" href="classPassenger_1_1FileChecker.html#832ff27b4b3e5db84a9d986285e7c270">00085</a> <span class="keywordtype">bool</span> <a class="code" href="classPassenger_1_1FileChecker.html#832ff27b4b3e5db84a9d986285e7c270" title="Checks whether the file&#39;s timestamp has changed or has been created or removed...">changed</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> throttleRate = 0) {
|
107
|
-
<a name="l00086"></a>00086 <span class="keywordtype">int</span> ret;
|
108
|
-
<a name="l00087"></a>00087 time_t ctime, mtime;
|
109
|
-
<a name="l00088"></a>00088 <span class="keywordtype">bool</span> result;
|
110
|
-
<a name="l00089"></a>00089
|
111
|
-
<a name="l00090"></a>00090 ret = cstat.refresh(throttleRate);
|
112
|
-
<a name="l00091"></a>00091 <span class="keywordflow">if</span> (ret == -1) {
|
113
|
-
<a name="l00092"></a>00092 ctime = 0;
|
114
|
-
<a name="l00093"></a>00093 mtime = 0;
|
115
|
-
<a name="l00094"></a>00094 } <span class="keywordflow">else</span> {
|
116
|
-
<a name="l00095"></a>00095 ctime = cstat.info.st_ctime;
|
117
|
-
<a name="l00096"></a>00096 mtime = cstat.info.st_mtime;
|
118
|
-
<a name="l00097"></a>00097 }
|
119
|
-
<a name="l00098"></a>00098 result = lastMtime != mtime || lastCtime != ctime;
|
120
|
-
<a name="l00099"></a>00099 lastMtime = mtime;
|
121
|
-
<a name="l00100"></a>00100 lastCtime = ctime;
|
122
|
-
<a name="l00101"></a>00101 <span class="keywordflow">return</span> result;
|
123
|
-
<a name="l00102"></a>00102 }
|
124
|
-
<a name="l00103"></a>00103 };
|
125
|
-
<a name="l00104"></a>00104
|
126
|
-
<a name="l00105"></a>00105 } <span class="comment">// namespace Passenger</span>
|
127
|
-
<a name="l00106"></a>00106
|
128
|
-
<a name="l00107"></a>00107 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_FILE_CHECKER_H_ */</span>
|
129
|
-
</pre></div></div>
|
130
|
-
<hr size="1"><address style="text-align: right;"><small>Generated on Wed Apr 8 22:35:10 2009 for Passenger by
|
131
|
-
<a href="http://www.doxygen.org/index.html">
|
132
|
-
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
|
133
|
-
</body>
|
134
|
-
</html>
|
@@ -1,842 +0,0 @@
|
|
1
|
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
-
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
3
|
-
<title>Passenger: StandardApplicationPool.h Source File</title>
|
4
|
-
<link href="tabs.css" rel="stylesheet" type="text/css">
|
5
|
-
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
6
|
-
</head><body>
|
7
|
-
<!-- Generated by Doxygen 1.5.8 -->
|
8
|
-
<div class="navigation" id="top">
|
9
|
-
<div class="tabs">
|
10
|
-
<ul>
|
11
|
-
<li><a href="main.html"><span>Main Page</span></a></li>
|
12
|
-
<li><a href="modules.html"><span>Modules</span></a></li>
|
13
|
-
<li><a href="annotated.html"><span>Classes</span></a></li>
|
14
|
-
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
15
|
-
</ul>
|
16
|
-
</div>
|
17
|
-
<div class="tabs">
|
18
|
-
<ul>
|
19
|
-
<li><a href="files.html"><span>File List</span></a></li>
|
20
|
-
</ul>
|
21
|
-
</div>
|
22
|
-
<h1>StandardApplicationPool.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
|
23
|
-
<a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
|
24
|
-
<a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
|
25
|
-
<a name="l00004"></a>00004 <span class="comment"> *</span>
|
26
|
-
<a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.</span>
|
27
|
-
<a name="l00006"></a>00006 <span class="comment"> *</span>
|
28
|
-
<a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
|
29
|
-
<a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
|
30
|
-
<a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
|
31
|
-
<a name="l00010"></a>00010 <span class="comment"> *</span>
|
32
|
-
<a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
|
33
|
-
<a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
|
34
|
-
<a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
|
35
|
-
<a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
|
36
|
-
<a name="l00015"></a>00015 <span class="comment"> *</span>
|
37
|
-
<a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
|
38
|
-
<a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
|
39
|
-
<a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
|
40
|
-
<a name="l00019"></a>00019 <span class="comment"> */</span>
|
41
|
-
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_STANDARD_APPLICATION_POOL_H_</span>
|
42
|
-
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_STANDARD_APPLICATION_POOL_H_</span>
|
43
|
-
<a name="l00022"></a>00022 <span class="preprocessor"></span>
|
44
|
-
<a name="l00023"></a>00023 <span class="preprocessor">#include <boost/shared_ptr.hpp></span>
|
45
|
-
<a name="l00024"></a>00024 <span class="preprocessor">#include <boost/weak_ptr.hpp></span>
|
46
|
-
<a name="l00025"></a>00025 <span class="preprocessor">#include <boost/thread.hpp></span>
|
47
|
-
<a name="l00026"></a>00026 <span class="preprocessor">#include <boost/bind.hpp></span>
|
48
|
-
<a name="l00027"></a>00027 <span class="preprocessor">#include <boost/date_time/microsec_time_clock.hpp></span>
|
49
|
-
<a name="l00028"></a>00028 <span class="preprocessor">#include <boost/date_time/posix_time/posix_time.hpp></span>
|
50
|
-
<a name="l00029"></a>00029
|
51
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include <oxt/system_calls.hpp></span>
|
52
|
-
<a name="l00031"></a>00031 <span class="preprocessor">#include <oxt/backtrace.hpp></span>
|
53
|
-
<a name="l00032"></a>00032
|
54
|
-
<a name="l00033"></a>00033 <span class="preprocessor">#include <string></span>
|
55
|
-
<a name="l00034"></a>00034 <span class="preprocessor">#include <sstream></span>
|
56
|
-
<a name="l00035"></a>00035 <span class="preprocessor">#include <map></span>
|
57
|
-
<a name="l00036"></a>00036 <span class="preprocessor">#include <list></span>
|
58
|
-
<a name="l00037"></a>00037
|
59
|
-
<a name="l00038"></a>00038 <span class="preprocessor">#include <sys/types.h></span>
|
60
|
-
<a name="l00039"></a>00039 <span class="preprocessor">#include <sys/stat.h></span>
|
61
|
-
<a name="l00040"></a>00040 <span class="preprocessor">#include <stdio.h></span>
|
62
|
-
<a name="l00041"></a>00041 <span class="preprocessor">#include <unistd.h></span>
|
63
|
-
<a name="l00042"></a>00042 <span class="preprocessor">#include <ctime></span>
|
64
|
-
<a name="l00043"></a>00043 <span class="preprocessor">#include <cerrno></span>
|
65
|
-
<a name="l00044"></a>00044 <span class="preprocessor">#ifdef TESTING_APPLICATION_POOL</span>
|
66
|
-
<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor"> #include <cstdlib></span>
|
67
|
-
<a name="l00046"></a>00046 <span class="preprocessor">#endif</span>
|
68
|
-
<a name="l00047"></a>00047 <span class="preprocessor"></span>
|
69
|
-
<a name="l00048"></a>00048 <span class="preprocessor">#include "ApplicationPool.h"</span>
|
70
|
-
<a name="l00049"></a>00049 <span class="preprocessor">#include "Logging.h"</span>
|
71
|
-
<a name="l00050"></a>00050 <span class="preprocessor">#include "FileChecker.h"</span>
|
72
|
-
<a name="l00051"></a>00051 <span class="preprocessor">#include "CachedFileStat.h"</span>
|
73
|
-
<a name="l00052"></a>00052 <span class="preprocessor">#ifdef PASSENGER_USE_DUMMY_SPAWN_MANAGER</span>
|
74
|
-
<a name="l00053"></a>00053 <span class="preprocessor"></span><span class="preprocessor"> #include "DummySpawnManager.h"</span>
|
75
|
-
<a name="l00054"></a>00054 <span class="preprocessor">#else</span>
|
76
|
-
<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor"> #include "SpawnManager.h"</span>
|
77
|
-
<a name="l00056"></a>00056 <span class="preprocessor">#endif</span>
|
78
|
-
<a name="l00057"></a>00057 <span class="preprocessor"></span>
|
79
|
-
<a name="l00058"></a>00058 <span class="keyword">namespace </span>Passenger {
|
80
|
-
<a name="l00059"></a>00059
|
81
|
-
<a name="l00060"></a>00060 <span class="keyword">using namespace </span>std;
|
82
|
-
<a name="l00061"></a>00061 <span class="keyword">using namespace </span>boost;
|
83
|
-
<a name="l00062"></a>00062 <span class="keyword">using namespace </span>oxt;
|
84
|
-
<a name="l00063"></a>00063
|
85
|
-
<a name="l00064"></a>00064 <span class="keyword">class </span>ApplicationPoolServer;
|
86
|
-
<a name="l00065"></a>00065
|
87
|
-
<a name="l00066"></a>00066 <span class="comment">/****************************************************************</span>
|
88
|
-
<a name="l00067"></a>00067 <span class="comment"> *</span>
|
89
|
-
<a name="l00068"></a>00068 <span class="comment"> * See "doc/ApplicationPool algorithm.txt" for a more readable</span>
|
90
|
-
<a name="l00069"></a>00069 <span class="comment"> * and detailed description of the algorithm implemented here.</span>
|
91
|
-
<a name="l00070"></a>00070 <span class="comment"> *</span>
|
92
|
-
<a name="l00071"></a>00071 <span class="comment"> ****************************************************************/</span>
|
93
|
-
<a name="l00072"></a>00072 <span class="comment"></span>
|
94
|
-
<a name="l00073"></a>00073 <span class="comment">/**</span>
|
95
|
-
<a name="l00074"></a>00074 <span class="comment"> * A standard implementation of ApplicationPool for single-process environments.</span>
|
96
|
-
<a name="l00075"></a>00075 <span class="comment"> *</span>
|
97
|
-
<a name="l00076"></a>00076 <span class="comment"> * The environment may or may not be multithreaded - StandardApplicationPool is completely</span>
|
98
|
-
<a name="l00077"></a>00077 <span class="comment"> * thread-safe. Apache with the threading MPM is an example of a multithreaded single-process</span>
|
99
|
-
<a name="l00078"></a>00078 <span class="comment"> * environment.</span>
|
100
|
-
<a name="l00079"></a>00079 <span class="comment"> *</span>
|
101
|
-
<a name="l00080"></a>00080 <span class="comment"> * This class is unusable in multi-process environments such as Apache with the prefork MPM.</span>
|
102
|
-
<a name="l00081"></a>00081 <span class="comment"> * The reasons are as follows:</span>
|
103
|
-
<a name="l00082"></a>00082 <span class="comment"> * - StandardApplicationPool uses threads internally. Because threads disappear after a fork(),</span>
|
104
|
-
<a name="l00083"></a>00083 <span class="comment"> * a StandardApplicationPool object will become unusable after a fork().</span>
|
105
|
-
<a name="l00084"></a>00084 <span class="comment"> * - StandardApplicationPool stores its internal cache on the heap. Different processes</span>
|
106
|
-
<a name="l00085"></a>00085 <span class="comment"> * cannot share their heaps, so they will not be able to access each others' pool cache.</span>
|
107
|
-
<a name="l00086"></a>00086 <span class="comment"> * - StandardApplicationPool has a connection to the spawn server. If there are multiple</span>
|
108
|
-
<a name="l00087"></a>00087 <span class="comment"> * processes, and they all use the spawn servers's connection at the same time without</span>
|
109
|
-
<a name="l00088"></a>00088 <span class="comment"> * some sort of synchronization, then bad things will happen.</span>
|
110
|
-
<a name="l00089"></a>00089 <span class="comment"> *</span>
|
111
|
-
<a name="l00090"></a>00090 <span class="comment"> * (Of course, StandardApplicationPool <em>is</em> usable if each process creates its own</span>
|
112
|
-
<a name="l00091"></a>00091 <span class="comment"> * StandardApplicationPool object, but that would defeat the point of having a shared pool.)</span>
|
113
|
-
<a name="l00092"></a>00092 <span class="comment"> *</span>
|
114
|
-
<a name="l00093"></a>00093 <span class="comment"> * For multi-process environments, one should use ApplicationPoolServer instead.</span>
|
115
|
-
<a name="l00094"></a>00094 <span class="comment"> *</span>
|
116
|
-
<a name="l00095"></a>00095 <span class="comment"> * @ingroup Support</span>
|
117
|
-
<a name="l00096"></a>00096 <span class="comment"> */</span>
|
118
|
-
<a name="l00097"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html">00097</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1StandardApplicationPool.html" title="A standard implementation of ApplicationPool for single-process environments.">StandardApplicationPool</a>: <span class="keyword">public</span> <a class="code" href="classPassenger_1_1ApplicationPool.html" title="A persistent pool of Applications.">ApplicationPool</a> {
|
119
|
-
<a name="l00098"></a>00098 <span class="keyword">private</span>:
|
120
|
-
<a name="l00099"></a>00099 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_MAX_IDLE_TIME = 120;
|
121
|
-
<a name="l00100"></a>00100 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_MAX_POOL_SIZE = 20;
|
122
|
-
<a name="l00101"></a>00101 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> DEFAULT_MAX_INSTANCES_PER_APP = 0;
|
123
|
-
<a name="l00102"></a>00102 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> CLEANER_THREAD_STACK_SIZE = 1024 * 128;
|
124
|
-
<a name="l00103"></a>00103 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MAX_GET_ATTEMPTS = 10;
|
125
|
-
<a name="l00104"></a>00104 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GET_TIMEOUT = 5000; <span class="comment">// In milliseconds.</span>
|
126
|
-
<a name="l00105"></a>00105
|
127
|
-
<a name="l00106"></a>00106 <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classPassenger_1_1ApplicationPoolServer.html" title="Multi-process usage support for ApplicationPool.">ApplicationPoolServer</a>;
|
128
|
-
<a name="l00107"></a>00107 <span class="keyword">struct </span>Domain;
|
129
|
-
<a name="l00108"></a>00108 <span class="keyword">struct </span>AppContainer;
|
130
|
-
<a name="l00109"></a>00109
|
131
|
-
<a name="l00110"></a>00110 <span class="keyword">typedef</span> shared_ptr<Domain> DomainPtr;
|
132
|
-
<a name="l00111"></a>00111 <span class="keyword">typedef</span> shared_ptr<AppContainer> AppContainerPtr;
|
133
|
-
<a name="l00112"></a>00112 <span class="keyword">typedef</span> list<AppContainerPtr> AppContainerList;
|
134
|
-
<a name="l00113"></a>00113 <span class="keyword">typedef</span> map<string, DomainPtr> DomainMap;
|
135
|
-
<a name="l00114"></a>00114
|
136
|
-
<a name="l00115"></a>00115 <span class="keyword">struct </span>Domain {
|
137
|
-
<a name="l00116"></a>00116 AppContainerList instances;
|
138
|
-
<a name="l00117"></a>00117 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size;
|
139
|
-
<a name="l00118"></a>00118 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> maxRequests;
|
140
|
-
<a name="l00119"></a>00119 <a class="code" href="classPassenger_1_1FileChecker.html" title="Utility class for checking for file changes.">FileChecker</a> restartFileChecker;
|
141
|
-
<a name="l00120"></a>00120 CachedFileStat alwaysRestartFileStatter;
|
142
|
-
<a name="l00121"></a>00121
|
143
|
-
<a name="l00122"></a>00122 Domain(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &options)
|
144
|
-
<a name="l00123"></a>00123 : restartFileChecker(determineRestartDir(options) + <span class="stringliteral">"/restart.txt"</span>),
|
145
|
-
<a name="l00124"></a>00124 alwaysRestartFileStatter(determineRestartDir(options) + <span class="stringliteral">"/always_restart.txt"</span>)
|
146
|
-
<a name="l00125"></a>00125 {
|
147
|
-
<a name="l00126"></a>00126 }
|
148
|
-
<a name="l00127"></a>00127
|
149
|
-
<a name="l00128"></a>00128 <span class="keyword">private</span>:
|
150
|
-
<a name="l00129"></a>00129 <span class="keyword">static</span> <span class="keywordtype">string</span> determineRestartDir(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &options) {
|
151
|
-
<a name="l00130"></a>00130 <span class="keywordflow">if</span> (options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>.empty()) {
|
152
|
-
<a name="l00131"></a>00131 <span class="keywordflow">return</span> options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a> + <span class="stringliteral">"/tmp"</span>;
|
153
|
-
<a name="l00132"></a>00132 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>[0] == <span class="charliteral">'/'</span>) {
|
154
|
-
<a name="l00133"></a>00133 <span class="keywordflow">return</span> options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>;
|
155
|
-
<a name="l00134"></a>00134 } <span class="keywordflow">else</span> {
|
156
|
-
<a name="l00135"></a>00135 <span class="keywordflow">return</span> options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a> + <span class="stringliteral">"/"</span> + options.<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>;
|
157
|
-
<a name="l00136"></a>00136 }
|
158
|
-
<a name="l00137"></a>00137 }
|
159
|
-
<a name="l00138"></a>00138 };
|
160
|
-
<a name="l00139"></a>00139
|
161
|
-
<a name="l00140"></a>00140 <span class="keyword">struct </span>AppContainer {
|
162
|
-
<a name="l00141"></a>00141 ApplicationPtr app;
|
163
|
-
<a name="l00142"></a>00142 time_t startTime;
|
164
|
-
<a name="l00143"></a>00143 time_t lastUsed;
|
165
|
-
<a name="l00144"></a>00144 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sessions;
|
166
|
-
<a name="l00145"></a>00145 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> processed;
|
167
|
-
<a name="l00146"></a>00146 AppContainerList::iterator iterator;
|
168
|
-
<a name="l00147"></a>00147 AppContainerList::iterator ia_iterator;
|
169
|
-
<a name="l00148"></a>00148
|
170
|
-
<a name="l00149"></a>00149 AppContainer() {
|
171
|
-
<a name="l00150"></a>00150 startTime = time(NULL);
|
172
|
-
<a name="l00151"></a>00151 processed = 0;
|
173
|
-
<a name="l00152"></a>00152 }
|
174
|
-
<a name="l00153"></a>00153 <span class="comment"></span>
|
175
|
-
<a name="l00154"></a>00154 <span class="comment"> /**</span>
|
176
|
-
<a name="l00155"></a>00155 <span class="comment"> * Returns the uptime of this AppContainer so far, as a string.</span>
|
177
|
-
<a name="l00156"></a>00156 <span class="comment"> */</span>
|
178
|
-
<a name="l00157"></a>00157 <span class="keywordtype">string</span> uptime()<span class="keyword"> const </span>{
|
179
|
-
<a name="l00158"></a>00158 time_t seconds = time(NULL) - startTime;
|
180
|
-
<a name="l00159"></a>00159 stringstream result;
|
181
|
-
<a name="l00160"></a>00160
|
182
|
-
<a name="l00161"></a>00161 <span class="keywordflow">if</span> (seconds >= 60) {
|
183
|
-
<a name="l00162"></a>00162 time_t minutes = seconds / 60;
|
184
|
-
<a name="l00163"></a>00163 <span class="keywordflow">if</span> (minutes >= 60) {
|
185
|
-
<a name="l00164"></a>00164 time_t hours = minutes / 60;
|
186
|
-
<a name="l00165"></a>00165 minutes = minutes % 60;
|
187
|
-
<a name="l00166"></a>00166 result << hours << <span class="stringliteral">"h "</span>;
|
188
|
-
<a name="l00167"></a>00167 }
|
189
|
-
<a name="l00168"></a>00168
|
190
|
-
<a name="l00169"></a>00169 seconds = seconds % 60;
|
191
|
-
<a name="l00170"></a>00170 result << minutes << <span class="stringliteral">"m "</span>;
|
192
|
-
<a name="l00171"></a>00171 }
|
193
|
-
<a name="l00172"></a>00172 result << seconds << <span class="stringliteral">"s"</span>;
|
194
|
-
<a name="l00173"></a>00173 <span class="keywordflow">return</span> result.str();
|
195
|
-
<a name="l00174"></a>00174 }
|
196
|
-
<a name="l00175"></a>00175 };
|
197
|
-
<a name="l00176"></a>00176 <span class="comment"></span>
|
198
|
-
<a name="l00177"></a>00177 <span class="comment"> /**</span>
|
199
|
-
<a name="l00178"></a>00178 <span class="comment"> * A data structure which contains data that's shared between a</span>
|
200
|
-
<a name="l00179"></a>00179 <span class="comment"> * StandardApplicationPool and a SessionCloseCallback object.</span>
|
201
|
-
<a name="l00180"></a>00180 <span class="comment"> * This is because the StandardApplicationPool's life time could be</span>
|
202
|
-
<a name="l00181"></a>00181 <span class="comment"> * different from a SessionCloseCallback's.</span>
|
203
|
-
<a name="l00182"></a>00182 <span class="comment"> */</span>
|
204
|
-
<a name="l00183"></a>00183 <span class="keyword">struct </span>SharedData {
|
205
|
-
<a name="l00184"></a>00184 boost::mutex lock;
|
206
|
-
<a name="l00185"></a>00185 condition activeOrMaxChanged;
|
207
|
-
<a name="l00186"></a>00186
|
208
|
-
<a name="l00187"></a>00187 DomainMap domains;
|
209
|
-
<a name="l00188"></a>00188 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> max;
|
210
|
-
<a name="l00189"></a>00189 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count;
|
211
|
-
<a name="l00190"></a>00190 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> active;
|
212
|
-
<a name="l00191"></a>00191 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxPerApp;
|
213
|
-
<a name="l00192"></a>00192 AppContainerList inactiveApps;
|
214
|
-
<a name="l00193"></a>00193 map<string, unsigned int> appInstanceCount;
|
215
|
-
<a name="l00194"></a>00194 };
|
216
|
-
<a name="l00195"></a>00195
|
217
|
-
<a name="l00196"></a>00196 <span class="keyword">typedef</span> shared_ptr<SharedData> SharedDataPtr;
|
218
|
-
<a name="l00197"></a>00197 <span class="comment"></span>
|
219
|
-
<a name="l00198"></a>00198 <span class="comment"> /**</span>
|
220
|
-
<a name="l00199"></a>00199 <span class="comment"> * Function object which will be called when a session has been closed.</span>
|
221
|
-
<a name="l00200"></a>00200 <span class="comment"> */</span>
|
222
|
-
<a name="l00201"></a>00201 <span class="keyword">struct </span>SessionCloseCallback {
|
223
|
-
<a name="l00202"></a>00202 SharedDataPtr data;
|
224
|
-
<a name="l00203"></a>00203 weak_ptr<AppContainer> container;
|
225
|
-
<a name="l00204"></a>00204
|
226
|
-
<a name="l00205"></a>00205 SessionCloseCallback(SharedDataPtr data,
|
227
|
-
<a name="l00206"></a>00206 <span class="keyword">const</span> weak_ptr<AppContainer> &container) {
|
228
|
-
<a name="l00207"></a>00207 this->data = data;
|
229
|
-
<a name="l00208"></a>00208 this->container = container;
|
230
|
-
<a name="l00209"></a>00209 }
|
231
|
-
<a name="l00210"></a>00210
|
232
|
-
<a name="l00211"></a>00211 <span class="keywordtype">void</span> operator()() {
|
233
|
-
<a name="l00212"></a>00212 boost::mutex::scoped_lock l(data->lock);
|
234
|
-
<a name="l00213"></a>00213 AppContainerPtr container(this->container.lock());
|
235
|
-
<a name="l00214"></a>00214
|
236
|
-
<a name="l00215"></a>00215 <span class="keywordflow">if</span> (container == NULL) {
|
237
|
-
<a name="l00216"></a>00216 <span class="keywordflow">return</span>;
|
238
|
-
<a name="l00217"></a>00217 }
|
239
|
-
<a name="l00218"></a>00218
|
240
|
-
<a name="l00219"></a>00219 DomainMap::iterator it;
|
241
|
-
<a name="l00220"></a>00220 it = data->domains.find(container->app->getAppRoot());
|
242
|
-
<a name="l00221"></a>00221 <span class="keywordflow">if</span> (it != data->domains.end()) {
|
243
|
-
<a name="l00222"></a>00222 Domain *domain = it->second.get();
|
244
|
-
<a name="l00223"></a>00223 AppContainerList *instances = &domain->instances;
|
245
|
-
<a name="l00224"></a>00224
|
246
|
-
<a name="l00225"></a>00225 container->processed++;
|
247
|
-
<a name="l00226"></a>00226 <span class="keywordflow">if</span> (domain->maxRequests > 0 && container->processed >= domain->maxRequests) {
|
248
|
-
<a name="l00227"></a>00227 instances->erase(container->iterator);
|
249
|
-
<a name="l00228"></a>00228 domain->size--;
|
250
|
-
<a name="l00229"></a>00229 <span class="keywordflow">if</span> (instances->empty()) {
|
251
|
-
<a name="l00230"></a>00230 data->domains.erase(container->app->getAppRoot());
|
252
|
-
<a name="l00231"></a>00231 }
|
253
|
-
<a name="l00232"></a>00232 data->count--;
|
254
|
-
<a name="l00233"></a>00233 data->active--;
|
255
|
-
<a name="l00234"></a>00234 data->activeOrMaxChanged.notify_all();
|
256
|
-
<a name="l00235"></a>00235 } <span class="keywordflow">else</span> {
|
257
|
-
<a name="l00236"></a>00236 container->lastUsed = time(NULL);
|
258
|
-
<a name="l00237"></a>00237 container->sessions--;
|
259
|
-
<a name="l00238"></a>00238 <span class="keywordflow">if</span> (container->sessions == 0) {
|
260
|
-
<a name="l00239"></a>00239 instances->erase(container->iterator);
|
261
|
-
<a name="l00240"></a>00240 instances->push_front(container);
|
262
|
-
<a name="l00241"></a>00241 container->iterator = instances->begin();
|
263
|
-
<a name="l00242"></a>00242 data->inactiveApps.push_back(container);
|
264
|
-
<a name="l00243"></a>00243 container->ia_iterator = data->inactiveApps.end();
|
265
|
-
<a name="l00244"></a>00244 container->ia_iterator--;
|
266
|
-
<a name="l00245"></a>00245 data->active--;
|
267
|
-
<a name="l00246"></a>00246 data->activeOrMaxChanged.notify_all();
|
268
|
-
<a name="l00247"></a>00247 }
|
269
|
-
<a name="l00248"></a>00248 }
|
270
|
-
<a name="l00249"></a>00249 }
|
271
|
-
<a name="l00250"></a>00250 }
|
272
|
-
<a name="l00251"></a>00251 };
|
273
|
-
<a name="l00252"></a>00252
|
274
|
-
<a name="l00253"></a>00253 <span class="preprocessor"> #ifdef PASSENGER_USE_DUMMY_SPAWN_MANAGER</span>
|
275
|
-
<a name="l00254"></a>00254 <span class="preprocessor"></span> <a class="code" href="classPassenger_1_1DummySpawnManager.html" title="A dummy SpawnManager replacement for testing/debugging purposes.">DummySpawnManager</a> spawnManager;
|
276
|
-
<a name="l00255"></a>00255 <span class="preprocessor"> #else</span>
|
277
|
-
<a name="l00256"></a>00256 <span class="preprocessor"></span> <a class="code" href="classPassenger_1_1SpawnManager.html" title="Spawning of Ruby on Rails/Rack application instances.">SpawnManager</a> spawnManager;
|
278
|
-
<a name="l00257"></a>00257 <span class="preprocessor"> #endif</span>
|
279
|
-
<a name="l00258"></a>00258 <span class="preprocessor"></span> SharedDataPtr data;
|
280
|
-
<a name="l00259"></a>00259 boost::thread *cleanerThread;
|
281
|
-
<a name="l00260"></a>00260 <span class="keywordtype">bool</span> detached;
|
282
|
-
<a name="l00261"></a>00261 <span class="keywordtype">bool</span> done;
|
283
|
-
<a name="l00262"></a>00262 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxIdleTime;
|
284
|
-
<a name="l00263"></a>00263 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> waitingOnGlobalQueue;
|
285
|
-
<a name="l00264"></a>00264 condition cleanerThreadSleeper;
|
286
|
-
<a name="l00265"></a>00265
|
287
|
-
<a name="l00266"></a>00266 <span class="comment">// Shortcuts for instance variables in SharedData. Saves typing in get().</span>
|
288
|
-
<a name="l00267"></a>00267 boost::mutex &lock;
|
289
|
-
<a name="l00268"></a>00268 condition &activeOrMaxChanged;
|
290
|
-
<a name="l00269"></a>00269 DomainMap &domains;
|
291
|
-
<a name="l00270"></a>00270 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &max;
|
292
|
-
<a name="l00271"></a>00271 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &count;
|
293
|
-
<a name="l00272"></a>00272 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &active;
|
294
|
-
<a name="l00273"></a>00273 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &maxPerApp;
|
295
|
-
<a name="l00274"></a>00274 AppContainerList &inactiveApps;
|
296
|
-
<a name="l00275"></a>00275 map<string, unsigned int> &appInstanceCount;
|
297
|
-
<a name="l00276"></a>00276 <span class="comment"></span>
|
298
|
-
<a name="l00277"></a>00277 <span class="comment"> /**</span>
|
299
|
-
<a name="l00278"></a>00278 <span class="comment"> * Verify that all the invariants are correct.</span>
|
300
|
-
<a name="l00279"></a>00279 <span class="comment"> */</span>
|
301
|
-
<a name="l00280"></a>00280 <span class="keywordtype">bool</span> <span class="keyword">inline</span> verifyState() {
|
302
|
-
<a name="l00281"></a>00281 <span class="preprocessor"> #if PASSENGER_DEBUG</span>
|
303
|
-
<a name="l00282"></a>00282 <span class="preprocessor"></span> <span class="comment">// Invariants for _domains_.</span>
|
304
|
-
<a name="l00283"></a>00283 DomainMap::const_iterator it;
|
305
|
-
<a name="l00284"></a>00284 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> totalSize = 0;
|
306
|
-
<a name="l00285"></a>00285 <span class="keywordflow">for</span> (it = domains.begin(); it != domains.end(); it++) {
|
307
|
-
<a name="l00286"></a>00286 <span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot = it->first;
|
308
|
-
<a name="l00287"></a>00287 Domain *domain = it->second.get();
|
309
|
-
<a name="l00288"></a>00288 AppContainerList *instances = &domain->instances;
|
310
|
-
<a name="l00289"></a>00289
|
311
|
-
<a name="l00290"></a>00290 P_ASSERT(domain->size <= count, <span class="keyword">false</span>,
|
312
|
-
<a name="l00291"></a>00291 <span class="stringliteral">"domains['"</span> << appRoot << <span class="stringliteral">"'].size ("</span> << domain->size <<
|
313
|
-
<a name="l00292"></a>00292 <span class="stringliteral">") <= count ("</span> << count << <span class="stringliteral">")"</span>);
|
314
|
-
<a name="l00293"></a>00293 totalSize += domain->size;
|
315
|
-
<a name="l00294"></a>00294
|
316
|
-
<a name="l00295"></a>00295 <span class="comment">// Invariants for Domain.</span>
|
317
|
-
<a name="l00296"></a>00296
|
318
|
-
<a name="l00297"></a>00297 P_ASSERT(!instances->empty(), <span class="keyword">false</span>,
|
319
|
-
<a name="l00298"></a>00298 <span class="stringliteral">"domains['"</span> << appRoot << <span class="stringliteral">"'].instances is nonempty."</span>);
|
320
|
-
<a name="l00299"></a>00299
|
321
|
-
<a name="l00300"></a>00300 AppContainerList::const_iterator prev_lit;
|
322
|
-
<a name="l00301"></a>00301 AppContainerList::const_iterator lit;
|
323
|
-
<a name="l00302"></a>00302 prev_lit = instances->begin();
|
324
|
-
<a name="l00303"></a>00303 lit = prev_lit;
|
325
|
-
<a name="l00304"></a>00304 lit++;
|
326
|
-
<a name="l00305"></a>00305 <span class="keywordflow">for</span> (; lit != instances->end(); lit++) {
|
327
|
-
<a name="l00306"></a>00306 <span class="keywordflow">if</span> ((*prev_lit)->sessions > 0) {
|
328
|
-
<a name="l00307"></a>00307 P_ASSERT((*lit)->sessions > 0, <span class="keyword">false</span>,
|
329
|
-
<a name="l00308"></a>00308 <span class="stringliteral">"domains['"</span> << appRoot << <span class="stringliteral">"'].instances "</span>
|
330
|
-
<a name="l00309"></a>00309 <span class="stringliteral">"is sorted from nonactive to active"</span>);
|
331
|
-
<a name="l00310"></a>00310 }
|
332
|
-
<a name="l00311"></a>00311 }
|
333
|
-
<a name="l00312"></a>00312 }
|
334
|
-
<a name="l00313"></a>00313 P_ASSERT(totalSize == count, <span class="keyword">false</span>, <span class="stringliteral">"(sum of all d.size in domains) == count"</span>);
|
335
|
-
<a name="l00314"></a>00314
|
336
|
-
<a name="l00315"></a>00315 P_ASSERT(active <= count, <span class="keyword">false</span>,
|
337
|
-
<a name="l00316"></a>00316 <span class="stringliteral">"active ("</span> << active << <span class="stringliteral">") < count ("</span> << count << <span class="stringliteral">")"</span>);
|
338
|
-
<a name="l00317"></a>00317 P_ASSERT(inactiveApps.size() == count - active, <span class="keyword">false</span>,
|
339
|
-
<a name="l00318"></a>00318 <span class="stringliteral">"inactive_apps.size() == count - active"</span>);
|
340
|
-
<a name="l00319"></a>00319 <span class="preprocessor"> #endif</span>
|
341
|
-
<a name="l00320"></a>00320 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
|
342
|
-
<a name="l00321"></a>00321 }
|
343
|
-
<a name="l00322"></a>00322
|
344
|
-
<a name="l00323"></a>00323 <span class="keywordtype">string</span> toStringWithoutLock()<span class="keyword"> const </span>{
|
345
|
-
<a name="l00324"></a>00324 stringstream result;
|
346
|
-
<a name="l00325"></a>00325
|
347
|
-
<a name="l00326"></a>00326 result << <span class="stringliteral">"----------- General information -----------"</span> << endl;
|
348
|
-
<a name="l00327"></a>00327 result << <span class="stringliteral">"max = "</span> << max << endl;
|
349
|
-
<a name="l00328"></a>00328 result << <span class="stringliteral">"count = "</span> << count << endl;
|
350
|
-
<a name="l00329"></a>00329 result << <span class="stringliteral">"active = "</span> << active << endl;
|
351
|
-
<a name="l00330"></a>00330 result << <span class="stringliteral">"inactive = "</span> << inactiveApps.size() << endl;
|
352
|
-
<a name="l00331"></a>00331 result << <span class="stringliteral">"Waiting on global queue: "</span> << waitingOnGlobalQueue << endl;
|
353
|
-
<a name="l00332"></a>00332 result << endl;
|
354
|
-
<a name="l00333"></a>00333
|
355
|
-
<a name="l00334"></a>00334 result << <span class="stringliteral">"----------- Domains -----------"</span> << endl;
|
356
|
-
<a name="l00335"></a>00335 DomainMap::const_iterator it;
|
357
|
-
<a name="l00336"></a>00336 <span class="keywordflow">for</span> (it = domains.begin(); it != domains.end(); it++) {
|
358
|
-
<a name="l00337"></a>00337 Domain *domain = it->second.get();
|
359
|
-
<a name="l00338"></a>00338 AppContainerList *instances = &domain->instances;
|
360
|
-
<a name="l00339"></a>00339 AppContainerList::const_iterator lit;
|
361
|
-
<a name="l00340"></a>00340
|
362
|
-
<a name="l00341"></a>00341 result << it->first << <span class="stringliteral">": "</span> << endl;
|
363
|
-
<a name="l00342"></a>00342 <span class="keywordflow">for</span> (lit = instances->begin(); lit != instances->end(); lit++) {
|
364
|
-
<a name="l00343"></a>00343 AppContainer *container = lit->get();
|
365
|
-
<a name="l00344"></a>00344 <span class="keywordtype">char</span> buf[128];
|
366
|
-
<a name="l00345"></a>00345
|
367
|
-
<a name="l00346"></a>00346 snprintf(buf, <span class="keyword">sizeof</span>(buf),
|
368
|
-
<a name="l00347"></a>00347 <span class="stringliteral">"PID: %-5lu Sessions: %-2u Processed: %-5u Uptime: %s"</span>,
|
369
|
-
<a name="l00348"></a>00348 (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) container->app->getPid(),
|
370
|
-
<a name="l00349"></a>00349 container->sessions,
|
371
|
-
<a name="l00350"></a>00350 container->processed,
|
372
|
-
<a name="l00351"></a>00351 container->uptime().c_str());
|
373
|
-
<a name="l00352"></a>00352 result << <span class="stringliteral">" "</span> << buf << endl;
|
374
|
-
<a name="l00353"></a>00353 }
|
375
|
-
<a name="l00354"></a>00354 result << endl;
|
376
|
-
<a name="l00355"></a>00355 }
|
377
|
-
<a name="l00356"></a>00356 <span class="keywordflow">return</span> result.str();
|
378
|
-
<a name="l00357"></a>00357 }
|
379
|
-
<a name="l00358"></a>00358 <span class="comment"></span>
|
380
|
-
<a name="l00359"></a>00359 <span class="comment"> /**</span>
|
381
|
-
<a name="l00360"></a>00360 <span class="comment"> * Checks whether the given application domain needs to be restarted.</span>
|
382
|
-
<a name="l00361"></a>00361 <span class="comment"> *</span>
|
383
|
-
<a name="l00362"></a>00362 <span class="comment"> * @throws SystemException Something went wrong while retrieving the system time.</span>
|
384
|
-
<a name="l00363"></a>00363 <span class="comment"> * @throws boost::thread_interrupted</span>
|
385
|
-
<a name="l00364"></a>00364 <span class="comment"> */</span>
|
386
|
-
<a name="l00365"></a>00365 <span class="keywordtype">bool</span> needsRestart(<span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot, Domain *domain, <span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &options) {
|
387
|
-
<a name="l00366"></a>00366 <span class="keywordflow">return</span> domain->alwaysRestartFileStatter.refresh(options.<a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>) == 0
|
388
|
-
<a name="l00367"></a>00367 || domain->restartFileChecker.changed(options.<a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>);
|
389
|
-
<a name="l00368"></a>00368 }
|
390
|
-
<a name="l00369"></a>00369
|
391
|
-
<a name="l00370"></a>00370 <span class="keywordtype">void</span> cleanerThreadMainLoop() {
|
392
|
-
<a name="l00371"></a>00371 this_thread::disable_syscall_interruption dsi;
|
393
|
-
<a name="l00372"></a>00372 unique_lock<boost::mutex> l(lock);
|
394
|
-
<a name="l00373"></a>00373 <span class="keywordflow">try</span> {
|
395
|
-
<a name="l00374"></a>00374 <span class="keywordflow">while</span> (!done && !this_thread::interruption_requested()) {
|
396
|
-
<a name="l00375"></a>00375 xtime xt;
|
397
|
-
<a name="l00376"></a>00376 xtime_get(&xt, TIME_UTC);
|
398
|
-
<a name="l00377"></a>00377 xt.sec += maxIdleTime + 1;
|
399
|
-
<a name="l00378"></a>00378 <span class="keywordflow">if</span> (cleanerThreadSleeper.timed_wait(l, xt)) {
|
400
|
-
<a name="l00379"></a>00379 <span class="comment">// Condition was woken up.</span>
|
401
|
-
<a name="l00380"></a>00380 <span class="keywordflow">if</span> (done) {
|
402
|
-
<a name="l00381"></a>00381 <span class="comment">// StandardApplicationPool is being destroyed.</span>
|
403
|
-
<a name="l00382"></a>00382 <span class="keywordflow">break</span>;
|
404
|
-
<a name="l00383"></a>00383 } <span class="keywordflow">else</span> {
|
405
|
-
<a name="l00384"></a>00384 <span class="comment">// maxIdleTime changed.</span>
|
406
|
-
<a name="l00385"></a>00385 <span class="keywordflow">continue</span>;
|
407
|
-
<a name="l00386"></a>00386 }
|
408
|
-
<a name="l00387"></a>00387 }
|
409
|
-
<a name="l00388"></a>00388
|
410
|
-
<a name="l00389"></a>00389 time_t now = syscalls::time(NULL);
|
411
|
-
<a name="l00390"></a>00390 AppContainerList::iterator it;
|
412
|
-
<a name="l00391"></a>00391 <span class="keywordflow">for</span> (it = inactiveApps.begin(); it != inactiveApps.end(); it++) {
|
413
|
-
<a name="l00392"></a>00392 AppContainer &container(*it->get());
|
414
|
-
<a name="l00393"></a>00393 ApplicationPtr app(container.app);
|
415
|
-
<a name="l00394"></a>00394 Domain *domain = domains[app->getAppRoot()].get();
|
416
|
-
<a name="l00395"></a>00395 AppContainerList *instances = &domain->instances;
|
417
|
-
<a name="l00396"></a>00396
|
418
|
-
<a name="l00397"></a>00397 <span class="keywordflow">if</span> (maxIdleTime > 0 &&
|
419
|
-
<a name="l00398"></a>00398 (now - container.lastUsed > (time_t) maxIdleTime)) {
|
420
|
-
<a name="l00399"></a>00399 P_DEBUG(<span class="stringliteral">"Cleaning idle app "</span> << app->getAppRoot() <<
|
421
|
-
<a name="l00400"></a>00400 <span class="stringliteral">" (PID "</span> << app->getPid() << <span class="stringliteral">")"</span>);
|
422
|
-
<a name="l00401"></a>00401 instances->erase(container.iterator);
|
423
|
-
<a name="l00402"></a>00402
|
424
|
-
<a name="l00403"></a>00403 AppContainerList::iterator prev = it;
|
425
|
-
<a name="l00404"></a>00404 prev--;
|
426
|
-
<a name="l00405"></a>00405 inactiveApps.erase(it);
|
427
|
-
<a name="l00406"></a>00406 it = prev;
|
428
|
-
<a name="l00407"></a>00407
|
429
|
-
<a name="l00408"></a>00408 domain->size--;
|
430
|
-
<a name="l00409"></a>00409
|
431
|
-
<a name="l00410"></a>00410 count--;
|
432
|
-
<a name="l00411"></a>00411 }
|
433
|
-
<a name="l00412"></a>00412 <span class="keywordflow">if</span> (instances->empty()) {
|
434
|
-
<a name="l00413"></a>00413 domains.erase(app->getAppRoot());
|
435
|
-
<a name="l00414"></a>00414 }
|
436
|
-
<a name="l00415"></a>00415 }
|
437
|
-
<a name="l00416"></a>00416 }
|
438
|
-
<a name="l00417"></a>00417 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> exception &e) {
|
439
|
-
<a name="l00418"></a>00418 P_ERROR(<span class="stringliteral">"Uncaught exception: "</span> << e.what());
|
440
|
-
<a name="l00419"></a>00419 }
|
441
|
-
<a name="l00420"></a>00420 }
|
442
|
-
<a name="l00421"></a>00421 <span class="comment"></span>
|
443
|
-
<a name="l00422"></a>00422 <span class="comment"> /**</span>
|
444
|
-
<a name="l00423"></a>00423 <span class="comment"> * Spawn a new application instance, or use an existing one that's in the pool.</span>
|
445
|
-
<a name="l00424"></a>00424 <span class="comment"> *</span>
|
446
|
-
<a name="l00425"></a>00425 <span class="comment"> * @throws boost::thread_interrupted</span>
|
447
|
-
<a name="l00426"></a>00426 <span class="comment"> * @throws SpawnException</span>
|
448
|
-
<a name="l00427"></a>00427 <span class="comment"> * @throws SystemException</span>
|
449
|
-
<a name="l00428"></a>00428 <span class="comment"> */</span>
|
450
|
-
<a name="l00429"></a>00429 pair<AppContainerPtr, Domain *>
|
451
|
-
<a name="l00430"></a>00430 spawnOrUseExisting(boost::mutex::scoped_lock &l, <span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &options) {
|
452
|
-
<a name="l00431"></a>00431 beginning_of_function:
|
453
|
-
<a name="l00432"></a>00432
|
454
|
-
<a name="l00433"></a>00433 TRACE_POINT();
|
455
|
-
<a name="l00434"></a>00434 this_thread::disable_interruption di;
|
456
|
-
<a name="l00435"></a>00435 this_thread::disable_syscall_interruption dsi;
|
457
|
-
<a name="l00436"></a>00436 <span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot(options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
|
458
|
-
<a name="l00437"></a>00437 AppContainerPtr container;
|
459
|
-
<a name="l00438"></a>00438 Domain *domain;
|
460
|
-
<a name="l00439"></a>00439 AppContainerList *instances;
|
461
|
-
<a name="l00440"></a>00440
|
462
|
-
<a name="l00441"></a>00441 <span class="keywordflow">try</span> {
|
463
|
-
<a name="l00442"></a>00442 DomainMap::iterator it(domains.find(appRoot));
|
464
|
-
<a name="l00443"></a>00443
|
465
|
-
<a name="l00444"></a>00444 <span class="keywordflow">if</span> (it != domains.end() && needsRestart(appRoot, it->second.get(), options)) {
|
466
|
-
<a name="l00445"></a>00445 AppContainerList::iterator it2;
|
467
|
-
<a name="l00446"></a>00446 instances = &it->second->instances;
|
468
|
-
<a name="l00447"></a>00447 <span class="keywordflow">for</span> (it2 = instances->begin(); it2 != instances->end(); it2++) {
|
469
|
-
<a name="l00448"></a>00448 container = *it2;
|
470
|
-
<a name="l00449"></a>00449 <span class="keywordflow">if</span> (container->sessions == 0) {
|
471
|
-
<a name="l00450"></a>00450 inactiveApps.erase(container->ia_iterator);
|
472
|
-
<a name="l00451"></a>00451 } <span class="keywordflow">else</span> {
|
473
|
-
<a name="l00452"></a>00452 active--;
|
474
|
-
<a name="l00453"></a>00453 }
|
475
|
-
<a name="l00454"></a>00454 it2--;
|
476
|
-
<a name="l00455"></a>00455 instances->erase(container->iterator);
|
477
|
-
<a name="l00456"></a>00456 count--;
|
478
|
-
<a name="l00457"></a>00457 }
|
479
|
-
<a name="l00458"></a>00458 domains.erase(appRoot);
|
480
|
-
<a name="l00459"></a>00459 spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#2e85c43042b9556ca2fd74b8d28956ce" title="Remove the cached application instances at the given application root.">reload</a>(appRoot);
|
481
|
-
<a name="l00460"></a>00460 it = domains.end();
|
482
|
-
<a name="l00461"></a>00461 activeOrMaxChanged.notify_all();
|
483
|
-
<a name="l00462"></a>00462 }
|
484
|
-
<a name="l00463"></a>00463
|
485
|
-
<a name="l00464"></a>00464 <span class="keywordflow">if</span> (it != domains.end()) {
|
486
|
-
<a name="l00465"></a>00465 domain = it->second.get();
|
487
|
-
<a name="l00466"></a>00466 instances = &domain->instances;
|
488
|
-
<a name="l00467"></a>00467
|
489
|
-
<a name="l00468"></a>00468 <span class="keywordflow">if</span> (instances->front()->sessions == 0) {
|
490
|
-
<a name="l00469"></a>00469 container = instances->front();
|
491
|
-
<a name="l00470"></a>00470 instances->pop_front();
|
492
|
-
<a name="l00471"></a>00471 instances->push_back(container);
|
493
|
-
<a name="l00472"></a>00472 container->iterator = instances->end();
|
494
|
-
<a name="l00473"></a>00473 container->iterator--;
|
495
|
-
<a name="l00474"></a>00474 inactiveApps.erase(container->ia_iterator);
|
496
|
-
<a name="l00475"></a>00475 active++;
|
497
|
-
<a name="l00476"></a>00476 activeOrMaxChanged.notify_all();
|
498
|
-
<a name="l00477"></a>00477 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (count >= max || (
|
499
|
-
<a name="l00478"></a>00478 maxPerApp != 0 && domain->size >= maxPerApp )
|
500
|
-
<a name="l00479"></a>00479 ) {
|
501
|
-
<a name="l00480"></a>00480 <span class="keywordflow">if</span> (options.<a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a>) {
|
502
|
-
<a name="l00481"></a>00481 UPDATE_TRACE_POINT();
|
503
|
-
<a name="l00482"></a>00482 waitingOnGlobalQueue++;
|
504
|
-
<a name="l00483"></a>00483 activeOrMaxChanged.wait(l);
|
505
|
-
<a name="l00484"></a>00484 waitingOnGlobalQueue--;
|
506
|
-
<a name="l00485"></a>00485 <span class="keywordflow">goto</span> beginning_of_function;
|
507
|
-
<a name="l00486"></a>00486 } <span class="keywordflow">else</span> {
|
508
|
-
<a name="l00487"></a>00487 AppContainerList::iterator it(instances->begin());
|
509
|
-
<a name="l00488"></a>00488 AppContainerList::iterator smallest(instances->begin());
|
510
|
-
<a name="l00489"></a>00489 it++;
|
511
|
-
<a name="l00490"></a>00490 <span class="keywordflow">for</span> (; it != instances->end(); it++) {
|
512
|
-
<a name="l00491"></a>00491 <span class="keywordflow">if</span> ((*it)->sessions < (*smallest)->sessions) {
|
513
|
-
<a name="l00492"></a>00492 smallest = it;
|
514
|
-
<a name="l00493"></a>00493 }
|
515
|
-
<a name="l00494"></a>00494 }
|
516
|
-
<a name="l00495"></a>00495 container = *smallest;
|
517
|
-
<a name="l00496"></a>00496 instances->erase(smallest);
|
518
|
-
<a name="l00497"></a>00497 instances->push_back(container);
|
519
|
-
<a name="l00498"></a>00498 container->iterator = instances->end();
|
520
|
-
<a name="l00499"></a>00499 container->iterator--;
|
521
|
-
<a name="l00500"></a>00500 }
|
522
|
-
<a name="l00501"></a>00501 } <span class="keywordflow">else</span> {
|
523
|
-
<a name="l00502"></a>00502 container = <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AppContainer());
|
524
|
-
<a name="l00503"></a>00503 {
|
525
|
-
<a name="l00504"></a>00504 this_thread::restore_interruption ri(di);
|
526
|
-
<a name="l00505"></a>00505 this_thread::restore_syscall_interruption rsi(dsi);
|
527
|
-
<a name="l00506"></a>00506 container->app = spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#af035d564cc4e6683508939c9d6dbb64" title="Spawn a new instance of an application.">spawn</a>(options);
|
528
|
-
<a name="l00507"></a>00507 }
|
529
|
-
<a name="l00508"></a>00508 container->sessions = 0;
|
530
|
-
<a name="l00509"></a>00509 instances->push_back(container);
|
531
|
-
<a name="l00510"></a>00510 container->iterator = instances->end();
|
532
|
-
<a name="l00511"></a>00511 container->iterator--;
|
533
|
-
<a name="l00512"></a>00512 domain->size++;
|
534
|
-
<a name="l00513"></a>00513 count++;
|
535
|
-
<a name="l00514"></a>00514 active++;
|
536
|
-
<a name="l00515"></a>00515 activeOrMaxChanged.notify_all();
|
537
|
-
<a name="l00516"></a>00516 }
|
538
|
-
<a name="l00517"></a>00517 } <span class="keywordflow">else</span> {
|
539
|
-
<a name="l00518"></a>00518 <span class="keywordflow">if</span> (active >= max) {
|
540
|
-
<a name="l00519"></a>00519 UPDATE_TRACE_POINT();
|
541
|
-
<a name="l00520"></a>00520 activeOrMaxChanged.wait(l);
|
542
|
-
<a name="l00521"></a>00521 <span class="keywordflow">goto</span> beginning_of_function;
|
543
|
-
<a name="l00522"></a>00522 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (count == max) {
|
544
|
-
<a name="l00523"></a>00523 container = inactiveApps.front();
|
545
|
-
<a name="l00524"></a>00524 inactiveApps.pop_front();
|
546
|
-
<a name="l00525"></a>00525 domain = domains[container->app->getAppRoot()].get();
|
547
|
-
<a name="l00526"></a>00526 instances = &domain->instances;
|
548
|
-
<a name="l00527"></a>00527 instances->erase(container->iterator);
|
549
|
-
<a name="l00528"></a>00528 <span class="keywordflow">if</span> (instances->empty()) {
|
550
|
-
<a name="l00529"></a>00529 domains.erase(container->app->getAppRoot());
|
551
|
-
<a name="l00530"></a>00530 } <span class="keywordflow">else</span> {
|
552
|
-
<a name="l00531"></a>00531 domain->size--;
|
553
|
-
<a name="l00532"></a>00532 }
|
554
|
-
<a name="l00533"></a>00533 count--;
|
555
|
-
<a name="l00534"></a>00534 }
|
556
|
-
<a name="l00535"></a>00535
|
557
|
-
<a name="l00536"></a>00536 UPDATE_TRACE_POINT();
|
558
|
-
<a name="l00537"></a>00537 container = <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(<span class="keyword">new</span> AppContainer());
|
559
|
-
<a name="l00538"></a>00538 {
|
560
|
-
<a name="l00539"></a>00539 this_thread::restore_interruption ri(di);
|
561
|
-
<a name="l00540"></a>00540 this_thread::restore_syscall_interruption rsi(dsi);
|
562
|
-
<a name="l00541"></a>00541 container->app = spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#af035d564cc4e6683508939c9d6dbb64" title="Spawn a new instance of an application.">spawn</a>(options);
|
563
|
-
<a name="l00542"></a>00542 }
|
564
|
-
<a name="l00543"></a>00543 container->sessions = 0;
|
565
|
-
<a name="l00544"></a>00544 it = domains.find(appRoot);
|
566
|
-
<a name="l00545"></a>00545 <span class="keywordflow">if</span> (it == domains.end()) {
|
567
|
-
<a name="l00546"></a>00546 domain = <span class="keyword">new</span> Domain(options);
|
568
|
-
<a name="l00547"></a>00547 domain->size = 1;
|
569
|
-
<a name="l00548"></a>00548 domain->maxRequests = options.<a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a>;
|
570
|
-
<a name="l00549"></a>00549 domains[appRoot] = <a class="code" href="group__Support.html#g41b6c4a82fed72531a147de0505a8396" title="Convenience shortcut for creating a shared_ptr.">ptr</a>(domain);
|
571
|
-
<a name="l00550"></a>00550 } <span class="keywordflow">else</span> {
|
572
|
-
<a name="l00551"></a>00551 domain = it->second.get();
|
573
|
-
<a name="l00552"></a>00552 domain->size++;
|
574
|
-
<a name="l00553"></a>00553 }
|
575
|
-
<a name="l00554"></a>00554 instances = &domain->instances;
|
576
|
-
<a name="l00555"></a>00555 instances->push_back(container);
|
577
|
-
<a name="l00556"></a>00556 container->iterator = instances->end();
|
578
|
-
<a name="l00557"></a>00557 container->iterator--;
|
579
|
-
<a name="l00558"></a>00558 count++;
|
580
|
-
<a name="l00559"></a>00559 active++;
|
581
|
-
<a name="l00560"></a>00560 activeOrMaxChanged.notify_all();
|
582
|
-
<a name="l00561"></a>00561 }
|
583
|
-
<a name="l00562"></a>00562 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a> &e) {
|
584
|
-
<a name="l00563"></a>00563 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot spawn application '"</span>);
|
585
|
-
<a name="l00564"></a>00564 message.append(appRoot);
|
586
|
-
<a name="l00565"></a>00565 message.append(<span class="stringliteral">"': "</span>);
|
587
|
-
<a name="l00566"></a>00566 message.append(e.<a class="code" href="classPassenger_1_1SpawnException.html#d2da180f89a43423a4b37248249972ff">what</a>());
|
588
|
-
<a name="l00567"></a>00567 <span class="keywordflow">if</span> (e.<a class="code" href="classPassenger_1_1SpawnException.html#e65dc272e183fd9e5637a4091cc6bbf4" title="Check whether an error page is available.">hasErrorPage</a>()) {
|
589
|
-
<a name="l00568"></a>00568 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(message, e.<a class="code" href="classPassenger_1_1SpawnException.html#6f675a37edd7070875d0744e7dd010a1" title="Return the error page content.">getErrorPage</a>());
|
590
|
-
<a name="l00569"></a>00569 } <span class="keywordflow">else</span> {
|
591
|
-
<a name="l00570"></a>00570 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(message);
|
592
|
-
<a name="l00571"></a>00571 }
|
593
|
-
<a name="l00572"></a>00572 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> exception &e) {
|
594
|
-
<a name="l00573"></a>00573 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot spawn application '"</span>);
|
595
|
-
<a name="l00574"></a>00574 message.append(appRoot);
|
596
|
-
<a name="l00575"></a>00575 message.append(<span class="stringliteral">"': "</span>);
|
597
|
-
<a name="l00576"></a>00576 message.append(e.what());
|
598
|
-
<a name="l00577"></a>00577 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(message);
|
599
|
-
<a name="l00578"></a>00578 }
|
600
|
-
<a name="l00579"></a>00579
|
601
|
-
<a name="l00580"></a>00580 <span class="keywordflow">return</span> make_pair(container, domain);
|
602
|
-
<a name="l00581"></a>00581 }
|
603
|
-
<a name="l00582"></a>00582
|
604
|
-
<a name="l00583"></a>00583 <span class="keyword">public</span>:<span class="comment"></span>
|
605
|
-
<a name="l00584"></a>00584 <span class="comment"> /**</span>
|
606
|
-
<a name="l00585"></a>00585 <span class="comment"> * Create a new StandardApplicationPool object.</span>
|
607
|
-
<a name="l00586"></a>00586 <span class="comment"> *</span>
|
608
|
-
<a name="l00587"></a>00587 <span class="comment"> * @param spawnServerCommand The filename of the spawn server to use.</span>
|
609
|
-
<a name="l00588"></a>00588 <span class="comment"> * @param logFile Specify a log file that the spawn server should use.</span>
|
610
|
-
<a name="l00589"></a>00589 <span class="comment"> * Messages on its standard output and standard error channels</span>
|
611
|
-
<a name="l00590"></a>00590 <span class="comment"> * will be written to this log file. If an empty string is</span>
|
612
|
-
<a name="l00591"></a>00591 <span class="comment"> * specified, no log file will be used, and the spawn server</span>
|
613
|
-
<a name="l00592"></a>00592 <span class="comment"> * will use the same standard output/error channels as the</span>
|
614
|
-
<a name="l00593"></a>00593 <span class="comment"> * current process.</span>
|
615
|
-
<a name="l00594"></a>00594 <span class="comment"> * @param rubyCommand The Ruby interpreter's command.</span>
|
616
|
-
<a name="l00595"></a>00595 <span class="comment"> * @param user The user that the spawn manager should run as. This</span>
|
617
|
-
<a name="l00596"></a>00596 <span class="comment"> * parameter only has effect if the current process is</span>
|
618
|
-
<a name="l00597"></a>00597 <span class="comment"> * running as root. If the empty string is given, or if</span>
|
619
|
-
<a name="l00598"></a>00598 <span class="comment"> * the <tt>user</tt> is not a valid username, then</span>
|
620
|
-
<a name="l00599"></a>00599 <span class="comment"> * the spawn manager will be run as the current user.</span>
|
621
|
-
<a name="l00600"></a>00600 <span class="comment"> * @throws SystemException An error occured while trying to setup the spawn server.</span>
|
622
|
-
<a name="l00601"></a>00601 <span class="comment"> * @throws IOException The specified log file could not be opened.</span>
|
623
|
-
<a name="l00602"></a>00602 <span class="comment"> */</span>
|
624
|
-
<a name="l00603"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#f175704fc477f37ba1d387be09fa2e6b">00603</a> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#f175704fc477f37ba1d387be09fa2e6b" title="Create a new StandardApplicationPool object.">StandardApplicationPool</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &spawnServerCommand,
|
625
|
-
<a name="l00604"></a>00604 <span class="keyword">const</span> <span class="keywordtype">string</span> &logFile = <span class="stringliteral">""</span>,
|
626
|
-
<a name="l00605"></a>00605 <span class="keyword">const</span> <span class="keywordtype">string</span> &rubyCommand = <span class="stringliteral">"ruby"</span>,
|
627
|
-
<a name="l00606"></a>00606 <span class="keyword">const</span> <span class="keywordtype">string</span> &user = <span class="stringliteral">""</span>)
|
628
|
-
<a name="l00607"></a>00607 :
|
629
|
-
<a name="l00608"></a>00608 #ifndef PASSENGER_USE_DUMMY_SPAWN_MANAGER
|
630
|
-
<a name="l00609"></a>00609 spawnManager(spawnServerCommand, logFile, rubyCommand, user),
|
631
|
-
<a name="l00610"></a>00610 #endif
|
632
|
-
<a name="l00611"></a>00611 data(new SharedData()),
|
633
|
-
<a name="l00612"></a>00612 lock(data->lock),
|
634
|
-
<a name="l00613"></a>00613 activeOrMaxChanged(data->activeOrMaxChanged),
|
635
|
-
<a name="l00614"></a>00614 domains(data->domains),
|
636
|
-
<a name="l00615"></a>00615 max(data->max),
|
637
|
-
<a name="l00616"></a>00616 count(data->count),
|
638
|
-
<a name="l00617"></a>00617 active(data->active),
|
639
|
-
<a name="l00618"></a>00618 maxPerApp(data->maxPerApp),
|
640
|
-
<a name="l00619"></a>00619 inactiveApps(data->inactiveApps),
|
641
|
-
<a name="l00620"></a>00620 appInstanceCount(data->appInstanceCount)
|
642
|
-
<a name="l00621"></a>00621 {
|
643
|
-
<a name="l00622"></a>00622 TRACE_POINT();
|
644
|
-
<a name="l00623"></a>00623 detached = <span class="keyword">false</span>;
|
645
|
-
<a name="l00624"></a>00624 done = <span class="keyword">false</span>;
|
646
|
-
<a name="l00625"></a>00625 max = DEFAULT_MAX_POOL_SIZE;
|
647
|
-
<a name="l00626"></a>00626 count = 0;
|
648
|
-
<a name="l00627"></a>00627 active = 0;
|
649
|
-
<a name="l00628"></a>00628 waitingOnGlobalQueue = 0;
|
650
|
-
<a name="l00629"></a>00629 maxPerApp = DEFAULT_MAX_INSTANCES_PER_APP;
|
651
|
-
<a name="l00630"></a>00630 maxIdleTime = DEFAULT_MAX_IDLE_TIME;
|
652
|
-
<a name="l00631"></a>00631 cleanerThread = <span class="keyword">new</span> boost::thread(
|
653
|
-
<a name="l00632"></a>00632 bind(&StandardApplicationPool::cleanerThreadMainLoop, <span class="keyword">this</span>),
|
654
|
-
<a name="l00633"></a>00633 CLEANER_THREAD_STACK_SIZE
|
655
|
-
<a name="l00634"></a>00634 );
|
656
|
-
<a name="l00635"></a>00635 }
|
657
|
-
<a name="l00636"></a>00636
|
658
|
-
<a name="l00637"></a>00637 <span class="keyword">virtual</span> ~<a class="code" href="classPassenger_1_1StandardApplicationPool.html" title="A standard implementation of ApplicationPool for single-process environments.">StandardApplicationPool</a>() {
|
659
|
-
<a name="l00638"></a>00638 <span class="keywordflow">if</span> (!detached) {
|
660
|
-
<a name="l00639"></a>00639 this_thread::disable_interruption di;
|
661
|
-
<a name="l00640"></a>00640 {
|
662
|
-
<a name="l00641"></a>00641 boost::mutex::scoped_lock l(lock);
|
663
|
-
<a name="l00642"></a>00642 done = <span class="keyword">true</span>;
|
664
|
-
<a name="l00643"></a>00643 cleanerThreadSleeper.notify_one();
|
665
|
-
<a name="l00644"></a>00644 }
|
666
|
-
<a name="l00645"></a>00645 cleanerThread->join();
|
667
|
-
<a name="l00646"></a>00646 }
|
668
|
-
<a name="l00647"></a>00647 <span class="keyword">delete</span> cleanerThread;
|
669
|
-
<a name="l00648"></a>00648 }
|
670
|
-
<a name="l00649"></a>00649
|
671
|
-
<a name="l00650"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#5a33f0766bbcfb2a48e08fc27bd1b684">00650</a> <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a> <span class="keyword">get</span>(<span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot) {
|
672
|
-
<a name="l00651"></a>00651 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#5a33f0766bbcfb2a48e08fc27bd1b684" title="Convenience shortcut for calling get() with default spawn options.">ApplicationPool::get</a>(appRoot);
|
673
|
-
<a name="l00652"></a>00652 }
|
674
|
-
<a name="l00653"></a>00653
|
675
|
-
<a name="l00654"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#ffc8f3ef8b1d925d203794d191d7fef4">00654</a> <span class="keyword">virtual</span> <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a> <span class="keyword">get</span>(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &options) {
|
676
|
-
<a name="l00655"></a>00655 TRACE_POINT();
|
677
|
-
<a name="l00656"></a>00656 <span class="keyword">using namespace </span>boost::posix_time;
|
678
|
-
<a name="l00657"></a>00657 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> attempt = 0;
|
679
|
-
<a name="l00658"></a>00658 <span class="comment">// TODO: We should probably add a timeout to the following</span>
|
680
|
-
<a name="l00659"></a>00659 <span class="comment">// lock. This way we can fail gracefully if the server's under</span>
|
681
|
-
<a name="l00660"></a>00660 <span class="comment">// rediculous load. Though I'm not sure how much it really helps.</span>
|
682
|
-
<a name="l00661"></a>00661 unique_lock<boost::mutex> l(lock);
|
683
|
-
<a name="l00662"></a>00662
|
684
|
-
<a name="l00663"></a>00663 <span class="keywordflow">while</span> (<span class="keyword">true</span>) {
|
685
|
-
<a name="l00664"></a>00664 attempt++;
|
686
|
-
<a name="l00665"></a>00665
|
687
|
-
<a name="l00666"></a>00666 pair<AppContainerPtr, Domain *> p(
|
688
|
-
<a name="l00667"></a>00667 spawnOrUseExisting(l, options)
|
689
|
-
<a name="l00668"></a>00668 );
|
690
|
-
<a name="l00669"></a>00669 AppContainerPtr &container = p.first;
|
691
|
-
<a name="l00670"></a>00670 Domain *domain = p.second;
|
692
|
-
<a name="l00671"></a>00671
|
693
|
-
<a name="l00672"></a>00672 container->lastUsed = time(NULL);
|
694
|
-
<a name="l00673"></a>00673 container->sessions++;
|
695
|
-
<a name="l00674"></a>00674
|
696
|
-
<a name="l00675"></a>00675 P_ASSERT(verifyState(), <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a>(),
|
697
|
-
<a name="l00676"></a>00676 <span class="stringliteral">"State is valid:\n"</span> << <a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383" title="Returns a textual description of the internal state of the application pool.">toString</a>(<span class="keyword">false</span>));
|
698
|
-
<a name="l00677"></a>00677 <span class="keywordflow">try</span> {
|
699
|
-
<a name="l00678"></a>00678 UPDATE_TRACE_POINT();
|
700
|
-
<a name="l00679"></a>00679 <span class="keywordflow">return</span> container->app->connect(SessionCloseCallback(data, container));
|
701
|
-
<a name="l00680"></a>00680 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> exception &e) {
|
702
|
-
<a name="l00681"></a>00681 container->sessions--;
|
703
|
-
<a name="l00682"></a>00682
|
704
|
-
<a name="l00683"></a>00683 AppContainerList &instances(domain->instances);
|
705
|
-
<a name="l00684"></a>00684 instances.erase(container->iterator);
|
706
|
-
<a name="l00685"></a>00685 domain->size--;
|
707
|
-
<a name="l00686"></a>00686 <span class="keywordflow">if</span> (instances.empty()) {
|
708
|
-
<a name="l00687"></a>00687 domains.erase(options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
|
709
|
-
<a name="l00688"></a>00688 }
|
710
|
-
<a name="l00689"></a>00689 count--;
|
711
|
-
<a name="l00690"></a>00690 active--;
|
712
|
-
<a name="l00691"></a>00691 activeOrMaxChanged.notify_all();
|
713
|
-
<a name="l00692"></a>00692 P_ASSERT(verifyState(), <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a>(),
|
714
|
-
<a name="l00693"></a>00693 <span class="stringliteral">"State is valid: "</span> << <a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383" title="Returns a textual description of the internal state of the application pool.">toString</a>(<span class="keyword">false</span>));
|
715
|
-
<a name="l00694"></a>00694 <span class="keywordflow">if</span> (attempt == MAX_GET_ATTEMPTS) {
|
716
|
-
<a name="l00695"></a>00695 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot connect to an existing "</span>
|
717
|
-
<a name="l00696"></a>00696 <span class="stringliteral">"application instance for '"</span>);
|
718
|
-
<a name="l00697"></a>00697 message.append(options.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
|
719
|
-
<a name="l00698"></a>00698 message.append(<span class="stringliteral">"': "</span>);
|
720
|
-
<a name="l00699"></a>00699 <span class="keywordflow">try</span> {
|
721
|
-
<a name="l00700"></a>00700 <span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &syse =
|
722
|
-
<a name="l00701"></a>00701 <span class="keyword">dynamic_cast<</span><span class="keyword">const </span><a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &<span class="keyword">></span>(e);
|
723
|
-
<a name="l00702"></a>00702 message.append(syse.<a class="code" href="classPassenger_1_1SystemException.html#0ef41d755fea2c9b1db2252e7c418dc8" title="Returns the system&#39;s error message.">sys</a>());
|
724
|
-
<a name="l00703"></a>00703 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> bad_cast &) {
|
725
|
-
<a name="l00704"></a>00704 message.append(e.what());
|
726
|
-
<a name="l00705"></a>00705 }
|
727
|
-
<a name="l00706"></a>00706 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a>(message);
|
728
|
-
<a name="l00707"></a>00707 }
|
729
|
-
<a name="l00708"></a>00708 }
|
730
|
-
<a name="l00709"></a>00709 }
|
731
|
-
<a name="l00710"></a>00710 <span class="comment">// Never reached; shut up compiler warning</span>
|
732
|
-
<a name="l00711"></a>00711 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1Application.html#d14f673494991460b16246a527ad8ad9" title="Convenient alias for Session smart pointer.">Application::SessionPtr</a>();
|
733
|
-
<a name="l00712"></a>00712 }
|
734
|
-
<a name="l00713"></a>00713
|
735
|
-
<a name="l00714"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#bcf8faeb4f431ae07ea0e20270661d08">00714</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#bcf8faeb4f431ae07ea0e20270661d08" title="Clear all application instances that are currently in the pool.">clear</a>() {
|
736
|
-
<a name="l00715"></a>00715 boost::mutex::scoped_lock l(lock);
|
737
|
-
<a name="l00716"></a>00716 domains.clear();
|
738
|
-
<a name="l00717"></a>00717 inactiveApps.clear();
|
739
|
-
<a name="l00718"></a>00718 appInstanceCount.clear();
|
740
|
-
<a name="l00719"></a>00719 count = 0;
|
741
|
-
<a name="l00720"></a>00720 active = 0;
|
742
|
-
<a name="l00721"></a>00721 activeOrMaxChanged.notify_all();
|
743
|
-
<a name="l00722"></a>00722 }
|
744
|
-
<a name="l00723"></a>00723
|
745
|
-
<a name="l00724"></a>00724 <span class="keyword">virtual</span> <span class="keywordtype">void</span> setMaxIdleTime(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seconds) {
|
746
|
-
<a name="l00725"></a>00725 boost::mutex::scoped_lock l(lock);
|
747
|
-
<a name="l00726"></a>00726 maxIdleTime = seconds;
|
748
|
-
<a name="l00727"></a>00727 cleanerThreadSleeper.notify_one();
|
749
|
-
<a name="l00728"></a>00728 }
|
750
|
-
<a name="l00729"></a>00729
|
751
|
-
<a name="l00730"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#04ef8c92da189520ad2022f4f82e9553">00730</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#04ef8c92da189520ad2022f4f82e9553" title="Set a hard limit on the number of application instances that this ApplicationPool...">setMax</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> max) {
|
752
|
-
<a name="l00731"></a>00731 boost::mutex::scoped_lock l(lock);
|
753
|
-
<a name="l00732"></a>00732 this->max = max;
|
754
|
-
<a name="l00733"></a>00733 activeOrMaxChanged.notify_all();
|
755
|
-
<a name="l00734"></a>00734 }
|
756
|
-
<a name="l00735"></a>00735
|
757
|
-
<a name="l00736"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#7773c4a3dfbd88eac72401d063831788">00736</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#7773c4a3dfbd88eac72401d063831788" title="Get the number of active applications in the pool.">getActive</a>()<span class="keyword"> const </span>{
|
758
|
-
<a name="l00737"></a>00737 <span class="keywordflow">return</span> active;
|
759
|
-
<a name="l00738"></a>00738 }
|
760
|
-
<a name="l00739"></a>00739
|
761
|
-
<a name="l00740"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#cdbfe2b9ffacdab4438c879c2411bf02">00740</a> <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#cdbfe2b9ffacdab4438c879c2411bf02" title="Get the number of active applications in the pool.">getCount</a>()<span class="keyword"> const </span>{
|
762
|
-
<a name="l00741"></a>00741 <span class="keywordflow">return</span> count;
|
763
|
-
<a name="l00742"></a>00742 }
|
764
|
-
<a name="l00743"></a>00743
|
765
|
-
<a name="l00744"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#3bafcda8d880f70561ad8a9da16e26ef">00744</a> <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#3bafcda8d880f70561ad8a9da16e26ef" title="Set a hard limit on the number of application instances that a single application...">setMaxPerApp</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxPerApp) {
|
766
|
-
<a name="l00745"></a>00745 boost::mutex::scoped_lock l(lock);
|
767
|
-
<a name="l00746"></a>00746 this->maxPerApp = maxPerApp;
|
768
|
-
<a name="l00747"></a>00747 activeOrMaxChanged.notify_all();
|
769
|
-
<a name="l00748"></a>00748 }
|
770
|
-
<a name="l00749"></a>00749
|
771
|
-
<a name="l00750"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#6955152d237920988d20297d2fff5660">00750</a> <span class="keyword">virtual</span> pid_t <a class="code" href="classPassenger_1_1StandardApplicationPool.html#6955152d237920988d20297d2fff5660" title="Get the process ID of the spawn server that is used.">getSpawnServerPid</a>()<span class="keyword"> const </span>{
|
772
|
-
<a name="l00751"></a>00751 <span class="keywordflow">return</span> spawnManager.<a class="code" href="classPassenger_1_1SpawnManager.html#1f77e2e7e6cb464028c13a29f983ad8e" title="Get the Process ID of the spawn server.">getServerPid</a>();
|
773
|
-
<a name="l00752"></a>00752 }
|
774
|
-
<a name="l00753"></a>00753 <span class="comment"></span>
|
775
|
-
<a name="l00754"></a>00754 <span class="comment"> /**</span>
|
776
|
-
<a name="l00755"></a>00755 <span class="comment"> * Returns a textual description of the internal state of</span>
|
777
|
-
<a name="l00756"></a>00756 <span class="comment"> * the application pool.</span>
|
778
|
-
<a name="l00757"></a>00757 <span class="comment"> */</span>
|
779
|
-
<a name="l00758"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383">00758</a> <span class="keyword">virtual</span> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#22b4149ca8256c3042fc342e681b0383" title="Returns a textual description of the internal state of the application pool.">toString</a>(<span class="keywordtype">bool</span> lockMutex = <span class="keyword">true</span>)<span class="keyword"> const </span>{
|
780
|
-
<a name="l00759"></a>00759 <span class="keywordflow">if</span> (lockMutex) {
|
781
|
-
<a name="l00760"></a>00760 unique_lock<boost::mutex> l(lock);
|
782
|
-
<a name="l00761"></a>00761 <span class="keywordflow">return</span> toStringWithoutLock();
|
783
|
-
<a name="l00762"></a>00762 } <span class="keywordflow">else</span> {
|
784
|
-
<a name="l00763"></a>00763 <span class="keywordflow">return</span> toStringWithoutLock();
|
785
|
-
<a name="l00764"></a>00764 }
|
786
|
-
<a name="l00765"></a>00765 }
|
787
|
-
<a name="l00766"></a>00766 <span class="comment"></span>
|
788
|
-
<a name="l00767"></a>00767 <span class="comment"> /**</span>
|
789
|
-
<a name="l00768"></a>00768 <span class="comment"> * Returns an XML description of the internal state of the</span>
|
790
|
-
<a name="l00769"></a>00769 <span class="comment"> * application pool.</span>
|
791
|
-
<a name="l00770"></a>00770 <span class="comment"> */</span>
|
792
|
-
<a name="l00771"></a><a class="code" href="classPassenger_1_1StandardApplicationPool.html#d153c41a1d0aca91d17cf36ed6fdda19">00771</a> <span class="keyword">virtual</span> <span class="keywordtype">string</span> <a class="code" href="classPassenger_1_1StandardApplicationPool.html#d153c41a1d0aca91d17cf36ed6fdda19" title="Returns an XML description of the internal state of the application pool.">toXml</a>()<span class="keyword"> const </span>{
|
793
|
-
<a name="l00772"></a>00772 unique_lock<boost::mutex> l(lock);
|
794
|
-
<a name="l00773"></a>00773 stringstream result;
|
795
|
-
<a name="l00774"></a>00774 DomainMap::const_iterator it;
|
796
|
-
<a name="l00775"></a>00775
|
797
|
-
<a name="l00776"></a>00776 result << <span class="stringliteral">"<?xml version=\"1.0\" encoding=\"iso8859-1\" ?>\n"</span>;
|
798
|
-
<a name="l00777"></a>00777 result << <span class="stringliteral">"<info>"</span>;
|
799
|
-
<a name="l00778"></a>00778
|
800
|
-
<a name="l00779"></a>00779 result << <span class="stringliteral">"<domains>"</span>;
|
801
|
-
<a name="l00780"></a>00780 <span class="keywordflow">for</span> (it = domains.begin(); it != domains.end(); it++) {
|
802
|
-
<a name="l00781"></a>00781 Domain *domain = it->second.get();
|
803
|
-
<a name="l00782"></a>00782 AppContainerList *instances = &domain->instances;
|
804
|
-
<a name="l00783"></a>00783 AppContainerList::const_iterator lit;
|
805
|
-
<a name="l00784"></a>00784
|
806
|
-
<a name="l00785"></a>00785 result << <span class="stringliteral">"<domain>"</span>;
|
807
|
-
<a name="l00786"></a>00786 result << <span class="stringliteral">"<name>"</span> << <a class="code" href="group__Support.html#ge74addedf73782a1eb1f6dd48d6fce06" title="Escape the given raw string into an XML value.">escapeForXml</a>(it->first) << <span class="stringliteral">"</name>"</span>;
|
808
|
-
<a name="l00787"></a>00787
|
809
|
-
<a name="l00788"></a>00788 result << <span class="stringliteral">"<instances>"</span>;
|
810
|
-
<a name="l00789"></a>00789 <span class="keywordflow">for</span> (lit = instances->begin(); lit != instances->end(); lit++) {
|
811
|
-
<a name="l00790"></a>00790 AppContainer *container = lit->get();
|
812
|
-
<a name="l00791"></a>00791
|
813
|
-
<a name="l00792"></a>00792 result << <span class="stringliteral">"<instance>"</span>;
|
814
|
-
<a name="l00793"></a>00793 result << <span class="stringliteral">"<pid>"</span> << container->app->getPid() << <span class="stringliteral">"</pid>"</span>;
|
815
|
-
<a name="l00794"></a>00794 result << <span class="stringliteral">"<sessions>"</span> << container->sessions << <span class="stringliteral">"</sessions>"</span>;
|
816
|
-
<a name="l00795"></a>00795 result << <span class="stringliteral">"<processed>"</span> << container->processed << <span class="stringliteral">"</processed>"</span>;
|
817
|
-
<a name="l00796"></a>00796 result << <span class="stringliteral">"<uptime>"</span> << container->uptime() << <span class="stringliteral">"</uptime>"</span>;
|
818
|
-
<a name="l00797"></a>00797 result << <span class="stringliteral">"</instance>"</span>;
|
819
|
-
<a name="l00798"></a>00798 }
|
820
|
-
<a name="l00799"></a>00799 result << <span class="stringliteral">"</instances>"</span>;
|
821
|
-
<a name="l00800"></a>00800
|
822
|
-
<a name="l00801"></a>00801 result << <span class="stringliteral">"</domain>"</span>;
|
823
|
-
<a name="l00802"></a>00802 }
|
824
|
-
<a name="l00803"></a>00803 result << <span class="stringliteral">"</domains>"</span>;
|
825
|
-
<a name="l00804"></a>00804
|
826
|
-
<a name="l00805"></a>00805 result << <span class="stringliteral">"</info>"</span>;
|
827
|
-
<a name="l00806"></a>00806 <span class="keywordflow">return</span> result.str();
|
828
|
-
<a name="l00807"></a>00807 }
|
829
|
-
<a name="l00808"></a>00808 };
|
830
|
-
<a name="l00809"></a>00809
|
831
|
-
<a name="l00810"></a>00810 <span class="keyword">typedef</span> shared_ptr<StandardApplicationPool> StandardApplicationPoolPtr;
|
832
|
-
<a name="l00811"></a>00811
|
833
|
-
<a name="l00812"></a>00812 } <span class="comment">// namespace Passenger</span>
|
834
|
-
<a name="l00813"></a>00813
|
835
|
-
<a name="l00814"></a>00814 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_STANDARD_APPLICATION_POOL_H_ */</span>
|
836
|
-
<a name="l00815"></a>00815
|
837
|
-
</pre></div></div>
|
838
|
-
<hr size="1"><address style="text-align: right;"><small>Generated on Wed Apr 8 22:35:10 2009 for Passenger by
|
839
|
-
<a href="http://www.doxygen.org/index.html">
|
840
|
-
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
|
841
|
-
</body>
|
842
|
-
</html>
|