1 /**
2  * \file
3  */
4 
5 #ifndef __MONO_METADATA_LOCK_TRACER_H__
6 #define __MONO_METADATA_LOCK_TRACER_H__
7 
8 /*This is a private header*/
9 #include <glib.h>
10 
11 #include "mono/utils/mono-os-mutex.h"
12 #include "mono/utils/mono-coop-mutex.h"
13 
14 G_BEGIN_DECLS
15 
16 typedef enum {
17 	InvalidLock = 0,
18 	LoaderLock,
19 	ImageDataLock,
20 	DomainLock,
21 	DomainAssembliesLock,
22 	DomainJitCodeHashLock,
23 	IcallLock,
24 	AssemblyBindingLock,
25 	MarshalLock,
26 	ClassesLock,
27 	LoaderGlobalDataLock,
28 	ThreadsLock,
29 } RuntimeLocks;
30 
31 #ifdef LOCK_TRACER
32 
33 void mono_locks_tracer_init (void);
34 
35 void mono_locks_lock_acquired (RuntimeLocks kind, gpointer lock);
36 void mono_locks_lock_released (RuntimeLocks kind, gpointer lock);
37 
38 #else
39 
40 #define mono_locks_tracer_init() do {} while (0)
41 
42 #define mono_locks_lock_acquired(__UNUSED0, __UNUSED1) do {} while (0)
43 #define mono_locks_lock_released(__UNUSED0, __UNUSED1) do {} while (0)
44 
45 #endif
46 
47 #define mono_locks_os_acquire(LOCK,NAME)	\
48 	do {	\
49 		mono_os_mutex_lock (LOCK);	\
50 		mono_locks_lock_acquired (NAME, LOCK);	\
51 	} while (0)
52 
53 #define mono_locks_os_release(LOCK,NAME)	\
54 	do {	\
55 		mono_locks_lock_released (NAME, LOCK);	\
56 		mono_os_mutex_unlock (LOCK);	\
57 	} while (0)
58 
59 #define mono_locks_coop_acquire(LOCK,NAME)	\
60 	do {	\
61 		mono_coop_mutex_lock (LOCK);	\
62 		mono_locks_lock_acquired (NAME, LOCK);	\
63 	} while (0)
64 
65 #define mono_locks_coop_release(LOCK,NAME)	\
66 	do {	\
67 		mono_locks_lock_released (NAME, LOCK);	\
68 		mono_coop_mutex_unlock (LOCK);	\
69 	} while (0)
70 
71 G_END_DECLS
72 
73 #endif /* __MONO_METADATA_LOCK_TRACER_H__ */
74