Add mono_gc_thread_detach callback. (mono/mono#18408)
authorJonathan Chambers <joncham@gmail.com>
Tue, 14 Jan 2020 11:56:09 +0000 (06:56 -0500)
committermonojenkins <jo.shields+jenkins@xamarin.com>
Tue, 14 Jan 2020 11:56:09 +0000 (12:56 +0100)
Add mono_gc_thread_detach callback for Boehm

Use under Boehm to detach without threads lock as Boehm will take it's own lock internally.

Note in `on_gc_notification` we take threads lock after Boehm already has it's own lock. For consistency and to prevent deadlocks always take lock ordering of Boehm then threads lock.

Commit migrated from https://github.com/mono/mono/commit/480bef72172856bd0f1a57243ddb53e98684f7d1

src/mono/mono/metadata/boehm-gc.c
src/mono/mono/metadata/gc-internals.h
src/mono/mono/metadata/null-gc.c
src/mono/mono/metadata/sgen-mono.c
src/mono/mono/metadata/threads.c

index 2e3a743..1f9fa2c 100644 (file)
@@ -355,6 +355,18 @@ mono_gc_thread_attach (MonoThreadInfo* info)
 }
 
 void
+mono_gc_thread_detach (MonoThreadInfo *p)
+{
+       /* Detach without threads lock as Boehm
+        * will take it's own lock internally. Note in
+        * on_gc_notification we take threads lock after
+        * Boehm already has it's own lock. For consistency
+        * always take lock ordering of Boehm then threads.
+        */
+       GC_unregister_my_thread ();
+}
+
+void
 mono_gc_thread_detach_with_lock (MonoThreadInfo *p)
 {
        MonoNativeThreadId tid;
index fcd57e7..eca830c 100644 (file)
@@ -404,6 +404,9 @@ G_EXTERN_C // due to THREAD_INFO_TYPE varying
 gpointer mono_gc_thread_attach (THREAD_INFO_TYPE *info);
 
 G_EXTERN_C // due to THREAD_INFO_TYPE varying
+void mono_gc_thread_detach (THREAD_INFO_TYPE *info);
+
+G_EXTERN_C // due to THREAD_INFO_TYPE varying
 void mono_gc_thread_detach_with_lock (THREAD_INFO_TYPE *info);
 
 G_EXTERN_C // due to THREAD_INFO_TYPE varying
index 47477fc..52f7101 100644 (file)
@@ -315,6 +315,11 @@ mono_gc_thread_attach (MonoThreadInfo* info)
 }
 
 void
+mono_gc_thread_detach (MonoThreadInfo *p)
+{
+}
+
+void
 mono_gc_thread_detach_with_lock (MonoThreadInfo *p)
 {
        mono_handle_stack_free (p->handle_stack);
index ae37cce..c1c86b4 100644 (file)
@@ -2153,6 +2153,11 @@ sgen_client_thread_attach (SgenThreadInfo* info)
 }
 
 void
+mono_gc_thread_detach (SgenThreadInfo *info)
+{
+}
+
+void
 mono_gc_thread_detach_with_lock (SgenThreadInfo *info)
 {
        return sgen_thread_detach_with_lock (info);
index 4380f2b..213aca9 100644 (file)
@@ -3386,6 +3386,8 @@ thread_detach (MonoThreadInfo *info)
        g_assert (internal);
 
        mono_thread_detach_internal (internal);
+
+       mono_gc_thread_detach (info);
 }
 
 static void