[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