Merge pull request #755 from ondrejmyska/master
[mono.git] / mono / utils / mono-threads.h
index b30e9ac4c16716c201ce2cb1bf853b177014cadc..0004e55c967954e437d6fcda1ec5e020bee49212 100644 (file)
@@ -99,8 +99,8 @@ typedef struct {
        /*Tells if this thread was created by the runtime or not.*/
        gboolean runtime_thread;
 
-       /* suspend machinery, fields protected by the suspend_lock */
-       mono_mutex_t suspend_lock;
+       /* suspend machinery, fields protected by suspend_semaphore */
+       MonoSemType suspend_semaphore;
        int suspend_count;
 
        MonoSemType finish_resume_semaphore;
@@ -108,7 +108,7 @@ typedef struct {
 
        /* only needed by the posix backend */ 
 #if (defined(_POSIX_VERSION) || defined(__native_client__)) && !defined (__MACH__)
-       MonoSemType suspend_semaphore;
+       MonoSemType begin_suspend_semaphore;
        gboolean syscall_break_signal;
        gboolean suspend_can_continue;
 #endif
@@ -119,6 +119,13 @@ typedef struct {
        /*async call machinery, thread MUST be suspended before accessing those fields*/
        void (*async_target)(void*);
        void *user_data;
+
+       /*
+       If true, this thread is running a critical region of code and cannot be suspended.
+       A critical session is implicitly started when you call mono_thread_info_safe_suspend_sync
+       and is ended when you call either mono_thread_info_resume or mono_thread_info_finish_suspend.
+       */
+       gboolean inside_critical_region;
 } MonoThreadInfo;
 
 typedef struct {
@@ -199,6 +206,9 @@ mono_thread_info_safe_suspend_sync (MonoNativeThreadId tid, gboolean interrupt_k
 gboolean
 mono_thread_info_resume (MonoNativeThreadId tid) MONO_INTERNAL;
 
+void
+mono_thread_info_finish_suspend (void) MONO_INTERNAL;
+
 void
 mono_thread_info_self_suspend (void) MONO_INTERNAL;