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
|