Add os.cpus() and os.uptime() support for sunos
This commit is contained in:
parent
2f98451561
commit
90348a616d
@ -27,6 +27,10 @@
|
|||||||
#include <stdlib.h> /* getexecname() */
|
#include <stdlib.h> /* getexecname() */
|
||||||
#include <strings.h> /* strncpy() */
|
#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)
|
#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64)
|
||||||
#define PROCFS_FILE_OFFSET_BITS_HACK 1
|
#define PROCFS_FILE_OFFSET_BITS_HACK 1
|
||||||
@ -46,6 +50,7 @@ namespace node {
|
|||||||
|
|
||||||
using namespace v8;
|
using namespace v8;
|
||||||
|
|
||||||
|
|
||||||
char** Platform::SetupArgs(int argc, char *argv[]) {
|
char** Platform::SetupArgs(int argc, char *argv[]) {
|
||||||
return 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) {
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,12 +223,30 @@ double Platform::GetTotalMemory() {
|
|||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Platform::GetUptime() {
|
double Platform::GetUptime() {
|
||||||
// http://munin-monitoring.org/attachment/ticket/419/uptime
|
kstat_ctl_t *kc;
|
||||||
return 0.0;
|
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) {
|
int Platform::GetLoadAvg(Local<Array> *loads) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -23,11 +23,29 @@ var common = require('../common');
|
|||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var os = require('os');
|
var os = require('os');
|
||||||
|
|
||||||
assert.ok(os.hostname().length > 0);
|
var hostname = os.hostname()
|
||||||
assert.ok(os.loadavg().length > 0);
|
console.log("hostname = %s", hostname);
|
||||||
assert.ok(os.uptime() > 0);
|
assert.ok(hostname.length > 0);
|
||||||
assert.ok(os.freemem() > 0);
|
|
||||||
assert.ok(os.totalmem() > 0);
|
var uptime = os.uptime();
|
||||||
assert.ok(os.cpus().length > 0);
|
console.log("uptime = %d", uptime);
|
||||||
assert.ok(os.type().length > 0);
|
assert.ok(uptime > 0);
|
||||||
assert.ok(os.release().length > 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.length > 0);
|
||||||
|
|
||||||
|
if (process.platform != 'sunos') {
|
||||||
|
// not implemeneted yet
|
||||||
|
assert.ok(os.loadavg().length > 0);
|
||||||
|
assert.ok(os.freemem() > 0);
|
||||||
|
assert.ok(os.totalmem() > 0);
|
||||||
|
}
|
||||||
|
4
wscript
4
wscript
@ -359,6 +359,8 @@ def configure(conf):
|
|||||||
conf.fatal("Cannot find socket library")
|
conf.fatal("Cannot find socket library")
|
||||||
if not conf.check(lib='nsl', uselib_store="NSL"):
|
if not conf.check(lib='nsl', uselib_store="NSL"):
|
||||||
conf.fatal("Cannot find nsl library")
|
conf.fatal("Cannot find nsl library")
|
||||||
|
if not conf.check(lib='kstat', uselib_store="KSTAT"):
|
||||||
|
conf.fatal("Cannot find kstat library")
|
||||||
|
|
||||||
conf.sub_config('deps/libeio')
|
conf.sub_config('deps/libeio')
|
||||||
|
|
||||||
@ -802,7 +804,7 @@ def build(bld):
|
|||||||
node = bld.new_task_gen("cxx", product_type)
|
node = bld.new_task_gen("cxx", product_type)
|
||||||
node.name = "node"
|
node.name = "node"
|
||||||
node.target = "node"
|
node.target = "node"
|
||||||
node.uselib = 'RT EV OPENSSL CARES EXECINFO DL KVM SOCKET NSL UTIL OPROFILE'
|
node.uselib = 'RT EV OPENSSL CARES EXECINFO DL KVM SOCKET NSL KSTAT UTIL OPROFILE'
|
||||||
node.add_objects = 'eio http_parser'
|
node.add_objects = 'eio http_parser'
|
||||||
if product_type_is_lib:
|
if product_type_is_lib:
|
||||||
node.install_path = '${LIBDIR}'
|
node.install_path = '${LIBDIR}'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user