solaris-kstat 1.0.3 → 1.1.0

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.
@@ -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