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
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));
#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>
/* 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)
#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)