summaryrefslogtreecommitdiff
path: root/src/node_dtrace.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2011-01-24 17:50:10 -0800
committerRyan Dahl <ry@tinyclouds.org>2011-01-24 18:59:06 -0800
commit068b733583a4f0781a8418ddf42f7912e3dd53a6 (patch)
tree7f9dd4ca422b06447db9f901cc11d9f7bca90423 /src/node_dtrace.cc
parent91cc2d8c4bff5c5fbacd757f38b9a8c690dce131 (diff)
downloadandroid-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.cc113
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());
+ }
+}
+
+}