X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fgc.c;h=3e56e77a821782527dfb4c03ba07f5076dc0ffb2;hb=23fbdb66437357ec6d50f498ed8e88590cd89196;hp=e0f12d34b558cf3ad62cc353a2e91618c6377062;hpb=ef48103513b187a9d700d66988e7b6020a5a9d95;p=mono.git diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index e0f12d34b55..3e56e77a821 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -71,7 +71,7 @@ static MonoCoopCond exited_cond; static MonoInternalThread *gc_thread; -static void object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*)); +static void object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*), MonoError *error); static void reference_queue_proccess_all (void); static void mono_reference_queue_cleanup (void); @@ -108,6 +108,7 @@ static gboolean suspend_finalizers = FALSE; void mono_gc_run_finalize (void *obj, void *data) { + MonoError error; MonoObject *exc = NULL; MonoObject *o; #ifndef HAVE_SGEN_GC @@ -161,7 +162,8 @@ mono_gc_run_finalize (void *obj, void *data) #endif /* make sure the finalizer is not called again if the object is resurrected */ - object_register_finalizer ((MonoObject *)obj, NULL); + object_register_finalizer ((MonoObject *)obj, NULL, &error); + mono_error_assert_ok (&error); /* FIXME don't swallow the error */ if (log_finalizers) g_log ("mono-gc-finalizers", G_LOG_LEVEL_MESSAGE, "<%s at %p> Registered finalizer as processed.", o->vtable->klass->name, o); @@ -228,7 +230,7 @@ mono_gc_run_finalize (void *obj, void *data) } /* - * To avoid the locking plus the other overhead of mono_runtime_invoke (), + * To avoid the locking plus the other overhead of mono_runtime_invoke_checked (), * create and precompile a wrapper which calls the finalize method using * a CALLVIRT. */ @@ -236,14 +238,15 @@ mono_gc_run_finalize (void *obj, void *data) g_log ("mono-gc-finalizers", G_LOG_LEVEL_MESSAGE, "<%s at %p> Compiling finalizer.", o->vtable->klass->name, o); if (!domain->finalize_runtime_invoke) { - MonoMethod *invoke = mono_marshal_get_runtime_invoke (mono_class_get_method_from_name_flags (mono_defaults.object_class, "Finalize", 0, 0), TRUE, FALSE); + MonoMethod *invoke = mono_marshal_get_runtime_invoke (mono_class_get_method_from_name_flags (mono_defaults.object_class, "Finalize", 0, 0), TRUE); domain->finalize_runtime_invoke = mono_compile_method (invoke); } runtime_invoke = (RuntimeInvokeFunction)domain->finalize_runtime_invoke; - mono_runtime_class_init (o->vtable); + mono_runtime_class_init_full (o->vtable, &error); + mono_error_raise_exception (&error); /* FIXME don't raise here */ if (G_UNLIKELY (MONO_GC_FINALIZE_INVOKE_ENABLED ())) { MONO_GC_FINALIZE_INVOKE ((unsigned long)o, mono_object_get_size (o), @@ -267,12 +270,14 @@ mono_gc_run_finalize (void *obj, void *data) void mono_gc_finalize_threadpool_threads (void) { + MonoError error; while (threads_to_finalize) { MonoInternalThread *thread = (MonoInternalThread*) mono_mlist_get_data (threads_to_finalize); /* Force finalization of the thread. */ thread->threadpool_thread = FALSE; - mono_object_register_finalizer ((MonoObject*)thread); + mono_object_register_finalizer ((MonoObject*)thread, &error); + mono_error_assert_ok (&error); /* FIXME don't swallow the error */ mono_gc_run_finalize (thread, NULL); @@ -302,12 +307,16 @@ mono_gc_out_of_memory (size_t size) * since that, too, can cause the underlying pointer to be offset. */ static void -object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*)) +object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*), MonoError *error) { MonoDomain *domain; - if (obj == NULL) - mono_raise_exception (mono_get_exception_argument_null ("obj")); + mono_error_init (error); + + if (obj == NULL) { + mono_error_set_argument_null (error, "obj", ""); + return; + } domain = obj->vtable->domain; @@ -349,10 +358,10 @@ object_register_finalizer (MonoObject *obj, void (*callback)(void *, void*)) * */ void -mono_object_register_finalizer (MonoObject *obj) +mono_object_register_finalizer (MonoObject *obj, MonoError *error) { /* g_print ("Registered finalizer on %p %s.%s\n", obj, mono_object_class (obj)->name_space, mono_object_class (obj)->name); */ - object_register_finalizer (obj, mono_gc_run_finalize); + object_register_finalizer (obj, mono_gc_run_finalize, error); } /** @@ -470,14 +479,19 @@ ves_icall_System_GC_KeepAlive (MonoObject *obj) void ves_icall_System_GC_ReRegisterForFinalize (MonoObject *obj) { + MonoError error; + MONO_CHECK_ARG_NULL (obj,); - object_register_finalizer (obj, mono_gc_run_finalize); + object_register_finalizer (obj, mono_gc_run_finalize, &error); + mono_error_set_pending_exception (&error); } void ves_icall_System_GC_SuppressFinalize (MonoObject *obj) { + MonoError error; + MONO_CHECK_ARG_NULL (obj,); /* delegates have no finalizers, but we register them to deal with the @@ -491,7 +505,8 @@ ves_icall_System_GC_SuppressFinalize (MonoObject *obj) * generated for it that needs cleaned up, but user wants to suppress * their derived object finalizer. */ - object_register_finalizer (obj, NULL); + object_register_finalizer (obj, NULL, &error); + mono_error_set_pending_exception (&error); } void @@ -890,7 +905,7 @@ mono_gc_is_finalizer_internal_thread (MonoInternalThread *thread) * This routine tests whether the @thread argument represents the * finalization thread. * - * Returns true if @thread is the finalization thread. + * Returns: TRUE if @thread is the finalization thread. */ gboolean mono_gc_is_finalizer_thread (MonoThread *thread) @@ -914,15 +929,6 @@ mono_gc_get_mach_exception_thread (void) } #endif -#ifndef HAVE_SGEN_GC -void* -mono_gc_alloc_mature (MonoVTable *vtable) -{ - return mono_object_new_specific (vtable); -} -#endif - - static MonoReferenceQueue *ref_queues; static void @@ -1064,6 +1070,7 @@ mono_gc_reference_queue_new (mono_reference_queue_callback callback) gboolean mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *user_data) { + MonoError error; RefQueueEntry *entry; if (queue->should_be_deleted) return FALSE; @@ -1073,7 +1080,8 @@ mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *u entry->domain = mono_object_domain (obj); entry->gchandle = mono_gchandle_new_weakref (obj, TRUE); - mono_object_register_finalizer (obj); + mono_object_register_finalizer (obj, &error); + mono_error_assert_ok (&error); ref_list_push (&queue->queue, entry); return TRUE;