[dtrace] Probes for taking/releasing the GC lock.
authorMark Probst <mark.probst@gmail.com>
Fri, 21 Sep 2012 14:44:16 +0000 (16:44 +0200)
committerMark Probst <mark.probst@gmail.com>
Fri, 28 Sep 2012 21:18:16 +0000 (23:18 +0200)
data/mono.d
mono/metadata/sgen-gc.c
mono/metadata/sgen-gc.h
mono/utils/dtrace.h

index 14591aa483862dbd9931db5bd0c58eab5dfbb3f6..a042a4a4fb3489a6aea3ef622390d9ee95e66c9a 100644 (file)
@@ -21,6 +21,9 @@ provider mono {
 
        probe gc__heap__alloc (void *addr, uintptr_t len);
        probe gc__heap__free (void *addr, uintptr_t len);
+
+       probe gc__locked ();
+       probe gc__unlocked ();
 };
 
 #pragma D attributes Evolving/Evolving/Common provider mono provider
index 3621386c5d173cab9e4626101aaea59ee35b6043..66e90ebc683f441d5bc7c6fa3a3462cb816eb18d 100644 (file)
@@ -3888,6 +3888,7 @@ sgen_thread_unregister (SgenThreadInfo *p)
                if (!sgen_park_current_thread_if_doing_handshake (p))
                        g_usleep (50);
        }
+       MONO_PROBE_GC_LOCKED ();
 #endif
 
        binary_protocol_thread_unregister ((gpointer)mono_thread_info_get_tid (p));
index 502ebdc4df13bc1d666d4d25b0afb79f6f761678..76b1ed0d973dfeabf4f3933ae0d432bca174bce9 100644 (file)
@@ -40,6 +40,7 @@ typedef struct _SgenThreadInfo SgenThreadInfo;
 #include <signal.h>
 #include <mono/utils/mono-compiler.h>
 #include <mono/utils/mono-threads.h>
+#include <mono/utils/dtrace.h>
 #include <mono/io-layer/mono-mutex.h>
 #include <mono/metadata/class-internals.h>
 #include <mono/metadata/object-internals.h>
@@ -202,9 +203,15 @@ typedef struct _SgenPinnedChunk SgenPinnedChunk;
 /* if changing LOCK_INIT to something that isn't idempotent, look at
    its use in mono_gc_base_init in sgen-gc.c */
 #define LOCK_INIT(name)        mono_mutex_init (&(name), NULL)
-#define LOCK_GC mono_mutex_lock (&gc_mutex)
+#define LOCK_GC do {                                           \
+               mono_mutex_lock (&gc_mutex);                    \
+               MONO_PROBE_GC_LOCKED ();                        \
+       } while (0)
 #define TRYLOCK_GC (mono_mutex_trylock (&gc_mutex) == 0)
-#define UNLOCK_GC mono_mutex_unlock (&gc_mutex)
+#define UNLOCK_GC do {                                         \
+               mono_mutex_unlock (&gc_mutex);                  \
+               MONO_PROBE_GC_UNLOCKED ();                      \
+       } while (0)
 #define LOCK_INTERRUPTION mono_mutex_lock (&interruption_mutex)
 #define UNLOCK_INTERRUPTION mono_mutex_unlock (&interruption_mutex)
 
index 69fe38b390f6959a303bf6e644828a8f8b7a2d6b..17a0ebbc7dec2cb93b20164d3ef8572487367ec4 100644 (file)
 #define MONO_PROBE_GC_END_ENABLED()    MONO_GC_END_ENABLED ()
 
 
+#define MONO_PROBE_GC_LOCKED()         MONO_GC_LOCKED ()
+#define MONO_PROBE_GC_UNLOCKED()       MONO_GC_UNLOCKED ()
+
+
 #define MONO_PROBE_GC_HEAP_ALLOC(addr,size)    MONO_GC_HEAP_ALLOC ((addr), (size))
 #define MONO_PROBE_GC_HEAP_FREE(addr,size)     MONO_GC_HEAP_FREE ((addr), (size))
 
 #define MONO_PROBE_GC_END_ENABLED() (0)
 
 
+#define MONO_PROBE_GC_LOCKED()
+#define MONO_PROBE_GC_LOCKED_ENABLED() (0)
+
+#define MONO_PROBE_GC_UNLOCKED()
+#define MONO_PROBE_GC_UNLOCKED_ENABLED() (0)
+
+
 #define MONO_PROBE_GC_HEAP_ALLOC(addr,size)
 #define MONO_PROBE_GC_HEAP_FREE(addr,size)