solaris-kstat 0.2.2 → 0.2.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.
- data/CHANGES +7 -0
- data/MANIFEST +10 -12
- data/README +15 -11
- data/ext/extconf.rb +16 -0
- data/{lib → ext}/solaris/rkstat.c +64 -64
- data/{lib → ext}/solaris/rkstat.h +1 -1
- data/test/tc_kstat.rb +6 -14
- metadata +13 -10
- data/extconf.rb +0 -14
data/CHANGES
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 0.2.3 - 23-Jul-2007
|
2
|
+
* KstatError is now Kstat::Error.
|
3
|
+
* Documentation improvements and updates.
|
4
|
+
* Added a Rakefile with tasks for installation and testing.
|
5
|
+
* Added a dir_config('kstat') to the extconf.rb file in case you should need it.
|
6
|
+
* Internal project layout and code cleanup changes that you don't care about.
|
7
|
+
|
1
8
|
== 0.2.2 - 10-Jul-2006
|
2
9
|
* Updated the gemspec (and put a gem out on RubyForge).
|
3
10
|
|
data/MANIFEST
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
CHANGES
|
2
|
-
MANIFEST
|
3
|
-
README
|
4
|
-
|
5
|
-
solaris-kstat.gemspec
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
test/tc_kstat.rb
|
1
|
+
* CHANGES
|
2
|
+
* MANIFEST
|
3
|
+
* README
|
4
|
+
* Rakefile
|
5
|
+
* solaris-kstat.gemspec
|
6
|
+
* examples/test.rb
|
7
|
+
* ext/extconf.rb
|
8
|
+
* ext/solaris/rkstat.c
|
9
|
+
* ext/solaris/rkstat.h
|
10
|
+
* test/tc_kstat.rb
|
data/README
CHANGED
@@ -2,14 +2,17 @@
|
|
2
2
|
Ruby extension for the Solaris kstat library.
|
3
3
|
|
4
4
|
== Prerequisites
|
5
|
-
Solaris 8 or later.
|
5
|
+
Solaris 8 (2.8) or later.
|
6
6
|
Ruby 1.8.x
|
7
7
|
|
8
8
|
== Installation
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
=== Manual Installation
|
10
|
+
rake test (optional)
|
11
|
+
rake install
|
12
|
+
|
13
|
+
=== Gem Installation
|
14
|
+
rake test (optional)
|
15
|
+
rake install_gem
|
13
16
|
|
14
17
|
== Synopsis
|
15
18
|
require "solaris/kstat"
|
@@ -48,7 +51,7 @@ Kstat#record
|
|
48
51
|
The more specific your criterion, the less data you will receive.
|
49
52
|
|
50
53
|
== Error Classes
|
51
|
-
|
54
|
+
Kstat::Error < StandardError
|
52
55
|
Raised if anything goes wrong. Typically, this will only occur if you
|
53
56
|
pass bad arguments to the constructor (e.g. a module name that doesn't
|
54
57
|
exist, etc).
|
@@ -68,8 +71,9 @@ KstatError < StandardError
|
|
68
71
|
I have noticed that results from the cpu_stat module differ from the output
|
69
72
|
of the 'kstat' command line tool. I am convinced that my code is correct and
|
70
73
|
that there is a bug in the Solaris::Kstat Perl module. Unfortunately, the
|
71
|
-
source for the version of Solaris::Kstat that works on
|
72
|
-
not available (the version on CPAN only works on
|
74
|
+
source for the version of the Solaris::Kstat Perl module that works on
|
75
|
+
Solaris 8 and later is not available (the version on CPAN only works on
|
76
|
+
Solaris 6 and 7).
|
73
77
|
|
74
78
|
See http://tinyurl.com/karxw for more details.
|
75
79
|
|
@@ -77,13 +81,13 @@ KstatError < StandardError
|
|
77
81
|
Thanks go to Charlie Mills for help with the 'volatile' issue.
|
78
82
|
|
79
83
|
== Future Plans
|
80
|
-
Eliminate warnings that occur during the build process.
|
84
|
+
Eliminate warnings that occur during the build process, if possible.
|
81
85
|
|
82
86
|
== License
|
83
87
|
Ruby's
|
84
88
|
|
85
89
|
== Copyright
|
86
|
-
(C) 2003-
|
90
|
+
(C) 2003-2007 Daniel J. Berger
|
87
91
|
All Rights Reserved
|
88
92
|
|
89
93
|
== Warranty
|
@@ -93,7 +97,7 @@ KstatError < StandardError
|
|
93
97
|
|
94
98
|
== Author
|
95
99
|
Daniel J. Berger
|
96
|
-
djberg96 at gmail dot com
|
100
|
+
djberg96 at nospam at gmail dot com
|
97
101
|
imperator on IRC (freenode)
|
98
102
|
|
99
103
|
== See Also
|
data/ext/extconf.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
dir_config('kstat')
|
5
|
+
|
6
|
+
FileUtils.cp('solaris/rkstat.c', '.')
|
7
|
+
FileUtils.cp('solaris/rkstat.h', '.')
|
8
|
+
|
9
|
+
# This package requires Solaris 2.8 or later
|
10
|
+
unless have_header('kstat.h')
|
11
|
+
STDERR.puts "The kstat.h header file was not found. Exiting."
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
15
|
+
have_library('kstat')
|
16
|
+
create_makefile('solaris/kstat')
|
@@ -21,15 +21,15 @@ VALUE cKstatError;
|
|
21
21
|
|
22
22
|
static VALUE ks_allocate(VALUE klass){
|
23
23
|
KstatStruct* ptr;
|
24
|
-
return Data_Make_Struct(klass,KstatStruct,0,ks_free,ptr);
|
24
|
+
return Data_Make_Struct(klass, KstatStruct, 0, ks_free, ptr);
|
25
25
|
}
|
26
26
|
|
27
27
|
/*
|
28
28
|
* call-seq:
|
29
29
|
* Kstat.new(module=nil, instance=-1, name=nil)
|
30
30
|
*
|
31
|
-
* Creates and returns a Kstat object.
|
32
|
-
* chain.
|
31
|
+
* Creates and returns a Kstat object. This does NOT traverse the kstat
|
32
|
+
* chain. The Kstat#record method uses the values passed to actually
|
33
33
|
* retrieve data.
|
34
34
|
*
|
35
35
|
* You may specify a module, an instance and a name. The module defaults to
|
@@ -38,24 +38,24 @@ static VALUE ks_allocate(VALUE klass){
|
|
38
38
|
*/
|
39
39
|
VALUE ks_init(int argc, VALUE* argv, VALUE self){
|
40
40
|
KstatStruct* ptr;
|
41
|
-
VALUE
|
41
|
+
VALUE v_module, v_instance, v_name;
|
42
42
|
|
43
43
|
Data_Get_Struct(self,KstatStruct,ptr);
|
44
44
|
|
45
|
-
rb_scan_args(argc,argv,"03"
|
45
|
+
rb_scan_args(argc, argv, "03", &v_module, &v_instance, &v_name);
|
46
46
|
|
47
|
-
if(!NIL_P(
|
48
|
-
SafeStringValue(
|
49
|
-
rb_iv_set(self,"@module",
|
47
|
+
if(!NIL_P(v_module)){
|
48
|
+
SafeStringValue(v_module);
|
49
|
+
rb_iv_set(self, "@module", v_module);
|
50
50
|
}
|
51
51
|
|
52
|
-
if(!NIL_P(
|
53
|
-
SafeStringValue(
|
54
|
-
rb_iv_set(self,"@name",
|
52
|
+
if(!NIL_P(v_name)){
|
53
|
+
SafeStringValue(v_name);
|
54
|
+
rb_iv_set(self, "@name", v_name);
|
55
55
|
}
|
56
56
|
|
57
|
-
if(!NIL_P(
|
58
|
-
rb_iv_set(self,"@instance",
|
57
|
+
if(!NIL_P(v_instance))
|
58
|
+
rb_iv_set(self, "@instance", v_instance);
|
59
59
|
|
60
60
|
return self;
|
61
61
|
}
|
@@ -66,7 +66,7 @@ VALUE ks_init(int argc, VALUE* argv, VALUE self){
|
|
66
66
|
* The more specific your criterion, the less data you will receive.
|
67
67
|
*/
|
68
68
|
VALUE ks_record(VALUE self){
|
69
|
-
volatile VALUE
|
69
|
+
volatile VALUE v_m_hash, v_i_hash, v_n_hash, v_s_hash;
|
70
70
|
KstatStruct* ptr;
|
71
71
|
kstat_io_t kio;
|
72
72
|
kstat_timer_t kt;
|
@@ -75,38 +75,33 @@ VALUE ks_record(VALUE self){
|
|
75
75
|
char* name;
|
76
76
|
int instance = -1; /* -1 represents all instances (the default) */
|
77
77
|
|
78
|
-
VALUE
|
78
|
+
VALUE v_module, v_instance, v_name;
|
79
79
|
|
80
80
|
Data_Get_Struct(self,KstatStruct,ptr);
|
81
81
|
|
82
|
-
|
83
|
-
|
84
|
-
|
82
|
+
v_m_hash = rb_hash_new(); /* Module name is key, holds v_i_hashes */
|
83
|
+
v_i_hash = rb_hash_new(); /* Instance name is key, holds v_n_hashes */
|
84
|
+
v_n_hash = rb_hash_new(); /* Name is key, holds v_s_hashes */
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
86
|
+
v_module = rb_iv_get(self, "@module");
|
87
|
+
v_instance = rb_iv_get(self, "@instance");
|
88
|
+
v_name = rb_iv_get(self, "@name");
|
89
89
|
|
90
90
|
/* Module is NULL by default (i.e. all modules are returned) */
|
91
|
-
if(NIL_P(
|
91
|
+
if(NIL_P(v_module))
|
92
92
|
module = NULL;
|
93
|
-
|
94
|
-
|
95
|
-
module = StringValuePtr(rbModule);
|
96
|
-
}
|
93
|
+
else
|
94
|
+
module = StringValuePtr(v_module);
|
97
95
|
|
98
96
|
/* Instance defaults to -1 (i.e. all instances are returned) */
|
99
|
-
if(!NIL_P(
|
100
|
-
instance = NUM2INT(
|
101
|
-
}
|
97
|
+
if(!NIL_P(v_instance))
|
98
|
+
instance = NUM2INT(v_instance);
|
102
99
|
|
103
100
|
/* Name is NULL by default (i.e. all names are returned) */
|
104
|
-
if(NIL_P(
|
101
|
+
if(NIL_P(v_name))
|
105
102
|
name = NULL;
|
106
|
-
|
107
|
-
|
108
|
-
name = StringValuePtr(rbName);
|
109
|
-
}
|
103
|
+
else
|
104
|
+
name = StringValuePtr(v_name);
|
110
105
|
|
111
106
|
/* A failure probably means the module, instance or name doesn't exist */
|
112
107
|
if((ptr->kc = kstat_open()) == NULL)
|
@@ -145,62 +140,67 @@ VALUE ks_record(VALUE self){
|
|
145
140
|
/* Call the appropriate data mapper based on ks_type */
|
146
141
|
switch(ptr->ksp->ks_type){
|
147
142
|
case KSTAT_TYPE_NAMED:
|
148
|
-
kstat_read(ptr->kc,ptr->ksp,NULL);
|
149
|
-
|
143
|
+
kstat_read(ptr->kc, ptr->ksp, NULL);
|
144
|
+
v_s_hash = map_named_data_type(ptr->ksp);
|
150
145
|
break;
|
151
146
|
case KSTAT_TYPE_IO:
|
152
|
-
kstat_read(ptr->kc,ptr->ksp
|
153
|
-
|
147
|
+
kstat_read(ptr->kc, ptr->ksp, &kio);
|
148
|
+
v_s_hash = map_io_data_type(&kio);
|
154
149
|
break;
|
155
150
|
case KSTAT_TYPE_TIMER:
|
156
|
-
kstat_read(ptr->kc,ptr->ksp
|
157
|
-
|
151
|
+
kstat_read(ptr->kc, ptr->ksp, &kt);
|
152
|
+
v_s_hash = map_timer_data_type(&kt);
|
158
153
|
case KSTAT_TYPE_INTR:
|
159
|
-
kstat_read(ptr->kc,ptr->ksp,NULL);
|
160
|
-
|
154
|
+
kstat_read(ptr->kc, ptr->ksp, NULL);
|
155
|
+
v_s_hash = map_intr_data_type(ptr->ksp);
|
161
156
|
break;
|
162
157
|
case KSTAT_TYPE_RAW:
|
163
|
-
kstat_read(ptr->kc,ptr->ksp,NULL);
|
164
|
-
|
158
|
+
kstat_read(ptr->kc, ptr->ksp, NULL);
|
159
|
+
v_s_hash = map_raw_data_type(ptr->ksp);
|
165
160
|
break;
|
166
161
|
default:
|
167
162
|
rb_raise(cKstatError,"Unknown data record type");
|
168
163
|
}
|
169
164
|
|
170
|
-
rb_hash_aset(
|
171
|
-
rb_hash_aset(
|
172
|
-
rb_hash_aset(
|
165
|
+
rb_hash_aset(v_n_hash, rb_str_new2(ptr->ksp->ks_name), v_s_hash);
|
166
|
+
rb_hash_aset(v_i_hash, INT2FIX(ptr->ksp->ks_instance), v_n_hash);
|
167
|
+
rb_hash_aset(v_m_hash, rb_str_new2(ptr->ksp->ks_module), v_i_hash);
|
173
168
|
|
174
169
|
ptr->ksp = ptr->ksp->ks_next;
|
175
170
|
}
|
176
171
|
|
177
|
-
return
|
172
|
+
return v_m_hash;
|
178
173
|
}
|
179
174
|
|
180
|
-
/*
|
181
|
-
* Interface for Solaris kstat data.
|
182
|
-
*/
|
183
175
|
void Init_kstat(){
|
184
176
|
VALUE mSolaris, cKstat;
|
185
177
|
|
186
|
-
/*
|
187
|
-
mSolaris
|
188
|
-
|
189
|
-
|
178
|
+
/* The Solaris module only serves as a toplevel namespace */
|
179
|
+
mSolaris = rb_define_module("Solaris");
|
180
|
+
|
181
|
+
/* The Kstat class encapsulates kstat (kernel statistics) information */
|
182
|
+
cKstat = rb_define_class_under(mSolaris, "Kstat", rb_cObject);
|
183
|
+
|
184
|
+
/* The Kstat::Error class is raised if any of the Kstat methods fail */
|
185
|
+
cKstatError = rb_define_class_under(cKstat, "Error", rb_eStandardError);
|
190
186
|
|
191
|
-
rb_define_alloc_func(cKstat,ks_allocate);
|
187
|
+
rb_define_alloc_func(cKstat, ks_allocate);
|
192
188
|
|
193
189
|
/* Instance Methods */
|
194
|
-
rb_define_method(cKstat,"initialize",ks_init
|
195
|
-
rb_define_method(cKstat,"record",ks_record,0);
|
190
|
+
rb_define_method(cKstat, "initialize", ks_init, -1);
|
191
|
+
rb_define_method(cKstat, "record", ks_record, 0);
|
192
|
+
|
193
|
+
/* Kernel module */
|
194
|
+
rb_define_attr(cKstat, "module", 1, 1);
|
195
|
+
|
196
|
+
/* Index of module entity */
|
197
|
+
rb_define_attr(cKstat, "instance", 1, 1);
|
196
198
|
|
197
|
-
/*
|
198
|
-
rb_define_attr(cKstat,"
|
199
|
-
rb_define_attr(cKstat,"instance",1,1);
|
200
|
-
rb_define_attr(cKstat,"name",1,1);
|
199
|
+
/* Unique name within module */
|
200
|
+
rb_define_attr(cKstat, "name", 1, 1);
|
201
201
|
|
202
|
-
/*
|
203
|
-
rb_define_const(cKstat,"VERSION",rb_str_new2(SOLARIS_KSTAT_VERSION));
|
202
|
+
/* 0.2.3: The version of this package, returned as a String */
|
203
|
+
rb_define_const(cKstat, "VERSION", rb_str_new2(SOLARIS_KSTAT_VERSION));
|
204
204
|
}
|
205
205
|
|
206
206
|
#ifdef __cplusplus
|
data/test/tc_kstat.rb
CHANGED
@@ -1,17 +1,9 @@
|
|
1
1
|
###############################################################################
|
2
2
|
# tc_kstat.rb
|
3
3
|
#
|
4
|
-
# Test suite for the solaris-kstat Ruby package.
|
4
|
+
# Test suite for the solaris-kstat Ruby package. You should run this via
|
5
|
+
# the 'rake test' task.
|
5
6
|
###############################################################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
if base == "test" || base =~ /solaris-kstat.*/
|
8
|
-
require "ftools"
|
9
|
-
Dir.chdir("..") if base == "test"
|
10
|
-
Dir.mkdir("solaris") unless File.exists?("solaris")
|
11
|
-
File.copy("kstat.so","solaris")
|
12
|
-
$LOAD_PATH.unshift Dir.pwd
|
13
|
-
end
|
14
|
-
|
15
7
|
require "solaris/kstat"
|
16
8
|
require "test/unit"
|
17
9
|
require "set"
|
@@ -23,7 +15,7 @@ class TC_Kstat < Test::Unit::TestCase
|
|
23
15
|
end
|
24
16
|
|
25
17
|
def test_version
|
26
|
-
assert_equal("0.2.
|
18
|
+
assert_equal("0.2.3", Kstat::VERSION)
|
27
19
|
end
|
28
20
|
|
29
21
|
def test_name
|
@@ -57,9 +49,9 @@ class TC_Kstat < Test::Unit::TestCase
|
|
57
49
|
end
|
58
50
|
|
59
51
|
def test_constructor_invalid_values
|
60
|
-
assert_raises(
|
61
|
-
assert_raises(
|
62
|
-
assert_raises(
|
52
|
+
assert_raises(Kstat::Error){ Kstat.new("bogus").record }
|
53
|
+
assert_raises(Kstat::Error){ Kstat.new("cpu_info",99).record }
|
54
|
+
assert_raises(Kstat::Error){ Kstat.new("cpu_info",0,"bogus").record }
|
63
55
|
assert_raises(TypeError){ Kstat.new("cpu_info","x").record }
|
64
56
|
end
|
65
57
|
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: solaris-kstat
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date:
|
6
|
+
version: 0.2.3
|
7
|
+
date: 2007-07-24 00:00:00 -06:00
|
8
8
|
summary: Interface for the Solaris kstat library
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,14 +29,15 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Daniel J. Berger
|
31
31
|
files:
|
32
|
-
-
|
33
|
-
-
|
34
|
-
-
|
35
|
-
-
|
36
|
-
- lib/solaris/rkstat.c
|
37
|
-
- lib/solaris/rkstat.h
|
32
|
+
- ext/extconf.rb
|
33
|
+
- ext/solaris
|
34
|
+
- ext/solaris/rkstat.c
|
35
|
+
- ext/solaris/rkstat.h
|
38
36
|
- test/tc_kstat.rb
|
39
37
|
- examples/test.rb
|
38
|
+
- README
|
39
|
+
- CHANGES
|
40
|
+
- MANIFEST
|
40
41
|
test_files:
|
41
42
|
- test/tc_kstat.rb
|
42
43
|
rdoc_options: []
|
@@ -44,10 +45,12 @@ rdoc_options: []
|
|
44
45
|
extra_rdoc_files:
|
45
46
|
- README
|
46
47
|
- CHANGES
|
48
|
+
- MANIFEST
|
49
|
+
- ext/solaris/rkstat.c
|
47
50
|
executables: []
|
48
51
|
|
49
52
|
extensions:
|
50
|
-
- extconf.rb
|
53
|
+
- ext/extconf.rb
|
51
54
|
requirements: []
|
52
55
|
|
53
56
|
dependencies: []
|
data/extconf.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
require "mkmf"
|
2
|
-
require "ftools"
|
3
|
-
|
4
|
-
File.copy("lib/solaris/rkstat.c",".")
|
5
|
-
File.copy("lib/solaris/rkstat.h",".")
|
6
|
-
|
7
|
-
# This package requires Solaris 2.8 or later
|
8
|
-
unless have_header("kstat.h")
|
9
|
-
STDERR.puts "The kstat.h header file was not found. Exiting."
|
10
|
-
exit
|
11
|
-
end
|
12
|
-
|
13
|
-
have_library("kstat")
|
14
|
-
create_makefile("solaris/kstat")
|