GC Problems...
Mohan Embar
gnustuff@thisiscool.com
Wed Sep 8 13:28:00 GMT 2004
Hi All,
>>The problem exists in both the COM environment we're running under, and the
>>simple test case application I'm attaching here, there appears to be a memory
>>leak.
>>>There is a known leak with thread creation on win32. I'm not sure if it
>applies to JvAttachCurrentThread(), but its possible. See
>http://gcc.gnu.org/PR14751
>>I heard Mohan was testing a fix for this, but I'm not sure what the
>status is now. I suggest attaching the thread just once instead of
>continuously attaching and detaching it.
I don't pretend to know the entire history of this, but from what I can
interpret from this post, JvAttachCurrentThread is supposed to avoid the
leakage of the 24 bytes from what I read here:
- http://gcc.gnu.org/ml/java/2002-03/msg00082.html
- http://gcc.gnu.org/ml/java/2002-03/msg00144.html
As for this:
http://gcc.gnu.org/PR14751
...I initially I thought I had a good handle (no pun intended) on the
problem, but walked away because it needed further investigation and
I got distracted by other things. Note that the issue in the PR relates
to leakage of OS handles, not memory (although the two issues probably
go hand in hand).
I took another swing at PR14751 last night and this is what I came
up with. It seems to fix both PR14751 as well as Simon's GCTest troubles.
I'll submit an official patch after I build and test the world. I'll
probably do this with a cvs -D 2004年09月01日 because I'm kind of scared
to get and build HEAD, unless someone has recently successfully gotten
and built it. I feel comfortable doing this because the non-Win32 portion
of this patch could probably be committed as obvious....
-- Mohan
http://www.thisiscool.com/
http://www.animalsong.org/
Index: win32-threads.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/win32-threads.cc,v
retrieving revision 1.11
diff -u -2 -r1.11 win32-threads.cc
--- win32-threads.cc 31 Oct 2003 03:36:38 -0000 1.11
+++ win32-threads.cc 8 Sep 2004 13:13:05 -0000
@@ -263,4 +263,5 @@
_Jv_Thread_t *data = (_Jv_Thread_t*)_Jv_Malloc(sizeof(_Jv_Thread_t));
data->flags = 0;
+ data->handle = 0;
data->thread_obj = obj;
data->interrupt_event = 0;
@@ -276,4 +277,5 @@
if (data->interrupt_event)
CloseHandle(data->interrupt_event);
+ CloseHandle(data->handle);
_Jv_Free(data);
}
@@ -366,5 +368,4 @@
data->flags |= FLAG_START;
- // FIXME: handle marking the info object for GC.
info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter));
info->method = meth;
@@ -380,5 +381,5 @@
data->flags |= FLAG_DAEMON;
- GC_CreateThread(NULL, 0, really_start, info, 0, &id);
+ data->handle = GC_CreateThread(NULL, 0, really_start, info, 0, &id);
_Jv_ThreadSetPriority(data, thread->getPriority());
}
Index: include/win32-threads.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/win32-threads.h,v
retrieving revision 1.9
diff -u -2 -r1.9 win32-threads.h
--- include/win32-threads.h 21 Oct 2003 04:46:19 -0000 1.9
+++ include/win32-threads.h 8 Sep 2004 13:13:07 -0000
@@ -14,4 +14,5 @@
#define __JV_WIN32_THREADS__
+#define WIN32_LEAN_AND_MEAN
#include <windows.h>
@@ -76,4 +77,5 @@
//
+#define _Jv_HaveCondDestroy
int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint nanos);
void _Jv_CondInit (_Jv_ConditionVariable_t *cv);
Index: java/lang/natThread.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natThread.cc,v
retrieving revision 1.27
diff -u -2 -r1.27 natThread.cc
--- java/lang/natThread.cc 28 May 2004 18:53:04 -0000 1.27
+++ java/lang/natThread.cc 8 Sep 2004 13:13:09 -0000
@@ -79,4 +79,10 @@
natThread *nt = (natThread *) ptr;
_Jv_ThreadDestroyData (nt->thread);
+#ifdef _Jv_HaveCondDestroy
+ _Jv_CondDestroy (&nt->join_cond);
+#endif
+#ifdef _Jv_HaveMutexDestroy
+ _Jv_MutexDestroy (&nt->join_mutex);
+#endif
}
More information about the Java
mailing list