diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-01-24 17:50:10 -0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-01-24 18:59:06 -0800 |
commit | 068b733583a4f0781a8418ddf42f7912e3dd53a6 (patch) | |
tree | 7f9dd4ca422b06447db9f901cc11d9f7bca90423 /src/node_dtrace.cc | |
parent | 91cc2d8c4bff5c5fbacd757f38b9a8c690dce131 (diff) | |
download | android-node-v8-068b733583a4f0781a8418ddf42f7912e3dd53a6.tar.gz android-node-v8-068b733583a4f0781a8418ddf42f7912e3dd53a6.tar.bz2 android-node-v8-068b733583a4f0781a8418ddf42f7912e3dd53a6.zip |
Land Cantrill's DTrace patch
only works on solaris
Diffstat (limited to 'src/node_dtrace.cc')
-rw-r--r-- | src/node_dtrace.cc | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/node_dtrace.cc b/src/node_dtrace.cc new file mode 100644 index 0000000000..0f7726a620 --- /dev/null +++ b/src/node_dtrace.cc @@ -0,0 +1,113 @@ +#include <node_dtrace.h> + +#ifdef HAVE_DTRACE +#include "node_provider.h" +#else +#define NODE_HTTP_SERVER_REQUEST(arg0, arg1) +#define NODE_HTTP_SERVER_REQUEST_ENABLED() (0) +#define NODE_HTTP_SERVER_RESPONSE(arg0) +#define NODE_HTTP_SERVER_RESPONSE_ENABLED() (0) +#define NODE_NET_SERVER_CONNECTION(arg0) +#define NODE_NET_SERVER_CONNECTION_ENABLED() (0) +#define NODE_NET_STREAM_END(arg0) +#define NODE_NET_STREAM_END_ENABLED() (0) +#endif + +namespace node { + +using namespace v8; + +#define SLURP_STRING(obj, member, valp) \ + String::Utf8Value _##member(obj->Get(String::New(#member))->ToString()); \ + if ((*(const char **)valp = *_##member) == NULL) \ + *(const char **)valp = "<unknown>"; + +#define SLURP_INT(obj, member, valp) \ + *valp = obj->Get(String::New(#member))->ToInteger()->Value(); + +#define SLURP_CONNECTION(arg, conn) \ + node_dtrace_connection_t conn; \ + Local<Object> _##conn = Local<Object>::Cast(arg); \ + SLURP_INT(_##conn, fd, &conn.fd); \ + SLURP_STRING(_##conn, remoteAddress, &conn.remote); \ + SLURP_INT(_##conn, remotePort, &conn.port); + +Handle<Value> DTRACE_NET_SERVER_CONNECTION(const Arguments& args) { + if (!NODE_NET_SERVER_CONNECTION_ENABLED()) + return Undefined(); + + HandleScope scope; + + SLURP_CONNECTION(args[0], conn); + NODE_NET_SERVER_CONNECTION(&conn); + + return Undefined(); +} + +Handle<Value> DTRACE_NET_STREAM_END(const Arguments& args) { + if (!NODE_NET_STREAM_END_ENABLED()) + return Undefined(); + + HandleScope scope; + + SLURP_CONNECTION(args[0], conn); + NODE_NET_STREAM_END(&conn); + + return Undefined(); +} + +Handle<Value> DTRACE_HTTP_SERVER_REQUEST(const Arguments& args) { + node_dtrace_http_request_t req; + + if (!NODE_HTTP_SERVER_REQUEST_ENABLED()) + return Undefined(); + + HandleScope scope; + + Local<Object> arg0 = Local<Object>::Cast(args[0]); + Local<Object> arg1 = Local<Object>::Cast(args[1]); + + SLURP_STRING(arg0, url, &req.url); + SLURP_STRING(arg0, method, &req.method); + + SLURP_CONNECTION(args[1], conn); + + NODE_HTTP_SERVER_REQUEST(&req, &conn); + return Undefined(); +} + +Handle<Value> DTRACE_HTTP_SERVER_RESPONSE(const Arguments& args) { + if (!NODE_HTTP_SERVER_RESPONSE_ENABLED()) + return Undefined(); + + HandleScope scope; + + SLURP_CONNECTION(args[0], conn); + NODE_HTTP_SERVER_RESPONSE(&conn); + + return Undefined(); +} + +#define NODE_PROBE(name) #name, name + +void InitDTrace(Handle<Object> target) { + static struct { + const char *name; + Handle<Value> (*func)(const Arguments&); + Persistent<FunctionTemplate> templ; + } tab[] = { + { NODE_PROBE(DTRACE_NET_SERVER_CONNECTION) }, + { NODE_PROBE(DTRACE_NET_STREAM_END) }, + { NODE_PROBE(DTRACE_HTTP_SERVER_REQUEST) }, + { NODE_PROBE(DTRACE_HTTP_SERVER_RESPONSE) }, + { NULL } + }; + + for (int i = 0; tab[i].name != NULL; i++) { + tab[i].templ = Persistent<FunctionTemplate>::New( + FunctionTemplate::New(tab[i].func)); + target->Set(String::NewSymbol(tab[i].name), tab[i].templ->GetFunction()); + } +} + +} |