sys-cpu 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGES.md +6 -0
- data/MANIFEST.md +1 -0
- data/lib/sys/cpu.rb +3 -1
- data/lib/sys/darwin/sys/cpu.rb +167 -0
- data/lib/sys/unix/sys/cpu.rb +18 -50
- data/spec/sys_cpu_spec.rb +1 -1
- data/sys-cpu.gemspec +1 -1
- metadata +3 -2
- metadata.gz.sig +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 8f9a7931b9cc69f3f9725734f85a34fd5ca077226a52f22bdef4fd9f298813c7
         | 
| 4 | 
            +
              data.tar.gz: b7fc906ea6420ed2dde2c9bc546cd5a782e6dc4f3527eb60ac7e5ee9b2cc002e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 07a5729274191c98a35515d26b04906222504a8f9a27d551a604998fad5cf40596a240d90434ec0706e54e7ac27d211d222cac122ce101b9d72e29657eda1990
         | 
| 7 | 
            +
              data.tar.gz: 44068c3fa47b3b9af47485133cd52e8d5bfef6638fbfd54a1e21822b1f8617343c4156d2ce17f3f2a46987cdbc2309fecfbacc33f582bb74ffe553229bd7d0ba
         | 
    
        checksums.yaml.gz.sig
    CHANGED
    
    | Binary file | 
    
        data.tar.gz.sig
    CHANGED
    
    | Binary file | 
    
        data/CHANGES.md
    CHANGED
    
    | @@ -1,3 +1,9 @@ | |
| 1 | 
            +
            ## 1.0.3 - 28-Jan-2021
         | 
| 2 | 
            +
            * The code for OSX was split out into its own source file. This was partly for
         | 
| 3 | 
            +
              ease of maintenance, but also because there was confusion with the
         | 
| 4 | 
            +
              processor_info function. The original function was only aimed at Solaris, but
         | 
| 5 | 
            +
              it turns out OSX has its own, different implementation. This caused segfaults.
         | 
| 6 | 
            +
             | 
| 1 7 | 
             
            ## 1.0.2 - 25-Jan-2021
         | 
| 2 8 | 
             
            * Fixed issues where things that were meant to be private weren't actually private.
         | 
| 3 9 |  | 
    
        data/MANIFEST.md
    CHANGED
    
    
    
        data/lib/sys/cpu.rb
    CHANGED
    
    | @@ -5,7 +5,7 @@ require 'rbconfig' | |
| 5 5 | 
             
            module Sys
         | 
| 6 6 | 
             
              class CPU
         | 
| 7 7 | 
             
                # The version of the sys-cpu gem.
         | 
| 8 | 
            -
                VERSION = '1.0. | 
| 8 | 
            +
                VERSION = '1.0.3'.freeze
         | 
| 9 9 | 
             
              end
         | 
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| @@ -14,6 +14,8 @@ case RbConfig::CONFIG['host_os'] | |
| 14 14 | 
             
                require_relative('linux/sys/cpu')
         | 
| 15 15 | 
             
              when /windows|mswin|mingw|cygwin|dos/i
         | 
| 16 16 | 
             
                require_relative('windows/sys/cpu')
         | 
| 17 | 
            +
              when /darwin|mach|osx/i
         | 
| 18 | 
            +
                require_relative('darwin/sys/cpu')
         | 
| 17 19 | 
             
              else
         | 
| 18 20 | 
             
                require_relative('unix/sys/cpu')
         | 
| 19 21 | 
             
            end
         | 
| @@ -0,0 +1,167 @@ | |
| 1 | 
            +
            require 'ffi'
         | 
| 2 | 
            +
            require 'rbconfig'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Sys
         | 
| 5 | 
            +
              class CPU
         | 
| 6 | 
            +
                extend FFI::Library
         | 
| 7 | 
            +
                ffi_lib FFI::Library::LIBC
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                # Error raised if any of the CPU methods fail.
         | 
| 10 | 
            +
                class Error < StandardError; end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                CTL_HW = 6 # Generic hardware/cpu
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                HW_MACHINE      = 1  # Machine class
         | 
| 15 | 
            +
                HW_MODEL        = 2  # Specific machine model
         | 
| 16 | 
            +
                HW_NCPU         = 3  # Number of CPU's
         | 
| 17 | 
            +
                HW_CPU_FREQ     = 15 # CPU frequency
         | 
| 18 | 
            +
                HW_MACHINE_ARCH = 12 # Machine architecture
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                SI_MACHINE          = 5
         | 
| 21 | 
            +
                SI_ARCHITECTURE     = 6
         | 
| 22 | 
            +
                SC_NPROCESSORS_ONLN = 15
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                P_OFFLINE  = 1
         | 
| 25 | 
            +
                P_ONLINE   = 2
         | 
| 26 | 
            +
                P_FAULTED  = 4
         | 
| 27 | 
            +
                P_POWEROFF = 5
         | 
| 28 | 
            +
                P_NOINTR   = 6
         | 
| 29 | 
            +
                P_SPARE    = 7
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                CPU_ARCH_ABI64     = 0x01000000
         | 
| 32 | 
            +
                CPU_TYPE_X86       = 7
         | 
| 33 | 
            +
                CPU_TYPE_X86_64    = (CPU_TYPE_X86 | CPU_ARCH_ABI64)
         | 
| 34 | 
            +
                CPU_TYPE_SPARC     = 14
         | 
| 35 | 
            +
                CPU_TYPE_POWERPC   = 18
         | 
| 36 | 
            +
                CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC | CPU_ARCH_ABI64
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                attach_function(
         | 
| 39 | 
            +
                  :sysctl,
         | 
| 40 | 
            +
                  [:pointer, :uint, :pointer, :pointer, :pointer, :size_t],
         | 
| 41 | 
            +
                  :int
         | 
| 42 | 
            +
                )
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                private_class_method :sysctl
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                attach_function(
         | 
| 47 | 
            +
                  :sysctlbyname,
         | 
| 48 | 
            +
                  [:string, :pointer, :pointer, :pointer, :size_t],
         | 
| 49 | 
            +
                  :int
         | 
| 50 | 
            +
                )
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                private_class_method :sysctlbyname
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                attach_function :getloadavg, [:pointer, :int], :int
         | 
| 55 | 
            +
                attach_function :processor_info, [:int, :int, :string, :pointer, :pointer], :int
         | 
| 56 | 
            +
                attach_function :sysconf, [:int], :long
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                private_class_method :getloadavg
         | 
| 59 | 
            +
                private_class_method :processor_info
         | 
| 60 | 
            +
                private_class_method :sysconf
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                # Returns the cpu's architecture. On most systems this will be identical
         | 
| 63 | 
            +
                # to the CPU.machine method. On OpenBSD it will be identical to the CPU.model
         | 
| 64 | 
            +
                # method.
         | 
| 65 | 
            +
                #
         | 
| 66 | 
            +
                def self.architecture
         | 
| 67 | 
            +
                  optr = FFI::MemoryPointer.new(:char, 256)
         | 
| 68 | 
            +
                  size = FFI::MemoryPointer.new(:size_t)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  size.write_int(optr.size)
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  if sysctlbyname('hw.machine', optr, size, nil, 0) < 0
         | 
| 73 | 
            +
                    raise Error, 'sysctlbyname function failed'
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  optr.read_string
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                # Returns the number of cpu's on your system. Note that each core on
         | 
| 80 | 
            +
                # multi-core systems are counted as a cpu, e.g. one dual core cpu would
         | 
| 81 | 
            +
                # return 2, not 1.
         | 
| 82 | 
            +
                #
         | 
| 83 | 
            +
                def self.num_cpu
         | 
| 84 | 
            +
                  optr = FFI::MemoryPointer.new(:long)
         | 
| 85 | 
            +
                  size = FFI::MemoryPointer.new(:size_t)
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  size.write_long(optr.size)
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  if sysctlbyname('hw.ncpu', optr, size, nil, 0) < 0
         | 
| 90 | 
            +
                    raise Error, 'sysctlbyname failed'
         | 
| 91 | 
            +
                  end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  optr.read_long
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                # Returns the cpu's class type. On most systems this will be identical
         | 
| 97 | 
            +
                # to the CPU.architecture method. On OpenBSD it will be identical to the
         | 
| 98 | 
            +
                # CPU.model method.
         | 
| 99 | 
            +
                #
         | 
| 100 | 
            +
                def self.machine
         | 
| 101 | 
            +
                  buf  = 0.chr * 32
         | 
| 102 | 
            +
                  mib  = FFI::MemoryPointer.new(:int, 2)
         | 
| 103 | 
            +
                  size = FFI::MemoryPointer.new(:long, 1)
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  mib.write_array_of_int([CTL_HW, HW_MACHINE])
         | 
| 106 | 
            +
                  size.write_int(buf.size)
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  if sysctl(mib, 2, buf, size, nil, 0) < 0
         | 
| 109 | 
            +
                    raise Error, 'sysctl function failed'
         | 
| 110 | 
            +
                  end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                  buf.strip
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                # Returns a string indicating the cpu model.
         | 
| 116 | 
            +
                #
         | 
| 117 | 
            +
                def self.model
         | 
| 118 | 
            +
                  ptr  = FFI::MemoryPointer.new(:long)
         | 
| 119 | 
            +
                  size = FFI::MemoryPointer.new(:size_t)
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                  size.write_long(ptr.size)
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                  if sysctlbyname('hw.cputype', ptr, size, nil, 0) < 0
         | 
| 124 | 
            +
                    raise 'sysctlbyname function failed'
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  case ptr.read_long
         | 
| 128 | 
            +
                    when  CPU_TYPE_X86, CPU_TYPE_X86_64
         | 
| 129 | 
            +
                      'Intel'
         | 
| 130 | 
            +
                    when CPU_TYPE_SPARC
         | 
| 131 | 
            +
                      'Sparc'
         | 
| 132 | 
            +
                    when CPU_TYPE_POWERPC, CPU_TYPE_POWERPC64
         | 
| 133 | 
            +
                      'PowerPC'
         | 
| 134 | 
            +
                    else
         | 
| 135 | 
            +
                      'Unknown'
         | 
| 136 | 
            +
                  end
         | 
| 137 | 
            +
                end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                # Returns an integer indicating the speed of the CPU.
         | 
| 140 | 
            +
                #
         | 
| 141 | 
            +
                def self.freq
         | 
| 142 | 
            +
                  optr = FFI::MemoryPointer.new(:long)
         | 
| 143 | 
            +
                  size = FFI::MemoryPointer.new(:size_t)
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  size.write_long(optr.size)
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                  if sysctlbyname('hw.cpufrequency', optr, size, nil, 0) < 0
         | 
| 148 | 
            +
                    raise Error, 'sysctlbyname failed'
         | 
| 149 | 
            +
                  end
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  optr.read_long / 1000000
         | 
| 152 | 
            +
                end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                # Returns an array of three floats indicating the 1, 5 and 15 minute load
         | 
| 155 | 
            +
                # average.
         | 
| 156 | 
            +
                #
         | 
| 157 | 
            +
                def self.load_avg
         | 
| 158 | 
            +
                  loadavg = FFI::MemoryPointer.new(:double, 3)
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                  if getloadavg(loadavg, loadavg.size) < 0
         | 
| 161 | 
            +
                    raise Error, 'getloadavg function failed'
         | 
| 162 | 
            +
                  end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                  loadavg.get_array_of_double(0, 3)
         | 
| 165 | 
            +
                end
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
            end
         | 
    
        data/lib/sys/unix/sys/cpu.rb
    CHANGED
    
    | @@ -105,13 +105,7 @@ module Sys | |
| 105 105 |  | 
| 106 106 | 
             
                    size.write_int(optr.size)
         | 
| 107 107 |  | 
| 108 | 
            -
                    if  | 
| 109 | 
            -
                      name = 'hw.machine'
         | 
| 110 | 
            -
                    else
         | 
| 111 | 
            -
                      name = 'hw.machine_arch'
         | 
| 112 | 
            -
                    end
         | 
| 113 | 
            -
             | 
| 114 | 
            -
                    if sysctlbyname(name, optr, size, nil, 0) < 0
         | 
| 108 | 
            +
                    if sysctlbyname('hw.machine_arch', optr, size, nil, 0) < 0
         | 
| 115 109 | 
             
                      raise Error, 'sysctlbyname function failed'
         | 
| 116 110 | 
             
                    end
         | 
| 117 111 |  | 
| @@ -204,52 +198,30 @@ module Sys | |
| 204 198 | 
             
                # Returns a string indicating the cpu model.
         | 
| 205 199 | 
             
                #
         | 
| 206 200 | 
             
                def self.model
         | 
| 207 | 
            -
                  if  | 
| 208 | 
            -
                     | 
| 209 | 
            -
                     | 
| 201 | 
            +
                  if respond_to?(:sysctl, true)
         | 
| 202 | 
            +
                    buf  = 0.chr * 64
         | 
| 203 | 
            +
                    mib  = FFI::MemoryPointer.new(:int, 2)
         | 
| 204 | 
            +
                    size = FFI::MemoryPointer.new(:long, 1)
         | 
| 210 205 |  | 
| 211 | 
            -
                     | 
| 206 | 
            +
                    mib.write_array_of_int([CTL_HW, HW_MODEL])
         | 
| 207 | 
            +
                    size.write_int(buf.size)
         | 
| 212 208 |  | 
| 213 | 
            -
                    if  | 
| 214 | 
            -
                      raise ' | 
| 209 | 
            +
                    if sysctl(mib, 2, buf, size, nil, 0) < 0
         | 
| 210 | 
            +
                      raise Error, 'sysctl function failed'
         | 
| 215 211 | 
             
                    end
         | 
| 216 212 |  | 
| 217 | 
            -
                     | 
| 218 | 
            -
                      when  CPU_TYPE_X86, CPU_TYPE_X86_64
         | 
| 219 | 
            -
                        'Intel'
         | 
| 220 | 
            -
                      when CPU_TYPE_SPARC
         | 
| 221 | 
            -
                        'Sparc'
         | 
| 222 | 
            -
                      when CPU_TYPE_POWERPC, CPU_TYPE_POWERPC64
         | 
| 223 | 
            -
                        'PowerPC'
         | 
| 224 | 
            -
                      else
         | 
| 225 | 
            -
                        'Unknown'
         | 
| 226 | 
            -
                    end
         | 
| 213 | 
            +
                    buf.strip
         | 
| 227 214 | 
             
                  else
         | 
| 228 | 
            -
                     | 
| 229 | 
            -
                      buf  = 0.chr * 64
         | 
| 230 | 
            -
                      mib  = FFI::MemoryPointer.new(:int, 2)
         | 
| 231 | 
            -
                      size = FFI::MemoryPointer.new(:long, 1)
         | 
| 232 | 
            -
             | 
| 233 | 
            -
                      mib.write_array_of_int([CTL_HW, HW_MODEL])
         | 
| 234 | 
            -
                      size.write_int(buf.size)
         | 
| 235 | 
            -
             | 
| 236 | 
            -
                      if sysctl(mib, 2, buf, size, nil, 0) < 0
         | 
| 237 | 
            -
                        raise Error, 'sysctl function failed'
         | 
| 238 | 
            -
                      end
         | 
| 239 | 
            -
             | 
| 240 | 
            -
                      buf.strip
         | 
| 241 | 
            -
                    else
         | 
| 242 | 
            -
                      pinfo = ProcInfo.new
         | 
| 215 | 
            +
                    pinfo = ProcInfo.new
         | 
| 243 216 |  | 
| 244 | 
            -
             | 
| 245 | 
            -
             | 
| 246 | 
            -
             | 
| 247 | 
            -
             | 
| 248 | 
            -
                        end
         | 
| 217 | 
            +
                    # Some systems start at 0, some at 1
         | 
| 218 | 
            +
                    if processor_info(0, pinfo) < 0
         | 
| 219 | 
            +
                      if processor_info(1, pinfo) < 0
         | 
| 220 | 
            +
                        raise Error, 'process_info function failed'
         | 
| 249 221 | 
             
                      end
         | 
| 250 | 
            -
             | 
| 251 | 
            -
                      pinfo[:pi_processor_type].to_s
         | 
| 252 222 | 
             
                    end
         | 
| 223 | 
            +
             | 
| 224 | 
            +
                    pinfo[:pi_processor_type].to_s
         | 
| 253 225 | 
             
                  end
         | 
| 254 226 | 
             
                end
         | 
| 255 227 |  | 
| @@ -272,11 +244,7 @@ module Sys | |
| 272 244 | 
             
                      raise Error, 'sysctlbyname failed'
         | 
| 273 245 | 
             
                    end
         | 
| 274 246 |  | 
| 275 | 
            -
                     | 
| 276 | 
            -
                      optr.read_long / 1000000
         | 
| 277 | 
            -
                    else
         | 
| 278 | 
            -
                      optr.read_long
         | 
| 279 | 
            -
                    end
         | 
| 247 | 
            +
                    optr.read_long
         | 
| 280 248 | 
             
                  elsif respond_to?(:sysctl, true)
         | 
| 281 249 | 
             
                    buf  = 0.chr * 16
         | 
| 282 250 | 
             
                    mib  = FFI::MemoryPointer.new(:int, 2)
         | 
    
        data/spec/sys_cpu_spec.rb
    CHANGED
    
    
    
        data/sys-cpu.gemspec
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sys-cpu
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Daniel J. Berger
         | 
| @@ -35,7 +35,7 @@ cert_chain: | |
| 35 35 | 
             
              ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
         | 
| 36 36 | 
             
              WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
         | 
| 37 37 | 
             
              -----END CERTIFICATE-----
         | 
| 38 | 
            -
            date: 2021-01- | 
| 38 | 
            +
            date: 2021-01-28 00:00:00.000000000 Z
         | 
| 39 39 | 
             
            dependencies:
         | 
| 40 40 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 41 41 | 
             
              name: ffi
         | 
| @@ -108,6 +108,7 @@ files: | |
| 108 108 | 
             
            - install.rb
         | 
| 109 109 | 
             
            - lib/sys-cpu.rb
         | 
| 110 110 | 
             
            - lib/sys/cpu.rb
         | 
| 111 | 
            +
            - lib/sys/darwin/sys/cpu.rb
         | 
| 111 112 | 
             
            - lib/sys/linux/sys/cpu.rb
         | 
| 112 113 | 
             
            - lib/sys/unix/sys/cpu.rb
         | 
| 113 114 | 
             
            - lib/sys/windows/sys/cpu.rb
         | 
    
        metadata.gz.sig
    CHANGED
    
    | Binary file |