Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Probst <mark.probst@gmail.com>2012-09-21 18:44:16 +0400
committerMark Probst <mark.probst@gmail.com>2012-09-29 01:18:16 +0400
commit977c5600c5d86302917414682f7b0e6675ed03bc (patch)
tree04cb07f3e90805b56030ebb2cd9150e11d68f934
parented5b41fd8daa1ed623790f3817da5e8be20120e0 (diff)
[dtrace] Probes for taking/releasing the GC lock.
-rw-r--r--data/mono.d3
-rw-r--r--mono/metadata/sgen-gc.c1
-rw-r--r--mono/metadata/sgen-gc.h11
-rw-r--r--mono/utils/dtrace.h11
4 files changed, 24 insertions, 2 deletions
diff --git a/data/mono.d b/data/mono.d
index 14591aa4838..a042a4a4fb3 100644
--- a/data/mono.d
+++ b/data/mono.d
@@ -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
diff --git a/mono/metadata/sgen-gc.c b/mono/metadata/sgen-gc.c
index 3621386c5d1..66e90ebc683 100644
--- a/mono/metadata/sgen-gc.c
+++ b/mono/metadata/sgen-gc.c
@@ -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));
diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h
index 502ebdc4df1..76b1ed0d973 100644
--- a/mono/metadata/sgen-gc.h
+++ b/mono/metadata/sgen-gc.h
@@ -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)
diff --git a/mono/utils/dtrace.h b/mono/utils/dtrace.h
index 69fe38b390f..17a0ebbc7de 100644
--- a/mono/utils/dtrace.h
+++ b/mono/utils/dtrace.h
@@ -46,6 +46,10 @@
#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))
@@ -73,6 +77,13 @@
#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)