X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgthr-win32.h;h=adf6efb81a584d76dd72c97be7b1c124226cf653;hb=052f0ad8a01ea8bb07d283f6f11d8e56e677dad2;hp=3e1aac7fce093930e3ad64dc36e8c47caeb25b12;hpb=4813f5af50dada66ece22c495d18a5cd6393f53b;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gthr-win32.h b/gcc/gthr-win32.h index 3e1aac7fce0..adf6efb81a5 100644 --- a/gcc/gthr-win32.h +++ b/gcc/gthr-win32.h @@ -1,6 +1,8 @@ /* Threads compatibility routines for libgcc2 and libobjc. */ /* Compile this one with gcc. */ -/* Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. + +/* Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Contributed by Mumit Khan . This file is part of GCC. @@ -17,8 +19,8 @@ for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ /* As a special exception, if you link this library with other files, some of which are compiled with GCC, to produce an executable, @@ -71,7 +73,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifdef _LIBOBJC /* This is necessary to prevent windef.h (included from windows.h) from - defining it's own BOOL as a typedef. */ + defining its own BOOL as a typedef. */ #ifndef __OBJC__ #define __OBJC__ #endif @@ -88,7 +90,7 @@ static DWORD __gthread_objc_data_tls = (DWORD) -1; int __gthread_objc_init_thread_system (void) { - /* Initialize the thread storage key */ + /* Initialize the thread storage key. */ if ((__gthread_objc_data_tls = TlsAlloc ()) != (DWORD) -1) return 0; else @@ -346,15 +348,16 @@ typedef struct { typedef struct { long counter; long depth; - DWORD owner; + unsigned long owner; void *sema; } __gthread_recursive_mutex_t; #define __GTHREAD_ONCE_INIT {0, -1} #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function #define __GTHREAD_MUTEX_INIT_DEFAULT {-1, 0} -#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_mutex_init_function -#define __GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT {-1, 0} +#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION \ + __gthread_recursive_mutex_init_function +#define __GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT {-1, 0, 0, 0} #if __MINGW32_MAJOR_VERSION >= 1 || \ (__MINGW32_MAJOR_VERSION == 0 && __MINGW32_MINOR_VERSION > 2) @@ -414,6 +417,13 @@ extern void __gthr_win32_mutex_init_function (__gthread_mutex_t *); extern int __gthr_win32_mutex_lock (__gthread_mutex_t *); extern int __gthr_win32_mutex_trylock (__gthread_mutex_t *); extern int __gthr_win32_mutex_unlock (__gthread_mutex_t *); +extern void + __gthr_win32_recursive_mutex_init_function (__gthread_recursive_mutex_t *); +extern int __gthr_win32_recursive_mutex_lock (__gthread_recursive_mutex_t *); +extern int + __gthr_win32_recursive_mutex_trylock (__gthread_recursive_mutex_t *); +extern int __gthr_win32_recursive_mutex_unlock (__gthread_recursive_mutex_t *); +extern void __gthr_win32_mutex_destroy (__gthread_mutex_t *); static inline int __gthread_once (__gthread_once_t *once, void (*func) (void)) @@ -454,6 +464,12 @@ __gthread_mutex_init_function (__gthread_mutex_t *mutex) __gthr_win32_mutex_init_function (mutex); } +static inline void +__gthread_mutex_destroy (__gthread_mutex_t *mutex) +{ + __gthr_win32_mutex_destroy (mutex); +} + static inline int __gthread_mutex_lock (__gthread_mutex_t *mutex) { @@ -481,6 +497,12 @@ __gthread_mutex_unlock (__gthread_mutex_t *mutex) return 0; } +static inline void +__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex) +{ + __gthr_win32_recursive_mutex_init_function (mutex); +} + static inline int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) { @@ -547,7 +569,8 @@ __gthread_once (__gthread_once_t *once, void (*func) (void)) leaks, especially in threaded applications making extensive use of C++ EH. Mingw uses a thread-support DLL to work-around this problem. */ static inline int -__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *)) +__gthread_key_create (__gthread_key_t *key, + void (*dtor) (void *) __attribute__((unused))) { int status = 0; DWORD tls_index = TlsAlloc (); @@ -599,6 +622,12 @@ __gthread_mutex_init_function (__gthread_mutex_t *mutex) mutex->sema = CreateSemaphore (NULL, 0, 65535, NULL); } +static inline void +__gthread_mutex_destroy (__gthread_mutex_t *mutex) +{ + CloseHandle ((HANDLE) mutex->sema); +} + static inline int __gthread_mutex_lock (__gthread_mutex_t *mutex) { @@ -668,7 +697,7 @@ __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) } else if (mutex->owner == me) { - InterlockedDecrement (&mx->lock_idx); + InterlockedDecrement (&mutex->counter); ++(mutex->depth); } else if (WaitForSingleObject (mutex->sema, INFINITE) == WAIT_OBJECT_0)