[sgen] Get the thread's domain via a callback, not via TLS.
authorMark Probst <mark.probst@gmail.com>
Wed, 5 Oct 2011 21:42:31 +0000 (23:42 +0200)
committerMark Probst <mark.probst@gmail.com>
Sun, 9 Oct 2011 09:15:30 +0000 (11:15 +0200)
mono/metadata/boehm-gc.c
mono/metadata/domain.c
mono/metadata/gc-internal.h
mono/metadata/null-gc.c
mono/metadata/sgen-gc.c
mono/metadata/sgen-os-win32.c

index 4c0996845362f740892cd58edf89c51a18ea9c8a..d7387ec7ba1e51531f85c4a2858865828ec111b2 100644 (file)
@@ -1175,6 +1175,11 @@ mono_gc_get_nursery (int *shift_bits, size_t *size)
        return NULL;
 }
 
+void
+mono_gc_set_current_thread_appdomain (MonoDomain *domain)
+{
+}
+
 gboolean
 mono_gc_precise_stack_mark_enabled (void)
 {
index a274b406c7601f31c37e241354f6fa0f31e7bc5e..efd8f02e4013978915049a529daa24f176a9b305 100644 (file)
@@ -57,12 +57,16 @@ MONO_FAST_TLS_DECLARE(tls_appdomain);
 #define SET_APPDOMAIN(x) do { \
        MONO_FAST_TLS_SET (tls_appdomain,x); \
        mono_native_tls_set_value (appdomain_thread_id, x); \
+       mono_gc_set_current_thread_appdomain (x); \
 } while (FALSE)
 
 #else /* !MONO_HAVE_FAST_TLS */
 
 #define GET_APPDOMAIN() ((MonoDomain *)mono_native_tls_get_value (appdomain_thread_id))
-#define SET_APPDOMAIN(x) mono_native_tls_set_value (appdomain_thread_id, x);
+#define SET_APPDOMAIN(x) do {                                          \
+               mono_native_tls_set_value (appdomain_thread_id, x);     \
+               mono_gc_set_current_thread_appdomain (x);               \
+       } while (FALSE)
 
 #endif
 
index 4ca9666e9333bea7907b2750faca742e9d8c4dff..90fcee5c9e0237361291928e6dd8e9d1e55a3e17 100644 (file)
@@ -319,6 +319,8 @@ guint8* mono_gc_get_card_table (int *shift_bits, gpointer *card_mask) MONO_INTER
 
 void* mono_gc_get_nursery (int *shift_bits, size_t *size) MONO_INTERNAL;
 
+void mono_gc_set_current_thread_appdomain (MonoDomain *domain) MONO_INTERNAL;
+
 /*
  * Return whenever GC is disabled
  */
index 8e2c52eadcb0bdc5438fa3d4bce671dc6dbb5919..750116c43fcb9a5b9229e1021ae95c8daf2a5131 100644 (file)
@@ -341,6 +341,11 @@ mono_gc_get_nursery (int *shift_bits, size_t *size)
        return NULL;
 }
 
+void
+mono_gc_set_current_thread_appdomain (MonoDomain *domain)
+{
+}
+
 gboolean
 mono_gc_precise_stack_mark_enabled (void)
 {
index 38c35409886dd068a35e4c984af4f70e08c99259..f7a3f3b773ea1aaad93e1e7a0d7b3d7eeb4ab206 100644 (file)
@@ -2231,6 +2231,14 @@ mono_gc_get_nursery (int *shift_bits, size_t *size)
        return nursery_start;
 }
 
+void
+mono_gc_set_current_thread_appdomain (MonoDomain *domain)
+{
+       SgenThreadInfo *info = mono_thread_info_current ();
+       g_assert (info);
+       info->stopped_domain = domain;
+}
+
 gboolean
 mono_gc_precise_stack_mark_enabled (void)
 {
index 7d38808ea6cab4bca7dc074cdb1ac497d74f45f6..c15dd1d3934575272c2970873d1c069985e69ae9 100644 (file)
@@ -55,7 +55,6 @@ mono_sgen_suspend_thread (SgenThreadInfo *info)
 
        CloseHandle (handle);
 
-       info->stopped_domain = NULL; /* FIXME: implement! */
        info->stopped_ip = (gpointer)context.Eip;
        info->stack_start = (char*)context.Esp - REDZONE_SIZE;