>From 79c2545308000d2120009a76bea4f36f06f16b1b Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 20 Jun 2019 03:54:56 +0200 Subject: [PATCH 04/26] thread, lock, cond, tls: Recognize C11 multithreaded applications. * m4/threadlib.m4 (gl_THREADLIB_BODY): Test for . * lib/glthread/thread.h (c11_threads_in_use): New macro. (pthread_in_use, pth_in_use, thread_in_use): Use it. * lib/glthread/lock.h (c11_threads_in_use): New macro. (pthread_in_use, pth_in_use, thread_in_use): Use it. * lib/glthread/cond.h (c11_threads_in_use): New macro. (pthread_in_use, pth_in_use, thread_in_use): Use it. * lib/glthread/tls.h (c11_threads_in_use): New macro. (pthread_in_use, pth_in_use, thread_in_use): Use it. --- ChangeLog | 13 +++++++++++++ lib/glthread/cond.h | 18 +++++++++++++++--- lib/glthread/lock.h | 17 ++++++++++++++--- lib/glthread/thread.h | 17 ++++++++++++++--- lib/glthread/tls.h | 17 ++++++++++++++--- m4/threadlib.m4 | 9 ++++++++- 6 files changed, 78 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index b8ff877..a9fe91e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,18 @@ 2019-06-20 Bruno Haible + thread, lock, cond, tls: Recognize C11 multithreaded applications. + * m4/threadlib.m4 (gl_THREADLIB_BODY): Test for . + * lib/glthread/thread.h (c11_threads_in_use): New macro. + (pthread_in_use, pth_in_use, thread_in_use): Use it. + * lib/glthread/lock.h (c11_threads_in_use): New macro. + (pthread_in_use, pth_in_use, thread_in_use): Use it. + * lib/glthread/cond.h (c11_threads_in_use): New macro. + (pthread_in_use, pth_in_use, thread_in_use): Use it. + * lib/glthread/tls.h (c11_threads_in_use): New macro. + (pthread_in_use, pth_in_use, thread_in_use): Use it. + +2019-06-20 Bruno Haible + tls tests: Small improvements. * tests/test-tls.c: Include . (worker_thread): Avoid gcc warning on 64-bit mingw. diff --git a/lib/glthread/cond.h b/lib/glthread/cond.h index abfa753..6540f1d 100644 --- a/lib/glthread/cond.h +++ b/lib/glthread/cond.h @@ -54,6 +54,17 @@ #include #include "glthread/lock.h" + +#if !defined c11_threads_in_use +# if HAVE_THREADS_H && (USE_POSIX_THREADS_WEAK || USE_PTH_THREADS_WEAK || USE_SOLARIS_THREADS_WEAK) +# include +# pragma weak thrd_exit +# define c11_threads_in_use() (thrd_exit != NULL) +# else +# define c11_threads_in_use() 0 +# endif +#endif + #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif @@ -115,7 +126,8 @@ extern int glthread_in_use (void); # if !PTHREAD_IN_USE_DETECTION_HARD # pragma weak pthread_mutexattr_gettype -# define pthread_in_use() (pthread_mutexattr_gettype != NULL) +# define pthread_in_use() \ + (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # endif # else @@ -177,7 +189,7 @@ extern "C" { # pragma weak pth_timeout # pragma weak pth_cancel -# define pth_in_use() (pth_cancel != NULL) +# define pth_in_use() (pth_cancel != NULL || c11_threads_in_use ()) # else @@ -237,7 +249,7 @@ extern "C" { # pragma weak cond_broadcast # pragma weak cond_destroy # pragma weak thr_suspend -# define thread_in_use() (thr_suspend != NULL) +# define thread_in_use() (thr_suspend != NULL || c11_threads_in_use ()) # else diff --git a/lib/glthread/lock.h b/lib/glthread/lock.h index 6e1fdf8..cc6fb5e 100644 --- a/lib/glthread/lock.h +++ b/lib/glthread/lock.h @@ -81,6 +81,16 @@ #include #include +#if !defined c11_threads_in_use +# if HAVE_THREADS_H && (USE_POSIX_THREADS_WEAK || USE_PTH_THREADS_WEAK || USE_SOLARIS_THREADS_WEAK) +# include +# pragma weak thrd_exit +# define c11_threads_in_use() (thrd_exit != NULL) +# else +# define c11_threads_in_use() 0 +# endif +#endif + /* ========================================================================= */ #if USE_POSIX_THREADS @@ -156,7 +166,8 @@ extern int glthread_in_use (void); pthread_rwlockattr_init */ # pragma weak pthread_mutexattr_gettype -# define pthread_in_use() (pthread_mutexattr_gettype != NULL) +# define pthread_in_use() \ + (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # endif # else @@ -421,7 +432,7 @@ extern "C" { # pragma weak pth_cond_notify # pragma weak pth_cancel -# define pth_in_use() (pth_cancel != NULL) +# define pth_in_use() (pth_cancel != NULL || c11_threads_in_use ()) # else @@ -572,7 +583,7 @@ extern "C" { # pragma weak thr_self # pragma weak thr_suspend -# define thread_in_use() (thr_suspend != NULL) +# define thread_in_use() (thr_suspend != NULL || c11_threads_in_use ()) # else diff --git a/lib/glthread/thread.h b/lib/glthread/thread.h index 1d2a544..f263129 100644 --- a/lib/glthread/thread.h +++ b/lib/glthread/thread.h @@ -74,6 +74,16 @@ #include #include +#if !defined c11_threads_in_use +# if HAVE_THREADS_H && (USE_POSIX_THREADS_WEAK || USE_PTH_THREADS_WEAK || USE_SOLARIS_THREADS_WEAK) +# include +# pragma weak thrd_exit +# define c11_threads_in_use() (thrd_exit != NULL) +# else +# define c11_threads_in_use() 0 +# endif +#endif + #ifndef _GL_INLINE_HEADER_BEGIN #error "Please include config.h first." #endif @@ -148,7 +158,8 @@ extern int glthread_in_use (void); # if !PTHREAD_IN_USE_DETECTION_HARD # pragma weak pthread_mutexattr_gettype -# define pthread_in_use() (pthread_mutexattr_gettype != NULL) +# define pthread_in_use() \ + (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # endif # else @@ -234,7 +245,7 @@ extern "C" { # pragma weak pth_exit # pragma weak pth_cancel -# define pth_in_use() (pth_cancel != NULL) +# define pth_in_use() (pth_cancel != NULL || c11_threads_in_use ()) # else @@ -287,7 +298,7 @@ extern "C" { # pragma weak thr_exit # pragma weak thr_suspend -# define thread_in_use() (thr_suspend != NULL) +# define thread_in_use() (thr_suspend != NULL || c11_threads_in_use ()) # else diff --git a/lib/glthread/tls.h b/lib/glthread/tls.h index 399a879..ab85409 100644 --- a/lib/glthread/tls.h +++ b/lib/glthread/tls.h @@ -46,6 +46,16 @@ #include #include +#if !defined c11_threads_in_use +# if HAVE_THREADS_H && (USE_POSIX_THREADS_WEAK || USE_PTH_THREADS_WEAK || USE_SOLARIS_THREADS_WEAK) +# include +# pragma weak thrd_exit +# define c11_threads_in_use() (thrd_exit != NULL) +# else +# define c11_threads_in_use() 0 +# endif +#endif + /* ========================================================================= */ #if USE_POSIX_THREADS @@ -77,7 +87,8 @@ extern int glthread_in_use (void); # if !PTHREAD_IN_USE_DETECTION_HARD # pragma weak pthread_mutexattr_gettype -# define pthread_in_use() (pthread_mutexattr_gettype != NULL) +# define pthread_in_use() \ + (pthread_mutexattr_gettype != NULL || c11_threads_in_use ()) # endif # else @@ -131,7 +142,7 @@ typedef union # pragma weak pth_key_delete # pragma weak pth_cancel -# define pth_in_use() (pth_cancel != NULL) +# define pth_in_use() (pth_cancel != NULL || c11_threads_in_use ()) # else @@ -183,7 +194,7 @@ typedef union # pragma weak thr_setspecific # pragma weak thr_suspend -# define thread_in_use() (thr_suspend != NULL) +# define thread_in_use() (thr_suspend != NULL || c11_threads_in_use ()) # else diff --git a/m4/threadlib.m4 b/m4/threadlib.m4 index b4401f8..f02eb97 100644 --- a/m4/threadlib.m4 +++ b/m4/threadlib.m4 @@ -1,4 +1,4 @@ -# threadlib.m4 serial 17 +# threadlib.m4 serial 18 dnl Copyright (C) 2005-2019 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -160,6 +160,13 @@ int main () *" -static "*) gl_cv_have_weak=no ;; esac ]) + if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then + dnl If we use weak symbols to implement pthread_in_use / pth_in_use / + gnl thread_in_use, we also need to test whether the ISO C 11 thrd_create + dnl facility is in use. + AC_CHECK_HEADERS_ONCE([threads.h]) + : + fi if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that # it groks . It's added above, in gl_THREADLIB_EARLY_BODY. -- 2.7.4