diff options
Diffstat (limited to 'src/node_dtrace.cc')
-rw-r--r-- | src/node_dtrace.cc | 146 |
1 files changed, 67 insertions, 79 deletions
diff --git a/src/node_dtrace.cc b/src/node_dtrace.cc index 4fb4fcd44f..b7b0822c37 100644 --- a/src/node_dtrace.cc +++ b/src/node_dtrace.cc @@ -59,12 +59,23 @@ namespace node { -using namespace v8; +using v8::FunctionCallbackInfo; +using v8::FunctionTemplate; +using v8::GCCallbackFlags; +using v8::GCEpilogueCallback; +using v8::GCPrologueCallback; +using v8::GCType; +using v8::Handle; +using v8::HandleScope; +using v8::Local; +using v8::Object; +using v8::String; +using v8::Value; #define SLURP_STRING(obj, member, valp) \ if (!(obj)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "object for " #obj " to contain string member " #member)))); \ + return ThrowError( \ + "expected object for " #obj " to contain string member " #member); \ } \ String::Utf8Value _##member(obj->Get(String::New(#member))); \ if ((*(const char **)valp = *_##member) == NULL) \ @@ -72,22 +83,22 @@ using namespace v8; #define SLURP_INT(obj, member, valp) \ if (!(obj)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "object for " #obj " to contain integer member " #member)))); \ + return ThrowError( \ + "expected object for " #obj " to contain integer member " #member); \ } \ *valp = obj->Get(String::New(#member))->ToInteger()->Value(); #define SLURP_OBJECT(obj, member, valp) \ if (!(obj)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "object for " #obj " to contain object member " #member)))); \ + return ThrowError( \ + "expected object for " #obj " to contain object member " #member); \ } \ *valp = Local<Object>::Cast(obj->Get(String::New(#member))); #define SLURP_CONNECTION(arg, conn) \ if (!(arg)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "argument " #arg " to be a connection object")))); \ + return ThrowError( \ + "expected argument " #arg " to be a connection object"); \ } \ node_dtrace_connection_t conn; \ Local<Object> _##conn = Local<Object>::Cast(arg); \ @@ -103,8 +114,8 @@ using namespace v8; #define SLURP_CONNECTION_HTTP_CLIENT(arg, conn) \ if (!(arg)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "argument " #arg " to be a connection object")))); \ + return ThrowError( \ + "expected argument " #arg " to be a connection object"); \ } \ node_dtrace_connection_t conn; \ Local<Object> _##conn = Local<Object>::Cast(arg); \ @@ -115,12 +126,12 @@ using namespace v8; #define SLURP_CONNECTION_HTTP_CLIENT_RESPONSE(arg0, arg1, conn) \ if (!(arg0)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "argument " #arg0 " to be a connection object")))); \ + return ThrowError( \ + "expected argument " #arg0 " to be a connection object"); \ } \ if (!(arg1)->IsObject()) { \ - return (ThrowException(Exception::Error(String::New("expected " \ - "argument " #arg1 " to be a connection object")))); \ + return ThrowError( \ + "expected argument " #arg1 " to be a connection object"); \ } \ node_dtrace_connection_t conn; \ Local<Object> _##conn = Local<Object>::Cast(arg0); \ @@ -131,86 +142,71 @@ using namespace v8; SLURP_INT(_##conn, port, &conn.port); -Handle<Value> DTRACE_NET_SERVER_CONNECTION(const Arguments& args) { +void DTRACE_NET_SERVER_CONNECTION(const FunctionCallbackInfo<Value>& args) { #ifndef HAVE_SYSTEMTAP if (!NODE_NET_SERVER_CONNECTION_ENABLED()) - return Undefined(node_isolate); + return; #endif - HandleScope scope(node_isolate); - SLURP_CONNECTION(args[0], conn); - NODE_NET_SERVER_CONNECTION(&conn, conn.remote, conn.port, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_NET_STREAM_END(const Arguments& args) { + +void DTRACE_NET_STREAM_END(const FunctionCallbackInfo<Value>& args) { #ifndef HAVE_SYSTEMTAP if (!NODE_NET_STREAM_END_ENABLED()) - return Undefined(node_isolate); + return; #endif - HandleScope scope(node_isolate); - SLURP_CONNECTION(args[0], conn); - NODE_NET_STREAM_END(&conn, conn.remote, conn.port, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_NET_SOCKET_READ(const Arguments& args) { + +void DTRACE_NET_SOCKET_READ(const FunctionCallbackInfo<Value>& args) { #ifndef HAVE_SYSTEMTAP if (!NODE_NET_SOCKET_READ_ENABLED()) - return Undefined(node_isolate); + return; #endif - HandleScope scope(node_isolate); - SLURP_CONNECTION(args[0], conn); if (!args[1]->IsNumber()) { - return (ThrowException(Exception::Error(String::New("expected " - "argument 1 to be number of bytes")))); + return ThrowError("expected argument 1 to be number of bytes"); } + int nbytes = args[1]->Int32Value(); NODE_NET_SOCKET_READ(&conn, nbytes, conn.remote, conn.port, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_NET_SOCKET_WRITE(const Arguments& args) { + +void DTRACE_NET_SOCKET_WRITE(const FunctionCallbackInfo<Value>& args) { #ifndef HAVE_SYSTEMTAP if (!NODE_NET_SOCKET_WRITE_ENABLED()) - return Undefined(node_isolate); + return; #endif - HandleScope scope(node_isolate); - SLURP_CONNECTION(args[0], conn); if (!args[1]->IsNumber()) { - return (ThrowException(Exception::Error(String::New("expected " - "argument 1 to be number of bytes")))); + return ThrowError("expected argument 1 to be number of bytes"); } + int nbytes = args[1]->Int32Value(); NODE_NET_SOCKET_WRITE(&conn, nbytes, conn.remote, conn.port, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_HTTP_SERVER_REQUEST(const Arguments& args) { + +void DTRACE_HTTP_SERVER_REQUEST(const FunctionCallbackInfo<Value>& args) { node_dtrace_http_server_request_t req; #ifndef HAVE_SYSTEMTAP if (!NODE_HTTP_SERVER_REQUEST_ENABLED()) - return Undefined(node_isolate); + return; #endif HandleScope scope(node_isolate); - Local<Object> arg0 = Local<Object>::Cast(args[0]); Local<Object> headers; @@ -218,12 +214,12 @@ Handle<Value> DTRACE_HTTP_SERVER_REQUEST(const Arguments& args) { req._un.version = 1; SLURP_STRING(arg0, url, &req.url); SLURP_STRING(arg0, method, &req.method); - SLURP_OBJECT(arg0, headers, &headers); - if (!(headers)->IsObject()) - return (ThrowException(Exception::Error(String::New("expected " - "object for request to contain string member headers")))); + if (!(headers)->IsObject()) { + return ThrowError( + "expected object for request to contain string member headers"); + } Local<Value> strfwdfor = headers->Get(String::New("x-forwarded-for")); String::Utf8Value fwdfor(strfwdfor); @@ -232,35 +228,29 @@ Handle<Value> DTRACE_HTTP_SERVER_REQUEST(const Arguments& args) { req.forwardedFor = const_cast<char*>(""); SLURP_CONNECTION(args[1], conn); - NODE_HTTP_SERVER_REQUEST(&req, &conn, conn.remote, conn.port, req.method, \ req.url, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_HTTP_SERVER_RESPONSE(const Arguments& args) { + +void DTRACE_HTTP_SERVER_RESPONSE(const FunctionCallbackInfo<Value>& args) { #ifndef HAVE_SYSTEMTAP if (!NODE_HTTP_SERVER_RESPONSE_ENABLED()) - return Undefined(node_isolate); + return; #endif - HandleScope scope(node_isolate); - SLURP_CONNECTION(args[0], conn); - NODE_HTTP_SERVER_RESPONSE(&conn, conn.remote, conn.port, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_HTTP_CLIENT_REQUEST(const Arguments& args) { + +void DTRACE_HTTP_CLIENT_REQUEST(const FunctionCallbackInfo<Value>& args) { node_dtrace_http_client_request_t req; char *header; #ifndef HAVE_SYSTEMTAP if (!NODE_HTTP_CLIENT_REQUEST_ENABLED()) - return Undefined(node_isolate); + return; #endif HandleScope scope(node_isolate); @@ -290,28 +280,21 @@ Handle<Value> DTRACE_HTTP_CLIENT_REQUEST(const Arguments& args) { *header = '\0'; SLURP_CONNECTION_HTTP_CLIENT(args[1], conn); - NODE_HTTP_CLIENT_REQUEST(&req, &conn, conn.remote, conn.port, req.method, \ req.url, conn.fd); - - return Undefined(node_isolate); } -Handle<Value> DTRACE_HTTP_CLIENT_RESPONSE(const Arguments& args) { + +void DTRACE_HTTP_CLIENT_RESPONSE(const FunctionCallbackInfo<Value>& args) { #ifndef HAVE_SYSTEMTAP if (!NODE_HTTP_CLIENT_RESPONSE_ENABLED()) - return Undefined(node_isolate); + return; #endif HandleScope scope(node_isolate); - SLURP_CONNECTION_HTTP_CLIENT_RESPONSE(args[0], args[1], conn); - NODE_HTTP_CLIENT_RESPONSE(&conn, conn.remote, conn.port, conn.fd); - - return Undefined(node_isolate); } -#define NODE_PROBE(name) #name, name, Persistent<FunctionTemplate>() static int dtrace_gc_start(GCType type, GCCallbackFlags flags) { NODE_GC_START(type, flags); @@ -322,17 +305,21 @@ static int dtrace_gc_start(GCType type, GCCallbackFlags flags) { return 0; } + static int dtrace_gc_done(GCType type, GCCallbackFlags flags) { NODE_GC_DONE(type, flags); return 0; } + void InitDTrace(Handle<Object> target) { + HandleScope scope(node_isolate); + static struct { const char *name; - Handle<Value> (*func)(const Arguments&); - Persistent<FunctionTemplate> templ; + void (*func)(const FunctionCallbackInfo<Value>&); } tab[] = { +#define NODE_PROBE(name) #name, name { NODE_PROBE(DTRACE_NET_SERVER_CONNECTION) }, { NODE_PROBE(DTRACE_NET_STREAM_END) }, { NODE_PROBE(DTRACE_NET_SOCKET_READ) }, @@ -341,12 +328,13 @@ void InitDTrace(Handle<Object> target) { { NODE_PROBE(DTRACE_HTTP_SERVER_RESPONSE) }, { NODE_PROBE(DTRACE_HTTP_CLIENT_REQUEST) }, { NODE_PROBE(DTRACE_HTTP_CLIENT_RESPONSE) } +#undef NODE_PROBE }; for (unsigned int i = 0; i < ARRAY_SIZE(tab); i++) { - tab[i].templ = Persistent<FunctionTemplate>::New(node_isolate, - FunctionTemplate::New(tab[i].func)); - target->Set(String::NewSymbol(tab[i].name), tab[i].templ->GetFunction()); + Local<String> key = String::New(tab[i].name); + Local<Value> val = FunctionTemplate::New(tab[i].func)->GetFunction(); + target->Set(key, val); } #ifdef HAVE_ETW |