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.

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. 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
- 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
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
- # 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
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
- # 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
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
- # 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
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
- # 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
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
- # 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
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
- 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
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
- # 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
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
- # 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
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
- 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
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