2009-09-02 13:17:15 -06:00
|
|
|
class Hardware
|
|
|
|
# These methods use info spewed out by sysctl.
|
|
|
|
# Look in <mach/machine.h> for decoding info.
|
|
|
|
|
|
|
|
def self.cpu_type
|
|
|
|
@@cpu_type ||= `/usr/sbin/sysctl -n hw.cputype`.to_i
|
|
|
|
|
|
|
|
case @@cpu_type
|
|
|
|
when 7
|
|
|
|
:intel
|
|
|
|
when 18
|
|
|
|
:ppc
|
|
|
|
else
|
|
|
|
:dunno
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.intel_family
|
|
|
|
@@intel_family ||= `/usr/sbin/sysctl -n hw.cpufamily`.to_i
|
|
|
|
|
|
|
|
case @@intel_family
|
|
|
|
when 0x73d67300 # Yonah: Core Solo/Duo
|
|
|
|
:core
|
|
|
|
when 0x426f69ef # Merom: Core 2 Duo
|
|
|
|
:core2
|
|
|
|
when 0x78ea4fbc # Penryn
|
|
|
|
:penryn
|
|
|
|
when 0x6b5a4cd2 # Nehalem
|
|
|
|
:nehalem
|
2010-04-22 10:01:43 -04:00
|
|
|
when 0x573B5EEC # Arrandale
|
|
|
|
:arrandale
|
2012-07-16 16:26:47 -05:00
|
|
|
when 0x5490B78C # Sandy Bridge
|
|
|
|
:sandybridge
|
|
|
|
when 0x1F65E835 # Ivy Bridge
|
|
|
|
:ivybridge
|
2009-09-02 13:17:15 -06:00
|
|
|
else
|
|
|
|
:dunno
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.processor_count
|
|
|
|
@@processor_count ||= `/usr/sbin/sysctl -n hw.ncpu`.to_i
|
|
|
|
end
|
2009-11-16 09:35:19 -08:00
|
|
|
|
|
|
|
def self.cores_as_words
|
|
|
|
case Hardware.processor_count
|
|
|
|
when 1 then 'single'
|
|
|
|
when 2 then 'dual'
|
|
|
|
when 4 then 'quad'
|
|
|
|
else
|
|
|
|
Hardware.processor_count
|
|
|
|
end
|
|
|
|
end
|
2009-09-02 13:17:15 -06:00
|
|
|
|
2010-04-22 11:15:03 -07:00
|
|
|
def self.is_32_bit?
|
|
|
|
not self.is_64_bit?
|
|
|
|
end
|
|
|
|
|
2009-09-18 12:50:01 -06:00
|
|
|
def self.is_64_bit?
|
2012-04-11 20:19:52 -05:00
|
|
|
return @@is_64_bit if defined? @@is_64_bit
|
|
|
|
@@is_64_bit = self.sysctl_bool("hw.cpu64bit_capable")
|
2009-09-18 12:50:01 -06:00
|
|
|
end
|
2009-11-16 09:35:19 -08:00
|
|
|
|
|
|
|
def self.bits
|
|
|
|
Hardware.is_64_bit? ? 64 : 32
|
|
|
|
end
|
2009-09-18 12:50:01 -06:00
|
|
|
|
2009-09-02 13:17:15 -06:00
|
|
|
protected
|
|
|
|
def self.sysctl_bool(property)
|
|
|
|
result = nil
|
|
|
|
IO.popen("/usr/sbin/sysctl -n #{property} 2>/dev/null") do |f|
|
|
|
|
result = f.gets.to_i # should be 0 or 1
|
|
|
|
end
|
|
|
|
$?.success? && result == 1 # sysctl call succeded and printed 1
|
|
|
|
end
|
|
|
|
end
|