Merge branch 'sgen-windows'
authorMark Probst <mark.probst@gmail.com>
Sun, 9 Oct 2011 13:01:12 +0000 (15:01 +0200)
committerMark Probst <mark.probst@gmail.com>
Sun, 9 Oct 2011 13:01:12 +0000 (15:01 +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
mono/utils/mono-mmap.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..181cfc97a5c0d672a3a7c8fd4a3049c2148928ac 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)
 {
@@ -4582,7 +4590,6 @@ mono_sgen_fill_thread_info_for_suspend (SgenThreadInfo *info)
  */
 //#define XDOMAIN_CHECKS_IN_WBARRIER
 
-#ifndef HOST_WIN32
 #ifndef SGEN_BINARY_PROTOCOL
 #ifndef HEAVY_STATISTICS
 #define MANAGED_ALLOCATION
@@ -4591,7 +4598,6 @@ mono_sgen_fill_thread_info_for_suspend (SgenThreadInfo *info)
 #endif
 #endif
 #endif
-#endif
 
 static gboolean
 is_ip_in_managed_allocator (MonoDomain *domain, gpointer ip);
@@ -6938,7 +6944,7 @@ enum {
  * CEE_MONO_TLS requires the tls offset, not the key, so the code below only works on darwin,
  * where the two are the same.
  */
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined (HOST_WIN32)
 #define EMIT_TLS_ACCESS(mb,member,dummy)       do {    \
        mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX);   \
        mono_mb_emit_byte ((mb), CEE_MONO_TLS);         \
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;
 
index 2d0e55302c05bf6b46f4edef5e14b5042a8f80a0..0b3aa083da7ee70b3578d16e4434b60f88a6eac8 100644 (file)
@@ -137,7 +137,13 @@ mono_valloc_aligned (size_t length, size_t alignment, int flags)
 int
 mono_vfree (void *addr, size_t length)
 {
-       int res = VirtualFree (addr, 0, MEM_RELEASE);
+       MEMORY_BASIC_INFORMATION mbi;
+       SIZE_T query_result = VirtualQuery (addr, &mbi, sizeof (mbi));
+       BOOL res;
+
+       g_assert (query_result);
+
+       res = VirtualFree (mbi.AllocationBase, 0, MEM_RELEASE);
 
        g_assert (res);