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
data/ext/oxt/thread.cpp
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
* OXT - OS eXtensions for boosT
|
3
|
+
* Provides important functionality necessary for writing robust server software.
|
4
|
+
*
|
5
|
+
* Copyright (c) 2008 Phusion
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
25
|
+
|
26
|
+
#include "thread.hpp"
|
27
|
+
|
28
|
+
namespace oxt {
|
29
|
+
boost::mutex _next_thread_number_mutex;
|
30
|
+
unsigned int _next_thread_number = 0;
|
31
|
+
}
|
32
|
+
|
data/ext/oxt/thread.hpp
ADDED
@@ -0,0 +1,223 @@
|
|
1
|
+
/*
|
2
|
+
* OXT - OS eXtensions for boosT
|
3
|
+
* Provides important functionality necessary for writing robust server software.
|
4
|
+
*
|
5
|
+
* Copyright (c) 2008 Phusion
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
25
|
+
#ifndef _OXT_THREAD_HPP_
|
26
|
+
#define _OXT_THREAD_HPP_
|
27
|
+
|
28
|
+
#include <boost/thread.hpp>
|
29
|
+
#include <boost/shared_ptr.hpp>
|
30
|
+
#include <boost/bind.hpp>
|
31
|
+
#include <boost/date_time/posix_time/posix_time_types.hpp>
|
32
|
+
#include "system_calls.hpp"
|
33
|
+
#include "backtrace.hpp"
|
34
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
35
|
+
#include <sstream>
|
36
|
+
#endif
|
37
|
+
|
38
|
+
namespace oxt {
|
39
|
+
|
40
|
+
extern boost::mutex _next_thread_number_mutex;
|
41
|
+
extern unsigned int _next_thread_number;
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Enhanced thread class with support for:
|
45
|
+
* - user-defined stack size.
|
46
|
+
* - system call interruption.
|
47
|
+
* - backtraces.
|
48
|
+
*/
|
49
|
+
class thread: public boost::thread {
|
50
|
+
private:
|
51
|
+
struct thread_data {
|
52
|
+
std::string name;
|
53
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
54
|
+
thread_registration *registration;
|
55
|
+
boost::mutex registration_lock;
|
56
|
+
bool done;
|
57
|
+
#endif
|
58
|
+
};
|
59
|
+
|
60
|
+
typedef boost::shared_ptr<thread_data> thread_data_ptr;
|
61
|
+
|
62
|
+
thread_data_ptr data;
|
63
|
+
|
64
|
+
void initialize_data(const std::string &thread_name) {
|
65
|
+
data = thread_data_ptr(new thread_data());
|
66
|
+
if (thread_name.empty()) {
|
67
|
+
boost::mutex::scoped_lock l(_next_thread_number_mutex);
|
68
|
+
std::stringstream str;
|
69
|
+
|
70
|
+
str << "Thread #" << _next_thread_number;
|
71
|
+
_next_thread_number++;
|
72
|
+
data->name = str.str();
|
73
|
+
} else {
|
74
|
+
data->name = thread_name;
|
75
|
+
}
|
76
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
77
|
+
data->registration = NULL;
|
78
|
+
data->done = false;
|
79
|
+
#endif
|
80
|
+
}
|
81
|
+
|
82
|
+
static void thread_main(boost::function<void ()> func, thread_data_ptr data) {
|
83
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
84
|
+
initialize_backtrace_support_for_this_thread i(data->name);
|
85
|
+
data->registration = i.registration;
|
86
|
+
#endif
|
87
|
+
|
88
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
89
|
+
// Put finalization code in a struct destructor,
|
90
|
+
// for exception safety.
|
91
|
+
struct finalization_routines {
|
92
|
+
thread_data_ptr &data;
|
93
|
+
|
94
|
+
finalization_routines(thread_data_ptr &data_)
|
95
|
+
: data(data_) {}
|
96
|
+
|
97
|
+
~finalization_routines() {
|
98
|
+
boost::mutex::scoped_lock l(data->registration_lock);
|
99
|
+
data->registration = NULL;
|
100
|
+
data->done = true;
|
101
|
+
}
|
102
|
+
};
|
103
|
+
finalization_routines f(data);
|
104
|
+
#endif
|
105
|
+
|
106
|
+
func();
|
107
|
+
}
|
108
|
+
|
109
|
+
public:
|
110
|
+
/**
|
111
|
+
* Create a new thread.
|
112
|
+
*
|
113
|
+
* @param func A function object which will be called as the thread's
|
114
|
+
* main function. This object must be copyable. <tt>func</tt> is
|
115
|
+
* copied into storage managed internally by the thread library,
|
116
|
+
* and that copy is invoked on a newly-created thread of execution.
|
117
|
+
* @param name A name for this thread. If an empty string is given, then
|
118
|
+
* a name will be automatically chosen.
|
119
|
+
* @param stack_size The stack size, in bytes, that the thread should
|
120
|
+
* have. If 0 is specified, the operating system's default stack
|
121
|
+
* size is used.
|
122
|
+
* @pre func must be copyable.
|
123
|
+
* @throws boost::thread_resource_error Something went wrong during
|
124
|
+
* creation of the thread.
|
125
|
+
*/
|
126
|
+
explicit thread(boost::function<void ()> func, const std::string &name = "", unsigned int stack_size = 0) {
|
127
|
+
initialize_data(name);
|
128
|
+
|
129
|
+
set_thread_main_function(boost::bind(thread_main, func, data));
|
130
|
+
start_thread(stack_size);
|
131
|
+
}
|
132
|
+
|
133
|
+
/**
|
134
|
+
* Return this thread's name. The name was set during construction.
|
135
|
+
*/
|
136
|
+
std::string name() const throw() {
|
137
|
+
return data->name;
|
138
|
+
}
|
139
|
+
|
140
|
+
/**
|
141
|
+
* Return the current backtrace of the thread of execution, as a string.
|
142
|
+
*/
|
143
|
+
std::string backtrace() const throw() {
|
144
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
145
|
+
boost::mutex::scoped_lock l(data->registration_lock);
|
146
|
+
if (data->registration == NULL) {
|
147
|
+
if (data->done) {
|
148
|
+
return " (no backtrace: thread has quit)";
|
149
|
+
} else {
|
150
|
+
return " (no backtrace: thread hasn't been started yet)";
|
151
|
+
}
|
152
|
+
} else {
|
153
|
+
spin_lock::scoped_lock l2(*data->registration->backtrace_lock);
|
154
|
+
return _format_backtrace(data->registration->backtrace);
|
155
|
+
}
|
156
|
+
#else
|
157
|
+
return " (backtrace support disabled during compile time)";
|
158
|
+
#endif
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* Return the backtraces of all oxt::thread threads, as well as that of the
|
163
|
+
* main thread, in a nicely formatted string.
|
164
|
+
*/
|
165
|
+
static std::string all_backtraces() throw() {
|
166
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
167
|
+
boost::mutex::scoped_lock l(_thread_registration_mutex);
|
168
|
+
list<thread_registration *>::const_iterator it;
|
169
|
+
std::stringstream result;
|
170
|
+
|
171
|
+
for (it = _registered_threads.begin(); it != _registered_threads.end(); it++) {
|
172
|
+
thread_registration *r = *it;
|
173
|
+
result << "Thread '" << r->name << "':" << endl;
|
174
|
+
|
175
|
+
spin_lock::scoped_lock l(*r->backtrace_lock);
|
176
|
+
result << _format_backtrace(r->backtrace) << endl;
|
177
|
+
}
|
178
|
+
return result.str();
|
179
|
+
#else
|
180
|
+
return "(backtrace support disabled during compile time)";
|
181
|
+
#endif
|
182
|
+
}
|
183
|
+
|
184
|
+
/**
|
185
|
+
* Interrupt the thread. This method behaves just like
|
186
|
+
* boost::thread::interrupt(), but will also respect the interruption
|
187
|
+
* points defined in oxt::syscalls.
|
188
|
+
*
|
189
|
+
* Note that an interruption request may get lost, depending on the
|
190
|
+
* current execution point of the thread. Thus, one should call this
|
191
|
+
* method in a loop, until a certain goal condition has been fulfilled.
|
192
|
+
* interrupt_and_join() is a convenience method that implements this
|
193
|
+
* pattern.
|
194
|
+
*/
|
195
|
+
void interrupt() {
|
196
|
+
int ret;
|
197
|
+
|
198
|
+
boost::thread::interrupt();
|
199
|
+
do {
|
200
|
+
ret = pthread_kill(native_handle(),
|
201
|
+
INTERRUPTION_SIGNAL);
|
202
|
+
} while (ret == EINTR);
|
203
|
+
}
|
204
|
+
|
205
|
+
/**
|
206
|
+
* Keep interrupting the thread until it's done, then join it.
|
207
|
+
*
|
208
|
+
* @throws boost::thread_interrupted The calling thread has been
|
209
|
+
* interrupted before we could join this thread.
|
210
|
+
*/
|
211
|
+
void interrupt_and_join() {
|
212
|
+
bool done = false;
|
213
|
+
while (!done) {
|
214
|
+
interrupt();
|
215
|
+
done = timed_join(boost::posix_time::millisec(10));
|
216
|
+
}
|
217
|
+
}
|
218
|
+
};
|
219
|
+
|
220
|
+
} // namespace oxt
|
221
|
+
|
222
|
+
#endif /* _OXT_THREAD_HPP_ */
|
223
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
/*
|
2
|
+
* OXT - OS eXtensions for boosT
|
3
|
+
* Provides important functionality necessary for writing robust server software.
|
4
|
+
*
|
5
|
+
* Copyright (c) 2008 Phusion
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
25
|
+
#include "tracable_exception.hpp"
|
26
|
+
#include "backtrace.hpp"
|
27
|
+
|
28
|
+
#ifdef OXT_BACKTRACE_IS_ENABLED
|
29
|
+
|
30
|
+
#include <boost/thread/mutex.hpp>
|
31
|
+
#include "macros.hpp"
|
32
|
+
|
33
|
+
namespace oxt {
|
34
|
+
|
35
|
+
using namespace std;
|
36
|
+
|
37
|
+
tracable_exception::tracable_exception() {
|
38
|
+
spin_lock *lock = _get_backtrace_lock();
|
39
|
+
if (OXT_LIKELY(lock != NULL)) {
|
40
|
+
spin_lock::scoped_lock l(*lock);
|
41
|
+
vector<trace_point *> *bt = _get_current_backtrace();
|
42
|
+
vector<trace_point *>::const_iterator it;
|
43
|
+
|
44
|
+
for (it = bt->begin(); it != bt->end(); it++) {
|
45
|
+
trace_point *p = new trace_point(
|
46
|
+
(*it)->function,
|
47
|
+
(*it)->source,
|
48
|
+
(*it)->line,
|
49
|
+
true);
|
50
|
+
backtrace_copy.push_back(p);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
tracable_exception::tracable_exception(const tracable_exception &other) {
|
56
|
+
list<trace_point *>::const_iterator it;
|
57
|
+
for (it = other.backtrace_copy.begin(); it != other.backtrace_copy.end(); it++) {
|
58
|
+
trace_point *p = new trace_point(
|
59
|
+
(*it)->function,
|
60
|
+
(*it)->source,
|
61
|
+
(*it)->line,
|
62
|
+
true);
|
63
|
+
backtrace_copy.push_back(p);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
tracable_exception::~tracable_exception() throw() {
|
68
|
+
list<trace_point *>::iterator it;
|
69
|
+
for (it = backtrace_copy.begin(); it != backtrace_copy.end(); it++) {
|
70
|
+
delete *it;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
string
|
75
|
+
tracable_exception::backtrace() const throw() {
|
76
|
+
return _format_backtrace(&backtrace_copy);
|
77
|
+
}
|
78
|
+
|
79
|
+
const char *
|
80
|
+
tracable_exception::what() const throw() {
|
81
|
+
return "oxt::tracable_exception";
|
82
|
+
}
|
83
|
+
|
84
|
+
} // namespace oxt
|
85
|
+
|
86
|
+
#endif
|
87
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
/*
|
2
|
+
* OXT - OS eXtensions for boosT
|
3
|
+
* Provides important functionality necessary for writing robust server software.
|
4
|
+
*
|
5
|
+
* Copyright (c) 2008 Phusion
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
25
|
+
#ifndef _OXT_TRACABLE_EXCEPTION_HPP_
|
26
|
+
#define _OXT_TRACABLE_EXCEPTION_HPP_
|
27
|
+
|
28
|
+
#if defined(NDEBUG) || defined(OXT_DISABLE_BACKTRACES)
|
29
|
+
#include "detail/tracable_exception_disabled.hpp"
|
30
|
+
#else
|
31
|
+
#include "detail/tracable_exception_enabled.hpp"
|
32
|
+
#endif
|
33
|
+
|
34
|
+
#endif /* _OXT_TRACABLE_EXCEPTION_HPP_ */
|
35
|
+
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# Phusion Passenger - http://www.modrails.com/
|
2
2
|
# Copyright (C) 2008 Phusion
|
3
3
|
#
|
4
|
+
# Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
|
5
|
+
#
|
4
6
|
# This program is free software; you can redistribute it and/or modify
|
5
7
|
# it under the terms of the GNU General Public License as published by
|
6
8
|
# the Free Software Foundation; version 2 of the License.
|
@@ -13,14 +15,17 @@
|
|
13
15
|
# You should have received a copy of the GNU General Public License along
|
14
16
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
17
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
18
|
+
require 'mkmf'
|
19
|
+
$LIBS=""
|
20
|
+
|
21
|
+
if RUBY_PLATFORM =~ /solaris/
|
22
|
+
have_library('xnet')
|
23
|
+
$CFLAGS << " -D_XPG4_2"
|
24
|
+
if RUBY_PLATFORM =~ /solaris2.9/
|
25
|
+
$CFLAGS << " -D__SOLARIS9__"
|
26
|
+
end
|
27
|
+
end
|
16
28
|
|
17
|
-
|
18
|
-
|
19
|
-
APP_SPAWNER_MAX_IDLE_TIME = 10 * 60
|
20
|
-
|
21
|
-
SPAWNER_CLEAN_INTERVAL = [
|
22
|
-
FRAMEWORK_SPAWNER_MAX_IDLE_TIME,
|
23
|
-
APP_SPAWNER_MAX_IDLE_TIME
|
24
|
-
].min + 5
|
25
|
-
APP_SPAWNER_CLEAN_INTERVAL = APP_SPAWNER_MAX_IDLE_TIME + 5
|
29
|
+
with_cflags($CFLAGS) do
|
30
|
+
create_makefile('native_support')
|
26
31
|
end
|
@@ -21,14 +21,26 @@
|
|
21
21
|
#include <sys/types.h>
|
22
22
|
#include <sys/un.h>
|
23
23
|
#include <sys/socket.h>
|
24
|
+
#include <stdio.h>
|
24
25
|
#include <string.h>
|
25
26
|
#include <unistd.h>
|
26
27
|
#include <errno.h>
|
28
|
+
#ifdef __OpenBSD__
|
29
|
+
// OpenBSD needs this for 'struct iovec'. Apparently it isn't
|
30
|
+
// always included by unistd.h and sys/types.h.
|
31
|
+
#include <sys/uio.h>
|
32
|
+
#endif
|
27
33
|
|
28
34
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
29
35
|
#ifndef RARRAY_LEN
|
30
36
|
#define RARRAY_LEN(ary) RARRAY(ary)->len
|
31
37
|
#endif
|
38
|
+
#ifndef RSTRING_PTR
|
39
|
+
#define RSTRING_PTR(str) RSTRING(str)->ptr
|
40
|
+
#endif
|
41
|
+
#ifndef RSTRING_LEN
|
42
|
+
#define RSTRING_LEN(str) RSTRING(str)->len
|
43
|
+
#endif
|
32
44
|
|
33
45
|
static VALUE mPassenger;
|
34
46
|
static VALUE mNativeSupport;
|
@@ -48,7 +60,7 @@ send_fd(VALUE self, VALUE socket_fd, VALUE fd_to_send) {
|
|
48
60
|
struct msghdr msg;
|
49
61
|
struct iovec vec;
|
50
62
|
char dummy[1];
|
51
|
-
#
|
63
|
+
#if defined(__APPLE__) || defined(__SOLARIS__)
|
52
64
|
struct {
|
53
65
|
struct cmsghdr header;
|
54
66
|
int fd;
|
@@ -77,7 +89,7 @@ send_fd(VALUE self, VALUE socket_fd, VALUE fd_to_send) {
|
|
77
89
|
control_header->cmsg_level = SOL_SOCKET;
|
78
90
|
control_header->cmsg_type = SCM_RIGHTS;
|
79
91
|
control_payload = NUM2INT(fd_to_send);
|
80
|
-
#
|
92
|
+
#if defined(__APPLE__) || defined(__SOLARIS__)
|
81
93
|
control_header->cmsg_len = sizeof(control_data);
|
82
94
|
control_data.fd = control_payload;
|
83
95
|
#else
|
@@ -108,7 +120,7 @@ recv_fd(VALUE self, VALUE socket_fd) {
|
|
108
120
|
struct msghdr msg;
|
109
121
|
struct iovec vec;
|
110
122
|
char dummy[1];
|
111
|
-
#
|
123
|
+
#if defined(__APPLE__) || defined(__SOLARIS__)
|
112
124
|
// File descriptor passing macros (CMSG_*) seem to be broken
|
113
125
|
// on 64-bit MacOS X. This structure works around the problem.
|
114
126
|
struct {
|
@@ -147,7 +159,7 @@ recv_fd(VALUE self, VALUE socket_fd) {
|
|
147
159
|
rb_sys_fail("No valid file descriptor received.");
|
148
160
|
return Qnil;
|
149
161
|
}
|
150
|
-
#
|
162
|
+
#if defined(__APPLE__) || defined(__SOLARIS__)
|
151
163
|
return INT2NUM(control_data.fd);
|
152
164
|
#else
|
153
165
|
return INT2NUM(*((int *) CMSG_DATA(control_header)));
|
@@ -173,7 +185,8 @@ create_unix_socket(VALUE self, VALUE filename, VALUE backlog) {
|
|
173
185
|
char *filename_str;
|
174
186
|
long filename_length;
|
175
187
|
|
176
|
-
filename_str =
|
188
|
+
filename_str = RSTRING_PTR(filename);
|
189
|
+
filename_length = RSTRING_LEN(filename);
|
177
190
|
|
178
191
|
fd = socket(PF_UNIX, SOCK_STREAM, 0);
|
179
192
|
if (fd == -1) {
|
@@ -251,12 +264,25 @@ close_all_file_descriptors(VALUE self, VALUE exceptions) {
|
|
251
264
|
return Qnil;
|
252
265
|
}
|
253
266
|
|
267
|
+
/*
|
268
|
+
* call-seq: disable_stdio_buffering
|
269
|
+
*
|
270
|
+
* Disables any kind of buffering on the C +stdout+ and +stderr+ variables,
|
271
|
+
* so that +fprintf()+ on +stdout+ and +stderr+ have immediate effect.
|
272
|
+
*/
|
273
|
+
static VALUE
|
274
|
+
disable_stdio_buffering() {
|
275
|
+
setvbuf(stdout, NULL, _IONBF, 0);
|
276
|
+
setvbuf(stderr, NULL, _IONBF, 0);
|
277
|
+
return Qnil;
|
278
|
+
}
|
279
|
+
|
254
280
|
void
|
255
281
|
Init_native_support() {
|
256
282
|
struct sockaddr_un addr;
|
257
283
|
|
258
284
|
/* */
|
259
|
-
mPassenger = rb_define_module("
|
285
|
+
mPassenger = rb_define_module("PhusionPassenger"); // Do not remove the above comment. We want the Passenger module's rdoc to be empty.
|
260
286
|
|
261
287
|
/*
|
262
288
|
* Utility functions for accessing system functionality.
|
@@ -268,6 +294,7 @@ Init_native_support() {
|
|
268
294
|
rb_define_singleton_method(mNativeSupport, "create_unix_socket", create_unix_socket, 2);
|
269
295
|
rb_define_singleton_method(mNativeSupport, "accept", f_accept, 1);
|
270
296
|
rb_define_singleton_method(mNativeSupport, "close_all_file_descriptors", close_all_file_descriptors, 1);
|
297
|
+
rb_define_singleton_method(mNativeSupport, "disable_stdio_buffering", disable_stdio_buffering, 0);
|
271
298
|
|
272
299
|
/* The maximum length of a Unix socket path, including terminating null. */
|
273
300
|
rb_define_const(mNativeSupport, "UNIX_PATH_MAX", INT2NUM(sizeof(addr.sun_path)));
|