src: fix tracing infrastructure after v8 upgrade
authorBen Noordhuis <info@bnoordhuis.nl>
Sat, 15 Mar 2014 06:15:11 +0000 (07:15 +0100)
committerFedor Indutny <fedor.indutny@gmail.com>
Sun, 16 Mar 2014 12:15:34 +0000 (16:15 +0400)
Fix up the dtrace/etw/systemtap infrastructure after the V8 upgrade in
commit 1c7bf24.  The win32 changes are untested but can hardly make
things worse because node doesn't build on windows right now.

Fixes #7313 with some luck.

src/node_counters.cc
src/node_dtrace.cc
src/node_provider.d
src/node_win32_etw_provider-inl.h
src/node_win32_etw_provider.h

index 9e351ac..ae2d5a4 100644 (file)
@@ -37,6 +37,7 @@ using v8::GCPrologueCallback;
 using v8::GCType;
 using v8::Handle;
 using v8::HandleScope;
+using v8::Isolate;
 using v8::Local;
 using v8::Object;
 using v8::String;
@@ -76,12 +77,16 @@ void COUNTER_HTTP_CLIENT_RESPONSE(const FunctionCallbackInfo<Value>&) {
 }
 
 
-static void counter_gc_start(GCType type, GCCallbackFlags flags) {
+static void counter_gc_start(Isolate* isolate,
+                             GCType type,
+                             GCCallbackFlags flags) {
   counter_gc_start_time = NODE_COUNT_GET_GC_RAWTIME();
 }
 
 
-static void counter_gc_done(GCType type, GCCallbackFlags flags) {
+static void counter_gc_done(Isolate* isolate,
+                            GCType type,
+                            GCCallbackFlags flags) {
   uint64_t endgc = NODE_COUNT_GET_GC_RAWTIME();
   if (endgc != 0) {
     uint64_t totalperiod = endgc - counter_gc_end_time;
@@ -117,7 +122,8 @@ void InitPerfCounters(Environment* env, Handle<Object> target) {
 
   for (int i = 0; i < ARRAY_SIZE(tab); i++) {
     Local<String> key = OneByteString(env->isolate(), tab[i].name);
-    Local<Value> val = FunctionTemplate::New(tab[i].func)->GetFunction();
+    Local<Value> val =
+        FunctionTemplate::New(env->isolate(), tab[i].func)->GetFunction();
     target->Set(key, val);
   }
 
@@ -129,8 +135,8 @@ void InitPerfCounters(Environment* env, Handle<Object> target) {
   counter_gc_start_time = NODE_COUNT_GET_GC_RAWTIME();
   counter_gc_end_time = counter_gc_start_time;
 
-  v8::V8::AddGCPrologueCallback(counter_gc_start);
-  v8::V8::AddGCEpilogueCallback(counter_gc_done);
+  env->isolate()->AddGCPrologueCallback(counter_gc_start);
+  env->isolate()->AddGCEpilogueCallback(counter_gc_done);
 }
 
 
index f0575b3..5372430 100644 (file)
@@ -46,8 +46,8 @@
 #define NODE_NET_SOCKET_READ_ENABLED() (0)
 #define NODE_NET_SOCKET_WRITE(arg0, arg1, arg2, arg3, arg4)
 #define NODE_NET_SOCKET_WRITE_ENABLED() (0)
-#define NODE_GC_START(arg0, arg1)
-#define NODE_GC_DONE(arg0, arg1)
+#define NODE_GC_START(arg0, arg1, arg2)
+#define NODE_GC_DONE(arg0, arg1, arg2)
 #endif
 
 #include "env.h"
@@ -63,6 +63,7 @@ using v8::GCPrologueCallback;
 using v8::GCType;
 using v8::Handle;
 using v8::HandleScope;
+using v8::Isolate;
 using v8::Local;
 using v8::Object;
 using v8::String;
@@ -287,19 +288,17 @@ void DTRACE_HTTP_CLIENT_RESPONSE(const FunctionCallbackInfo<Value>& args) {
 }
 
 
-int dtrace_gc_start(GCType type, GCCallbackFlags flags) {
-  NODE_GC_START(type, flags);
-  /*
-   * We avoid the tail-call elimination of the USDT probe (which screws up
-   * args) by forcing a return of 0.
-   */
-  return 0;
+void dtrace_gc_start(Isolate* isolate, GCType type, GCCallbackFlags flags) {
+  // Previous versions of this probe point only logged type and flags.
+  // That's why for reasons of backwards compatibility the isolate goes last.
+  NODE_GC_START(type, flags, isolate);
 }
 
 
-int dtrace_gc_done(GCType type, GCCallbackFlags flags) {
-  NODE_GC_DONE(type, flags);
-  return 0;
+void dtrace_gc_done(Isolate* isolate, GCType type, GCCallbackFlags flags) {
+  // Previous versions of this probe point only logged type and flags.
+  // That's why for reasons of backwards compatibility the isolate goes last.
+  NODE_GC_DONE(type, flags, isolate);
 }
 
 
@@ -334,8 +333,8 @@ void InitDTrace(Environment* env, Handle<Object> target) {
 #endif
 
 #if defined HAVE_DTRACE || defined HAVE_ETW
-  v8::V8::AddGCPrologueCallback((GCPrologueCallback)dtrace_gc_start);
-  v8::V8::AddGCEpilogueCallback((GCEpilogueCallback)dtrace_gc_done);
+  env->isolate()->AddGCPrologueCallback(dtrace_gc_start);
+  env->isolate()->AddGCEpilogueCallback(dtrace_gc_done);
 #endif
 }
 
index 6f95b03..9f2d33a 100644 (file)
@@ -75,8 +75,8 @@ provider node {
       string a, int p, string m, string u, int fd);
        probe http__client__response(node_dtrace_connection_t *c, const char *a,
            int p, int fd) : (node_connection_t *c, string a, int p, int fd);
-       probe gc__start(int t, int f);
-       probe gc__done(int t, int f);
+       probe gc__start(int t, int f, void *isolate);
+       probe gc__done(int t, int f, void *isolate);
 };
 
 #pragma D attributes Evolving/Evolving/ISA provider node provider
index 17d50a8..dc860e3 100644 (file)
@@ -162,7 +162,9 @@ void NODE_NET_STREAM_END(node_dtrace_connection_t* conn,
 }
 
 
-void NODE_GC_START(v8::GCType type, v8::GCCallbackFlags flags) {
+void NODE_GC_START(v8::GCType type,
+                   v8::GCCallbackFlags flags,
+                   v8::Isolate* isolate) {
   if (events_enabled > 0) {
     EVENT_DATA_DESCRIPTOR descriptors[2];
     ETW_WRITE_GC(descriptors, type, flags);
@@ -171,7 +173,9 @@ void NODE_GC_START(v8::GCType type, v8::GCCallbackFlags flags) {
 }
 
 
-void NODE_GC_DONE(v8::GCType type, v8::GCCallbackFlags flags) {
+void NODE_GC_DONE(v8::GCType type,
+                  v8::GCCallbackFlags flags,
+                  v8::Isolate* isolate) {
   if (events_enabled > 0) {
     EVENT_DATA_DESCRIPTOR descriptors[2];
     ETW_WRITE_GC(descriptors, type, flags);
index fd95d9a..8d7cedd 100644 (file)
@@ -68,8 +68,12 @@ INLINE void NODE_NET_SERVER_CONNECTION(node_dtrace_connection_t* conn,
   const char *remote, int port, int fd);
 INLINE void NODE_NET_STREAM_END(node_dtrace_connection_t* conn,
   const char *remote, int port, int fd);
-INLINE void NODE_GC_START(v8::GCType type, v8::GCCallbackFlags flags);
-INLINE void NODE_GC_DONE(v8::GCType type, v8::GCCallbackFlags flags);
+INLINE void NODE_GC_START(v8::GCType type,
+                          v8::GCCallbackFlags flags,
+                          v8::Isolate* isolate);
+INLINE void NODE_GC_DONE(v8::GCType type,
+                         v8::GCCallbackFlags flags,
+                         v8::Isolate* isolate);
 INLINE void NODE_V8SYMBOL_REMOVE(const void* addr1, const void* addr2);
 INLINE void NODE_V8SYMBOL_MOVE(const void* addr1, const void* addr2);
 INLINE void NODE_V8SYMBOL_RESET();