Commit 80408cac by Wu Yongwei Committed by Danny Smith

gthr-win32.h (__gthread_mutex_t): Change typedef to new structure.

2004-04-27  Wu Yongwei  <adah@sh163.net>

	* gthr-win32.h (__gthread_mutex_t): Change typedef to new structure.
	(__GTHREAD_MUTEX_INIT_DEFAULT): Adjust.
	(__gthread_mutex_init_function): Replace CreateMutex with
	initialization of custom mutex using CreateSemaphore.
	(__gthread_mutex_lock): Use InterlockedIncrement.
	(__gthread_mutex_trylock): Use InterlockedCompareExchange.
	(__gthread_mutex_unlock): Use InterlockedDecrement and
	ReleaseSemaphore to unlock
	* config/i386/gthr-win32.c (__gthread_mutex_init_function,
	__gthread_mutex_lock, __gthread_mutex_trylock,
	__gthread_mutex_unlock): Adjust to match inline versions in
	gthr-win32.h.

From-SVN: r81227
parent 1f1d584b
2004-04-27 Wu Yongwei <adah@sh163.net>
* gthr-win32.h (__gthread_mutex_t): Change typedef to new structure.
(__GTHREAD_MUTEX_INIT_DEFAULT): Adjust.
(__gthread_mutex_init_function): Replace CreateMutex with
initialization of custom mutex using CreateSemaphore.
(__gthread_mutex_lock): Use InterlockedIncrement.
(__gthread_mutex_trylock): Use InterlockedCompareExchange.
(__gthread_mutex_unlock): Use InterlockedDecrement and
ReleaseSemaphore to unlock
* config/i386/gthr-win32.c (__gthread_mutex_init_function,
__gthread_mutex_lock, __gthread_mutex_trylock,
__gthread_mutex_unlock): Adjust to match inline versions in
gthr-win32.h.
2004-04-27 Paul Brook <paul@codesourcery.com> 2004-04-27 Paul Brook <paul@codesourcery.com>
* config/arm/arm.c (arm_promote_prototypes): New function. * config/arm/arm.c (arm_promote_prototypes): New function.
......
...@@ -61,10 +61,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -61,10 +61,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
This may cause incorrect error return due to truncation values on This may cause incorrect error return due to truncation values on
hw where sizeof (DWORD) > sizeof (int). hw where sizeof (DWORD) > sizeof (int).
3. We might consider using Critical Sections instead of Windows32 3. We are currently using a special mutex instead of the Critical
mutexes for better performance, but emulating __gthread_mutex_trylock Sections, since Win9x does not support TryEnterCriticalSection
interface becomes more complicated (Win9x does not support (while NT does).
TryEnterCriticalSectioni, while NT does).
The basic framework should work well enough. In the long term, GCC The basic framework should work well enough. In the long term, GCC
needs to use Structured Exception Handling on Windows32. */ needs to use Structured Exception Handling on Windows32. */
...@@ -145,23 +144,29 @@ __gthr_win32_setspecific (__gthread_key_t key, const void *ptr) ...@@ -145,23 +144,29 @@ __gthr_win32_setspecific (__gthread_key_t key, const void *ptr)
void void
__gthr_win32_mutex_init_function (__gthread_mutex_t *mutex) __gthr_win32_mutex_init_function (__gthread_mutex_t *mutex)
{ {
/* Create unnamed mutex with default security attr and no initial owner. */ mutex->counter = 0;
*mutex = CreateMutex (NULL, 0, NULL); mutex->sema = CreateSemaphore (NULL, 0, 65535, NULL);
} }
int int
__gthr_win32_mutex_lock (__gthread_mutex_t *mutex) __gthr_win32_mutex_lock (__gthread_mutex_t *mutex)
{ {
if (WaitForSingleObject (*mutex, INFINITE) == WAIT_OBJECT_0) if (InterlockedIncrement (&mutex->counter) == 1 ||
WaitForSingleObject (mutex->sema, INFINITE) == WAIT_OBJECT_0)
return 0; return 0;
else else
return 1; {
// WaitForSingleObject returns WAIT_FAILED, and we can only do
// some best-effort cleanup here.
InterlockedDecrement (&mutex->counter);
return 1;
}
} }
int int
__gthr_win32_mutex_trylock (__gthread_mutex_t *mutex) __gthr_win32_mutex_trylock (__gthread_mutex_t *mutex)
{ {
if (WaitForSingleObject (*mutex, 0) == WAIT_OBJECT_0) if (InterlockedCompareExchange (&mutex->counter, 1, 0 ) == 0)
return 0; return 0;
else else
return 1; return 1;
...@@ -170,5 +175,8 @@ __gthr_win32_mutex_trylock (__gthread_mutex_t *mutex) ...@@ -170,5 +175,8 @@ __gthr_win32_mutex_trylock (__gthread_mutex_t *mutex)
int int
__gthr_win32_mutex_unlock (__gthread_mutex_t *mutex) __gthr_win32_mutex_unlock (__gthread_mutex_t *mutex)
{ {
return (ReleaseMutex (*mutex) != 0) ? 0 : 1; if (InterlockedDecrement (&mutex->counter))
return ReleaseSemaphore (mutex->sema, 1, NULL) ? 0 : 1;
else
return 0;
} }
/* Threads compatibility routines for libgcc2 and libobjc. */ /* Threads compatibility routines for libgcc2 and libobjc. */
/* Compile this one with gcc. */ /* Compile this one with gcc. */
/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. /* Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
Contributed by Mumit Khan <khan@xraylith.wisc.edu>. Contributed by Mumit Khan <khan@xraylith.wisc.edu>.
This file is part of GCC. This file is part of GCC.
...@@ -54,10 +54,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -54,10 +54,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
This may cause incorrect error return due to truncation values on This may cause incorrect error return due to truncation values on
hw where sizeof (DWORD) > sizeof (int). hw where sizeof (DWORD) > sizeof (int).
3. We might consider using Critical Sections instead of Windows32 3. We are currently using a special mutex instead of the Critical
mutexes for better performance, but emulating __gthread_mutex_trylock Sections, since Win9x does not support TryEnterCriticalSection
interface becomes more complicated (Win9x does not support (while NT does).
TryEnterCriticalSectioni, while NT does).
The basic framework should work well enough. In the long term, GCC The basic framework should work well enough. In the long term, GCC
needs to use Structured Exception Handling on Windows32. */ needs to use Structured Exception Handling on Windows32. */
...@@ -339,11 +338,14 @@ typedef struct { ...@@ -339,11 +338,14 @@ typedef struct {
long started; long started;
} __gthread_once_t; } __gthread_once_t;
typedef void* __gthread_mutex_t; typedef struct {
long counter;
void *sema;
} __gthread_mutex_t;
#define __GTHREAD_ONCE_INIT {0, -1} #define __GTHREAD_ONCE_INIT {0, -1}
#define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function
#define __GTHREAD_MUTEX_INIT_DEFAULT 0 #define __GTHREAD_MUTEX_INIT_DEFAULT {0, 0}
#if __MINGW32_MAJOR_VERSION >= 1 || \ #if __MINGW32_MAJOR_VERSION >= 1 || \
(__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2) (__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2)
...@@ -534,8 +536,8 @@ __gthread_setspecific (__gthread_key_t key, const void *ptr) ...@@ -534,8 +536,8 @@ __gthread_setspecific (__gthread_key_t key, const void *ptr)
static inline void static inline void
__gthread_mutex_init_function (__gthread_mutex_t *mutex) __gthread_mutex_init_function (__gthread_mutex_t *mutex)
{ {
/* Create unnamed mutex with default security attr and no initial owner. */ mutex->counter = 0;
*mutex = CreateMutex (NULL, 0, NULL); mutex->sema = CreateSemaphore (NULL, 0, 65535, NULL);
} }
static inline int static inline int
...@@ -545,10 +547,16 @@ __gthread_mutex_lock (__gthread_mutex_t *mutex) ...@@ -545,10 +547,16 @@ __gthread_mutex_lock (__gthread_mutex_t *mutex)
if (__gthread_active_p ()) if (__gthread_active_p ())
{ {
if (WaitForSingleObject (*mutex, INFINITE) == WAIT_OBJECT_0) if (InterlockedIncrement (&mutex->counter) == 1 ||
WaitForSingleObject (mutex->sema, INFINITE) == WAIT_OBJECT_0)
status = 0; status = 0;
else else
status = 1; {
// WaitForSingleObject returns WAIT_FAILED, and we can only do
// some best-effort cleanup here.
InterlockedDecrement (&mutex->counter);
status = 1;
}
} }
return status; return status;
} }
...@@ -560,7 +568,7 @@ __gthread_mutex_trylock (__gthread_mutex_t *mutex) ...@@ -560,7 +568,7 @@ __gthread_mutex_trylock (__gthread_mutex_t *mutex)
if (__gthread_active_p ()) if (__gthread_active_p ())
{ {
if (WaitForSingleObject (*mutex, 0) == WAIT_OBJECT_0) if (InterlockedCompareExchange (&mutex->counter, 1, 0 ) == 0)
status = 0; status = 0;
else else
status = 1; status = 1;
...@@ -572,9 +580,11 @@ static inline int ...@@ -572,9 +580,11 @@ static inline int
__gthread_mutex_unlock (__gthread_mutex_t *mutex) __gthread_mutex_unlock (__gthread_mutex_t *mutex)
{ {
if (__gthread_active_p ()) if (__gthread_active_p ())
return (ReleaseMutex (*mutex) != 0) ? 0 : 1; {
else if (InterlockedDecrement (&mutex->counter))
return 0; return ReleaseSemaphore (mutex->sema, 1, NULL) ? 0 : 1;
}
return 0;
} }
#endif /* __GTHREAD_HIDE_WIN32API */ #endif /* __GTHREAD_HIDE_WIN32API */
......
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