@@ -50,6 +50,7 @@ namespace node {
50
50
51
51
using namespace v8 ;
52
52
53
+
53
54
char ** Platform::SetupArgs (int argc, char *argv[]) {
54
55
return argv;
55
56
}
@@ -112,14 +113,42 @@ int Platform::GetExecutablePath(char* buffer, size_t* size) {
112
113
}
113
114
114
115
115
- // TODO: libkstat provides all this info. Need to link it though.
116
+ static Handle <Value> data_named (kstat_named_t *knp) {
117
+ Handle <Value> val;
118
+
119
+ switch (knp->data_type ) {
120
+ case KSTAT_DATA_CHAR:
121
+ val = Number::New (knp->value .c [0 ]);
122
+ break ;
123
+ case KSTAT_DATA_INT32:
124
+ val = Number::New (knp->value .i32 );
125
+ break ;
126
+ case KSTAT_DATA_UINT32:
127
+ val = Number::New (knp->value .ui32 );
128
+ break ;
129
+ case KSTAT_DATA_INT64:
130
+ val = Number::New (knp->value .i64 );
131
+ break ;
132
+ case KSTAT_DATA_UINT64:
133
+ val = Number::New (knp->value .ui64 );
134
+ break ;
135
+ case KSTAT_DATA_STRING:
136
+ val = String::New (KSTAT_NAMED_STR_PTR (knp));
137
+ break ;
138
+ default :
139
+ throw (String::New (" unrecognized data type" ));
140
+ }
141
+
142
+ return (val);
143
+ }
116
144
117
145
118
146
int Platform::GetCPUInfo (Local<Array> *cpus) {
119
147
HandleScope scope;
120
148
Local<Object> cpuinfo;
121
149
Local<Object> cputimes;
122
150
151
+ int lookup_instance;
123
152
kstat_ctl_t *kc;
124
153
kstat_t *ksp;
125
154
kstat_named_t *knp;
@@ -129,10 +158,9 @@ int Platform::GetCPUInfo(Local<Array> *cpus) {
129
158
130
159
*cpus = Array::New ();
131
160
132
- int lookup_instance = 0 ;
133
- while (ksp = kstat_lookup (kc, " cpu_info" , lookup_instance, NULL )){
161
+ lookup_instance = 0 ;
162
+ while (ksp = kstat_lookup (kc, " cpu_info" , lookup_instance, NULL )) {
134
163
cpuinfo = Object::New ();
135
- cputimes = Object::New ();
136
164
137
165
if (kstat_read (kc, ksp, NULL ) == -1 ) {
138
166
/*
@@ -144,6 +172,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) {
144
172
* the strerror().
145
173
*/
146
174
cpuinfo->Set (String::New (" error" ), String::New (strerror (errno)));
175
+ (*cpus)->Set (lookup_instance, cpuinfo);
147
176
} else {
148
177
knp = (kstat_named_t *) kstat_data_lookup (ksp, " clock_MHz" );
149
178
cpuinfo->Set (String::New (" speed" ), data_named (knp));
@@ -162,6 +191,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) {
162
191
163
192
if (kstat_read (kc, ksp, NULL ) == -1 ) {
164
193
cputimes->Set (String::New (" error" ), String::New (strerror (errno)));
194
+ cpuinfo->Set (String::New (" times" ), cpuinfo);
165
195
} else {
166
196
knp = (kstat_named_t *) kstat_data_lookup (ksp, " cpu_ticks_kernel" );
167
197
cputimes->Set (String::New (" system" ), data_named (knp));
@@ -170,7 +200,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) {
170
200
knp = (kstat_named_t *) kstat_data_lookup (ksp, " cpu_ticks_idle" );
171
201
cputimes->Set (String::New (" idle" ), data_named (knp));
172
202
knp = (kstat_named_t *) kstat_data_lookup (ksp, " intr" );
173
- cputimes->Set (String::New (" intr " ), data_named (knp));
203
+ cputimes->Set (String::New (" irq " ), data_named (knp));
174
204
175
205
cpuinfo->Set (String::New (" times" ), cputimes);
176
206
}
@@ -183,34 +213,6 @@ int Platform::GetCPUInfo(Local<Array> *cpus) {
183
213
return 0 ;
184
214
}
185
215
186
- Handle <Value> Platform::data_named (kstat_named_t *knp) {
187
- Handle <Value> val;
188
-
189
- switch (knp->data_type ) {
190
- case KSTAT_DATA_CHAR:
191
- val = Number::New (knp->value .c [0 ]);
192
- break ;
193
- case KSTAT_DATA_INT32:
194
- val = Number::New (knp->value .i32 );
195
- break ;
196
- case KSTAT_DATA_UINT32:
197
- val = Number::New (knp->value .ui32 );
198
- break ;
199
- case KSTAT_DATA_INT64:
200
- val = Number::New (knp->value .i64 );
201
- break ;
202
- case KSTAT_DATA_UINT64:
203
- val = Number::New (knp->value .ui64 );
204
- break ;
205
- case KSTAT_DATA_STRING:
206
- val = String::New (KSTAT_NAMED_STR_PTR (knp));
207
- break ;
208
- default :
209
- throw (String::New (" unrecognized data type" ));
210
- }
211
-
212
- return (val);
213
- }
214
216
215
217
double Platform::GetFreeMemory () {
216
218
return 0.0 ;
@@ -223,8 +225,29 @@ double Platform::GetTotalMemory() {
223
225
224
226
225
227
double Platform::GetUptime () {
226
- // http://munin-monitoring.org/attachment/ticket/419/uptime
227
- return 0.0 ;
228
+ kstat_ctl_t *kc;
229
+ kstat_t *ksp;
230
+ kstat_named_t *knp;
231
+
232
+ long hz = sysconf (_SC_CLK_TCK);
233
+ ulong_t clk_intr;
234
+
235
+ if ((kc = kstat_open ()) == NULL ) {
236
+ throw " could not open kstat" ;
237
+ }
238
+
239
+ ksp = kstat_lookup (kc, " unix" , 0 , " system_misc" );
240
+
241
+ if (kstat_read (kc, ksp, NULL ) == -1 ) {
242
+ throw " unable to read kstat" ;
243
+ } else {
244
+ knp = (kstat_named_t *) kstat_data_lookup (ksp, " clk_intr" );
245
+ clk_intr = knp->value .ul ;
246
+ }
247
+
248
+ kstat_close (kc);
249
+
250
+ return static_cast <double >(clk_intr / hz);
228
251
}
229
252
230
253
@@ -233,5 +256,11 @@ int Platform::GetLoadAvg(Local<Array> *loads) {
233
256
}
234
257
235
258
259
+ Handle <Value> Platform::GetInterfaceAddresses () {
260
+ HandleScope scope;
261
+ return scope.Close (Object::New ());
262
+ }
263
+
264
+
236
265
} // namespace node
237
266
0 commit comments