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
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
}
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;
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);
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);