solaris-kstat 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,353 +0,0 @@
1
- #ifdef __cplusplus
2
- extern "C" {
3
- #endif
4
-
5
- #define SOLARIS_KSTAT_VERSION "1.0.3"
6
-
7
- // Function prototypes
8
- static VALUE map_named_data_type(kstat_t* ksp);
9
- static VALUE map_io_data_type(kstat_io_t* kio);
10
- static VALUE map_intr_data_type(kstat_t* ksp);
11
- static VALUE map_timer_data_type(kstat_timer_t* kt);
12
- static VALUE map_raw_data_type(kstat_t* ksp);
13
- static VALUE map_raw_vminfo(kstat_t* ksp);
14
- static VALUE map_raw_flushmeter(kstat_t* ksp);
15
- static VALUE map_raw_var(kstat_t* ksp);
16
- static VALUE map_raw_ncstats(kstat_t* ksp);
17
- static VALUE map_raw_sysinfo(kstat_t* ksp);
18
- static VALUE map_raw_cpu_sysinfo(kstat_t* ksp);
19
- static VALUE map_raw_mntinfo(kstat_t* ksp);
20
-
21
- // Structure wrapped as our Kstat class
22
- struct kstruct{
23
- kstat_ctl_t* kc;
24
- kstat_t* ksp;
25
- };
26
-
27
- typedef struct kstruct KstatStruct;
28
-
29
- static void ks_free(KstatStruct* p){
30
- if(p->kc)
31
- kstat_close(p->kc);
32
-
33
- free(p);
34
- }
35
-
36
- // Helps reduce GC for String key/value pairs in a hash
37
- void hash_add_pair(VALUE v_hash, const char *key, const char *value)
38
- {
39
- volatile VALUE key_obj = rb_str_new2(key);
40
- rb_hash_aset(v_hash, key_obj, rb_str_new2(value));
41
- }
42
-
43
- // Helper functions
44
-
45
- static VALUE map_raw_mntinfo(kstat_t* ksp){
46
- struct mntinfo_kstat *mptr;
47
- mptr = (struct mntinfo_kstat*)(ksp->ks_data);
48
- volatile VALUE v_hash = rb_hash_new();
49
-
50
- rb_hash_aset(v_hash,rb_str_new2("mik_proto"),rb_str_new2(mptr->mik_proto));
51
- rb_hash_aset(v_hash,rb_str_new2("mik_vers"),UINT2NUM(mptr->mik_vers));
52
- rb_hash_aset(v_hash,rb_str_new2("mik_flags"),UINT2NUM(mptr->mik_flags));
53
- rb_hash_aset(v_hash,rb_str_new2("mik_secmod"),UINT2NUM(mptr->mik_secmod));
54
- rb_hash_aset(v_hash,rb_str_new2("mik_curread"),UINT2NUM(mptr->mik_curread));
55
- rb_hash_aset(v_hash,rb_str_new2("mik_curwrite"), UINT2NUM(mptr->mik_curwrite));
56
- rb_hash_aset(v_hash,rb_str_new2("mik_timeo"),UINT2NUM(mptr->mik_timeo));
57
- rb_hash_aset(v_hash,rb_str_new2("mik_retrans"),UINT2NUM(mptr->mik_retrans));
58
- rb_hash_aset(v_hash,rb_str_new2("mik_acregmin"), UINT2NUM(mptr->mik_acregmin));
59
- rb_hash_aset(v_hash,rb_str_new2("mik_acregmax"), UINT2NUM(mptr->mik_acregmax));
60
- rb_hash_aset(v_hash,rb_str_new2("mik_acdirmin"), UINT2NUM(mptr->mik_acdirmin));
61
- rb_hash_aset(v_hash,rb_str_new2("mik_acdirmax"), UINT2NUM(mptr->mik_acdirmax));
62
- rb_hash_aset(v_hash,rb_str_new2("mik_noresponse"), UINT2NUM(mptr->mik_noresponse));
63
- rb_hash_aset(v_hash,rb_str_new2("mik_failover"), UINT2NUM(mptr->mik_failover));
64
- rb_hash_aset(v_hash,rb_str_new2("mik_remap"), UINT2NUM(mptr->mik_remap));
65
- rb_hash_aset(v_hash,rb_str_new2("mik_curserver"), rb_str_new2(mptr->mik_curserver));
66
-
67
- return v_hash;
68
- }
69
-
70
- static VALUE map_raw_vminfo(kstat_t* ksp){
71
- vminfo_t *vminfop;
72
- vminfop = (vminfo_t *)ksp->ks_data;
73
- volatile VALUE v_hash = rb_hash_new();
74
-
75
- rb_hash_aset(v_hash,rb_str_new2("freemem"),ULL2NUM(vminfop->freemem));
76
- rb_hash_aset(v_hash,rb_str_new2("swap_resv"),ULL2NUM(vminfop->swap_resv));
77
- rb_hash_aset(v_hash,rb_str_new2("swap_alloc"),ULL2NUM(vminfop->swap_alloc));
78
- rb_hash_aset(v_hash,rb_str_new2("swap_avail"),ULL2NUM(vminfop->swap_avail));
79
- rb_hash_aset(v_hash,rb_str_new2("swap_free"),ULL2NUM(vminfop->swap_free));
80
-
81
- return v_hash;
82
- }
83
-
84
- static VALUE map_raw_var(kstat_t* ksp){
85
- struct var* v;
86
- v = (struct var *)ksp->ks_data;
87
- volatile VALUE v_hash = rb_hash_new();
88
-
89
- rb_hash_aset(v_hash,rb_str_new2("v_buf"),INT2NUM(v->v_buf));
90
- rb_hash_aset(v_hash,rb_str_new2("v_call"),INT2NUM(v->v_call));
91
- rb_hash_aset(v_hash,rb_str_new2("v_proc"),INT2NUM(v->v_proc));
92
- rb_hash_aset(v_hash,rb_str_new2("v_maxupttl"),INT2NUM(v->v_maxupttl));
93
- rb_hash_aset(v_hash,rb_str_new2("v_nglobpris"),INT2NUM(v->v_nglobpris));
94
- rb_hash_aset(v_hash,rb_str_new2("v_maxsyspri"),INT2NUM(v->v_maxsyspri));
95
- rb_hash_aset(v_hash,rb_str_new2("v_clist"),INT2NUM(v->v_clist));
96
- rb_hash_aset(v_hash,rb_str_new2("v_maxup"),INT2NUM(v->v_maxup));
97
- rb_hash_aset(v_hash,rb_str_new2("v_hbuf"),INT2NUM(v->v_hbuf));
98
- rb_hash_aset(v_hash,rb_str_new2("v_hmask"),INT2NUM(v->v_hmask));
99
- rb_hash_aset(v_hash,rb_str_new2("v_pbuf"),INT2NUM(v->v_pbuf));
100
- rb_hash_aset(v_hash,rb_str_new2("v_sptmap"),INT2NUM(v->v_sptmap));
101
- rb_hash_aset(v_hash,rb_str_new2("v_maxpmem"),INT2NUM(v->v_maxpmem));
102
- rb_hash_aset(v_hash,rb_str_new2("v_autoup"),INT2NUM(v->v_autoup));
103
- rb_hash_aset(v_hash,rb_str_new2("v_bufhwm"),INT2NUM(v->v_bufhwm));
104
-
105
- return v_hash;
106
- }
107
-
108
- static VALUE map_raw_flushmeter(kstat_t* ksp){
109
- struct flushmeter* fp;
110
- fp = (struct flushmeter *)ksp->ks_data;
111
- volatile VALUE v_hash = rb_hash_new();
112
-
113
- rb_hash_aset(v_hash,rb_str_new2("f_ctx"),ULL2NUM(fp->f_ctx));
114
- rb_hash_aset(v_hash,rb_str_new2("f_segment"),ULL2NUM(fp->f_segment));
115
- rb_hash_aset(v_hash,rb_str_new2("f_page"),ULL2NUM(fp->f_page));
116
- rb_hash_aset(v_hash,rb_str_new2("f_partial"),ULL2NUM(fp->f_partial));
117
- rb_hash_aset(v_hash,rb_str_new2("f_usr"),ULL2NUM(fp->f_usr));
118
- rb_hash_aset(v_hash,rb_str_new2("f_region"),ULL2NUM(fp->f_region));
119
-
120
- return v_hash;
121
- }
122
-
123
- static VALUE map_raw_ncstats(kstat_t* ksp){
124
- struct ncstats* np;
125
- np = (struct ncstats *)ksp->ks_data;
126
- volatile VALUE v_hash = rb_hash_new();
127
-
128
- rb_hash_aset(v_hash,rb_str_new2("hits"),INT2NUM(np->hits));
129
- rb_hash_aset(v_hash,rb_str_new2("misses"),INT2NUM(np->misses));
130
- rb_hash_aset(v_hash,rb_str_new2("enters"),INT2NUM(np->enters));
131
- rb_hash_aset(v_hash,rb_str_new2("dbl_enters"),INT2NUM(np->dbl_enters));
132
- rb_hash_aset(v_hash,rb_str_new2("long_enter"),INT2NUM(np->long_enter));
133
- rb_hash_aset(v_hash,rb_str_new2("long_look"),INT2NUM(np->long_look));
134
- rb_hash_aset(v_hash,rb_str_new2("move_to_front"),INT2NUM(np->move_to_front));
135
- rb_hash_aset(v_hash,rb_str_new2("purges"),INT2NUM(np->purges));
136
-
137
- return v_hash;
138
- }
139
-
140
- static VALUE map_raw_sysinfo(kstat_t* ksp){
141
- sysinfo_t* sp;
142
- sp = (sysinfo_t *)ksp->ks_data;
143
- volatile VALUE v_hash = rb_hash_new();
144
-
145
- rb_hash_aset(v_hash,rb_str_new2("updates"),UINT2NUM(sp->updates));
146
- rb_hash_aset(v_hash,rb_str_new2("runque"),UINT2NUM(sp->runque));
147
- rb_hash_aset(v_hash,rb_str_new2("runocc"),UINT2NUM(sp->runocc));
148
- rb_hash_aset(v_hash,rb_str_new2("swpque"),UINT2NUM(sp->swpque));
149
- rb_hash_aset(v_hash,rb_str_new2("swpocc"),UINT2NUM(sp->swpocc));
150
- rb_hash_aset(v_hash,rb_str_new2("waiting"),UINT2NUM(sp->waiting));
151
-
152
- return v_hash;
153
- }
154
-
155
-
156
- // Maps the cpu_sysinfo struct from sys/sysinfo.h into a hash.
157
- static VALUE map_raw_cpu_sysinfo(kstat_t* ksp){
158
- cpu_sysinfo_t* cptr;
159
- cptr = (cpu_sysinfo_t *)ksp->ks_data;
160
- volatile VALUE v_hash = rb_hash_new();
161
-
162
- rb_hash_aset(v_hash,rb_str_new2("cpu_idle"),UINT2NUM(cptr->cpu[CPU_IDLE]));
163
- rb_hash_aset(v_hash,rb_str_new2("cpu_user"),UINT2NUM(cptr->cpu[CPU_USER]));
164
- rb_hash_aset(v_hash,rb_str_new2("cpu_kernel"),UINT2NUM(cptr->cpu[CPU_KERNEL]));
165
- rb_hash_aset(v_hash,rb_str_new2("cpu_wait"),UINT2NUM(cptr->cpu[CPU_WAIT]));
166
- rb_hash_aset(v_hash,rb_str_new2("wait_io"),UINT2NUM(cptr->wait[W_IO]));
167
- rb_hash_aset(v_hash,rb_str_new2("wait_swap"),UINT2NUM(cptr->wait[W_SWAP]));
168
- rb_hash_aset(v_hash,rb_str_new2("wait_pio"),UINT2NUM(cptr->wait[W_PIO]));
169
- rb_hash_aset(v_hash,rb_str_new2("bread"),UINT2NUM(cptr->bread));
170
- rb_hash_aset(v_hash,rb_str_new2("bwrite"),UINT2NUM(cptr->bwrite));
171
- rb_hash_aset(v_hash,rb_str_new2("lread"),UINT2NUM(cptr->lread));
172
- rb_hash_aset(v_hash,rb_str_new2("lwrite"),UINT2NUM(cptr->lwrite));
173
- rb_hash_aset(v_hash,rb_str_new2("phread"),UINT2NUM(cptr->phread));
174
- rb_hash_aset(v_hash,rb_str_new2("phwrite"),UINT2NUM(cptr->phwrite));
175
- rb_hash_aset(v_hash,rb_str_new2("pswitch"),UINT2NUM(cptr->pswitch));
176
- rb_hash_aset(v_hash,rb_str_new2("trap"),UINT2NUM(cptr->trap));
177
- rb_hash_aset(v_hash,rb_str_new2("intr"),UINT2NUM(cptr->intr));
178
- rb_hash_aset(v_hash,rb_str_new2("syscall"),UINT2NUM(cptr->syscall));
179
- rb_hash_aset(v_hash,rb_str_new2("sysread"),UINT2NUM(cptr->sysread));
180
- rb_hash_aset(v_hash,rb_str_new2("syswrite"),UINT2NUM(cptr->syswrite));
181
- rb_hash_aset(v_hash,rb_str_new2("sysfork"),UINT2NUM(cptr->sysfork));
182
- rb_hash_aset(v_hash,rb_str_new2("sysvfork"),UINT2NUM(cptr->sysvfork));
183
- rb_hash_aset(v_hash,rb_str_new2("sysexec"),UINT2NUM(cptr->sysexec));
184
- rb_hash_aset(v_hash,rb_str_new2("readch"),UINT2NUM(cptr->readch));
185
- rb_hash_aset(v_hash,rb_str_new2("writech"),UINT2NUM(cptr->writech));
186
- rb_hash_aset(v_hash,rb_str_new2("rcvint"),UINT2NUM(cptr->rcvint));
187
- rb_hash_aset(v_hash,rb_str_new2("xmtint"),UINT2NUM(cptr->xmtint));
188
- rb_hash_aset(v_hash,rb_str_new2("mdmint"),UINT2NUM(cptr->mdmint));
189
- rb_hash_aset(v_hash,rb_str_new2("rawch"),UINT2NUM(cptr->rawch));
190
- rb_hash_aset(v_hash,rb_str_new2("canch"),UINT2NUM(cptr->canch));
191
- rb_hash_aset(v_hash,rb_str_new2("outch"),UINT2NUM(cptr->outch));
192
- rb_hash_aset(v_hash,rb_str_new2("msg"),UINT2NUM(cptr->msg));
193
- rb_hash_aset(v_hash,rb_str_new2("sema"),UINT2NUM(cptr->sema));
194
- rb_hash_aset(v_hash,rb_str_new2("namei"),UINT2NUM(cptr->namei));
195
- rb_hash_aset(v_hash,rb_str_new2("ufsiget"),UINT2NUM(cptr->ufsiget));
196
- rb_hash_aset(v_hash,rb_str_new2("ufsdirblk"),UINT2NUM(cptr->ufsdirblk));
197
- rb_hash_aset(v_hash,rb_str_new2("ufsipage"),UINT2NUM(cptr->ufsipage));
198
- rb_hash_aset(v_hash,rb_str_new2("ufsinopage"),UINT2NUM(cptr->ufsinopage));
199
- rb_hash_aset(v_hash,rb_str_new2("inodeovf"),UINT2NUM(cptr->inodeovf));
200
- rb_hash_aset(v_hash,rb_str_new2("fileovf"),UINT2NUM(cptr->fileovf));
201
- rb_hash_aset(v_hash,rb_str_new2("procovf"),UINT2NUM(cptr->procovf));
202
- rb_hash_aset(v_hash,rb_str_new2("intrthread"),UINT2NUM(cptr->intrthread));
203
- rb_hash_aset(v_hash,rb_str_new2("intrblk"),UINT2NUM(cptr->intrblk));
204
- rb_hash_aset(v_hash,rb_str_new2("idlethread"),UINT2NUM(cptr->idlethread));
205
- rb_hash_aset(v_hash,rb_str_new2("inv_swtch"),UINT2NUM(cptr->inv_swtch));
206
- rb_hash_aset(v_hash,rb_str_new2("nthreads"),UINT2NUM(cptr->nthreads));
207
- rb_hash_aset(v_hash,rb_str_new2("cpumigrate"),UINT2NUM(cptr->cpumigrate));
208
- rb_hash_aset(v_hash,rb_str_new2("xcalls"),UINT2NUM(cptr->xcalls));
209
- rb_hash_aset(v_hash,rb_str_new2("mutex_adenters"), UINT2NUM(cptr->mutex_adenters));
210
- rb_hash_aset(v_hash,rb_str_new2("rw_rdfails"),UINT2NUM(cptr->rw_rdfails));
211
- rb_hash_aset(v_hash,rb_str_new2("rw_wrfails"),UINT2NUM(cptr->rw_wrfails));
212
- rb_hash_aset(v_hash,rb_str_new2("modload"),UINT2NUM(cptr->modload));
213
- rb_hash_aset(v_hash,rb_str_new2("modunload"),UINT2NUM(cptr->modunload));
214
- rb_hash_aset(v_hash,rb_str_new2("bawrite"),UINT2NUM(cptr->bawrite));
215
-
216
- #ifdef STATISTICS
217
- rb_hash_aset(v_hash,rb_str_new2("rw_enters"),UINT2NUM(cptr->rw_enters));
218
- rb_hash_aset(v_hash,rb_str_new2("win_uo_cnt"),UINT2NUM(cptr->win_uo_cnt));
219
- rb_hash_aset(v_hash,rb_str_new2("win_uu_cnt"),UINT2NUM(cptr->win_uu_cnt));
220
- rb_hash_aset(v_hash,rb_str_new2("win_so_cnt"),UINT2NUM(cptr->win_so_cnt));
221
- rb_hash_aset(v_hash,rb_str_new2("win_su_cnt"),UINT2NUM(cptr->win_su_cnt));
222
- rb_hash_aset(v_hash,rb_str_new2("win_suo_cnt"),UINT2NUM(cptr->win_suo_cnt));
223
- #endif
224
-
225
- return v_hash;
226
- }
227
-
228
- /* There are several different structs possible here. We'll forward this
229
- * call to the appropriate mapper based on the module and name.
230
- *
231
- * A few names are not yet being handled.
232
- */
233
- static VALUE map_raw_data_type(kstat_t* ksp){
234
- VALUE v_hash = rb_hash_new();
235
-
236
- if(!strcmp(ksp->ks_module, "unix")){
237
- if(!strcmp(ksp->ks_name, "vminfo")){
238
- v_hash = map_raw_vminfo(ksp);
239
- }
240
- else if(!strcmp(ksp->ks_name, "flushmeter")){
241
- v_hash = map_raw_flushmeter(ksp);
242
- }
243
- else if(!strcmp(ksp->ks_name, "ncstats")){
244
- v_hash = map_raw_ncstats(ksp);
245
- }
246
- else if(!strcmp(ksp->ks_name, "sysinfo")){
247
- v_hash = map_raw_sysinfo(ksp);
248
- }
249
- else if(!strcmp(ksp->ks_name, "var")){
250
- v_hash = map_raw_var(ksp);
251
- }
252
- else{
253
- // Return an empty hash for unhandled names for now
254
- v_hash = rb_hash_new();
255
- }
256
- }
257
-
258
- if(!strcmp(ksp->ks_module,"cpu_stat"))
259
- v_hash = map_raw_cpu_sysinfo(ksp);
260
-
261
- if(!strcmp(ksp->ks_module,"nfs")){
262
- if(!strcmp(ksp->ks_name,"mntinfo")){
263
- v_hash = map_raw_mntinfo(ksp);
264
- }
265
- }
266
-
267
- return v_hash;
268
- }
269
-
270
- static VALUE map_timer_data_type(kstat_timer_t* t){
271
- volatile VALUE v_hash = rb_hash_new();
272
-
273
- rb_hash_aset(v_hash,rb_str_new2("name"),rb_str_new2(t->name));
274
- rb_hash_aset(v_hash,rb_str_new2("num_events"),ULL2NUM(t->num_events));
275
- rb_hash_aset(v_hash,rb_str_new2("elapsed_time"),ULL2NUM(t->elapsed_time));
276
- rb_hash_aset(v_hash,rb_str_new2("min_time"),ULL2NUM(t->min_time));
277
- rb_hash_aset(v_hash,rb_str_new2("max_time"),ULL2NUM(t->max_time));
278
- rb_hash_aset(v_hash,rb_str_new2("start_time"),ULL2NUM(t->start_time));
279
- rb_hash_aset(v_hash,rb_str_new2("stop_time"),ULL2NUM(t->stop_time));
280
-
281
- return v_hash;
282
- }
283
-
284
- static VALUE map_intr_data_type(kstat_t* ksp){
285
- int i;
286
- kstat_intr_t* kp;
287
- kp = (kstat_intr_t *)ksp->ks_data;
288
- VALUE v_hash = rb_hash_new();
289
- static char* intr_names[] =
290
- {"hard", "soft", "watchdog", "spurious", "multiple_service"};
291
-
292
- for(i = 0; i < KSTAT_NUM_INTRS; i++)
293
- rb_hash_aset(v_hash,rb_str_new2(intr_names[i]),UINT2NUM(kp->intrs[i]));
294
-
295
- return v_hash;
296
- }
297
-
298
- static VALUE map_io_data_type(kstat_io_t* k){
299
- volatile VALUE v_hash = rb_hash_new();
300
-
301
- rb_hash_aset(v_hash,rb_str_new2("nread"),ULL2NUM(k->nread));
302
- rb_hash_aset(v_hash,rb_str_new2("nwritten"),ULL2NUM(k->nwritten));
303
- rb_hash_aset(v_hash,rb_str_new2("reads"),UINT2NUM(k->reads));
304
- rb_hash_aset(v_hash,rb_str_new2("writes"),UINT2NUM(k->writes));
305
- rb_hash_aset(v_hash,rb_str_new2("wtime"),ULL2NUM(k->wtime));
306
- rb_hash_aset(v_hash,rb_str_new2("wlentime"),ULL2NUM(k->wlentime));
307
- rb_hash_aset(v_hash,rb_str_new2("wlastupdate"),ULL2NUM(k->wlastupdate));
308
- rb_hash_aset(v_hash,rb_str_new2("rtime"),ULL2NUM(k->rtime));
309
- rb_hash_aset(v_hash,rb_str_new2("rlentime"),ULL2NUM(k->rlentime));
310
- rb_hash_aset(v_hash,rb_str_new2("rlastupdate"),ULL2NUM(k->rlastupdate));
311
- rb_hash_aset(v_hash,rb_str_new2("wcnt"),UINT2NUM(k->wcnt));
312
- rb_hash_aset(v_hash,rb_str_new2("rcnt"),UINT2NUM(k->rcnt));
313
-
314
- return v_hash;
315
- }
316
-
317
- static VALUE map_named_data_type(kstat_t* ksp){
318
- volatile VALUE v_hash;
319
- kstat_named_t* knp;
320
- knp = (kstat_named_t *)ksp->ks_data;
321
- int i;
322
-
323
- v_hash = rb_hash_new();
324
-
325
- for(i = 0; i < ksp->ks_ndata; i++, knp++){
326
- switch (knp->data_type){
327
- case KSTAT_DATA_CHAR:
328
- hash_add_pair(v_hash,knp->name,knp->value.c);
329
- break;
330
- case KSTAT_DATA_INT32:
331
- rb_hash_aset(v_hash,rb_str_new2(knp->name),INT2NUM(knp->value.i32));
332
- break;
333
- case KSTAT_DATA_UINT32:
334
- rb_hash_aset(v_hash,rb_str_new2(knp->name),UINT2NUM(knp->value.ui32));
335
- break;
336
- case KSTAT_DATA_INT64:
337
- rb_hash_aset(v_hash,rb_str_new2(knp->name),LL2NUM(knp->value.i64));
338
- break;
339
- case KSTAT_DATA_UINT64:
340
- rb_hash_aset(v_hash,rb_str_new2(knp->name),ULL2NUM(knp->value.ui64));
341
- break;
342
- default:
343
- hash_add_pair(v_hash,knp->name,"Unknown");
344
- break;
345
- }
346
- }
347
-
348
- return v_hash;
349
- }
350
-
351
- #ifdef __cplusplus
352
- }
353
- #endif