Browse Source

Add os.cpus() and os.uptime() support for sunos

v0.7.4-release
Scott McWhirter 14 years ago
committed by Ryan Dahl
parent
commit
e8cf98c841
  1. 6
      src/platform.h
  2. 99
      src/platform_sunos.cc
  3. 34
      test/simple/test-os.js

6
src/platform.h

@ -43,12 +43,6 @@ class Platform {
static double GetUptime();
static int GetLoadAvg(v8::Local<v8::Array> *loads);
static v8::Handle<v8::Value> GetInterfaceAddresses();
private:
static double GetUptimeImpl();
static double prog_start_time;
#ifdef __sun
static v8::Handle<v8::Value> data_named(kstat_named_t *);
#endif
};

99
src/platform_sunos.cc

@ -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;
while (ksp = kstat_lookup(kc, "cpu_info", lookup_instance, NULL)){
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

34
test/simple/test-os.js

@ -23,11 +23,29 @@ var common = require('../common');
var assert = require('assert');
var os = require('os');
assert.ok(os.hostname().length > 0);
assert.ok(os.loadavg().length > 0);
assert.ok(os.uptime() > 0);
assert.ok(os.freemem() > 0);
assert.ok(os.totalmem() > 0);
assert.ok(os.cpus().length > 0);
assert.ok(os.type().length > 0);
assert.ok(os.release().length > 0);
var hostname = os.hostname()
console.log("hostname = %s", hostname);
assert.ok(hostname.length > 0);
var uptime = os.uptime();
console.log("uptime = %d", uptime);
assert.ok(uptime > 0);
var cpus = os.cpus();
console.log("cpus = ", cpus);
assert.ok(cpus.length > 0);
var type = os.type();
console.log("type = ", type);
assert.ok(type.length > 0);
var release = os.release();
console.log("release = ", release);
assert.ok(release > 0);
if (process.platform != 'sunos') {
// not implemeneted yet
assert.ok(os.loadavg().length > 0);
assert.ok(os.freemem() > 0);
assert.ok(os.totalmem() > 0);
}

Loading…
Cancel
Save