X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgthr-posix.h;h=b16f9b31fe8d4c9144e818e6734434b3dc580ed2;hb=052f0ad8a01ea8bb07d283f6f11d8e56e677dad2;hp=a290b6aab7c3647df4a0b21d388a3f17a0e64f2c;hpb=05f60a3c91532927c069d73dec8dafa6ee73231c;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gthr-posix.h b/gcc/gthr-posix.h index a290b6aab7c..b16f9b31fe8 100644 --- a/gcc/gthr-posix.h +++ b/gcc/gthr-posix.h @@ -47,6 +47,11 @@ typedef pthread_key_t __gthread_key_t; typedef pthread_once_t __gthread_once_t; typedef pthread_mutex_t __gthread_mutex_t; typedef pthread_mutex_t __gthread_recursive_mutex_t; +typedef pthread_cond_t __gthread_cond_t; + +/* POSIX like conditional variables are supported. Please look at comments + in gthr.h for details. */ +#define __GTHREAD_HAS_COND 1 #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT @@ -57,6 +62,7 @@ typedef pthread_mutex_t __gthread_recursive_mutex_t; #else #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function #endif +#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER #if SUPPORTS_WEAK && GTHREAD_USE_WEAK # ifndef __gthrw_pragma @@ -88,6 +94,9 @@ __gthrw3(pthread_mutex_lock) __gthrw3(pthread_mutex_trylock) __gthrw3(pthread_mutex_unlock) __gthrw3(pthread_mutex_init) +__gthrw3(pthread_mutex_destroy) +__gthrw3(pthread_cond_broadcast) +__gthrw3(pthread_cond_wait) #else __gthrw(pthread_once) __gthrw(pthread_getspecific) @@ -98,6 +107,9 @@ __gthrw(pthread_mutex_lock) __gthrw(pthread_mutex_trylock) __gthrw(pthread_mutex_unlock) __gthrw(pthread_mutex_init) +__gthrw(pthread_mutex_destroy) +__gthrw(pthread_cond_broadcast) +__gthrw(pthread_cond_wait) #endif __gthrw(pthread_key_create) @@ -110,22 +122,16 @@ __gthrw(pthread_mutexattr_destroy) #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) /* Objective-C. */ #if defined(__osf__) && defined(_PTHREAD_USE_MANGLED_NAMES_) -__gthrw3(pthread_cond_broadcast) __gthrw3(pthread_cond_destroy) __gthrw3(pthread_cond_init) __gthrw3(pthread_cond_signal) -__gthrw3(pthread_cond_wait) __gthrw3(pthread_exit) -__gthrw3(pthread_mutex_destroy) __gthrw3(pthread_self) #else -__gthrw(pthread_cond_broadcast) __gthrw(pthread_cond_destroy) __gthrw(pthread_cond_init) __gthrw(pthread_cond_signal) -__gthrw(pthread_cond_wait) __gthrw(pthread_exit) -__gthrw(pthread_mutex_destroy) __gthrw(pthread_self) #endif /* __osf__ && _PTHREAD_USE_MANGLED_NAMES_ */ #ifdef _POSIX_PRIORITY_SCHEDULING @@ -152,9 +158,12 @@ __gthrw(pthread_setschedparam) it is passed so we cannot pretend that the interface is active if -pthreads is not specified. On Solaris 2.5.1, the interface is not exposed at all so we need to play the usual game with weak symbols. On Solaris 10 and up, a - working interface is always exposed. */ + working interface is always exposed. On FreeBSD 6 and later, libc also + exposes a dummy POSIX threads interface, similar to what Solaris 2.6 up + to 9 does. FreeBSD >= 700014 even provides a pthread_cancel stub in libc, + which means the alternate __gthread_active_p below cannot be used there. */ -#if defined(__sun) && defined(__svr4__) +#if defined(__FreeBSD__) || (defined(__sun) && defined(__svr4__)) static volatile int __gthread_active = -1; @@ -197,7 +206,7 @@ __gthread_active_p (void) return __gthread_active_latest_value != 0; } -#else /* not Solaris */ +#else /* neither FreeBSD nor Solaris */ static inline int __gthread_active_p (void) @@ -207,7 +216,7 @@ __gthread_active_p (void) return __gthread_active_ptr != 0; } -#endif /* Solaris */ +#endif /* FreeBSD or Solaris */ #else /* not SUPPORTS_WEAK */ @@ -240,20 +249,20 @@ __gthread_active_init (void) { static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_t t; + pthread_attr_t a; int result; __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); if (__gthread_active < 0) { - result = __gthrw_(pthread_create) (&t, NULL, __gthread_start, NULL); + __gthrw_(pthread_attr_init) (&a); + __gthrw_(pthread_attr_setdetachstate) (&a, PTHREAD_CREATE_DETACHED); + result = __gthrw_(pthread_create) (&t, &a, __gthread_start, NULL); if (result != ENOSYS) - { - __gthread_active = 1; - if (!result) - __gthrw_(pthread_join) (t, NULL); - } + __gthread_active = 1; else __gthread_active = 0; + __gthrw_(pthread_attr_destroy) (&a); } __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); } @@ -671,6 +680,15 @@ __gthread_setspecific (__gthread_key_t key, const void *ptr) } static inline int +__gthread_mutex_destroy (__gthread_mutex_t *mutex) +{ + if (__gthread_active_p ()) + return __gthrw_(pthread_mutex_destroy) (mutex); + else + return 0; +} + +static inline int __gthread_mutex_lock (__gthread_mutex_t *mutex) { if (__gthread_active_p ()) @@ -737,6 +755,25 @@ __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) return __gthread_mutex_unlock (mutex); } +static inline int +__gthread_cond_broadcast (__gthread_cond_t *cond) +{ + return __gthrw_(pthread_cond_broadcast) (cond); +} + +static inline int +__gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex) +{ + return __gthrw_(pthread_cond_wait) (cond, mutex); +} + +static inline int +__gthread_cond_wait_recursive (__gthread_cond_t *cond, + __gthread_recursive_mutex_t *mutex) +{ + return __gthread_cond_wait (cond, mutex); +} + #endif /* _LIBOBJC */ #endif /* ! GCC_GTHR_POSIX_H */