Commit 8627cc15 by Adam Megacz Committed by Adam Megacz

win32-threads.h (_Jv_ConditionVariable_t): Now a struct, to enable safer wait() algorithm.

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.

From-SVN: r49427
parent 7e57448e
2002-02-01 Adam Megacz <adam@xwt.org> 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. * configure.in: Added support for mingw.
* java/lang/Win32Process.java: Created as empty file. * java/lang/Win32Process.java: Created as empty file.
* java/lang/natWin32Process.cc: Created as empty file. * java/lang/natWin32Process.cc: Created as empty file.
......
...@@ -18,8 +18,13 @@ details. */ ...@@ -18,8 +18,13 @@ details. */
// Typedefs. // Typedefs.
// //
typedef HANDLE _Jv_ConditionVariable_t; typedef struct _Jv_ConditionVariable_t {
typedef HANDLE _Jv_Mutex_t; HANDLE ev[2];
CRITICAL_SECTION count_mutex;
int blocked_count;
};
typedef CRITICAL_SECTION _Jv_Mutex_t;
typedef struct typedef struct
{ {
...@@ -34,63 +39,39 @@ typedef void _Jv_ThreadStartFunc (java::lang::Thread *); ...@@ -34,63 +39,39 @@ typedef void _Jv_ThreadStartFunc (java::lang::Thread *);
// Condition variables. // Condition variables.
// //
inline void int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint nanos);
_Jv_CondInit (_Jv_ConditionVariable_t *cv) void _Jv_CondInit (_Jv_ConditionVariable_t *cv);
{ void _Jv_CondDestroy (_Jv_ConditionVariable_t *cv);
*cv = CreateEvent (NULL, 0, 0, NULL); int _Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *);
} int _Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *);
#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. // Mutexes.
// We use CRITICAL_SECTIONs instead of CreateMutex() for better performance
// //
inline void inline void _Jv_MutexInit (_Jv_Mutex_t *mu)
_Jv_MutexInit (_Jv_Mutex_t *mu)
{ {
*mu = CreateMutex (NULL, 0, NULL); InitializeCriticalSection(mu);
} }
#define _Jv_HaveMutexDestroy #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; mu = NULL;
} }
int _Jv_MutexLock (_Jv_Mutex_t *mu); inline int _Jv_MutexUnlock (_Jv_Mutex_t *mu)
{
LeaveCriticalSection(mu);
return 0;
}
inline int inline int _Jv_MutexLock (_Jv_Mutex_t *mu)
_Jv_MutexUnlock (_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); ...@@ -101,24 +82,23 @@ void _Jv_InitThreads (void);
_Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread); _Jv_Thread_t *_Jv_ThreadInitData (java::lang::Thread *thread);
void _Jv_ThreadDestroyData (_Jv_Thread_t *data); void _Jv_ThreadDestroyData (_Jv_Thread_t *data);
inline java::lang::Thread * inline java::lang::Thread* _Jv_ThreadCurrent (void)
_Jv_ThreadCurrent (void)
{ {
extern DWORD _Jv_ThreadKey; extern DWORD _Jv_ThreadKey;
return (java::lang::Thread *) TlsGetValue(_Jv_ThreadKey); return (java::lang::Thread *) TlsGetValue(_Jv_ThreadKey);
} }
inline _Jv_Thread_t * inline _Jv_Thread_t *_Jv_ThreadCurrentData(void)
_Jv_ThreadCurrentData (void)
{ {
extern DWORD _Jv_ThreadDataKey; extern DWORD _Jv_ThreadDataKey;
return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey); return (_Jv_Thread_t *) TlsGetValue(_Jv_ThreadDataKey);
} }
inline void inline void _Jv_ThreadYield (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); void _Jv_ThreadRegister (_Jv_Thread_t *data);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment