solaris-kstat 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- 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")
|