passenger 5.0.0.beta3 → 5.0.0.rc1
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.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +11 -5
- data/CHANGELOG +38 -0
- data/CONTRIBUTING.md +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +33 -33
- data/bin/passenger +1 -1
- data/bin/passenger-config +1 -1
- data/bin/passenger-install-apache2-module +800 -800
- data/bin/passenger-install-nginx-module +592 -592
- data/bin/passenger-memory-stats +127 -127
- data/bin/passenger-status +216 -216
- data/build/agents.rb +127 -127
- data/build/apache2.rb +87 -87
- data/build/basics.rb +60 -60
- data/build/common_library.rb +165 -165
- data/build/cplusplus_support.rb +51 -51
- data/build/cxx_tests.rb +268 -268
- data/build/debian.rb +143 -143
- data/build/documentation.rb +58 -58
- data/build/integration_tests.rb +81 -81
- data/build/misc.rb +132 -132
- data/build/nginx.rb +20 -20
- data/build/node_tests.rb +7 -7
- data/build/oxt_tests.rb +14 -14
- data/build/packaging.rb +570 -570
- data/build/preprocessor.rb +260 -260
- data/build/rake_extensions.rb +71 -71
- data/build/ruby_extension.rb +29 -29
- data/build/ruby_tests.rb +6 -6
- data/build/test_basics.rb +37 -37
- data/debian.template/control.template +3 -5
- data/dev/copy_boost_headers +134 -134
- data/dev/install_scripts_bootstrap_code.rb +25 -25
- data/dev/list_tests +20 -20
- data/dev/ruby_server.rb +223 -223
- data/dev/runner +18 -18
- data/doc/ServerOptimizationGuide.txt.md +55 -2
- data/doc/Users guide Nginx.txt +0 -26
- data/doc/Users guide Standalone.txt +5 -1
- data/doc/users_guide_snippets/tips.txt +9 -0
- data/ext/common/ApplicationPool2/Group.h +23 -11
- data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
- data/ext/common/ApplicationPool2/Pool.h +22 -17
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/ApplicationPool2/Spawner.h +1 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/agents/Base.cpp +35 -20
- data/ext/common/agents/HelperAgent/Main.cpp +8 -1
- data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
- data/ext/common/agents/Main.cpp +1 -1
- data/ext/common/agents/Watchdog/Main.cpp +54 -19
- data/ext/nginx/Configuration.c +7 -0
- data/ext/nginx/ContentHandler.c +9 -1
- data/helper-scripts/backtrace-sanitizer.rb +106 -87
- data/helper-scripts/crash-watch.rb +32 -0
- data/helper-scripts/download_binaries/extconf.rb +38 -38
- data/helper-scripts/meteor-loader.rb +107 -107
- data/helper-scripts/prespawn +101 -101
- data/helper-scripts/rack-loader.rb +96 -96
- data/helper-scripts/rack-preloader.rb +137 -137
- data/lib/phusion_passenger.rb +292 -292
- data/lib/phusion_passenger/abstract_installer.rb +438 -438
- data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
- data/lib/phusion_passenger/admin_tools.rb +20 -20
- data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
- data/lib/phusion_passenger/apache2/config_options.rb +182 -182
- data/lib/phusion_passenger/common_library.rb +479 -485
- data/lib/phusion_passenger/config/about_command.rb +161 -161
- data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
- data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
- data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
- data/lib/phusion_passenger/config/command.rb +25 -25
- data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
- data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
- data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
- data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
- data/lib/phusion_passenger/config/installation_utils.rb +204 -204
- data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
- data/lib/phusion_passenger/config/main.rb +152 -152
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
- data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
- data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
- data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
- data/lib/phusion_passenger/config/utils.rb +95 -95
- data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
- data/lib/phusion_passenger/console_text_template.rb +25 -25
- data/lib/phusion_passenger/constants.rb +90 -90
- data/lib/phusion_passenger/debug_logging.rb +106 -106
- data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
- data/lib/phusion_passenger/message_channel.rb +312 -312
- data/lib/phusion_passenger/message_client.rb +176 -176
- data/lib/phusion_passenger/native_support.rb +369 -369
- data/lib/phusion_passenger/nginx/config_options.rb +297 -297
- data/lib/phusion_passenger/packaging.rb +131 -131
- data/lib/phusion_passenger/platform_info.rb +360 -360
- data/lib/phusion_passenger/platform_info/apache.rb +767 -767
- data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
- data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
- data/lib/phusion_passenger/platform_info/curl.rb +32 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
- data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
- data/lib/phusion_passenger/platform_info/linux.rb +55 -55
- data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
- data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
- data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
- data/lib/phusion_passenger/plugin.rb +66 -66
- data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
- data/lib/phusion_passenger/public_api.rb +191 -191
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
- data/lib/phusion_passenger/request_handler.rb +567 -577
- data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
- data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
- data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
- data/lib/phusion_passenger/standalone/command.rb +44 -40
- data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
- data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
- data/lib/phusion_passenger/standalone/main.rb +73 -73
- data/lib/phusion_passenger/standalone/start_command.rb +697 -685
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
- data/lib/phusion_passenger/standalone/status_command.rb +64 -64
- data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
- data/lib/phusion_passenger/standalone/version_command.rb +9 -9
- data/lib/phusion_passenger/union_station/connection.rb +32 -32
- data/lib/phusion_passenger/union_station/core.rb +251 -251
- data/lib/phusion_passenger/union_station/transaction.rb +126 -126
- data/lib/phusion_passenger/utils.rb +199 -167
- data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
- data/lib/phusion_passenger/utils/download.rb +196 -196
- data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
- data/lib/phusion_passenger/utils/lock.rb +31 -31
- data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
- data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
- data/lib/phusion_passenger/utils/shellwords.rb +20 -20
- data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
- data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
- data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
- data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
- data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
- data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
- data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
- data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
- data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
- data/passenger.gemspec +0 -1
- data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
- data/resources/templates/standalone/config.erb +19 -15
- data/test/integration_tests/apache2_tests.rb +566 -566
- data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
- data/test/integration_tests/native_packaging_spec.rb +296 -296
- data/test/integration_tests/nginx_tests.rb +393 -393
- data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
- data/test/integration_tests/source_packaging_test.rb +138 -138
- data/test/integration_tests/spec_helper.rb +5 -5
- data/test/integration_tests/standalone_tests.rb +367 -367
- data/test/ruby/debug_logging_spec.rb +133 -133
- data/test/ruby/message_channel_spec.rb +186 -186
- data/test/ruby/rack/loader_spec.rb +28 -28
- data/test/ruby/rack/preloader_spec.rb +34 -34
- data/test/ruby/rails3.0/loader_spec.rb +12 -12
- data/test/ruby/rails3.0/preloader_spec.rb +18 -18
- data/test/ruby/rails3.1/loader_spec.rb +12 -12
- data/test/ruby/rails3.1/preloader_spec.rb +18 -18
- data/test/ruby/rails3.2/loader_spec.rb +12 -12
- data/test/ruby/rails3.2/preloader_spec.rb +18 -18
- data/test/ruby/rails4.0/loader_spec.rb +12 -12
- data/test/ruby/rails4.0/preloader_spec.rb +18 -18
- data/test/ruby/rails4.1/loader_spec.rb +12 -12
- data/test/ruby/rails4.1/preloader_spec.rb +18 -18
- data/test/ruby/request_handler_spec.rb +730 -730
- data/test/ruby/shared/loader_sharedspec.rb +224 -224
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
- data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
- data/test/ruby/spec_helper.rb +65 -65
- data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
- data/test/ruby/union_station_spec.rb +276 -276
- data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
- data/test/ruby/utils/hosts_file_parser.rb +248 -248
- data/test/ruby/utils/tee_input_spec.rb +215 -215
- data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
- data/test/ruby/utils_spec.rb +21 -21
- data/test/stub/rack/config.ru +87 -87
- data/test/stub/rack/library.rb +8 -8
- data/test/stub/rack/start.rb +30 -30
- data/test/support/apache2_controller.rb +191 -191
- data/test/support/nginx_controller.rb +90 -99
- data/test/support/placebo-preloader.rb +57 -57
- data/test/support/test_helper.rb +435 -435
- metadata +11 -21
- metadata.gz.asc +7 -7
- data/lib/phusion_passenger/standalone/command2.rb +0 -292
- data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
- data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
- data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -23,7 +23,7 @@ define 'ruby-dev' do
|
|
23
23
|
false
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
if ruby_command =~ %r(^/usr/bin/ruby) || ruby_command =~ %r(^/System/Library/Frameworks/Ruby.framework)
|
28
28
|
# Only tell user to install the headers with the system's package manager
|
29
29
|
# if Ruby itself was installed with the package manager.
|
@@ -83,20 +83,20 @@ define 'rubygems' do
|
|
83
83
|
false
|
84
84
|
end
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
install_instructions "Please download it from <b>#{website}</b>. " +
|
88
88
|
"Extract the tarball, and run <b>ruby setup.rb</b>"
|
89
89
|
if ruby_command =~ %r(^/usr/bin/ruby)
|
90
90
|
# Only tell user to install RubyGems with the system's package manager
|
91
91
|
# if Ruby itself was installed with the package manager.
|
92
|
-
#
|
92
|
+
#
|
93
93
|
# Older versions of Debian have totally messed up RubyGems by patching it to install binaries
|
94
94
|
# to /var/lib/gems/bin instead of /usr/bin or even /usr/local/bin. That
|
95
95
|
# wouldn't be so much of a problem were it not for the fact that
|
96
96
|
# /var/lib/gems/bin is not in $PATH by default, so on a regular basis people
|
97
97
|
# ask various Ruby/Rails support forums why they get a 'foo: command not found'
|
98
98
|
# after typing 'gem install foo'.
|
99
|
-
#
|
99
|
+
#
|
100
100
|
# Luckily newer Debian versions fixed this problem.
|
101
101
|
on :debian do
|
102
102
|
apt_get_install "rubygems"
|
@@ -120,7 +120,7 @@ define 'rake' do
|
|
120
120
|
false
|
121
121
|
end
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
if ruby_command =~ %r(^/usr/bin/ruby)
|
125
125
|
# Only tell user to install Rake with the system's package manager
|
126
126
|
# if Ruby itself was installed with the package manager.
|
@@ -1,15 +1,15 @@
|
|
1
1
|
define 'download-tool' do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
2
|
+
name "A download tool like 'wget' or 'curl'"
|
3
|
+
define_checker do
|
4
|
+
check_for_command('wget') || check_for_command('curl')
|
5
|
+
end
|
6
|
+
on :debian do
|
7
|
+
apt_get_install "wget curl"
|
8
|
+
end
|
9
|
+
on :redhat do
|
10
|
+
yum_install "wget curl"
|
11
|
+
end
|
12
|
+
on :other_platforms do
|
13
|
+
install_instructions "Please install either wget (http://www.gnu.org/software/wget/) or curl (http://curl.haxx.se/)."
|
14
|
+
end
|
15
15
|
end
|
@@ -27,60 +27,60 @@ PhusionPassenger.require_passenger_lib 'platform_info/operating_system'
|
|
27
27
|
|
28
28
|
module PhusionPassenger
|
29
29
|
|
30
|
-
module PlatformInfo
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
30
|
+
module PlatformInfo
|
31
|
+
# An identifier for the current Linux distribution. nil if the operating system is not Linux.
|
32
|
+
def self.linux_distro
|
33
|
+
tags = linux_distro_tags
|
34
|
+
if tags
|
35
|
+
return tags.first
|
36
|
+
else
|
37
|
+
return nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Autodetects the current Linux distribution and return a number of identifier tags.
|
42
|
+
# The first tag identifies the distribution while the other tags indicate which
|
43
|
+
# distributions it is likely compatible with.
|
44
|
+
# Returns nil if the operating system is not Linux.
|
45
|
+
def self.linux_distro_tags
|
46
|
+
if os_name != "linux"
|
47
|
+
return nil
|
48
|
+
end
|
49
|
+
lsb_release = read_file("/etc/lsb-release")
|
50
|
+
if lsb_release =~ /Ubuntu/
|
51
|
+
return [:ubuntu, :debian]
|
52
|
+
elsif File.exist?("/etc/debian_version")
|
53
|
+
return [:debian]
|
54
|
+
elsif File.exist?("/etc/redhat-release")
|
55
|
+
redhat_release = read_file("/etc/redhat-release")
|
56
|
+
if redhat_release =~ /CentOS/
|
57
|
+
return [:centos, :redhat]
|
58
|
+
elsif redhat_release =~ /Fedora/
|
59
|
+
return [:fedora, :redhat]
|
60
|
+
elsif redhat_release =~ /Mandriva/
|
61
|
+
return [:mandriva, :redhat]
|
62
|
+
else
|
63
|
+
# On official RHEL distros, the content is in the form of
|
64
|
+
# "Red Hat Enterprise Linux Server release 5.1 (Tikanga)"
|
65
|
+
return [:rhel, :redhat]
|
66
|
+
end
|
67
|
+
elsif File.exist?("/etc/system-release")
|
68
|
+
system_release = read_file("/etc/system-release")
|
69
|
+
if system_release =~ /Amazon Linux/
|
70
|
+
return [:amazon, :redhat]
|
71
|
+
else
|
72
|
+
return [:unknown]
|
73
|
+
end
|
74
|
+
elsif File.exist?("/etc/suse-release")
|
75
|
+
return [:suse]
|
76
|
+
elsif File.exist?("/etc/gentoo-release")
|
77
|
+
return [:gentoo]
|
78
|
+
else
|
79
|
+
return [:unknown]
|
80
|
+
end
|
81
|
+
# TODO: Slackware
|
82
|
+
end
|
83
|
+
memoize :linux_distro_tags
|
84
|
+
end
|
85
85
|
|
86
86
|
end # PhusionPassenger
|
@@ -26,161 +26,161 @@ PhusionPassenger.require_passenger_lib 'platform_info'
|
|
26
26
|
|
27
27
|
module PhusionPassenger
|
28
28
|
|
29
|
-
module PlatformInfo
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
29
|
+
module PlatformInfo
|
30
|
+
# Returns the operating system's name. This name is in lowercase and contains no spaces,
|
31
|
+
# and thus is suitable to be used in some kind of ID. It may contain a version number.
|
32
|
+
# Linux is always identified as "linux". OS X is always identified as "macosx".
|
33
|
+
# Identifiers for other operating systems may contain a version number, e.g. "freebsd10".
|
34
|
+
def self.os_name
|
35
|
+
if rb_config['target_os'] =~ /darwin/ && (sw_vers = find_command('sw_vers'))
|
36
|
+
return "macosx"
|
37
|
+
elsif rb_config['target_os'] =~ /^linux-/
|
38
|
+
return "linux"
|
39
|
+
else
|
40
|
+
return rb_config['target_os']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
memoize :os_name
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
# The current platform's shared library extension ('so' on most Unices).
|
46
|
+
def self.library_extension
|
47
|
+
if os_name == "macosx"
|
48
|
+
return "bundle"
|
49
|
+
else
|
50
|
+
return "so"
|
51
|
+
end
|
52
|
+
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
54
|
+
# Returns the `uname` command, or nil if `uname` cannot be found.
|
55
|
+
# In addition to looking for `uname` in `PATH`, this method also looks
|
56
|
+
# for `uname` in /bin and /usr/bin, just in case the user didn't
|
57
|
+
# configure its PATH properly.
|
58
|
+
def self.uname_command
|
59
|
+
if result = find_command("uname")
|
60
|
+
result
|
61
|
+
elsif File.exist?("/bin/uname")
|
62
|
+
return "/bin/uname"
|
63
|
+
elsif File.exist?("/usr/bin/uname")
|
64
|
+
return "/usr/bin/uname"
|
65
|
+
else
|
66
|
+
return nil
|
67
|
+
end
|
68
|
+
end
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
70
|
+
# Returns a list of all CPU architecture names that the current machine CPU
|
71
|
+
# supports. If there are multiple such architectures then the first item in
|
72
|
+
# the result denotes that OS runtime's main/preferred architecture.
|
73
|
+
#
|
74
|
+
# This function normalizes some names. For example x86 is always reported
|
75
|
+
# as "x86" regardless of whether the OS reports it as "i386" or "i686".
|
76
|
+
# x86_64 is always reported as "x86_64" even if the OS reports it as "amd64".
|
77
|
+
#
|
78
|
+
# Please note that even if the CPU supports multiple architectures, the
|
79
|
+
# operating system might not. For example most x86 CPUs nowadays also
|
80
|
+
# support x86_64, but x86_64 Linux systems require various x86 compatibility
|
81
|
+
# libraries to be installed before x86 executables can be run. This function
|
82
|
+
# does not detect whether these compatibility libraries are installed.
|
83
|
+
# The only guarantee that you have is that the OS can run executables in
|
84
|
+
# the architecture denoted by the first item in the result.
|
85
|
+
#
|
86
|
+
# For example, on x86_64 Linux this function can return ["x86_64", "x86"].
|
87
|
+
# This indicates that the CPU supports both of these architectures, and that
|
88
|
+
# the OS's main/preferred architecture is x86_64. Most executables on the
|
89
|
+
# system are thus be x86_64. It is guaranteed that the OS can run x86_64
|
90
|
+
# executables, but not x86 executables per se.
|
91
|
+
#
|
92
|
+
# Another example: on MacOS X this function can return either
|
93
|
+
# ["x86_64", "x86"] or ["x86", "x86_64"]. The former result indicates
|
94
|
+
# OS X 10.6 (Snow Leopard) and beyond because starting from that version
|
95
|
+
# everything is 64-bit by default. The latter result indicates an OS X
|
96
|
+
# version older than 10.6.
|
97
|
+
def self.cpu_architectures
|
98
|
+
uname = uname_command
|
99
|
+
raise "The 'uname' command cannot be found" if !uname
|
100
|
+
if os_name == "macosx"
|
101
|
+
arch = `#{uname} -p`.strip
|
102
|
+
if arch == "i386"
|
103
|
+
# Macs have been x86 since around 2007. I think all of them come with
|
104
|
+
# a recent enough Intel CPU that supports both x86 and x86_64, and I
|
105
|
+
# think every OS X version has both the x86 and x86_64 runtime installed.
|
106
|
+
major, minor, *rest = `sw_vers -productVersion`.strip.split(".")
|
107
|
+
major = major.to_i
|
108
|
+
minor = minor.to_i
|
109
|
+
if major >= 10 || (major == 10 && minor >= 6)
|
110
|
+
# Since Snow Leopard x86_64 is the default.
|
111
|
+
["x86_64", "x86"]
|
112
|
+
else
|
113
|
+
# Before Snow Leopard x86 was the default.
|
114
|
+
["x86", "x86_64"]
|
115
|
+
end
|
116
|
+
else
|
117
|
+
arch
|
118
|
+
end
|
119
|
+
else
|
120
|
+
arch = `#{uname} -p`.strip
|
121
|
+
# On some systems 'uname -p' returns something like
|
122
|
+
# 'Intel(R) Pentium(R) M processor 1400MHz' or
|
123
|
+
# 'Intel(R)_Xeon(R)_CPU___________X7460__@_2.66GHz'.
|
124
|
+
if arch == "unknown" || arch =~ / / || arch =~ /Hz$/
|
125
|
+
arch = `#{uname} -m`.strip
|
126
|
+
end
|
127
|
+
if arch =~ /^i.86$/
|
128
|
+
arch = "x86"
|
129
|
+
elsif arch == "amd64"
|
130
|
+
arch = "x86_64"
|
131
|
+
end
|
132
132
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
133
|
+
if arch == "x86"
|
134
|
+
# Most x86 operating systems nowadays are probably running on
|
135
|
+
# a CPU that supports both x86 and x86_64, but we're not gonna
|
136
|
+
# go through the trouble of checking that. The main architecture
|
137
|
+
# is what we usually care about.
|
138
|
+
["x86"]
|
139
|
+
elsif arch == "x86_64"
|
140
|
+
# I don't think there's a single x86_64 CPU out there
|
141
|
+
# that doesn't support x86 as well.
|
142
|
+
["x86_64", "x86"]
|
143
|
+
else
|
144
|
+
[arch]
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
memoize :cpu_architectures, true
|
149
149
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
150
|
+
# Returns whether the OS's main CPU architecture supports the
|
151
|
+
# x86/x86_64 sfence instruction.
|
152
|
+
def self.supports_sfence_instruction?
|
153
|
+
arch = cpu_architectures[0]
|
154
|
+
return arch == "x86_64" || (arch == "x86" &&
|
155
|
+
try_compile_and_run("Checking for sfence instruction support", :c, %Q{
|
156
|
+
int
|
157
|
+
main() {
|
158
|
+
__asm__ __volatile__ ("sfence" ::: "memory");
|
159
|
+
return 0;
|
160
|
+
}
|
161
|
+
}))
|
162
|
+
end
|
163
|
+
memoize :supports_sfence_instruction?, true
|
164
164
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
165
|
+
# Returns whether the OS's main CPU architecture supports the
|
166
|
+
# x86/x86_64 lfence instruction.
|
167
|
+
def self.supports_lfence_instruction?
|
168
|
+
arch = cpu_architectures[0]
|
169
|
+
return arch == "x86_64" || (arch == "x86" &&
|
170
|
+
try_compile_and_run("Checking for lfence instruction support", :c, %Q{
|
171
|
+
int
|
172
|
+
main() {
|
173
|
+
__asm__ __volatile__ ("lfence" ::: "memory");
|
174
|
+
return 0;
|
175
|
+
}
|
176
|
+
}))
|
177
|
+
end
|
178
|
+
memoize :supports_lfence_instruction?, true
|
179
179
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
end
|
180
|
+
def self.requires_no_tls_direct_seg_refs?
|
181
|
+
return File.exists?("/proc/xen/capabilities") && cpu_architectures[0] == "x86"
|
182
|
+
end
|
183
|
+
memoize :requires_no_tls_direct_seg_refs?, true
|
184
|
+
end
|
185
185
|
|
186
186
|
end # module PhusionPassenger
|