diff options
author | Rodrigo Kumpera <kumpera@gmail.com> | 2011-02-02 23:05:11 +0300 |
---|---|---|
committer | Andrew Jorgensen <ajorgensen@novell.com> | 2011-02-02 23:14:58 +0300 |
commit | aaa43cdb8ab054b33c23ba2a16475d4108acc1f4 (patch) | |
tree | 3b838f22cd4b76d1de79f39ba41c4a1d6834734b | |
parent | 369a5deb182f08c980415b9009522fb1755249eb (diff) |
Fix dynamic method cleanup at shutdown.moon/moon-2-0
* gc.c (mono_gc_cleanup): Cleanup all reference
queues after regular finalization.
* reflection.c: The dynamic method ref queue is finalized
by the runtime itself.
* runtime.c: Ditto.
-rw-r--r-- | mono/metadata/gc.c | 12 | ||||
-rw-r--r-- | mono/metadata/object-internals.h | 3 | ||||
-rw-r--r-- | mono/metadata/reflection.c | 17 |
3 files changed, 16 insertions, 16 deletions
diff --git a/mono/metadata/gc.c b/mono/metadata/gc.c index 81e784fcff5..fdad070881f 100644 --- a/mono/metadata/gc.c +++ b/mono/metadata/gc.c @@ -64,6 +64,7 @@ static void object_register_finalizer (MonoObject *obj, void (*callback)(void *, static void mono_gchandle_set_target (guint32 gchandle, MonoObject *obj); static void reference_queue_proccess_all (void); +static void mono_reference_queue_cleanup (void); #ifndef HAVE_NULL_GC static HANDLE pending_done_event; static HANDLE shutdown_event; @@ -1144,6 +1145,8 @@ mono_gc_cleanup (void) #endif } + mono_reference_queue_cleanup (); + DeleteCriticalSection (&handle_section); DeleteCriticalSection (&allocator_section); DeleteCriticalSection (&finalizer_mutex); @@ -1252,6 +1255,15 @@ restart: LeaveCriticalSection (&reference_queue_mutex); } +static void +mono_reference_queue_cleanup (void) +{ + MonoReferenceQueue *queue = ref_queues; + for (; queue; queue = queue->next) + queue->should_be_deleted = TRUE; + reference_queue_proccess_all (); +} + /** * mono_gc_reference_queue_new: * @callback callback used when processing dead entries. diff --git a/mono/metadata/object-internals.h b/mono/metadata/object-internals.h index d1f03deb048..6ef472d31be 100644 --- a/mono/metadata/object-internals.h +++ b/mono/metadata/object-internals.h @@ -1448,9 +1448,6 @@ mono_string_to_utf8_checked (MonoString *s, MonoError *error) MONO_INTERNAL; gboolean mono_class_is_reflection_method_or_constructor (MonoClass *class) MONO_INTERNAL; -void -mono_reflection_shutdown (void) MONO_INTERNAL; - #endif /* __MONO_OBJECT_INTERNALS_H__ */ diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c index 6e53b737a9e..5186f349a87 100644 --- a/mono/metadata/reflection.c +++ b/mono/metadata/reflection.c @@ -10970,20 +10970,11 @@ typedef struct { MonoMethod *handle; MonoDomain *domain; } DynamicMethodReleaseData; - -static MonoReferenceQueue *dynamic_method_queue; -void -mono_reflection_shutdown (void) -{ - MonoReferenceQueue *queue; - mono_loader_lock (); - queue = dynamic_method_queue; - dynamic_method_queue = NULL; - if (queue) - mono_gc_reference_queue_free (queue); - mono_loader_unlock (); -} +/* + * The runtime automatically clean up those after finalization. +*/ +static MonoReferenceQueue *dynamic_method_queue; static void free_dynamic_method (void *dynamic_method) |