2002-02-01 Adam Megacz <adam@xwt.org>
authormegacz <megacz@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Feb 2002 04:27:34 +0000 (04:27 +0000)
committermegacz <megacz@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 2 Feb 2002 04:27:34 +0000 (04:27 +0000)
        * include/win32-threads.h (_Jv_ConditionVariable_t): Now a struct, to
enable safer wait() algorithm.
(_Jv_CondWait, _Jv_CondInit, _Jv_CondDestroy, _Jv_CondNotify,
_Jv_CondNotifyAll): Implementations moved to win32-threads.cc.
(_Jv_MutexInit, _Jv_HaveMutexDestroy, _Jv_MutexUnlock,
_Jv_MutexLock, _Jv_ThreadYield): Reimplement using CRITICAL_SECTIONs
instead of mutex.
(_Jv_ThreadYield): Don't call Sleep(), because it crashes win98.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@49427 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 59abe22..5303f43 100644 (file)
@@ -1,5 +1,16 @@
 2002-02-01  Adam Megacz <adam@xwt.org>
 
+        * include/win32-threads.h (_Jv_ConditionVariable_t): Now a struct, to
+       enable safer wait() algorithm.
+       (_Jv_CondWait, _Jv_CondInit, _Jv_CondDestroy, _Jv_CondNotify,
+       _Jv_CondNotifyAll): Implementations moved to win32-threads.cc.
+       (_Jv_MutexInit, _Jv_HaveMutexDestroy, _Jv_MutexUnlock,
+       _Jv_MutexLock, _Jv_ThreadYield): Reimplement using CRITICAL_SECTIONs
+       instead of mutex.
+       (_Jv_ThreadYield): Don't call Sleep(), because it crashes win98.
+
+2002-02-01  Adam Megacz <adam@xwt.org>
+
        * configure.in: Added support for mingw.
        * java/lang/Win32Process.java: Created as empty file.
        * java/lang/natWin32Process.cc: Created as empty file.
index a646632..21fdd0e 100644 (file)
@@ -18,8 +18,13 @@ details.  */
 // Typedefs.
 //
 
-typedef HANDLE _Jv_ConditionVariable_t;
-typedef HANDLE _Jv_Mutex_t;
+typedef struct _Jv_ConditionVariable_t {
+  HANDLE ev[2];
+  CRITICAL_SECTION count_mutex;
+  int blocked_count;
+};
+
+typedef CRITICAL_SECTION _Jv_Mutex_t;
 
 typedef struct
 {
@@ -34,63 +39,39 @@ typedef void _Jv_ThreadStartFunc (java::lang::Thread *);
 // Condition variables.
 //
 
-inline void
-_Jv_CondInit (_Jv_ConditionVariable_t *cv)
-{
-  *cv = CreateEvent (NULL, 0, 0, NULL);
-}
-
-#define _Jv_HaveCondDestroy
-
-inline void
-_Jv_CondDestroy (_Jv_ConditionVariable_t *cv)
-{
-  CloseHandle (*cv);
-  cv = NULL;
-}
-
-int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
-                 jlong millis, jint nanos);
-
-inline int
-_Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *)
-{
-  // FIXME: check for mutex ownership?
-  return PulseEvent (*cv) ? 0 : _JV_NOT_OWNER;        // FIXME?
-}
-
-inline int
-_Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *)
-{
-  // FIXME: check for mutex ownership?
-  return PulseEvent (*cv) ? 0 : _JV_NOT_OWNER;        // FIXME?
-}
+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);
+int _Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *);
+int _Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *);
 
 //
 // Mutexes.
+// We use CRITICAL_SECTIONs instead of CreateMutex() for better performance
 //
 
-inline void
-_Jv_MutexInit (_Jv_Mutex_t *mu)
+inline void _Jv_MutexInit (_Jv_Mutex_t *mu)
 {
-  *mu = CreateMutex (NULL, 0, NULL);
+  InitializeCriticalSection(mu);
 }
 
 #define _Jv_HaveMutexDestroy
-
-inline void
-_Jv_MutexDestroy (_Jv_Mutex_t *mu)
+inline void _Jv_MutexDestroy (_Jv_Mutex_t *mu)
 {
-  CloseHandle (*mu);
+  DeleteCriticalSection(mu);
   mu = NULL;
 }
 
-int _Jv_MutexLock (_Jv_Mutex_t *mu);
+inline int _Jv_MutexUnlock (_Jv_Mutex_t *mu)
+{
+  LeaveCriticalSection(mu);
+  return 0;
+}
 
-inline int
-_Jv_MutexUnlock (_Jv_Mutex_t *mu)
+inline int _Jv_MutexLock (_Jv_Mutex_t *mu)
 {
-  return ReleaseMutex(*mu) ? 0 : GetLastError();        // FIXME: Map error code?
+  EnterCriticalSection(mu);
+  return 0;
 }
 
 //
@@ -101,24 +82,23 @@ void _Jv_InitThreads (void);
 _Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread);
 void _Jv_ThreadDestroyData (_Jv_Thread_t *data);
 
-inline java::lang::Thread *
-_Jv_ThreadCurrent (void)
+inline java::lang::Thread* _Jv_ThreadCurrent (void)
 {
   extern DWORD _Jv_ThreadKey;
   return (java::lang::Thread *) TlsGetValue(_Jv_ThreadKey);
 }
 
-inline _Jv_Thread_t *
-_Jv_ThreadCurrentData (void)
+inline _Jv_Thread_t *_Jv_ThreadCurrentData(void)
 {
   extern DWORD _Jv_ThreadDataKey;
   return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey);
 }
 
-inline void
-_Jv_ThreadYield (void)
+inline void _Jv_ThreadYield (void)
 {
-  Sleep (0);
+  // FIXME: win98 freezes hard (OS hang) when we use this --
+  //        for now, we simply don't yield
+  // Sleep (0);
 }
 
 void _Jv_ThreadRegister (_Jv_Thread_t *data);