This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

WIN-03: fix win32-threads.h



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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]