Merge pull request #654 from alesliehughes/master
[mono.git] / mono / metadata / gc.c
index 5b036f433839d194f0934941d1149789b272ffe3..7a46d49301de2653b0b4aace9ad1914371faaf00 100644 (file)
@@ -263,20 +263,14 @@ mono_gc_out_of_memory (size_t size)
 static void
 object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*))
 {
-#if HAVE_BOEHM_GC
-       guint offset = 0;
        MonoDomain *domain;
 
        if (obj == NULL)
                mono_raise_exception (mono_get_exception_argument_null ("obj"));
-       
-       domain = obj->vtable->domain;
 
-#ifndef GC_DEBUG
-       /* This assertion is not valid when GC_DEBUG is defined */
-       g_assert (GC_base (obj) == (char*)obj - offset);
-#endif
+       domain = obj->vtable->domain;
 
+#if HAVE_BOEHM_GC
        if (mono_domain_is_unloading (domain) && (callback != NULL))
                /*
                 * Can't register finalizers in a dying appdomain, since they
@@ -293,17 +287,14 @@ object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*))
 
        mono_domain_finalizers_unlock (domain);
 
-       GC_REGISTER_FINALIZER_NO_ORDER ((char*)obj - offset, callback, GUINT_TO_POINTER (offset), NULL, NULL);
+       mono_gc_register_for_finalization (obj, callback);
 #elif defined(HAVE_SGEN_GC)
-       if (obj == NULL)
-               mono_raise_exception (mono_get_exception_argument_null ("obj"));
-
        /*
         * If we register finalizers for domains that are unloading we might
         * end up running them while or after the domain is being cleared, so
         * the objects will not be valid anymore.
         */
-       if (!mono_domain_is_unloading (obj->vtable->domain))
+       if (!mono_domain_is_unloading (domain))
                mono_gc_register_for_finalization (obj, callback);
 #endif
 }
@@ -342,6 +333,10 @@ mono_domain_finalize (MonoDomain *domain, guint32 timeout)
        HANDLE done_event;
        MonoInternalThread *thread = mono_thread_internal_current ();
 
+#if defined(__native_client__)
+       return FALSE;
+#endif
+
        if (mono_thread_internal_current () == gc_thread)
                /* We are called from inside a finalizer, not much we can do here */
                return FALSE;
@@ -1461,14 +1456,10 @@ reference_queue_clear_for_domain (MonoDomain *domain)
                RefQueueEntry **iter = &queue->queue;
                RefQueueEntry *entry;
                while ((entry = *iter)) {
-                       MonoObject *obj;
+                       if (entry->domain == domain) {
 #ifdef HAVE_SGEN_GC
-                       obj = mono_gc_weak_link_get (&entry->dis_link);
-                       if (obj && mono_object_domain (obj) == domain) {
                                mono_gc_weak_link_remove (&entry->dis_link, TRUE);
 #else
-                       obj = mono_gchandle_get_target (entry->gchandle);
-                       if (obj && mono_object_domain (obj) == domain) {
                                mono_gchandle_free ((guint32)entry->gchandle);
 #endif
                                ref_list_remove_element (iter, entry);
@@ -1528,6 +1519,7 @@ mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *u
 
        entry = g_new0 (RefQueueEntry, 1);
        entry->user_data = user_data;
+       entry->domain = mono_object_domain (obj);
 
 #ifdef HAVE_SGEN_GC
        mono_gc_weak_link_add (&entry->dis_link, obj, TRUE);