From 45d3bc2039f338d4cd4aebad22679ec576df1833 Mon Sep 17 00:00:00 2001 From: Jan Kryl Date: Tue, 13 Oct 2015 20:57:06 +0200 Subject: [PATCH] Fix usage module to work on Solaris with node 4.x --- src/binding.cpp | 2 +- src/solaris.cpp | 32 +++++++++++++++++--------------- src/solaris.h | 5 +++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/binding.cpp b/src/binding.cpp index 54d5611..24ba477 100644 --- a/src/binding.cpp +++ b/src/binding.cpp @@ -11,7 +11,7 @@ void RegisterModule(Local exports) { #ifdef is_solaris exports->Set(Nan::New("getUsage").ToLocalChecked(), - FunctionTemplate::New(GetUsage)->GetFunction()); + Nan::New(GetUsage)->GetFunction()); #endif exports->Set(Nan::New("OS").ToLocalChecked(), Nan::New(OS).ToLocalChecked()); } diff --git a/src/solaris.cpp b/src/solaris.cpp index 59a3ed5..f4cfb3c 100644 --- a/src/solaris.cpp +++ b/src/solaris.cpp @@ -1,6 +1,5 @@ #include #include "solaris.h" - /* Getting CPU Usage from the /proc */ @@ -19,7 +18,7 @@ static int read_buffer(char *buffer, int buffer_size, char* file_path) { } } -static char* get_proc_file(char* type, char* pid) { +static char* get_proc_file(const char* type, char* pid) { size_t type_len = strlen(type); size_t pid_len = strlen(pid); size_t proc_len = strlen("/proc/"); @@ -52,6 +51,8 @@ int get_usage(int pid, ps_usage_t* ps_usage) { if(success_psinfo) { ps_usage->cpu = get_pct(psinfo.pr_pctcpu); + // Note that rssize will be zero if we are getting info for 64-bit + // process from 32-bit process! ps_usage->memory = psinfo.pr_rssize * 1024; return 1; } else { @@ -76,37 +77,38 @@ void AsyncGetUsage(uv_work_t* req) { } void AsyncAfterGetUsage(uv_work_t* req) { + Nan::HandleScope scope; UsageData* usageData = static_cast(req->data); if(usageData->failed) { const unsigned argc = 1; Local argv[argc] = { - Exception::Error(String::New("INVALID_PID")) + Nan::RangeError("INVALID_PID") }; - usageData->callback->Call(Context::GetCurrent()->Global(), argc, argv); + usageData->callback.Call(argc, argv); } else { - Local usage = Object::New(); - usage->Set(String::NewSymbol("cpu"), Number::New(usageData->ps_usage.cpu)); - usage->Set(String::NewSymbol("memory"), Number::New(usageData->ps_usage.memory)); + Local usage = Nan::New(); + Nan::Set(usage, Nan::New("cpu").ToLocalChecked(), Nan::New(usageData->ps_usage.cpu)); + Nan::Set(usage, Nan::New("memory").ToLocalChecked(), Nan::New(usageData->ps_usage.memory)); const unsigned argc = 2; - Local argv[argc] = { Local::New(Null()), usage }; - usageData->callback->Call(Context::GetCurrent()->Global(), argc, argv); + Local argv[argc] = { Nan::Null(), usage }; + usageData->callback.Call(argc, argv); } delete usageData; delete req; } -Handle GetUsage(const Arguments& args) { - HandleScope scope; +NAN_METHOD(GetUsage) { + Nan::HandleScope(); - int pid = (int)(Local::Cast(args[0])->Value()); - Local callback = Local::Cast(args[1]); + int pid = Nan::To(info[0]).FromJust(); + Local callback = Local::Cast(info[1]); UsageData* usageData = new UsageData(); usageData->pid = pid; - usageData->callback = Persistent::New(callback); + usageData->callback.SetFunction(callback); usageData->failed = false; uv_work_t* req = new uv_work_t(); @@ -114,5 +116,5 @@ Handle GetUsage(const Arguments& args) { uv_queue_work(uv_default_loop(), req, AsyncGetUsage, (uv_after_work_cb)AsyncAfterGetUsage); - return scope.Close(Undefined()); + Nan::Undefined(); } diff --git a/src/solaris.h b/src/solaris.h index 81bc112..a387eff 100644 --- a/src/solaris.h +++ b/src/solaris.h @@ -6,6 +6,7 @@ #include #include #include +#include typedef struct ps_usage { float cpu; @@ -15,12 +16,12 @@ typedef struct ps_usage { using namespace v8; struct UsageData { int pid; - Persistent callback; + Nan::Callback callback; ps_usage_t ps_usage; bool failed; }; extern int get_usage(int pid, ps_usage_t* ps_usage); -extern Handle GetUsage(const Arguments& args); +extern NAN_METHOD(GetUsage); #endif