|
|
@ -27,6 +27,10 @@ |
|
|
|
#include <stdlib.h> /* getexecname() */ |
|
|
|
#include <strings.h> /* strncpy() */ |
|
|
|
|
|
|
|
#include <kstat.h> |
|
|
|
#include <errno.h> |
|
|
|
#include <inttypes.h> |
|
|
|
#include <sys/types.h> |
|
|
|
|
|
|
|
#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64) |
|
|
|
#define PROCFS_FILE_OFFSET_BITS_HACK 1 |
|
|
@ -46,6 +50,7 @@ namespace node { |
|
|
|
|
|
|
|
using namespace v8; |
|
|
|
|
|
|
|
|
|
|
|
char** Platform::SetupArgs(int argc, char *argv[]) { |
|
|
|
return argv; |
|
|
|
} |
|
|
@ -108,11 +113,103 @@ 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) { |
|
|
|
// http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/psrinfo/psrinfo.pl
|
|
|
|
HandleScope scope; |
|
|
|
Local<Object> cpuinfo; |
|
|
|
Local<Object> cputimes; |
|
|
|
|
|
|
|
int lookup_instance; |
|
|
|
kstat_ctl_t *kc; |
|
|
|
kstat_t *ksp; |
|
|
|
kstat_named_t *knp; |
|
|
|
|
|
|
|
if ((kc = kstat_open()) == NULL) |
|
|
|
throw "could not open kstat"; |
|
|
|
|
|
|
|
*cpus = Array::New(); |
|
|
|
|
|
|
|
lookup_instance = 0; |
|
|
|
while (ksp = kstat_lookup(kc, "cpu_info", lookup_instance, NULL)){ |
|
|
|
cpuinfo = Object::New(); |
|
|
|
|
|
|
|
if (kstat_read(kc, ksp, NULL) == -1) { |
|
|
|
/*
|
|
|
|
* It is deeply annoying, but some kstats can return errors |
|
|
|
* under otherwise routine conditions. (ACPI is one |
|
|
|
* offender; there are surely others.) To prevent these |
|
|
|
* fouled kstats from completely ruining our day, we assign |
|
|
|
* an "error" member to the return value that consists of |
|
|
|
* 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)); |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "brand"); |
|
|
|
cpuinfo->Set(String::New("model"), data_named(knp)); |
|
|
|
(*cpus)->Set(lookup_instance, cpuinfo); |
|
|
|
} |
|
|
|
|
|
|
|
lookup_instance++; |
|
|
|
} |
|
|
|
|
|
|
|
lookup_instance = 0; |
|
|
|
while (ksp = kstat_lookup(kc, "cpu", lookup_instance, "sys")){ |
|
|
|
cpuinfo = (*cpus)->Get(lookup_instance)->ToObject(); |
|
|
|
cputimes = Object::New(); |
|
|
|
|
|
|
|
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)); |
|
|
|
knp = (kstat_named_t *) kstat_data_lookup(ksp, "cpu_ticks_user"); |
|
|
|
cputimes->Set(String::New("user"), data_named(knp)); |
|
|
|
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("irq"), data_named(knp)); |
|
|
|
|
|
|
|
cpuinfo->Set(String::New("times"), cputimes); |
|
|
|
} |
|
|
|
|
|
|
|
lookup_instance++; |
|
|
|
} |
|
|
|
|
|
|
|
kstat_close(kc); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
@ -126,12 +223,30 @@ double Platform::GetTotalMemory() { |
|
|
|
return 0.0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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 ); |
|
|
|
} |
|
|
|
|
|
|
|
int Platform::GetLoadAvg(Local<Array> *loads) { |
|
|
|
return 0; |
|
|
|