re PR libgcj/14751 ([win32] thread creation leaks system handle resources)
authorMohan Embar <gnustuff@thisiscool.com>
Sat, 11 Sep 2004 19:13:51 +0000 (19:13 +0000)
committerMohan Embar <membar@gcc.gnu.org>
Sat, 11 Sep 2004 19:13:51 +0000 (19:13 +0000)
PR libgcj/14751
* win32-threads.cc (_Jv_ThreadInitData): Zero out thread
handle in newly-allocated _Jv_Thread_t.
(_Jv_ThreadDestroyData): Close thread handle.
(_Jv_ThreadStart): Remove obsolete comment.
Store handle of newly-created thread in _Jv_Thread_t.
* include/win32-threads.h: #define WIN32_LEAN_AND_MEAN
before including <windows.h>
#define _Jv_HaveCondDestroy

From-SVN: r87362

libjava/ChangeLog
libjava/include/win32-threads.h
libjava/win32-threads.cc

index d3a6cea..cc796b1 100644 (file)
@@ -1,5 +1,17 @@
 2004-09-11  Mohan Embar  <gnustuff@thisiscool.com>
 
+       PR libgcj/14751
+       * win32-threads.cc (_Jv_ThreadInitData): Zero out thread
+       handle in newly-allocated _Jv_Thread_t.
+       (_Jv_ThreadDestroyData): Close thread handle.
+       (_Jv_ThreadStart): Remove obsolete comment.
+       Store handle of newly-created thread in _Jv_Thread_t.
+       * include/win32-threads.h: #define WIN32_LEAN_AND_MEAN
+       before including <windows.h>
+       #define _Jv_HaveCondDestroy
+
+2004-09-11  Mohan Embar  <gnustuff@thisiscool.com>
+
        * java/lang/natThread.cc (finalize_native): Destroy
        join conditional variable and mutex if these destroy
        operations are supported.
index fdd21c5..ba9def1 100644 (file)
@@ -13,6 +13,7 @@ details.  */
 #ifndef __JV_WIN32_THREADS__
 #define __JV_WIN32_THREADS__
 
+#define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 
 //
@@ -75,6 +76,7 @@ typedef void _Jv_ThreadStartFunc (java::lang::Thread *);
 // Condition variables.
 //
 
+#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);
 void _Jv_CondDestroy (_Jv_ConditionVariable_t *cv);
index 9e3981d..35a16cd 100644 (file)
@@ -262,6 +262,7 @@ _Jv_ThreadInitData (java::lang::Thread* obj)
 {
   _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;
   InitializeCriticalSection (&data->interrupt_mutex);
@@ -275,6 +276,7 @@ _Jv_ThreadDestroyData (_Jv_Thread_t *data)
   DeleteCriticalSection (&data->interrupt_mutex);
   if (data->interrupt_event)
     CloseHandle(data->interrupt_event);
+  CloseHandle(data->handle);
   _Jv_Free(data);
 }
 
@@ -365,7 +367,6 @@ _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data, _Jv_ThreadStart
     return;
   data->flags |= FLAG_START;
 
-  // FIXME: handle marking the info object for GC.
   info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter));
   info->method = meth;
   info->data = data;
@@ -379,7 +380,7 @@ _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data, _Jv_ThreadStart
   else
     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());
 }