forked from davglass/node-getrusage
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathgetrusage.cc
More file actions
80 lines (63 loc) · 2.62 KB
/
getrusage.cc
File metadata and controls
80 lines (63 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <v8.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <node.h>
using namespace v8;
Handle<Value> GetSysTime(const Arguments& args) {
struct rusage ru;
getrusage(RUSAGE_SELF, &ru);
return Number::New( ru.ru_stime.tv_sec * 1e6 + ru.ru_stime.tv_usec );
}
Handle<Value> GetUserTime(const Arguments& args) {
struct rusage ru;
getrusage(RUSAGE_SELF, &ru);
return Number::New( ru.ru_utime.tv_sec * 1e6 + ru.ru_utime.tv_usec);
}
Handle<Value> GetTimeOfDay(const Arguments& args) {
struct timeval tim;
int r = gettimeofday(&tim, NULL);
if(r < 0) {
return Number::New(-1);
}
return Number::New( tim.tv_sec* 1e6 + tim.tv_usec);
}
static Handle<Value> timevalToNumber(struct timeval &tim) {
return Number::New( tim.tv_sec* 1e6 + tim.tv_usec );
}
Handle<Value> GetUsage(const Arguments& args) {
HandleScope scope;
struct rusage ru;
getrusage(RUSAGE_SELF, &ru);
Local<Object> info = Object::New();
#define FIELD(name, conv) \
info->Set(String::NewSymbol(#name), conv(ru.ru_##name))
FIELD(utime, timevalToNumber); /* user time used */
FIELD(stime, timevalToNumber); /* system time used */
FIELD(maxrss, Number::New); /* maximum resident set size */
FIELD(ixrss, Number::New); /* integral shared memory size */
FIELD(idrss, Number::New); /* integral unshared data size */
FIELD(isrss, Number::New); /* integral unshared stack size */
FIELD(minflt, Number::New); /* page reclaims */
FIELD(majflt, Number::New); /* page faults */
FIELD(nswap, Number::New); /* swaps */
FIELD(inblock, Number::New); /* block input operations */
FIELD(oublock, Number::New); /* block output operations */
FIELD(msgsnd, Number::New); /* messages sent */
FIELD(msgrcv, Number::New); /* messages received */
FIELD(nsignals, Number::New); /* signals received */
FIELD(nvcsw, Number::New); /* voluntary context switches */
FIELD(nivcsw, Number::New); /* involuntary context switches */
#undef FIELD
return scope.Close(info);
}
extern "C" void init(Handle<Object> target) {
HandleScope scope;
target->Set(String::New("usage"), FunctionTemplate::New(GetUsage)->GetFunction());
target->Set(String::New("getsystime"), FunctionTemplate::New(GetSysTime)->GetFunction());
target->Set(String::New("getusertime"), FunctionTemplate::New(GetUserTime)->GetFunction());
target->Set(String::New("gettimeofday"), FunctionTemplate::New(GetTimeOfDay)->GetFunction());
}