Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRodrigo Kumpera <kumpera@gmail.com>2011-02-02 23:05:11 +0300
committerAndrew Jorgensen <ajorgensen@novell.com>2011-02-02 23:14:58 +0300
commitaaa43cdb8ab054b33c23ba2a16475d4108acc1f4 (patch)
tree3b838f22cd4b76d1de79f39ba41c4a1d6834734b
parent369a5deb182f08c980415b9009522fb1755249eb (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.c12
-rw-r--r--mono/metadata/object-internals.h3
-rw-r--r--mono/metadata/reflection.c17
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)