diff options
Diffstat (limited to 'gl/m4/threadlib.m4')
| -rw-r--r-- | gl/m4/threadlib.m4 | 376 |
1 files changed, 187 insertions, 189 deletions
diff --git a/gl/m4/threadlib.m4 b/gl/m4/threadlib.m4 index f5e81479..333c8fe0 100644 --- a/gl/m4/threadlib.m4 +++ b/gl/m4/threadlib.m4 | |||
| @@ -1,9 +1,10 @@ | |||
| 1 | # threadlib.m4 | 1 | # threadlib.m4 |
| 2 | # serial 42 | 2 | # serial 45.1 |
| 3 | dnl Copyright (C) 2005-2024 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2005-2025 Free Software Foundation, Inc. |
| 4 | dnl This file is free software; the Free Software Foundation | 4 | dnl This file is free software; the Free Software Foundation |
| 5 | dnl gives unlimited permission to copy and/or distribute it, | 5 | dnl gives unlimited permission to copy and/or distribute it, |
| 6 | dnl with or without modifications, as long as this notice is preserved. | 6 | dnl with or without modifications, as long as this notice is preserved. |
| 7 | dnl This file is offered as-is, without any warranty. | ||
| 7 | 8 | ||
| 8 | dnl From Bruno Haible. | 9 | dnl From Bruno Haible. |
| 9 | 10 | ||
| @@ -56,24 +57,22 @@ AC_DEFUN([gl_ANYTHREADLIB_EARLY], | |||
| 56 | [ | 57 | [ |
| 57 | AC_REQUIRE([AC_CANONICAL_HOST]) | 58 | AC_REQUIRE([AC_CANONICAL_HOST]) |
| 58 | if test -z "$gl_anythreadlib_early_done"; then | 59 | if test -z "$gl_anythreadlib_early_done"; then |
| 59 | case "$host_os" in | 60 | AS_CASE([$host_os], |
| 60 | osf*) | 61 | [osf*], |
| 61 | # On OSF/1, the compiler needs the flag -D_REENTRANT so that it | 62 | [# On OSF/1, the compiler needs the flag -D_REENTRANT so that it |
| 62 | # groks <pthread.h>. cc also understands the flag -pthread, but | 63 | # groks <pthread.h>. cc also understands the flag -pthread, but |
| 63 | # we don't use it because 1. gcc-2.95 doesn't understand -pthread, | 64 | # we do not use it because 1. gcc-2.95 does not understand -pthread, |
| 64 | # 2. putting a flag into CPPFLAGS that has an effect on the linker | 65 | # 2. putting a flag into CPPFLAGS that has an effect on the linker |
| 65 | # causes the AC_LINK_IFELSE test below to succeed unexpectedly, | 66 | # causes the AC_LINK_IFELSE test below to succeed unexpectedly, |
| 66 | # leading to wrong values of LIBTHREAD and LTLIBTHREAD. | 67 | # leading to wrong values of LIBTHREAD and LTLIBTHREAD. |
| 67 | CPPFLAGS="$CPPFLAGS -D_REENTRANT" | 68 | CPPFLAGS="$CPPFLAGS -D_REENTRANT" |
| 68 | ;; | 69 | ]) |
| 69 | esac | ||
| 70 | # Some systems optimize for single-threaded programs by default, and | 70 | # Some systems optimize for single-threaded programs by default, and |
| 71 | # need special flags to disable these optimizations. For example, the | 71 | # need special flags to disable these optimizations. For example, the |
| 72 | # definition of 'errno' in <errno.h>. | 72 | # definition of errno in <errno.h>. |
| 73 | case "$host_os" in | 73 | AS_CASE([$host_os], |
| 74 | aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; | 74 | [aix* | freebsd*], [CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE"], |
| 75 | solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; | 75 | [hpux* | solaris*], [CPPFLAGS="$CPPFLAGS -D_REENTRANT"]) |
| 76 | esac | ||
| 77 | gl_anythreadlib_early_done=done | 76 | gl_anythreadlib_early_done=done |
| 78 | fi | 77 | fi |
| 79 | ]) | 78 | ]) |
| @@ -85,24 +84,26 @@ AC_DEFUN([gl_WEAK_SYMBOLS], | |||
| 85 | AC_REQUIRE([AC_CANONICAL_HOST]) | 84 | AC_REQUIRE([AC_CANONICAL_HOST]) |
| 86 | AC_CACHE_CHECK([whether imported symbols can be declared weak], | 85 | AC_CACHE_CHECK([whether imported symbols can be declared weak], |
| 87 | [gl_cv_have_weak], | 86 | [gl_cv_have_weak], |
| 88 | [case "$host_os" in | 87 | [AS_CASE([$host_os], |
| 89 | cygwin* | mingw* | windows*) | 88 | [cygwin* | mingw* | windows*], |
| 89 | [ | ||
| 90 | dnl On Cygwin 3.2.0 with gcc 10.2, and likewise on mingw 10.0.0 with | 90 | dnl On Cygwin 3.2.0 with gcc 10.2, and likewise on mingw 10.0.0 with |
| 91 | dnl gcc 11.3, the test below would succeed, but programs that use | 91 | dnl gcc 11.3, the test below would succeed, but programs that use |
| 92 | dnl pthread_in_use() with weak symbol references crash miserably at | 92 | dnl pthread_in_use() with weak symbol references crash miserably at |
| 93 | dnl runtime. | 93 | dnl runtime. |
| 94 | gl_cv_have_weak="guessing no" | 94 | gl_cv_have_weak="guessing no" |
| 95 | ;; | 95 | ], |
| 96 | *) | 96 | [ |
| 97 | gl_cv_have_weak=no | 97 | gl_cv_have_weak=no |
| 98 | dnl First, test whether the compiler accepts it syntactically. | 98 | dnl First, test whether the compiler accepts it syntactically. |
| 99 | AC_LINK_IFELSE( | 99 | AC_LINK_IFELSE( |
| 100 | [AC_LANG_PROGRAM( | 100 | [AC_LANG_PROGRAM( |
| 101 | [[extern void xyzzy (); | 101 | [[extern void xyzzy (); |
| 102 | #pragma weak xyzzy]], | 102 | #pragma weak xyzzy |
| 103 | ]], | ||
| 103 | [[xyzzy();]])], | 104 | [[xyzzy();]])], |
| 104 | [gl_cv_have_weak=maybe]) | 105 | [gl_cv_have_weak=maybe]) |
| 105 | if test $gl_cv_have_weak = maybe; then | 106 | AS_IF([test $gl_cv_have_weak = maybe], [ |
| 106 | dnl Second, test whether it actually works. On Cygwin 1.7.2, with | 107 | dnl Second, test whether it actually works. On Cygwin 1.7.2, with |
| 107 | dnl gcc 4.3, symbols declared weak always evaluate to the address 0. | 108 | dnl gcc 4.3, symbols declared weak always evaluate to the address 0. |
| 108 | AC_RUN_IFELSE( | 109 | AC_RUN_IFELSE( |
| @@ -125,20 +126,19 @@ int main () | |||
| 125 | [gl_cv_have_weak="guessing yes"], | 126 | [gl_cv_have_weak="guessing yes"], |
| 126 | [gl_cv_have_weak="guessing no"]) | 127 | [gl_cv_have_weak="guessing no"]) |
| 127 | ]) | 128 | ]) |
| 128 | fi | 129 | ]) |
| 129 | ;; | 130 | ]) |
| 130 | esac | 131 | dnl But when linking statically, weak symbols do not work. |
| 131 | dnl But when linking statically, weak symbols don't work. | 132 | AS_CASE([" $LDFLAGS "], |
| 132 | case " $LDFLAGS " in | 133 | [*" -static "*], [gl_cv_have_weak=no]) |
| 133 | *" -static "*) gl_cv_have_weak=no ;; | ||
| 134 | esac | ||
| 135 | dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak | 134 | dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak |
| 136 | dnl symbol and linking against a shared library that has a dependency on | 135 | dnl symbol and linking against a shared library that has a dependency on |
| 137 | dnl the shared library that defines the symbol. | 136 | dnl the shared library that defines the symbol. |
| 138 | case "$gl_cv_have_weak" in | 137 | AS_CASE([$gl_cv_have_weak], |
| 139 | *yes) | 138 | [*yes], |
| 140 | case "$host_os" in | 139 | [AS_CASE([$host_os], |
| 141 | freebsd* | dragonfly* | midnightbsd*) | 140 | [freebsd* | dragonfly* | midnightbsd*], |
| 141 | [ | ||
| 142 | : > conftest1.c | 142 | : > conftest1.c |
| 143 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1 | 143 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1 |
| 144 | cat <<EOF > conftest2.c | 144 | cat <<EOF > conftest2.c |
| @@ -152,17 +152,15 @@ EOF | |||
| 152 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \ | 152 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \ |
| 153 | || gl_cv_have_weak=no | 153 | || gl_cv_have_weak=no |
| 154 | rm -f conftest1.c libempty.so conftest2.c conftest | 154 | rm -f conftest1.c libempty.so conftest2.c conftest |
| 155 | ;; | 155 | ]) |
| 156 | esac | 156 | ]) |
| 157 | ;; | ||
| 158 | esac | ||
| 159 | ]) | 157 | ]) |
| 160 | case "$gl_cv_have_weak" in | 158 | AS_CASE([$gl_cv_have_weak], |
| 161 | *yes) | 159 | [*yes], |
| 160 | [ | ||
| 162 | AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], | 161 | AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], |
| 163 | [Define to 1 if the compiler and linker support weak declarations of symbols.]) | 162 | [Define to 1 if the compiler and linker support weak declarations of symbols.]) |
| 164 | ;; | 163 | ]) |
| 165 | esac | ||
| 166 | ]) | 164 | ]) |
| 167 | 165 | ||
| 168 | dnl ============================================================================ | 166 | dnl ============================================================================ |
| @@ -188,15 +186,15 @@ dnl The guts of gl_PTHREADLIB. Needs to be expanded only once. | |||
| 188 | AC_DEFUN([gl_PTHREADLIB_BODY], | 186 | AC_DEFUN([gl_PTHREADLIB_BODY], |
| 189 | [ | 187 | [ |
| 190 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) | 188 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) |
| 191 | if test -z "$gl_pthreadlib_body_done"; then | 189 | AS_IF([test -z "$gl_pthreadlib_body_done"], [ |
| 192 | gl_pthread_api=no | 190 | gl_pthread_api=no |
| 193 | LIBPTHREAD= | 191 | LIBPTHREAD= |
| 194 | LIBPMULTITHREAD= | 192 | LIBPMULTITHREAD= |
| 195 | # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that | 193 | # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that |
| 196 | # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY. | 194 | # it groks <pthread.h>. It is added above, in gl_ANYTHREADLIB_EARLY. |
| 197 | AC_CHECK_HEADER([pthread.h], | 195 | AC_CHECK_HEADER([pthread.h], |
| 198 | [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) | 196 | [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) |
| 199 | if test "$gl_have_pthread_h" = yes; then | 197 | AS_IF([test "$gl_have_pthread_h" = yes], [ |
| 200 | # Other possible tests: | 198 | # Other possible tests: |
| 201 | # -lpthreads (FSU threads, PCthreads) | 199 | # -lpthreads (FSU threads, PCthreads) |
| 202 | # -lgthreads | 200 | # -lgthreads |
| @@ -208,7 +206,7 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 208 | # needs -pthread for some reason. See: | 206 | # needs -pthread for some reason. See: |
| 209 | # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html | 207 | # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html |
| 210 | saved_LIBS="$LIBS" | 208 | saved_LIBS="$LIBS" |
| 211 | for gl_pthread in '' '-pthread'; do | 209 | for gl_pthread in "" "-pthread"; do |
| 212 | LIBS="$LIBS $gl_pthread" | 210 | LIBS="$LIBS $gl_pthread" |
| 213 | AC_LINK_IFELSE( | 211 | AC_LINK_IFELSE( |
| 214 | [AC_LANG_PROGRAM( | 212 | [AC_LANG_PROGRAM( |
| @@ -230,8 +228,9 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 230 | gl_pthread_in_glibc=no | 228 | gl_pthread_in_glibc=no |
| 231 | # On Linux with glibc >= 2.34, libc contains the fully functional | 229 | # On Linux with glibc >= 2.34, libc contains the fully functional |
| 232 | # pthread functions. | 230 | # pthread functions. |
| 233 | case "$host_os" in | 231 | AS_CASE([$host_os], |
| 234 | linux*) | 232 | [linux*], |
| 233 | [ | ||
| 235 | AC_EGREP_CPP([Lucky user], | 234 | AC_EGREP_CPP([Lucky user], |
| 236 | [#include <features.h> | 235 | [#include <features.h> |
| 237 | #ifdef __GNU_LIBRARY__ | 236 | #ifdef __GNU_LIBRARY__ |
| @@ -242,19 +241,18 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 242 | ], | 241 | ], |
| 243 | [gl_pthread_in_glibc=yes], | 242 | [gl_pthread_in_glibc=yes], |
| 244 | []) | 243 | []) |
| 245 | ;; | 244 | ]) |
| 246 | esac | ||
| 247 | echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD | 245 | echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD |
| 248 | 246 | ||
| 249 | # Test for libpthread by looking for pthread_kill. (Not pthread_self, | 247 | # Test for libpthread by looking for pthread_kill. (Not pthread_self, |
| 250 | # since it is defined as a macro on OSF/1.) | 248 | # since it is defined as a macro on OSF/1.) |
| 251 | if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then | 249 | AS_IF([test $gl_pthread_api = yes && test -z "$LIBPTHREAD"], [ |
| 252 | # The program links fine without libpthread. But it may actually | 250 | # The program links fine without libpthread. But it may actually |
| 253 | # need to link with libpthread in order to create multiple threads. | 251 | # need to link with libpthread in order to create multiple threads. |
| 254 | AC_CHECK_LIB([pthread], [pthread_kill], | 252 | AC_CHECK_LIB([pthread], [pthread_kill], |
| 255 | [if test $gl_pthread_in_glibc = yes; then | 253 | [AS_IF([test $gl_pthread_in_glibc = yes], [ |
| 256 | LIBPMULTITHREAD= | 254 | LIBPMULTITHREAD= |
| 257 | else | 255 | ], [ |
| 258 | LIBPMULTITHREAD=-lpthread | 256 | LIBPMULTITHREAD=-lpthread |
| 259 | # On Solaris and HP-UX, most pthread functions exist also in libc. | 257 | # On Solaris and HP-UX, most pthread functions exist also in libc. |
| 260 | # Therefore pthread_in_use() needs to actually try to create a | 258 | # Therefore pthread_in_use() needs to actually try to create a |
| @@ -262,14 +260,13 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 262 | # pthread_create will actually create a thread. | 260 | # pthread_create will actually create a thread. |
| 263 | # On Solaris 10 or newer, this test is no longer needed, because | 261 | # On Solaris 10 or newer, this test is no longer needed, because |
| 264 | # libc contains the fully functional pthread functions. | 262 | # libc contains the fully functional pthread functions. |
| 265 | case "$host_os" in | 263 | AS_CASE([$host_os], |
| 266 | changequote(,)dnl | 264 | [[solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*]], |
| 267 | solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*) | 265 | [ |
| 268 | changequote([,])dnl | 266 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], |
| 269 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], | 267 | [Define if the pthread_in_use() detection is hard.]) |
| 270 | [Define if the pthread_in_use() detection is hard.]) | 268 | ]) |
| 271 | esac | 269 | ]) |
| 272 | fi | ||
| 273 | ], | 270 | ], |
| 274 | [dnl This is needed on FreeBSD 5.2.1. | 271 | [dnl This is needed on FreeBSD 5.2.1. |
| 275 | AC_CHECK_LIB([thr], [pthread_kill], | 272 | AC_CHECK_LIB([thr], [pthread_kill], |
| @@ -280,35 +277,36 @@ changequote([,])dnl | |||
| 280 | fi | 277 | fi |
| 281 | ]) | 278 | ]) |
| 282 | ]) | 279 | ]) |
| 283 | elif test $gl_pthread_api != yes; then | 280 | ], [test $gl_pthread_api != yes], [ |
| 284 | # Some library is needed. Try libpthread and libc_r. | 281 | # Some library is needed. Try libpthread and libc_r. |
| 285 | AC_CHECK_LIB([pthread], [pthread_kill], | 282 | AC_CHECK_LIB([pthread], [pthread_kill], |
| 286 | [gl_pthread_api=yes | 283 | [gl_pthread_api=yes |
| 287 | LIBPTHREAD=-lpthread | 284 | LIBPTHREAD=-lpthread |
| 288 | LIBPMULTITHREAD=-lpthread]) | 285 | LIBPMULTITHREAD=-lpthread]) |
| 289 | if test $gl_pthread_api != yes; then | 286 | AS_IF([test $gl_pthread_api != yes], [ |
| 290 | # For FreeBSD 4. | 287 | # For FreeBSD 4. |
| 291 | AC_CHECK_LIB([c_r], [pthread_kill], | 288 | AC_CHECK_LIB([c_r], [pthread_kill], |
| 292 | [gl_pthread_api=yes | 289 | [gl_pthread_api=yes |
| 293 | LIBPTHREAD=-lc_r | 290 | LIBPTHREAD=-lc_r |
| 294 | LIBPMULTITHREAD=-lc_r]) | 291 | LIBPMULTITHREAD=-lc_r]) |
| 295 | fi | 292 | ]) |
| 296 | fi | 293 | ]) |
| 297 | echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD | 294 | echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD |
| 298 | fi | 295 | ]) |
| 299 | AC_MSG_CHECKING([whether POSIX threads API is available]) | 296 | AC_MSG_CHECKING([whether POSIX threads API is available]) |
| 300 | AC_MSG_RESULT([$gl_pthread_api]) | 297 | AC_MSG_RESULT([$gl_pthread_api]) |
| 301 | AC_SUBST([LIBPTHREAD]) | 298 | AC_SUBST([LIBPTHREAD]) |
| 302 | AC_SUBST([LIBPMULTITHREAD]) | 299 | AC_SUBST([LIBPMULTITHREAD]) |
| 303 | if test $gl_pthread_api = yes; then | 300 | AS_IF([test $gl_pthread_api = yes], [ |
| 304 | AC_DEFINE([HAVE_PTHREAD_API], [1], | 301 | AC_DEFINE([HAVE_PTHREAD_API], [1], |
| 305 | [Define if you have the <pthread.h> header and the POSIX threads API.]) | 302 | [Define if you have the <pthread.h> header and the POSIX threads API.]) |
| 306 | fi | 303 | ]) |
| 307 | 304 | ||
| 308 | dnl On some systems, sched_yield is in librt, rather than in libpthread. | 305 | dnl On some systems, sched_yield is in librt, rather than in libpthread. |
| 309 | AC_LINK_IFELSE( | 306 | AC_LINK_IFELSE( |
| 310 | [AC_LANG_PROGRAM( | 307 | [AC_LANG_PROGRAM( |
| 311 | [[#include <sched.h>]], | 308 | [[#include <sched.h> |
| 309 | ]], | ||
| 312 | [[sched_yield ();]])], | 310 | [[sched_yield ();]])], |
| 313 | [SCHED_YIELD_LIB= | 311 | [SCHED_YIELD_LIB= |
| 314 | ], | 312 | ], |
| @@ -323,7 +321,7 @@ changequote([,])dnl | |||
| 323 | AC_SUBST([LIB_SCHED_YIELD]) | 321 | AC_SUBST([LIB_SCHED_YIELD]) |
| 324 | 322 | ||
| 325 | gl_pthreadlib_body_done=done | 323 | gl_pthreadlib_body_done=done |
| 326 | fi | 324 | ]) |
| 327 | ]) | 325 | ]) |
| 328 | 326 | ||
| 329 | AC_DEFUN([gl_PTHREADLIB], | 327 | AC_DEFUN([gl_PTHREADLIB], |
| @@ -350,44 +348,45 @@ AC_DEFUN([gl_STDTHREADLIB_BODY], | |||
| 350 | [ | 348 | [ |
| 351 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) | 349 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) |
| 352 | AC_REQUIRE([AC_CANONICAL_HOST]) | 350 | AC_REQUIRE([AC_CANONICAL_HOST]) |
| 353 | if test -z "$gl_stdthreadlib_body_done"; then | 351 | AS_IF([test -z "$gl_stdthreadlib_body_done"], [ |
| 354 | AC_CHECK_HEADERS_ONCE([threads.h]) | 352 | AC_CHECK_HEADERS_ONCE([threads.h]) |
| 355 | 353 | ||
| 356 | case "$host_os" in | 354 | AS_CASE([$host_os], |
| 357 | mingw* | windows*) | 355 | [mingw* | windows*], |
| 356 | [ | ||
| 358 | LIBSTDTHREAD= | 357 | LIBSTDTHREAD= |
| 359 | ;; | 358 | ], |
| 360 | *) | 359 | [ |
| 361 | gl_PTHREADLIB_BODY | 360 | gl_PTHREADLIB_BODY |
| 362 | if test $ac_cv_header_threads_h = yes; then | 361 | AS_IF([test $ac_cv_header_threads_h = yes], [ |
| 363 | dnl glibc >= 2.29 has thrd_create in libpthread. | 362 | dnl glibc >= 2.29 has thrd_create in libpthread. |
| 364 | dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends | 363 | dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends |
| 365 | dnl on libpthread (for the symbol 'pthread_mutexattr_gettype'). | 364 | dnl on libpthread (for the symbol pthread_mutexattr_gettype). |
| 366 | dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in | 365 | dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in |
| 367 | dnl libc. | 366 | dnl libc. |
| 368 | gl_CHECK_FUNCS_ANDROID([thrd_create], [[#include <threads.h>]]) | 367 | gl_CHECK_FUNCS_ANDROID([thrd_create], [[#include <threads.h> |
| 369 | if test $ac_cv_func_thrd_create = yes; then | 368 | ]]) |
| 369 | AS_IF([test $ac_cv_func_thrd_create = yes], [ | ||
| 370 | LIBSTDTHREAD= | 370 | LIBSTDTHREAD= |
| 371 | else | 371 | ], [ |
| 372 | AC_CHECK_LIB([stdthreads], [thrd_create], [ | 372 | AC_CHECK_LIB([stdthreads], [thrd_create], [ |
| 373 | LIBSTDTHREAD='-lstdthreads -lpthread' | 373 | LIBSTDTHREAD="-lstdthreads -lpthread" |
| 374 | ], [ | 374 | ], [ |
| 375 | dnl Guess that thrd_create is in libpthread. | 375 | dnl Guess that thrd_create is in libpthread. |
| 376 | LIBSTDTHREAD="$LIBPMULTITHREAD" | 376 | LIBSTDTHREAD="$LIBPMULTITHREAD" |
| 377 | ]) | 377 | ]) |
| 378 | fi | 378 | ]) |
| 379 | else | 379 | ], [ |
| 380 | dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c. | 380 | dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c. |
| 381 | LIBSTDTHREAD="$LIBPMULTITHREAD $SCHED_YIELD_LIB" | 381 | LIBSTDTHREAD="$LIBPMULTITHREAD $SCHED_YIELD_LIB" |
| 382 | fi | 382 | ]) |
| 383 | ;; | 383 | ]) |
| 384 | esac | ||
| 385 | AC_SUBST([LIBSTDTHREAD]) | 384 | AC_SUBST([LIBSTDTHREAD]) |
| 386 | 385 | ||
| 387 | AC_MSG_CHECKING([whether ISO C threads API is available]) | 386 | AC_MSG_CHECKING([whether ISO C threads API is available]) |
| 388 | AC_MSG_RESULT([$ac_cv_header_threads_h]) | 387 | AC_MSG_RESULT([$ac_cv_header_threads_h]) |
| 389 | gl_stdthreadlib_body_done=done | 388 | gl_stdthreadlib_body_done=done |
| 390 | fi | 389 | ]) |
| 391 | ]) | 390 | ]) |
| 392 | 391 | ||
| 393 | AC_DEFUN([gl_STDTHREADLIB], | 392 | AC_DEFUN([gl_STDTHREADLIB], |
| @@ -404,7 +403,7 @@ dnl ------------ | |||
| 404 | dnl Tests for a multithreading library to be used. | 403 | dnl Tests for a multithreading library to be used. |
| 405 | dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO | 404 | dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO |
| 406 | dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the | 405 | dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the |
| 407 | dnl default is 'no', otherwise it is system dependent. In both cases, the user | 406 | dnl default is "no", otherwise it is system dependent. In both cases, the user |
| 408 | dnl can change the choice through the options --enable-threads=choice or | 407 | dnl can change the choice through the options --enable-threads=choice or |
| 409 | dnl --disable-threads. | 408 | dnl --disable-threads. |
| 410 | dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, | 409 | dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, |
| @@ -449,7 +448,7 @@ AC_DEFUN([gl_THREADLIB_EARLY_BODY], | |||
| 449 | m4_ifdef([gl_THREADLIB_DEFAULT_NO], | 448 | m4_ifdef([gl_THREADLIB_DEFAULT_NO], |
| 450 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])], | 449 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])], |
| 451 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=])]) | 450 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=])]) |
| 452 | dnl gl_use_winpthreads_default defaults to 'no', because in mingw 10, like | 451 | dnl gl_use_winpthreads_default defaults to "no", because in mingw 10, like |
| 453 | dnl in mingw 5, the use of libwinpthread still makes test-pthread-tss crash. | 452 | dnl in mingw 5, the use of libwinpthread still makes test-pthread-tss crash. |
| 454 | m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=no]) | 453 | m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=no]) |
| 455 | AC_ARG_ENABLE([threads], | 454 | AC_ARG_ENABLE([threads], |
| @@ -459,41 +458,35 @@ AS_HELP_STRING([[--disable-threads]], [build without multithread safety])]), | |||
| 459 | [if test -n "$gl_use_threads_default"; then | 458 | [if test -n "$gl_use_threads_default"; then |
| 460 | gl_use_threads="$gl_use_threads_default" | 459 | gl_use_threads="$gl_use_threads_default" |
| 461 | else | 460 | else |
| 462 | changequote(,)dnl | 461 | AS_CASE([$host_os], |
| 463 | case "$host_os" in | ||
| 464 | dnl Disable multithreading by default on OSF/1, because it interferes | 462 | dnl Disable multithreading by default on OSF/1, because it interferes |
| 465 | dnl with fork()/exec(): When msgexec is linked with -lpthread, its | 463 | dnl with fork()/exec(): When msgexec is linked with -lpthread, its |
| 466 | dnl child process gets an endless segmentation fault inside execvp(). | 464 | dnl child process gets an endless segmentation fault inside execvp(). |
| 467 | osf*) gl_use_threads=no ;; | 465 | [osf*], [gl_use_threads=no], |
| 468 | dnl Disable multithreading by default on Cygwin 1.5.x, because it has | 466 | dnl Disable multithreading by default on Cygwin 1.5.x, because it has |
| 469 | dnl bugs that lead to endless loops or crashes. See | 467 | dnl bugs that lead to endless loops or crashes. See |
| 470 | dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>. | 468 | dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>. |
| 471 | cygwin*) | 469 | [cygwin*], |
| 472 | case `uname -r` in | 470 | [AS_CASE([$(uname -r)], |
| 473 | 1.[0-5].*) gl_use_threads=no ;; | 471 | [[1.[0-5].*]], [gl_use_threads=no], |
| 474 | *) gl_use_threads=yes ;; | 472 | [gl_use_threads=yes]) |
| 475 | esac | 473 | ], |
| 476 | ;; | ||
| 477 | dnl Obey gl_AVOID_WINPTHREAD on mingw. | 474 | dnl Obey gl_AVOID_WINPTHREAD on mingw. |
| 478 | mingw* | windows*) | 475 | [mingw* | windows*], |
| 479 | case "$gl_use_winpthreads_default" in | 476 | [AS_CASE([$gl_use_winpthreads_default], |
| 480 | yes) gl_use_threads=posix ;; | 477 | [yes], [gl_use_threads=posix], |
| 481 | no) gl_use_threads=windows ;; | 478 | [no], [gl_use_threads=windows], |
| 482 | *) gl_use_threads=yes ;; | 479 | [gl_use_threads=yes]) |
| 483 | esac | 480 | ], |
| 484 | ;; | 481 | [gl_use_threads=yes]) |
| 485 | *) gl_use_threads=yes ;; | ||
| 486 | esac | ||
| 487 | changequote([,])dnl | ||
| 488 | fi | 482 | fi |
| 489 | ]) | 483 | ]) |
| 490 | if test "$gl_use_threads" = yes \ | 484 | AS_CASE([$gl_use_threads], |
| 491 | || test "$gl_use_threads" = isoc \ | 485 | [yes | isoc | posix | isoc+posix], |
| 492 | || test "$gl_use_threads" = posix \ | 486 | [ |
| 493 | || test "$gl_use_threads" = isoc+posix; then | 487 | # For using <threads.h> or <pthread.h>: |
| 494 | # For using <threads.h> or <pthread.h>: | 488 | gl_ANYTHREADLIB_EARLY |
| 495 | gl_ANYTHREADLIB_EARLY | 489 | ]) |
| 496 | fi | ||
| 497 | ]) | 490 | ]) |
| 498 | 491 | ||
| 499 | dnl The guts of gl_THREADLIB. Needs to be expanded only once. | 492 | dnl The guts of gl_THREADLIB. Needs to be expanded only once. |
| @@ -506,90 +499,95 @@ AC_DEFUN([gl_THREADLIB_BODY], | |||
| 506 | LTLIBTHREAD= | 499 | LTLIBTHREAD= |
| 507 | LIBMULTITHREAD= | 500 | LIBMULTITHREAD= |
| 508 | LTLIBMULTITHREAD= | 501 | LTLIBMULTITHREAD= |
| 509 | if test "$gl_use_threads" != no; then | 502 | AS_IF([test "$gl_use_threads" = no], |
| 503 | [AC_DEFINE([AVOID_ANY_THREADS], [1], | ||
| 504 | [Define if no multithread safety and no multithreading is desired.])], | ||
| 505 | [ | ||
| 510 | dnl Check whether the compiler and linker support weak declarations. | 506 | dnl Check whether the compiler and linker support weak declarations. |
| 511 | gl_WEAK_SYMBOLS | 507 | gl_WEAK_SYMBOLS |
| 512 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then | 508 | AS_CASE([$gl_cv_have_weak], |
| 513 | dnl If we use weak symbols to implement pthread_in_use / pth_in_use / | 509 | [*yes], |
| 514 | dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create | 510 | [ |
| 515 | dnl facility is in use. | 511 | dnl If we use weak symbols to implement pthread_in_use / pth_in_use / |
| 516 | AC_CHECK_HEADERS_ONCE([threads.h]) | 512 | dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create |
| 517 | : | 513 | dnl facility is in use. |
| 518 | fi | 514 | AC_CHECK_HEADERS_ONCE([threads.h]) |
| 519 | if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then | 515 | : |
| 520 | AC_CHECK_HEADERS_ONCE([threads.h]) | 516 | ]) |
| 521 | gl_have_isoc_threads="$ac_cv_header_threads_h" | 517 | AS_CASE([$gl_use_threads], |
| 522 | fi | 518 | [isoc | isoc+posix], |
| 523 | if test "$gl_use_threads" = yes \ | 519 | [ |
| 524 | || test "$gl_use_threads" = posix \ | 520 | AC_CHECK_HEADERS_ONCE([threads.h]) |
| 525 | || test "$gl_use_threads" = isoc+posix; then | 521 | gl_have_isoc_threads="$ac_cv_header_threads_h" |
| 526 | gl_PTHREADLIB_BODY | 522 | ]) |
| 527 | LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD | 523 | AS_CASE([$gl_use_threads], |
| 528 | LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD | 524 | [yes | posix | isoc+posix], |
| 529 | if test $gl_pthread_api = yes; then | 525 | [ |
| 530 | if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then | 526 | gl_PTHREADLIB_BODY |
| 531 | gl_threads_api='isoc+posix' | 527 | LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD |
| 532 | AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1], | 528 | LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD |
| 533 | [Define if the combination of the ISO C and POSIX multithreading APIs can be used.]) | 529 | AS_IF([test $gl_pthread_api = yes], [ |
| 534 | LIBTHREAD= LTLIBTHREAD= | 530 | AS_IF([test "$gl_use_threads" = isoc+posix && |
| 535 | else | 531 | test "$gl_have_isoc_threads" = yes], [ |
| 536 | gl_threads_api=posix | 532 | gl_threads_api="isoc+posix" |
| 537 | AC_DEFINE([USE_POSIX_THREADS], [1], | 533 | AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1], |
| 538 | [Define if the POSIX multithreading library can be used.]) | 534 | [Define if the combination of the ISO C and POSIX multithreading APIs can be used.]) |
| 539 | if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then | 535 | LIBTHREAD= LTLIBTHREAD= |
| 540 | AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1], | 536 | ], [ |
| 541 | [Define if references to the POSIX multithreading library are satisfied by libc.]) | 537 | gl_threads_api=posix |
| 542 | else | 538 | AC_DEFINE([USE_POSIX_THREADS], [1], |
| 543 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then | 539 | [Define if the POSIX multithreading library can be used.]) |
| 544 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], | 540 | AS_IF([test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"], [ |
| 545 | [Define if references to the POSIX multithreading library should be made weak.]) | 541 | AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1], |
| 546 | LIBTHREAD= LTLIBTHREAD= | 542 | [Define if references to the POSIX multithreading library are satisfied by libc.]) |
| 547 | else | 543 | ], [ |
| 548 | case "$host_os" in | 544 | AS_CASE([$gl_cv_have_weak], |
| 549 | freebsd* | dragonfly* | midnightbsd*) | 545 | [*yes], |
| 550 | if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then | 546 | [ |
| 551 | dnl If weak symbols can't tell whether pthread_create(), pthread_key_create() | 547 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], |
| 552 | dnl etc. will succeed, we need a runtime test. | 548 | [Define if references to the POSIX multithreading library should be made weak.]) |
| 553 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], | 549 | LIBTHREAD= LTLIBTHREAD= |
| 554 | [Define if the pthread_in_use() detection is hard.]) | 550 | ], |
| 555 | fi | 551 | [AS_CASE([$host_os], |
| 556 | ;; | 552 | [freebsd* | dragonfly* | midnightbsd*], |
| 557 | esac | 553 | [ |
| 558 | fi | 554 | AS_IF([test "x$LIBTHREAD" != "x$LIBMULTITHREAD"], [ |
| 559 | fi | 555 | dnl If weak symbols cannot tell whether |
| 560 | fi | 556 | dnl pthread_create(), dnl pthread_key_create() |
| 561 | fi | 557 | dnl etc. will succeed, we need a runtime test. |
| 562 | fi | 558 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], |
| 563 | if test $gl_threads_api = none; then | 559 | [Define if the pthread_in_use() detection is hard.]) |
| 564 | if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then | 560 | ]) |
| 561 | ]) | ||
| 562 | ]) | ||
| 563 | ]) | ||
| 564 | ]) | ||
| 565 | ]) | ||
| 566 | ]) | ||
| 567 | AS_IF([test $gl_threads_api = none], [ | ||
| 568 | AS_IF([test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes], [ | ||
| 565 | gl_STDTHREADLIB_BODY | 569 | gl_STDTHREADLIB_BODY |
| 566 | LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD | 570 | LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD |
| 567 | LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD | 571 | LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD |
| 568 | gl_threads_api=isoc | 572 | gl_threads_api=isoc |
| 569 | AC_DEFINE([USE_ISOC_THREADS], [1], | 573 | AC_DEFINE([USE_ISOC_THREADS], [1], |
| 570 | [Define if the ISO C multithreading library can be used.]) | 574 | [Define if the ISO C multithreading library can be used.]) |
| 571 | fi | 575 | ]) |
| 572 | fi | 576 | ]) |
| 573 | if test $gl_threads_api = none; then | 577 | AS_IF([test $gl_threads_api = none], [ |
| 574 | case "$gl_use_threads" in | 578 | # The "win32" is for backward compatibility. |
| 575 | yes | windows | win32) # The 'win32' is for backward compatibility. | 579 | AS_CASE([$gl_use_threads], |
| 576 | if { case "$host_os" in | 580 | [yes | windows | win32], |
| 577 | mingw* | windows*) true;; | 581 | [AS_CASE([$host_os], |
| 578 | *) false;; | 582 | [mingw* | windows*], |
| 579 | esac | 583 | [ |
| 580 | }; then | 584 | gl_threads_api=windows |
| 581 | gl_threads_api=windows | 585 | AC_DEFINE([USE_WINDOWS_THREADS], [1], |
| 582 | AC_DEFINE([USE_WINDOWS_THREADS], [1], | 586 | [Define if the native Windows multithreading API can be used.]) |
| 583 | [Define if the native Windows multithreading API can be used.]) | 587 | ]) |
| 584 | fi | 588 | ]) |
| 585 | ;; | 589 | ]) |
| 586 | esac | 590 | ]) |
| 587 | fi | ||
| 588 | else | ||
| 589 | dnl "$gl_use_threads" is "no". | ||
| 590 | AC_DEFINE([AVOID_ANY_THREADS], [1], | ||
| 591 | [Define if no multithread safety and no multithreading is desired.]) | ||
| 592 | fi | ||
| 593 | AC_MSG_CHECKING([for multithread API to use]) | 591 | AC_MSG_CHECKING([for multithread API to use]) |
| 594 | AC_MSG_RESULT([$gl_threads_api]) | 592 | AC_MSG_RESULT([$gl_threads_api]) |
| 595 | AC_SUBST([LIBTHREAD]) | 593 | AC_SUBST([LIBTHREAD]) |
| @@ -609,7 +607,7 @@ dnl gl_DISABLE_THREADS | |||
| 609 | dnl ------------------ | 607 | dnl ------------------ |
| 610 | dnl Sets the gl_THREADLIB default so that threads are not used by default. | 608 | dnl Sets the gl_THREADLIB default so that threads are not used by default. |
| 611 | dnl The user can still override it at installation time, by using the | 609 | dnl The user can still override it at installation time, by using the |
| 612 | dnl configure option '--enable-threads'. | 610 | dnl configure option "--enable-threads". |
| 613 | 611 | ||
| 614 | AC_DEFUN([gl_DISABLE_THREADS], [ | 612 | AC_DEFUN([gl_DISABLE_THREADS], [ |
| 615 | m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) | 613 | m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) |
| @@ -621,7 +619,7 @@ dnl ------------------- | |||
| 621 | dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the | 619 | dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the |
| 622 | dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. | 620 | dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. |
| 623 | dnl The user can still override it at installation time, by using the | 621 | dnl The user can still override it at installation time, by using the |
| 624 | dnl configure option '--enable-threads=posix'. | 622 | dnl configure option "--enable-threads=posix". |
| 625 | dnl As of 2023, this is now the default. | 623 | dnl As of 2023, this is now the default. |
| 626 | 624 | ||
| 627 | AC_DEFUN([gl_AVOID_WINPTHREAD], [ | 625 | AC_DEFUN([gl_AVOID_WINPTHREAD], [ |
