sys-cpu 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|