This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
WIN-03: fix win32-threads.h
- From: Adam Megacz <patches at lists dot megacz dot com>
- To: java-patches at gcc dot gnu dot org
- Date: 31 Jan 2002 16:21:46 -0800
- Subject: WIN-03: fix win32-threads.h
- Organization: Myself
2002-01-31 Adam Megacz <adam@xwt.org>
* include/win32-threads.h:
- use CRITICAL_SECTIONs instead of CreateMutex()
- more sophisticated _Jv_ConditionVariable_t to enable safer wait() algorithm
- temporarily disabled _Jv_ThreadYield() due to crashes on win98
Index: win32-threads.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/win32-threads.h,v
retrieving revision 1.4
diff -c -3 -p -r1.4 win32-threads.h
*** win32-threads.h 2001/05/22 06:47:48 1.4
--- win32-threads.h 2002/02/01 00:22:44
*************** details. */
*** 18,26 ****
// Typedefs.
//
! typedef HANDLE _Jv_ConditionVariable_t;
! typedef HANDLE _Jv_Mutex_t;
typedef struct
{
int flags; // Flags are defined in implementation.
--- 18,31 ----
// Typedefs.
//
! typedef struct _Jv_ConditionVariable_t {
! HANDLE ev[2];
! CRITICAL_SECTION count_mutex;
! int blocked_count;
! };
+ typedef CRITICAL_SECTION _Jv_Mutex_t;
+
typedef struct
{
int flags; // Flags are defined in implementation.
*************** typedef void _Jv_ThreadStartFunc (java::
*** 33,96 ****
//
// 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?
! }
//
// Mutexes.
//
! inline void
! _Jv_MutexInit (_Jv_Mutex_t *mu)
! {
! *mu = CreateMutex (NULL, 0, NULL);
}
#define _Jv_HaveMutexDestroy
!
! inline void
! _Jv_MutexDestroy (_Jv_Mutex_t *mu)
! {
! CloseHandle (*mu);
mu = NULL;
}
! int _Jv_MutexLock (_Jv_Mutex_t *mu);
! inline int
! _Jv_MutexUnlock (_Jv_Mutex_t *mu)
! {
! return ReleaseMutex(*mu) ? 0 : GetLastError(); // FIXME: Map error code?
}
//
--- 38,73 ----
//
// Condition variables.
//
! 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) {
! InitializeCriticalSection(mu);
}
#define _Jv_HaveMutexDestroy
! inline void _Jv_MutexDestroy (_Jv_Mutex_t *mu) {
! DeleteCriticalSection(mu);
mu = NULL;
}
! inline int _Jv_MutexUnlock (_Jv_Mutex_t *mu) {
! LeaveCriticalSection(mu);
! return 0;
! }
! inline int _Jv_MutexLock (_Jv_Mutex_t *mu) {
! EnterCriticalSection(mu);
! return 0;
}
//
*************** void _Jv_InitThreads (void);
*** 101,124 ****
_Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread);
void _Jv_ThreadDestroyData (_Jv_Thread_t *data);
! 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)
! {
extern DWORD _Jv_ThreadDataKey;
return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey);
}
! inline void
! _Jv_ThreadYield (void)
! {
! Sleep (0);
}
void _Jv_ThreadRegister (_Jv_Thread_t *data);
--- 78,97 ----
_Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread);
void _Jv_ThreadDestroyData (_Jv_Thread_t *data);
! 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) {
extern DWORD _Jv_ThreadDataKey;
return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey);
}
! inline void _Jv_ThreadYield (void) {
! // 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);