X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgthr-tpf.h;h=fd80bd49df374077445c07cf1813dfbcc3c44689;hb=9636921b6f9c9162ae3aeb278b588b6ee37a3842;hp=a4e82d1427c2c4f9abd653d72a8350aa5020bee6;hpb=96ecec54419a247d7111ac8927bf0921416f4a65;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gthr-tpf.h b/gcc/gthr-tpf.h index a4e82d1427c..fd80bd49df3 100644 --- a/gcc/gthr-tpf.h +++ b/gcc/gthr-tpf.h @@ -1,6 +1,6 @@ /* Threads compatibility routines for libgcc2 and libobjc. Compile this one with gcc. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2005 Free Software Foundation, Inc. This file is part of GCC. @@ -61,6 +61,7 @@ typedef pthread_mutex_t __gthread_recursive_mutex_t; #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT +#define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function #define NOTATHREAD 00 #define ECBBASEPTR (unsigned long int) *(unsigned int *)0x00000514u @@ -69,19 +70,29 @@ typedef pthread_mutex_t __gthread_recursive_mutex_t; #define __tpf_pthread_active() (CE2THRCPTR != NOTATHREAD) #if SUPPORTS_WEAK && GTHREAD_USE_WEAK +# define __gthrw(name) \ + static __typeof(name) __gthrw_ ## name __attribute__ ((__weakref__(#name))); +# define __gthrw_(name) __gthrw_ ## name +#else +# define __gthrw(name) +# define __gthrw_(name) name +#endif -#pragma weak pthread_once -#pragma weak pthread_key_create -#pragma weak pthread_key_delete -#pragma weak pthread_getspecific -#pragma weak pthread_setspecific -#pragma weak pthread_create - -#pragma weak pthread_mutex_lock -#pragma weak pthread_mutex_trylock -#pragma weak pthread_mutex_unlock - -#endif /* SUPPORTS_WEAK */ +__gthrw(pthread_once) +__gthrw(pthread_key_create) +__gthrw(pthread_key_delete) +__gthrw(pthread_getspecific) +__gthrw(pthread_setspecific) +__gthrw(pthread_create) + +__gthrw(pthread_mutex_lock) +__gthrw(pthread_mutex_trylock) +__gthrw(pthread_mutex_unlock) +__gthrw(pthread_mutexattr_init) +__gthrw(pthread_mutexattr_settype) +__gthrw(pthread_mutexattr_destroy) +__gthrw(pthread_mutex_init) +__gthrw(pthread_mutex_destroy) static inline int __gthread_active_p (void) @@ -93,7 +104,7 @@ static inline int __gthread_once (__gthread_once_t *once, void (*func) (void)) { if (__tpf_pthread_active ()) - return pthread_once (once, func); + return __gthrw_(pthread_once) (once, func); else return -1; } @@ -102,7 +113,7 @@ static inline int __gthread_key_create (__gthread_key_t *key, void (*dtor) (void *)) { if (__tpf_pthread_active ()) - return pthread_key_create (key, dtor); + return __gthrw_(pthread_key_create) (key, dtor); else return -1; } @@ -111,7 +122,7 @@ static inline int __gthread_key_delete (__gthread_key_t key) { if (__tpf_pthread_active ()) - return pthread_key_delete (key); + return __gthrw_(pthread_key_delete) (key); else return -1; } @@ -120,7 +131,7 @@ static inline void * __gthread_getspecific (__gthread_key_t key) { if (__tpf_pthread_active ()) - return pthread_getspecific (key); + return __gthrw_(pthread_getspecific) (key); else return NULL; } @@ -129,16 +140,25 @@ static inline int __gthread_setspecific (__gthread_key_t key, const void *ptr) { if (__tpf_pthread_active ()) - return pthread_setspecific (key, ptr); + return __gthrw_(pthread_setspecific) (key, ptr); else return -1; } static inline int +__gthread_mutex_destroy (__gthread_mutex_t *mutex) +{ + if (__tpf_pthread_active ()) + return __gthrw_(pthread_mutex_destroy) (mutex); + else + return 0; +} + +static inline int __gthread_mutex_lock (__gthread_mutex_t *mutex) { if (__tpf_pthread_active ()) - return pthread_mutex_lock (mutex); + return __gthrw_(pthread_mutex_lock) (mutex); else return 0; } @@ -147,7 +167,7 @@ static inline int __gthread_mutex_trylock (__gthread_mutex_t *mutex) { if (__tpf_pthread_active ()) - return pthread_mutex_trylock (mutex); + return __gthrw_(pthread_mutex_trylock) (mutex); else return 0; } @@ -156,7 +176,7 @@ static inline int __gthread_mutex_unlock (__gthread_mutex_t *mutex) { if (__tpf_pthread_active ()) - return pthread_mutex_unlock (mutex); + return __gthrw_(pthread_mutex_unlock) (mutex); else return 0; } @@ -188,4 +208,25 @@ __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) return 0; } +static inline int +__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex) +{ + if (__tpf_pthread_active ()) + { + pthread_mutexattr_t attr; + int r; + + r = __gthrw_(pthread_mutexattr_init) (&attr); + if (!r) + r = __gthrw_(pthread_mutexattr_settype) (&attr, PTHREAD_MUTEX_RECURSIVE); + if (!r) + r = __gthrw_(pthread_mutex_init) (mutex, &attr); + if (!r) + r = __gthrw_(pthread_mutexattr_destroy) (&attr); + return r; + } + return 0; +} + + #endif /* ! GCC_GTHR_TPF_H */