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/boost/cstdint.hpp
CHANGED
@@ -122,8 +122,10 @@ namespace boost
|
|
122
122
|
|
123
123
|
} // namespace boost
|
124
124
|
|
125
|
-
#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__)
|
126
|
-
|
125
|
+
#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || \
|
126
|
+
defined(__SOLARIS9__)
|
127
|
+
// FreeBSD, Tru64 and Solaris 9 have an <inttypes.h> that contains much of
|
128
|
+
// what we need.
|
127
129
|
# include <inttypes.h>
|
128
130
|
|
129
131
|
namespace boost {
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED
|
2
|
+
#define BOOST_CURRENT_FUNCTION_HPP_INCLUDED
|
3
|
+
|
4
|
+
// MS compatible compilers support #pragma once
|
5
|
+
|
6
|
+
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
7
|
+
# pragma once
|
8
|
+
#endif
|
9
|
+
|
10
|
+
//
|
11
|
+
// boost/current_function.hpp - BOOST_CURRENT_FUNCTION
|
12
|
+
//
|
13
|
+
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
|
14
|
+
//
|
15
|
+
// Distributed under the Boost Software License, Version 1.0. (See
|
16
|
+
// accompanying file LICENSE_1_0.txt or copy at
|
17
|
+
// http://www.boost.org/LICENSE_1_0.txt)
|
18
|
+
//
|
19
|
+
// http://www.boost.org/libs/utility/current_function.html
|
20
|
+
//
|
21
|
+
|
22
|
+
namespace boost
|
23
|
+
{
|
24
|
+
|
25
|
+
namespace detail
|
26
|
+
{
|
27
|
+
|
28
|
+
inline void current_function_helper()
|
29
|
+
{
|
30
|
+
|
31
|
+
#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600))
|
32
|
+
|
33
|
+
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
|
34
|
+
|
35
|
+
#elif defined(__DMC__) && (__DMC__ >= 0x810)
|
36
|
+
|
37
|
+
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
|
38
|
+
|
39
|
+
#elif defined(__FUNCSIG__)
|
40
|
+
|
41
|
+
# define BOOST_CURRENT_FUNCTION __FUNCSIG__
|
42
|
+
|
43
|
+
#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))
|
44
|
+
|
45
|
+
# define BOOST_CURRENT_FUNCTION __FUNCTION__
|
46
|
+
|
47
|
+
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
|
48
|
+
|
49
|
+
# define BOOST_CURRENT_FUNCTION __FUNC__
|
50
|
+
|
51
|
+
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
|
52
|
+
|
53
|
+
# define BOOST_CURRENT_FUNCTION __func__
|
54
|
+
|
55
|
+
#else
|
56
|
+
|
57
|
+
# define BOOST_CURRENT_FUNCTION "(unknown)"
|
58
|
+
|
59
|
+
#endif
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
} // namespace detail
|
64
|
+
|
65
|
+
} // namespace boost
|
66
|
+
|
67
|
+
#endif // #ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED
|
@@ -51,14 +51,14 @@
|
|
51
51
|
|
52
52
|
# include <boost/detail/sp_counted_base_gcc_ppc.hpp>
|
53
53
|
|
54
|
-
#elif defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
|
55
|
-
|
56
|
-
# include <boost/detail/sp_counted_base_sync.hpp>
|
57
|
-
|
58
54
|
#elif defined(__GNUC__) && ( defined( __sparcv8 ) || defined( __sparcv9 ) )
|
59
55
|
|
60
56
|
# include <boost/detail/sp_counted_base_gcc_sparc.hpp>
|
61
57
|
|
58
|
+
#elif defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
|
59
|
+
|
60
|
+
# include <boost/detail/sp_counted_base_sync.hpp>
|
61
|
+
|
62
62
|
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
|
63
63
|
|
64
64
|
# include <boost/detail/sp_counted_base_w32.hpp>
|
@@ -9,6 +9,7 @@
|
|
9
9
|
#define BOOST_THREAD_EXCEPTIONS_PDM070801_H
|
10
10
|
|
11
11
|
#include <boost/thread/detail/config.hpp>
|
12
|
+
#include <oxt/tracable_exception.hpp>
|
12
13
|
|
13
14
|
// pdm: Sorry, but this class is used all over the place & I end up
|
14
15
|
// with recursive headers if I don't separate it
|
@@ -21,7 +22,7 @@
|
|
21
22
|
|
22
23
|
namespace boost {
|
23
24
|
|
24
|
-
class BOOST_THREAD_DECL thread_exception : public
|
25
|
+
class BOOST_THREAD_DECL thread_exception : public oxt::tracable_exception
|
25
26
|
{
|
26
27
|
protected:
|
27
28
|
std::string message;
|
@@ -134,15 +134,22 @@ namespace boost
|
|
134
134
|
mutable boost::mutex thread_info_mutex;
|
135
135
|
detail::thread_data_ptr thread_info;
|
136
136
|
|
137
|
-
void start_thread(unsigned int stack_size = 0);
|
138
|
-
|
139
137
|
explicit thread(detail::thread_data_ptr data);
|
140
138
|
|
141
139
|
detail::thread_data_ptr get_thread_info() const;
|
142
140
|
|
141
|
+
protected:
|
142
|
+
template <class F>
|
143
|
+
void set_thread_main_function(F f)
|
144
|
+
{
|
145
|
+
thread_info = detail::thread_data_ptr(new thread_data<F>(f));
|
146
|
+
}
|
147
|
+
|
148
|
+
void start_thread(unsigned int stack_size);
|
149
|
+
|
143
150
|
public:
|
144
151
|
thread();
|
145
|
-
~thread();
|
152
|
+
virtual ~thread();
|
146
153
|
|
147
154
|
template <class F>
|
148
155
|
explicit thread(F f, unsigned int stack_size = 0):
|
@@ -150,6 +157,7 @@ namespace boost
|
|
150
157
|
{
|
151
158
|
start_thread(stack_size);
|
152
159
|
}
|
160
|
+
|
153
161
|
template <class F>
|
154
162
|
thread(detail::thread_move_t<F> f, unsigned int stack_size = 0):
|
155
163
|
thread_info(new thread_data<F>(f))
|
@@ -10,12 +10,13 @@
|
|
10
10
|
#include <boost/enable_shared_from_this.hpp>
|
11
11
|
#include <boost/thread/mutex.hpp>
|
12
12
|
#include <boost/optional.hpp>
|
13
|
+
#include <oxt/tracable_exception.hpp>
|
13
14
|
#include <pthread.h>
|
14
15
|
#include "condition_variable_fwd.hpp"
|
15
16
|
|
16
17
|
namespace boost
|
17
18
|
{
|
18
|
-
class thread_interrupted
|
19
|
+
class thread_interrupted: public oxt::tracable_exception
|
19
20
|
{};
|
20
21
|
|
21
22
|
namespace detail
|
@@ -0,0 +1,172 @@
|
|
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
|
+
#if !(defined(NDEBUG) || defined(OXT_DISABLE_BACKTRACES))
|
26
|
+
|
27
|
+
#include <boost/thread/mutex.hpp>
|
28
|
+
#include <boost/thread/tss.hpp>
|
29
|
+
#include <sstream>
|
30
|
+
#include "backtrace.hpp"
|
31
|
+
|
32
|
+
namespace oxt {
|
33
|
+
|
34
|
+
boost::mutex _thread_registration_mutex;
|
35
|
+
list<thread_registration *> _registered_threads;
|
36
|
+
|
37
|
+
// Register main thread.
|
38
|
+
static initialize_backtrace_support_for_this_thread main_thread_initialization("Main thread");
|
39
|
+
|
40
|
+
/*
|
41
|
+
* boost::thread_specific_storage is pretty expensive. So we use the __thread
|
42
|
+
* keyword whenever possible - that's almost free.
|
43
|
+
* GCC supports the __thread keyword on x86 since version 3.3. Not sure
|
44
|
+
* about other architectures.
|
45
|
+
*/
|
46
|
+
|
47
|
+
#if defined(__GNUC__) && ( \
|
48
|
+
__GNUC__ > 3 || ( \
|
49
|
+
__GNUC__ == 3 && __GNUC_MINOR__ >= 3 \
|
50
|
+
) \
|
51
|
+
)
|
52
|
+
#define GCC_IS_3_3_OR_HIGHER
|
53
|
+
#endif
|
54
|
+
|
55
|
+
/*
|
56
|
+
* FreeBSD 5 supports the __thread keyword, and everything works fine in
|
57
|
+
* micro-tests, but in mod_passenger the thread-local variables are initialized
|
58
|
+
* to unaligned addresses for some weird reason, thereby causing bus errors.
|
59
|
+
*
|
60
|
+
* GCC on OpenBSD supports __thread, but any access to such a variable
|
61
|
+
* results in a segfault.
|
62
|
+
*
|
63
|
+
* Solaris does support __thread, but often it's not compiled into default GCC
|
64
|
+
* packages (not to mention it's not available for Sparc). Playing it safe...
|
65
|
+
*
|
66
|
+
* MacOS X doesn't support __thread at all.
|
67
|
+
*/
|
68
|
+
#if defined(GCC_IS_3_3_OR_HIGHER) && !defined(__FreeBSD__) && \
|
69
|
+
!defined(__SOLARIS__) && !defined(__OpenBSD__) && !defined(__APPLE__)
|
70
|
+
static __thread spin_lock *backtrace_lock = NULL;
|
71
|
+
static __thread vector<trace_point *> *current_backtrace = NULL;
|
72
|
+
|
73
|
+
void
|
74
|
+
_init_backtrace_tls() {
|
75
|
+
backtrace_lock = new spin_lock();
|
76
|
+
current_backtrace = new vector<trace_point *>();
|
77
|
+
current_backtrace->reserve(50);
|
78
|
+
}
|
79
|
+
|
80
|
+
void
|
81
|
+
_finalize_backtrace_tls() {
|
82
|
+
delete backtrace_lock;
|
83
|
+
delete current_backtrace;
|
84
|
+
}
|
85
|
+
|
86
|
+
spin_lock *
|
87
|
+
_get_backtrace_lock() {
|
88
|
+
return backtrace_lock;
|
89
|
+
}
|
90
|
+
|
91
|
+
vector<trace_point *> *
|
92
|
+
_get_current_backtrace() {
|
93
|
+
return current_backtrace;
|
94
|
+
}
|
95
|
+
#else
|
96
|
+
static thread_specific_ptr<spin_lock> backtrace_lock;
|
97
|
+
static thread_specific_ptr< vector<trace_point *> > current_backtrace;
|
98
|
+
|
99
|
+
void _init_backtrace_tls() {
|
100
|
+
// Not implemented.
|
101
|
+
}
|
102
|
+
|
103
|
+
void _finalize_backtrace_tls() {
|
104
|
+
// Not implemented.
|
105
|
+
}
|
106
|
+
|
107
|
+
spin_lock *
|
108
|
+
_get_backtrace_lock() {
|
109
|
+
spin_lock *result;
|
110
|
+
|
111
|
+
result = backtrace_lock.get();
|
112
|
+
if (OXT_UNLIKELY(result == NULL)) {
|
113
|
+
result = new spin_lock();
|
114
|
+
backtrace_lock.reset(result);
|
115
|
+
}
|
116
|
+
return result;
|
117
|
+
}
|
118
|
+
|
119
|
+
vector<trace_point *> *
|
120
|
+
_get_current_backtrace() {
|
121
|
+
vector<trace_point *> *result;
|
122
|
+
|
123
|
+
result = current_backtrace.get();
|
124
|
+
if (OXT_UNLIKELY(result == NULL)) {
|
125
|
+
result = new vector<trace_point *>();
|
126
|
+
current_backtrace.reset(result);
|
127
|
+
}
|
128
|
+
return result;
|
129
|
+
}
|
130
|
+
#endif
|
131
|
+
|
132
|
+
template<typename Iterable, typename ReverseIterator> static string
|
133
|
+
format_backtrace(Iterable backtrace_list) {
|
134
|
+
if (backtrace_list->empty()) {
|
135
|
+
return " (empty)";
|
136
|
+
} else {
|
137
|
+
stringstream result;
|
138
|
+
ReverseIterator it;
|
139
|
+
|
140
|
+
for (it = backtrace_list->rbegin(); it != backtrace_list->rend(); it++) {
|
141
|
+
trace_point *p = *it;
|
142
|
+
|
143
|
+
result << " in '" << p->function << "'";
|
144
|
+
if (p->source != NULL) {
|
145
|
+
result << " (" << p->source << ":" << p->line << ")";
|
146
|
+
}
|
147
|
+
result << endl;
|
148
|
+
}
|
149
|
+
return result.str();
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
string
|
154
|
+
_format_backtrace(const list<trace_point *> *backtrace_list) {
|
155
|
+
return format_backtrace<
|
156
|
+
const list<trace_point *> *,
|
157
|
+
list<trace_point *>::const_reverse_iterator
|
158
|
+
>(backtrace_list);
|
159
|
+
}
|
160
|
+
|
161
|
+
string
|
162
|
+
_format_backtrace(const vector<trace_point *> *backtrace_list) {
|
163
|
+
return format_backtrace<
|
164
|
+
const vector<trace_point *> *,
|
165
|
+
vector<trace_point *>::const_reverse_iterator
|
166
|
+
>(backtrace_list);
|
167
|
+
}
|
168
|
+
|
169
|
+
} // namespace oxt
|
170
|
+
|
171
|
+
#endif
|
172
|
+
|
@@ -0,0 +1,135 @@
|
|
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_BACKTRACE_HPP_
|
26
|
+
#define _OXT_BACKTRACE_HPP_
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Portable C++ backtrace support.
|
30
|
+
*
|
31
|
+
* C++ doesn't provide a builtin, automatic, portable way of obtaining
|
32
|
+
* backtraces. Obtaining a backtrace via a debugger (e.g. gdb) is very
|
33
|
+
* expensive. Furthermore, not all machines have a debugger installed.
|
34
|
+
* This makes it very hard to debug problems on production servers.
|
35
|
+
*
|
36
|
+
* This file provides a portable way of specifying and obtaining
|
37
|
+
* backtraces. Via oxt::thread::all_backtraces(), it is even possible
|
38
|
+
* to obtain the backtraces of all running threads.
|
39
|
+
*
|
40
|
+
* <h2>Initialization</h2>
|
41
|
+
* Every thread that is to contain backtrace information <b>must</b> be
|
42
|
+
* initialized. Initialization is done by instantiating an
|
43
|
+
* initialize_backtrace_support_for_this_thread object. This includes the main
|
44
|
+
* thread as well.
|
45
|
+
*
|
46
|
+
* If you use oxt::thread, then initialization will be automatically done for
|
47
|
+
* you for that partciular thread.
|
48
|
+
*
|
49
|
+
* <h2>Basic usage</h2>
|
50
|
+
* Backtrace points must be specified manually in the code using TRACE_POINT().
|
51
|
+
* The TracableException class allows one to obtain the backtrace at the moment
|
52
|
+
* the exception object was created.
|
53
|
+
*
|
54
|
+
* For example:
|
55
|
+
* @code
|
56
|
+
* void foo() {
|
57
|
+
* TRACE_POINT();
|
58
|
+
* do_something();
|
59
|
+
* bar();
|
60
|
+
* do_something_else();
|
61
|
+
* }
|
62
|
+
*
|
63
|
+
* void bar() {
|
64
|
+
* TRACE_POINT();
|
65
|
+
* throw TracableException();
|
66
|
+
* }
|
67
|
+
* @encode
|
68
|
+
*
|
69
|
+
* One can obtain the backtrace string, as follows:
|
70
|
+
* @code
|
71
|
+
* try {
|
72
|
+
* foo();
|
73
|
+
* } catch (const TracableException &e) {
|
74
|
+
* cout << "Something bad happened:\n" << e.backtrace();
|
75
|
+
* }
|
76
|
+
* @endcode
|
77
|
+
*
|
78
|
+
* This will print something like:
|
79
|
+
* @code
|
80
|
+
* Something bad happened:
|
81
|
+
* in 'bar' (example.cpp:123)
|
82
|
+
* in 'foo' (example.cpp:117)
|
83
|
+
* in 'example_function' (example.cpp:456)
|
84
|
+
* @encode
|
85
|
+
*
|
86
|
+
* <h2>Making sure the line number is correct</h2>
|
87
|
+
* A TRACE_POINT() call will add a backtrace point for the source line on
|
88
|
+
* which it is written. However, this causes an undesirable effect in long
|
89
|
+
* functions:
|
90
|
+
* @code
|
91
|
+
* 100 void some_long_function() {
|
92
|
+
* 101 TRACE_POINT();
|
93
|
+
* 102 do_something();
|
94
|
+
* 103 for (...) {
|
95
|
+
* 104 do_something();
|
96
|
+
* 105 }
|
97
|
+
* 106 do_something_else();
|
98
|
+
* 107
|
99
|
+
* 108 if (!write_file()) {
|
100
|
+
* 109 throw TracableException();
|
101
|
+
* 110 }
|
102
|
+
* 111 }
|
103
|
+
* @endcode
|
104
|
+
* You will want the thrown exception to show a backtrace line number that's
|
105
|
+
* near line 109. But as things are now, the backtrace will show line 101.
|
106
|
+
*
|
107
|
+
* This can be solved by calling UPDATE_TRACE_POINT() from time to time:
|
108
|
+
* @code
|
109
|
+
* 100 void some_long_function() {
|
110
|
+
* 101 TRACE_POINT();
|
111
|
+
* 102 do_something();
|
112
|
+
* 103 for (...) {
|
113
|
+
* 104 do_something();
|
114
|
+
* 105 }
|
115
|
+
* 106 do_something_else();
|
116
|
+
* 107
|
117
|
+
* 108 if (!write_file()) {
|
118
|
+
* 109 UPDATE_TRACE_POINT(); // Added!
|
119
|
+
* 110 throw TracableException();
|
120
|
+
* 111 }
|
121
|
+
* 112 }
|
122
|
+
* @endcode
|
123
|
+
*
|
124
|
+
* <h2>Compilation options</h2>
|
125
|
+
* Define OXT_DISABLE_BACKTRACES to disable backtrace support. The backtrace
|
126
|
+
* functions as provided by this header will become empty stubs.
|
127
|
+
*/
|
128
|
+
|
129
|
+
#if defined(NDEBUG) || defined(OXT_DISABLE_BACKTRACES)
|
130
|
+
#include "detail/backtrace_disabled.hpp"
|
131
|
+
#else
|
132
|
+
#include "detail/backtrace_enabled.hpp"
|
133
|
+
#endif
|
134
|
+
|
135
|
+
#endif /* _OXT_BACKTRACE_HPP_ */
|