|
|
@ -50,6 +50,7 @@ namespace node { |
|
|
|
|
|
|
|
using namespace v8; |
|
|
|
|
|
|
|
|
|
|
|
char** Platform::SetupArgs(int argc, char *argv[]) { |
|
|
|
return argv; |
|
|
|
} |
|
|
@ -112,7 +113,34 @@ int Platform::GetExecutablePath(char* buffer, size_t* size) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TODO: libkstat provides all this info. Need to link it though.
|
|
|
|
static Handle<Value> data_named(kstat_named_t *knp) { |
|
|
|
Handle<Value> val; |
|
|
|
|
|
|
|
switch (knp->data_type) { |
|
|
|
case KSTAT_DATA_CHAR: |
|
|
|
val = Number::New(knp->value.c[0]); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_INT32: |
|
|
|
val = Number::New(knp->value.i32); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_UINT32: |
|
|
|
val = Number::New(knp->value.ui32); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_INT64: |
|
|
|
val = Number::New(knp->value.i64); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_UINT64: |
|
|
|
val = Number::New(knp->value.ui64); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_STRING: |
|
|
|
val = String::New(KSTAT_NAMED_STR_PTR(knp)); |
|
|
|
break; |
|
|
|
default: |
|
|
|
throw (String::New("unrecognized data type")); |
|
|
|
} |
|
|
|
|
|
|
|
return (val); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
@ -120,6 +148,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
|
Local<Object> cpuinfo; |
|
|
|
Local<Object> cputimes; |
|
|
|
|
|
|
|
int lookup_instance; |
|
|
|
kstat_ctl_t *kc; |
|
|
|
kstat_t *ksp; |
|
|
|
kstat_named_t *knp; |
|
|
@ -129,10 +158,9 @@ int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
|
|
|
|
|
*cpus = Array::New(); |
|
|
|
|
|
|
|
int lookup_instance = 0; |
|
|
|
lookup_instance = 0; |
|
|
|
while (ksp = kstat_lookup(kc, "cpu_info", lookup_instance, NULL)) { |
|
|
|
cpuinfo = Object::New(); |
|
|
|
cputimes = Object::New(); |
|
|
|
|
|
|
|
if (kstat_read(kc, ksp, NULL) == -1) { |
|
|
|
/*
|
|
|
@ -144,6 +172,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
|
* the strerror(). |
|
|
|
*/ |
|
|
|
cpuinfo->Set(String::New("error"), String::New(strerror(errno))); |
|
|
|
(*cpus)->Set(lookup_instance, cpuinfo); |
|
|
|
} else { |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "clock_MHz"); |
|
|
|
cpuinfo->Set(String::New("speed"), data_named(knp)); |
|
|
@ -162,6 +191,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
|
|
|
|
|
if (kstat_read(kc, ksp, NULL) == -1) { |
|
|
|
cputimes->Set(String::New("error"), String::New(strerror(errno))); |
|
|
|
cpuinfo->Set(String::New("times"), cpuinfo); |
|
|
|
} else { |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "cpu_ticks_kernel"); |
|
|
|
cputimes->Set(String::New("system"), data_named(knp)); |
|
|
@ -170,7 +200,7 @@ int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "cpu_ticks_idle"); |
|
|
|
cputimes->Set(String::New("idle"), data_named(knp)); |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "intr"); |
|
|
|
cputimes->Set(String::New("intr"), data_named(knp)); |
|
|
|
cputimes->Set(String::New("irq"), data_named(knp)); |
|
|
|
|
|
|
|
cpuinfo->Set(String::New("times"), cputimes); |
|
|
|
} |
|
|
@ -183,34 +213,6 @@ int Platform::GetCPUInfo(Local<Array> *cpus) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
Handle<Value> Platform::data_named(kstat_named_t *knp) { |
|
|
|
Handle<Value> val; |
|
|
|
|
|
|
|
switch (knp->data_type) { |
|
|
|
case KSTAT_DATA_CHAR: |
|
|
|
val = Number::New(knp->value.c[0]); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_INT32: |
|
|
|
val = Number::New(knp->value.i32); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_UINT32: |
|
|
|
val = Number::New(knp->value.ui32); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_INT64: |
|
|
|
val = Number::New(knp->value.i64); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_UINT64: |
|
|
|
val = Number::New(knp->value.ui64); |
|
|
|
break; |
|
|
|
case KSTAT_DATA_STRING: |
|
|
|
val = String::New(KSTAT_NAMED_STR_PTR(knp)); |
|
|
|
break; |
|
|
|
default: |
|
|
|
throw (String::New("unrecognized data type")); |
|
|
|
} |
|
|
|
|
|
|
|
return (val); |
|
|
|
} |
|
|
|
|
|
|
|
double Platform::GetFreeMemory() { |
|
|
|
return 0.0; |
|
|
@ -223,8 +225,29 @@ double Platform::GetTotalMemory() { |
|
|
|
|
|
|
|
|
|
|
|
double Platform::GetUptime() { |
|
|
|
// http://munin-monitoring.org/attachment/ticket/419/uptime
|
|
|
|
return 0.0; |
|
|
|
kstat_ctl_t *kc; |
|
|
|
kstat_t *ksp; |
|
|
|
kstat_named_t *knp; |
|
|
|
|
|
|
|
long hz = sysconf(_SC_CLK_TCK); |
|
|
|
ulong_t clk_intr; |
|
|
|
|
|
|
|
if ((kc = kstat_open()) == NULL) { |
|
|
|
throw "could not open kstat"; |
|
|
|
} |
|
|
|
|
|
|
|
ksp = kstat_lookup(kc, "unix", 0, "system_misc"); |
|
|
|
|
|
|
|
if (kstat_read(kc, ksp, NULL) == -1) { |
|
|
|
throw "unable to read kstat"; |
|
|
|
} else { |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "clk_intr"); |
|
|
|
clk_intr = knp->value.ul; |
|
|
|
} |
|
|
|
|
|
|
|
kstat_close(kc); |
|
|
|
|
|
|
|
return static_cast<double>(clk_intr / hz); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -233,5 +256,11 @@ int Platform::GetLoadAvg(Local<Array> *loads) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Handle<Value> Platform::GetInterfaceAddresses() { |
|
|
|
HandleScope scope; |
|
|
|
return scope.Close(Object::New()); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} // namespace node
|
|
|
|
|
|
|
|