X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fboehm-gc.c;h=acbd4eae4b0735bdaef0564e5f2225c780bddddf;hb=a08574bf9e4f27e3187a3f6edf7d99d32c28ad6c;hp=f9ea588a30e2b7636e6ce48cdb5355bf1a21e692;hpb=45d90b20b7fb92adbeaf9a711cade5489ebeee42;p=mono.git diff --git a/mono/metadata/boehm-gc.c b/mono/metadata/boehm-gc.c index f9ea588a30e..acbd4eae4b0 100644 --- a/mono/metadata/boehm-gc.c +++ b/mono/metadata/boehm-gc.c @@ -56,12 +56,6 @@ void *pthread_get_stackaddr_np(pthread_t); static gboolean gc_initialized = FALSE; static mono_mutex_t mono_gc_lock; -static void* -boehm_thread_register (MonoThreadInfo* info, void *baseptr); -static void -boehm_thread_unregister (MonoThreadInfo *p); -static void -boehm_thread_detach (MonoThreadInfo *p); static void register_test_toggleref_callback (void); @@ -108,9 +102,7 @@ static void on_gc_heap_resize (size_t new_size); void mono_gc_base_init (void) { - MonoThreadInfoCallbacks cb; const char *env; - int dummy; if (gc_initialized) return; @@ -129,7 +121,7 @@ mono_gc_base_init (void) * we used to do this only when running on valgrind, * but it happens also in other setups. */ -#if defined(HAVE_PTHREAD_GETATTR_NP) && defined(HAVE_PTHREAD_ATTR_GETSTACK) && !defined(__native_client__) +#if defined(HAVE_PTHREAD_GETATTR_NP) && defined(HAVE_PTHREAD_ATTR_GETSTACK) { size_t size; void *sstart; @@ -138,12 +130,6 @@ mono_gc_base_init (void) pthread_attr_getstack (&attr, &sstart, &size); pthread_attr_destroy (&attr); /*g_print ("stackbottom pth is: %p\n", (char*)sstart + size);*/ -#ifdef __ia64__ - /* - * The calculation above doesn't seem to work on ia64, also we need to set - * GC_register_stackbottom as well, but don't know how. - */ -#else /* apparently with some linuxthreads implementations sstart can be NULL, * fallback to the more imprecise method (bug# 78096). */ @@ -156,7 +142,6 @@ mono_gc_base_init (void) stack_bottom &= ~4095; GC_stackbottom = (char*)stack_bottom; } -#endif } #elif defined(HAVE_PTHREAD_GET_STACKSIZE_NP) && defined(HAVE_PTHREAD_GET_STACKADDR_NP) GC_stackbottom = (char*)pthread_get_stackaddr_np (pthread_self ()); @@ -171,8 +156,6 @@ mono_gc_base_init (void) GC_stackbottom = (char*)ss.ss_sp; } -#elif defined(__native_client__) - /* Do nothing, GC_stackbottom is set correctly in libgc */ #else { int dummy; @@ -247,17 +230,12 @@ mono_gc_base_init (void) g_strfreev (opts); } - memset (&cb, 0, sizeof (cb)); - cb.thread_register = boehm_thread_register; - cb.thread_unregister = boehm_thread_unregister; - cb.thread_detach = boehm_thread_detach; - cb.mono_method_is_critical = (gboolean (*)(void *))mono_runtime_is_critical_method; - - mono_threads_init (&cb, sizeof (MonoThreadInfo)); + mono_thread_callbacks_init (); + mono_thread_info_init (sizeof (MonoThreadInfo)); mono_os_mutex_init (&mono_gc_lock); mono_os_mutex_init_recursive (&handle_section); - mono_thread_info_attach (&dummy); + mono_thread_info_attach (); GC_set_on_collection_event (on_gc_notification); GC_on_heap_resize = on_gc_heap_resize; @@ -385,20 +363,14 @@ mono_gc_is_gc_thread (void) return GC_thread_is_registered (); } -gboolean -mono_gc_register_thread (void *baseptr) -{ - return mono_thread_info_attach (baseptr) != NULL; -} - -static void* -boehm_thread_register (MonoThreadInfo* info, void *baseptr) +gpointer +mono_gc_thread_attach (MonoThreadInfo* info) { struct GC_stack_base sb; int res; /* TODO: use GC_get_stack_base instead of baseptr. */ - sb.mem_base = baseptr; + sb.mem_base = info->stack_end; res = GC_register_my_thread (&sb); if (res == GC_UNIMPLEMENTED) return NULL; /* Cannot happen with GC v7+. */ @@ -408,8 +380,8 @@ boehm_thread_register (MonoThreadInfo* info, void *baseptr) return info; } -static void -boehm_thread_unregister (MonoThreadInfo *p) +void +mono_gc_thread_detach_with_lock (MonoThreadInfo *p) { MonoNativeThreadId tid; @@ -417,13 +389,14 @@ boehm_thread_unregister (MonoThreadInfo *p) if (p->runtime_thread) mono_threads_add_joinable_thread ((gpointer)tid); + + mono_handle_stack_free (p->handle_stack); } -static void -boehm_thread_detach (MonoThreadInfo *p) +gboolean +mono_gc_thread_in_critical_region (MonoThreadInfo *info) { - if (mono_thread_internal_current_is_attached ()) - mono_thread_detach_internal (mono_thread_internal_current ()); + return FALSE; } gboolean