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