[Mono-bugs] [Bug 78739][Nor] New - leaking tls data
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Fri Jun 30 09:48:19 EDT 2006
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by joe at otee.dk.
http://bugzilla.ximian.com/show_bug.cgi?id=78739
--- shadow/78739 2006-06-30 09:48:19.000000000 -0400
+++ shadow/78739.tmp.16786 2006-06-30 09:48:19.000000000 -0400
@@ -0,0 +1,336 @@
+Bug#: 78739
+Product: Mono: Runtime
+Version: 1.1
+OS: All
+OS Details:
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: JIT
+AssignedTo: lupus at ximian.com
+ReportedBy: joe at otee.dk
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: leaking tls data
+
+Mono is leaking tls data when calling mini_cleanup.
+
+Here is a patch to fix it.
+
+
+
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/critical-sections.c mono-
+patch_unity/mono/io-layer/critical-sections.c
+--- mono/mono/io-layer/critical-sections.c 2005-04-12 19:21:43.000000000 +0200
++++ mono-patch_unity/mono/io-layer/critical-sections.c 2006-06-12
+05:40:39.000000000 +0200
+@@ -40,6 +40,15 @@
+ g_assert (ret == 0);
+ }
+
++
++void critical_section_attr_cleanup(void)
++{
++ pthread_mutexattr_destroy(&attr);
++}
++
++
++int gCounter = 0;
++
+ /**
+ * InitializeCriticalSection:
+ * @section: The critical section to initialise
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/critical-sections.h mono-
+patch_unity/mono/io-layer/critical-sections.h
+--- mono/mono/io-layer/critical-sections.h 2005-06-09 19:45:32.000000000 +0200
++++ mono-patch_unity/mono/io-layer/critical-sections.h 2006-06-12
+05:41:02.000000000 +0200
+@@ -25,6 +25,9 @@
+ mono_mutex_t mutex;
+ };
+
++extern void critical_section_attr_cleanup(void);
++
++
+ extern void InitializeCriticalSection(WapiCriticalSection *section);
+ extern gboolean InitializeCriticalSectionAndSpinCount(WapiCriticalSection *section, guint32
+spincount);
+ extern void DeleteCriticalSection(WapiCriticalSection *section);
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/error.c mono-patch_unity/
+mono/io-layer/error.c
+--- mono/mono/io-layer/error.c 2005-10-11 15:21:43.000000000 +0200
++++ mono-patch_unity/mono/io-layer/error.c 2006-06-12 05:41:11.000000000 +0200
+@@ -46,6 +46,11 @@
+ return(err);
+ }
+
++void clenup_iolayer_error (void)
++{
++ pthread_key_delete(error_key);
++}
++
+ /**
+ * SetLastError:
+ * @code: The error code.
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/error.h mono-
+patch_unity/mono/io-layer/error.h
+--- mono/mono/io-layer/error.h 2004-12-11 01:05:11.000000000 +0100
++++ mono-patch_unity/mono/io-layer/error.h 2006-06-12 05:41:21.000000000 +0200
+@@ -1801,6 +1801,7 @@
+ void SetLastError (guint32 code);
+ guint32 errno_to_WSA (guint32 code, const char *function_name);
+ gint _wapi_get_win32_file_error (gint err);
++void clenup_iolayer_error (void);
+
+ G_END_DECLS
+
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/handles.c mono-
+patch_unity/mono/io-layer/handles.c
+--- mono/mono/io-layer/handles.c 2006-05-24 23:34:06.000000000 +0200
++++ mono-patch_unity/mono/io-layer/handles.c 2006-06-12 05:41:26.000000000 +0200
+@@ -167,6 +167,9 @@
+ }
+
+ _wapi_shm_semaphores_remove ();
++
++ mono_mutex_destroy(&_wapi_global_signal_mutex);
++ pthread_cond_destroy(&_wapi_global_signal_cond);
+ }
+
+ static mono_once_t shared_init_once = MONO_ONCE_INIT;
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/threads.c mono-
+patch_unity/mono/io-layer/threads.c
+--- mono/mono/io-layer/threads.c 2006-05-24 23:34:06.000000000 +0200
++++ mono-patch_unity/mono/io-layer/threads.c 2006-06-12 05:41:54.000000000 +0200
+@@ -201,6 +201,12 @@
+ g_assert (thr_ret == 0);
+ }
+
++void thread_hash_cleanup(void)
++{
++ pthread_key_delete(thread_attached_key);
++ pthread_key_delete(thread_hash_key);
++}
++
+ static void _wapi_thread_suspend (struct _WapiHandle_thread *thread)
+ {
+ g_assert (thread->owner_pid == _wapi_getpid ());
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/io-layer/threads.h mono-
+patch_unity/mono/io-layer/threads.h
+--- mono/mono/io-layer/threads.h 2006-05-24 23:34:06.000000000 +0200
++++ mono-patch_unity/mono/io-layer/threads.h 2006-06-12 05:42:04.000000000 +0200
+@@ -65,5 +65,7 @@
+ */
+ extern void _wapi_thread_signal_self (guint32 exitstatus);
+
++extern void thread_hash_cleanup(void);
++
+ G_END_DECLS
+ #endif /* _WAPI_THREADS_H_ */
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/appdomain.c mono-
+patch_unity/mono/metadata/appdomain.c
+--- mono/mono/metadata/appdomain.c 2006-06-06 15:29:04.000000000 +0200
++++ mono-patch_unity/mono/metadata/appdomain.c 2006-06-12 05:42:32.000000000
++0200
+@@ -28,6 +28,7 @@
+ #include <mono/metadata/marshal.h>
+ #include <mono/metadata/monitor.h>
+ #include <mono/metadata/threadpool.h>
++#include <mono/metadata/mono-debug.h>
+ #include <mono/utils/mono-uri.h>
+ #include <mono/utils/mono-logger.h>
+
+@@ -206,6 +207,12 @@
+ mono_network_cleanup ();
+
+ mono_marshal_cleanup ();
++
++ mono_type_initialization_cleanup ();
++
++ mono_thread_pool_global_cleanup();
++
++ mono_monitor_cleanup ();
+ }
+
+ static MonoDomainFunc quit_function = NULL;
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/domain.c mono-
+patch_unity/mono/metadata/domain.c
+--- mono/mono/metadata/domain.c 2006-06-06 15:29:04.000000000 +0200
++++ mono-patch_unity/mono/metadata/domain.c 2006-06-12 05:43:19.000000000 +0200
+@@ -879,6 +881,10 @@
+ mono_images_cleanup ();
+ mono_raw_buffer_cleanup ();
+ mono_metadata_cleanup ();
++
++ TlsFree(appdomain_thread_id);
++ DeleteCriticalSection (&appdomains_mutex);
++
+ }
+
+ /**
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/gc.c mono-patch_unity/
+mono/metadata/gc.c
+--- mono/mono/metadata/gc.c 2006-05-23 12:39:48.000000000 +0200
++++ mono-patch_unity/mono/metadata/gc.c 2006-06-12 05:43:36.000000000 +0200
+@@ -843,6 +844,7 @@
+ /* MS seems to wait for about 2 seconds */
+ if (WaitForSingleObjectEx (shutdown_event, 2000, FALSE) == WAIT_TIMEOUT) {
+ mono_thread_stop (gc_thread);
++ mono_thread_detach(gc_thread);
+ }
+ }
+ gc_thread = NULL;
+@@ -852,6 +854,10 @@
+ }
+
+ #endif
++
++ DeleteCriticalSection (&handle_section);
++ DeleteCriticalSection (&allocator_section);
++ DeleteCriticalSection (&finalizer_mutex);
+ }
+
+ #else
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/monitor.c mono-
+patch_unity/mono/metadata/monitor.c
+--- mono/mono/metadata/monitor.c 2006-03-16 17:18:43.000000000 +0100
++++ mono-patch_unity/mono/metadata/monitor.c 2006-06-12 05:43:45.000000000 +0200
+@@ -85,6 +85,12 @@
+ InitializeCriticalSection (&monitor_mutex);
+ }
+
++void
++mono_monitor_cleanup (void)
++{
++ DeleteCriticalSection (&monitor_mutex);
++}
++
+ /* LOCKING: this is called with monitor_mutex held */
+ static void
+ mon_finalize (MonoThreadsSync *mon)
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/monitor.h mono-
+patch_unity/mono/metadata/monitor.h
+--- mono/mono/metadata/monitor.h 2005-06-09 19:45:32.000000000 +0200
++++ mono-patch_unity/mono/metadata/monitor.h 2006-06-12 05:43:48.000000000 +0200
+@@ -16,6 +16,7 @@
+ G_BEGIN_DECLS
+
+ void mono_monitor_init (void);
++void mono_monitor_cleanup (void);
+
+ extern gboolean ves_icall_System_Threading_Monitor_Monitor_try_enter(MonoObject *obj,
+guint32 ms);
+ extern void ves_icall_System_Threading_Monitor_Monitor_exit(MonoObject *obj);
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/object.c mono-
+patch_unity/mono/metadata/object.c
+--- mono/mono/metadata/object.c 2006-05-31 19:16:47.000000000 +0200
++++ mono-patch_unity/mono/metadata/object.c 2006-06-12 05:43:55.000000000 +0200
+@@ -173,6 +173,15 @@
+ InitializeCriticalSection (&ldstr_section);
+ }
+
++void
++mono_type_initialization_cleanup (void)
++{
++ DeleteCriticalSection (&type_initialization_section);
++ DeleteCriticalSection (&ldstr_section);
++}
++
++
++
+ /*
+ * mono_runtime_class_init:
+ * @vtable: vtable that needs to be initialized
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/rawbuffer.h mono-
+patch_unity/mono/metadata/rawbuffer.h
+--- mono/mono/metadata/rawbuffer.h 2006-05-04 20:05:59.000000000 +0200
++++ mono-patch_unity/mono/metadata/rawbuffer.h 2006-06-12 05:31:15.000000000
++0200
+@@ -13,4 +13,6 @@
+ void mono_raw_buffer_handle_pagefault (void *ptr);
+ guint32 mono_raw_buffer_get_n_pagefaults (void);
+
++void *mono_raw_buffer_load_malloc (int fd, int is_writable, guint32 base, size_t size);
++
+ #endif /* __MONO_RAWBUFFER_H__ */
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/threadpool.c mono-
+patch_unity/mono/metadata/threadpool.c
+--- mono/mono/metadata/threadpool.c 2006-06-01 20:57:18.000000000 +0200
++++ mono-patch_unity/mono/metadata/threadpool.c 2006-06-12 05:43:59.000000000
++0200
+@@ -976,6 +976,13 @@
+ g_assert (async_call_klass);
+ }
+
++void mono_thread_pool_global_cleanup ()
++{
++ DeleteCriticalSection (&socket_io_data.io_lock);
++ DeleteCriticalSection (&ares_lock);
++}
++
++
+ MonoAsyncResult *
+ mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg, MonoDelegate
+*async_callback,
+ MonoObject *state)
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/threadpool.h mono-
+patch_unity/mono/metadata/threadpool.h
+--- mono/mono/metadata/threadpool.h 2005-04-12 16:18:13.000000000 +0200
++++ mono-patch_unity/mono/metadata/threadpool.h 2006-06-12 05:44:05.000000000
++0200
+@@ -6,6 +6,7 @@
+
+ /* No managed code here */
+ void mono_thread_pool_init (void);
++void mono_thread_pool_global_cleanup (void);
+
+ MonoAsyncResult *
+ mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg,
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/metadata/threads.c mono-
+patch_unity/mono/metadata/threads.c
+--- mono/mono/metadata/threads.c 2006-05-25 18:12:30.000000000 +0200
++++ mono-patch_unity/mono/metadata/threads.c 2006-06-12 05:44:11.000000000 +0200
+@@ -1814,6 +1814,8 @@
+ DeleteCriticalSection (&contexts_mutex);
+ CloseHandle (background_change_event);
+ #endif
++
++ TlsFree(current_object_key);
+ }
+
+ void
+diff -Naur --exclude .DS_Store --exclude '*.rej' mono/mono/mini/mini.c mono-patch_unity/
+mono/mini/mini.c
+--- mono/mono/mini/mini.c 2006-06-08 22:49:05.000000000 +0200
++++ mono-patch_unity/mono/mini/mini.c 2006-06-12 05:44:36.000000000 +0200
+@@ -11122,6 +11181,7 @@
+ /* This accesses metadata so needs to be called before runtime shutdown */
+ print_jit_stats ();
+
++
+ mono_runtime_cleanup (domain);
+
+ mono_profiler_shutdown ();
+@@ -11147,6 +11207,19 @@
+ mono_trace_cleanup ();
+
+ mono_counters_dump (-1, stdout);
++
++ thread_hash_cleanup();
++ clenup_iolayer_error();
++
++ TlsFree(mono_jit_tls_id);
++
++ DeleteCriticalSection (&jit_mutex);
++
++ critical_section_attr_cleanup();
++
++ mono_thread_pool_cleanup();
++
++ DeleteCriticalSection (&mono_delegate_section);
+ }
+
+ void
More information about the mono-bugs
mailing list