def self.num_cpu
if respond_to?(:sysctlbyname, true)
optr = FFI::MemoryPointer.new(:long)
size = FFI::MemoryPointer.new(:size_t)
size.write_long(optr.size)
if sysctlbyname('hw.ncpu', optr, size, nil, 0) < 0
raise Error, "sysctlbyname failed"
end
optr.read_long
elsif respond_to?(:sysconf, true)
num = sysconf(SC_NPROCESSORS_ONLN)
if num < 0
raise Error, "sysconf function failed"
end
num
else
buf = 0.chr * 4
mib = FFI::MemoryPointer.new(:int, 2)
size = FFI::MemoryPointer.new(:long, 1)
mib.write_array_of_int([CTL_HW, HW_NCPU])
size.write_int(buf.size)
if sysctl(mib, 2, buf, size, nil, 0) < 0
raise Error, "sysctl function failed"
end
buf.strip.unpack("C").first
end
end