# File lib/unix/sys/cpu.rb, line 134
    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