diff options
Diffstat (limited to 'gl/m4/threadlib.m4')
| -rw-r--r-- | gl/m4/threadlib.m4 | 403 |
1 files changed, 190 insertions, 213 deletions
diff --git a/gl/m4/threadlib.m4 b/gl/m4/threadlib.m4 index f5e81479..bdea4b97 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 49 |
| 3 | dnl Copyright (C) 2005-2024 Free Software Foundation, Inc. | 3 | dnl Copyright (C) 2005-2026 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,12 @@ 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 | osf*) | ||
| 61 | # 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 | # we don't use it because 1. gcc-2.95 doesn't understand -pthread, | ||
| 64 | # 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 | # leading to wrong values of LIBTHREAD and LTLIBTHREAD. | ||
| 67 | CPPFLAGS="$CPPFLAGS -D_REENTRANT" | ||
| 68 | ;; | ||
| 69 | esac | ||
| 70 | # Some systems optimize for single-threaded programs by default, and | 60 | # Some systems optimize for single-threaded programs by default, and |
| 71 | # need special flags to disable these optimizations. For example, the | 61 | # need special flags to disable these optimizations. For example, the |
| 72 | # definition of 'errno' in <errno.h>. | 62 | # definition of errno in <errno.h>. |
| 73 | case "$host_os" in | 63 | AS_CASE([$host_os], |
| 74 | aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;; | 64 | [aix* | freebsd*], [CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE"], |
| 75 | solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;; | 65 | [hpux* | solaris*], [CPPFLAGS="$CPPFLAGS -D_REENTRANT"]) |
| 76 | esac | ||
| 77 | gl_anythreadlib_early_done=done | 66 | gl_anythreadlib_early_done=done |
| 78 | fi | 67 | fi |
| 79 | ]) | 68 | ]) |
| @@ -85,24 +74,26 @@ AC_DEFUN([gl_WEAK_SYMBOLS], | |||
| 85 | AC_REQUIRE([AC_CANONICAL_HOST]) | 74 | AC_REQUIRE([AC_CANONICAL_HOST]) |
| 86 | AC_CACHE_CHECK([whether imported symbols can be declared weak], | 75 | AC_CACHE_CHECK([whether imported symbols can be declared weak], |
| 87 | [gl_cv_have_weak], | 76 | [gl_cv_have_weak], |
| 88 | [case "$host_os" in | 77 | [AS_CASE([$host_os], |
| 89 | cygwin* | mingw* | windows*) | 78 | [cygwin* | mingw* | windows*], |
| 79 | [ | ||
| 90 | dnl On Cygwin 3.2.0 with gcc 10.2, and likewise on mingw 10.0.0 with | 80 | 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 | 81 | 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 | 82 | dnl pthread_in_use() with weak symbol references crash miserably at |
| 93 | dnl runtime. | 83 | dnl runtime. |
| 94 | gl_cv_have_weak="guessing no" | 84 | gl_cv_have_weak="guessing no" |
| 95 | ;; | 85 | ], |
| 96 | *) | 86 | [ |
| 97 | gl_cv_have_weak=no | 87 | gl_cv_have_weak=no |
| 98 | dnl First, test whether the compiler accepts it syntactically. | 88 | dnl First, test whether the compiler accepts it syntactically. |
| 99 | AC_LINK_IFELSE( | 89 | AC_LINK_IFELSE( |
| 100 | [AC_LANG_PROGRAM( | 90 | [AC_LANG_PROGRAM( |
| 101 | [[extern void xyzzy (); | 91 | [[extern void xyzzy (); |
| 102 | #pragma weak xyzzy]], | 92 | #pragma weak xyzzy |
| 93 | ]], | ||
| 103 | [[xyzzy();]])], | 94 | [[xyzzy();]])], |
| 104 | [gl_cv_have_weak=maybe]) | 95 | [gl_cv_have_weak=maybe]) |
| 105 | if test $gl_cv_have_weak = maybe; then | 96 | AS_IF([test $gl_cv_have_weak = maybe], [ |
| 106 | dnl Second, test whether it actually works. On Cygwin 1.7.2, with | 97 | 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. | 98 | dnl gcc 4.3, symbols declared weak always evaluate to the address 0. |
| 108 | AC_RUN_IFELSE( | 99 | AC_RUN_IFELSE( |
| @@ -125,20 +116,19 @@ int main () | |||
| 125 | [gl_cv_have_weak="guessing yes"], | 116 | [gl_cv_have_weak="guessing yes"], |
| 126 | [gl_cv_have_weak="guessing no"]) | 117 | [gl_cv_have_weak="guessing no"]) |
| 127 | ]) | 118 | ]) |
| 128 | fi | 119 | ]) |
| 129 | ;; | 120 | ]) |
| 130 | esac | 121 | dnl But when linking statically, weak symbols do not work. |
| 131 | dnl But when linking statically, weak symbols don't work. | 122 | AS_CASE([" $LDFLAGS "], |
| 132 | case " $LDFLAGS " in | 123 | [*" -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 | 124 | 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 | 125 | dnl symbol and linking against a shared library that has a dependency on |
| 137 | dnl the shared library that defines the symbol. | 126 | dnl the shared library that defines the symbol. |
| 138 | case "$gl_cv_have_weak" in | 127 | AS_CASE([$gl_cv_have_weak], |
| 139 | *yes) | 128 | [*yes], |
| 140 | case "$host_os" in | 129 | [AS_CASE([$host_os], |
| 141 | freebsd* | dragonfly* | midnightbsd*) | 130 | [freebsd* | dragonfly* | midnightbsd*], |
| 131 | [ | ||
| 142 | : > conftest1.c | 132 | : > conftest1.c |
| 143 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1 | 133 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1 |
| 144 | cat <<EOF > conftest2.c | 134 | cat <<EOF > conftest2.c |
| @@ -152,17 +142,15 @@ EOF | |||
| 152 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \ | 142 | $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \ |
| 153 | || gl_cv_have_weak=no | 143 | || gl_cv_have_weak=no |
| 154 | rm -f conftest1.c libempty.so conftest2.c conftest | 144 | rm -f conftest1.c libempty.so conftest2.c conftest |
| 155 | ;; | 145 | ]) |
| 156 | esac | 146 | ]) |
| 157 | ;; | ||
| 158 | esac | ||
| 159 | ]) | 147 | ]) |
| 160 | case "$gl_cv_have_weak" in | 148 | AS_CASE([$gl_cv_have_weak], |
| 161 | *yes) | 149 | [*yes], |
| 150 | [ | ||
| 162 | AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], | 151 | AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], |
| 163 | [Define to 1 if the compiler and linker support weak declarations of symbols.]) | 152 | [Define to 1 if the compiler and linker support weak declarations of symbols.]) |
| 164 | ;; | 153 | ]) |
| 165 | esac | ||
| 166 | ]) | 154 | ]) |
| 167 | 155 | ||
| 168 | dnl ============================================================================ | 156 | dnl ============================================================================ |
| @@ -188,36 +176,30 @@ dnl The guts of gl_PTHREADLIB. Needs to be expanded only once. | |||
| 188 | AC_DEFUN([gl_PTHREADLIB_BODY], | 176 | AC_DEFUN([gl_PTHREADLIB_BODY], |
| 189 | [ | 177 | [ |
| 190 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) | 178 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) |
| 191 | if test -z "$gl_pthreadlib_body_done"; then | 179 | AS_IF([test -z "$gl_pthreadlib_body_done"], [ |
| 192 | gl_pthread_api=no | 180 | gl_pthread_api=no |
| 193 | LIBPTHREAD= | 181 | LIBPTHREAD= |
| 194 | LIBPMULTITHREAD= | 182 | LIBPMULTITHREAD= |
| 195 | # 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. | ||
| 197 | AC_CHECK_HEADER([pthread.h], | 183 | AC_CHECK_HEADER([pthread.h], |
| 198 | [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) | 184 | [gl_have_pthread_h=yes], [gl_have_pthread_h=no]) |
| 199 | if test "$gl_have_pthread_h" = yes; then | 185 | AS_IF([test "$gl_have_pthread_h" = yes], [ |
| 200 | # Other possible tests: | 186 | # Other possible tests: |
| 201 | # -lpthreads (FSU threads, PCthreads) | 187 | # -lpthreads (FSU threads, PCthreads) |
| 202 | # -lgthreads | 188 | # -lgthreads |
| 203 | # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist | 189 | # Test whether both pthread_mutex_lock exists in libc. |
| 204 | # in libc. IRIX 6.5 has the first one in both libc and libpthread, but | ||
| 205 | # the second one only in libpthread, and lock.c needs it. | ||
| 206 | # | 190 | # |
| 207 | # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 | 191 | # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04 |
| 208 | # needs -pthread for some reason. See: | 192 | # needs -pthread for some reason. See: |
| 209 | # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html | 193 | # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html |
| 210 | saved_LIBS="$LIBS" | 194 | saved_LIBS="$LIBS" |
| 211 | for gl_pthread in '' '-pthread'; do | 195 | for gl_pthread in "" "-pthread"; do |
| 212 | LIBS="$LIBS $gl_pthread" | 196 | LIBS="$LIBS $gl_pthread" |
| 213 | AC_LINK_IFELSE( | 197 | AC_LINK_IFELSE( |
| 214 | [AC_LANG_PROGRAM( | 198 | [AC_LANG_PROGRAM( |
| 215 | [[#include <pthread.h> | 199 | [[#include <pthread.h> |
| 216 | pthread_mutex_t m; | 200 | pthread_mutex_t m; |
| 217 | pthread_mutexattr_t ma; | ||
| 218 | ]], | 201 | ]], |
| 219 | [[pthread_mutex_lock (&m); | 202 | [[pthread_mutex_lock (&m);]])], |
| 220 | pthread_mutexattr_init (&ma);]])], | ||
| 221 | [gl_pthread_api=yes | 203 | [gl_pthread_api=yes |
| 222 | LIBPTHREAD=$gl_pthread | 204 | LIBPTHREAD=$gl_pthread |
| 223 | LIBPMULTITHREAD=$gl_pthread]) | 205 | LIBPMULTITHREAD=$gl_pthread]) |
| @@ -230,8 +212,9 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 230 | gl_pthread_in_glibc=no | 212 | gl_pthread_in_glibc=no |
| 231 | # On Linux with glibc >= 2.34, libc contains the fully functional | 213 | # On Linux with glibc >= 2.34, libc contains the fully functional |
| 232 | # pthread functions. | 214 | # pthread functions. |
| 233 | case "$host_os" in | 215 | AS_CASE([$host_os], |
| 234 | linux*) | 216 | [linux*], |
| 217 | [ | ||
| 235 | AC_EGREP_CPP([Lucky user], | 218 | AC_EGREP_CPP([Lucky user], |
| 236 | [#include <features.h> | 219 | [#include <features.h> |
| 237 | #ifdef __GNU_LIBRARY__ | 220 | #ifdef __GNU_LIBRARY__ |
| @@ -242,19 +225,17 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 242 | ], | 225 | ], |
| 243 | [gl_pthread_in_glibc=yes], | 226 | [gl_pthread_in_glibc=yes], |
| 244 | []) | 227 | []) |
| 245 | ;; | 228 | ]) |
| 246 | esac | ||
| 247 | echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD | 229 | echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD |
| 248 | 230 | ||
| 249 | # Test for libpthread by looking for pthread_kill. (Not pthread_self, | 231 | # Test for libpthread by looking for pthread_kill. |
| 250 | # since it is defined as a macro on OSF/1.) | 232 | AS_IF([test $gl_pthread_api = yes && test -z "$LIBPTHREAD"], [ |
| 251 | if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then | ||
| 252 | # The program links fine without libpthread. But it may actually | 233 | # The program links fine without libpthread. But it may actually |
| 253 | # need to link with libpthread in order to create multiple threads. | 234 | # need to link with libpthread in order to create multiple threads. |
| 254 | AC_CHECK_LIB([pthread], [pthread_kill], | 235 | AC_CHECK_LIB([pthread], [pthread_kill], |
| 255 | [if test $gl_pthread_in_glibc = yes; then | 236 | [AS_IF([test $gl_pthread_in_glibc = yes], [ |
| 256 | LIBPMULTITHREAD= | 237 | LIBPMULTITHREAD= |
| 257 | else | 238 | ], [ |
| 258 | LIBPMULTITHREAD=-lpthread | 239 | LIBPMULTITHREAD=-lpthread |
| 259 | # On Solaris and HP-UX, most pthread functions exist also in libc. | 240 | # On Solaris and HP-UX, most pthread functions exist also in libc. |
| 260 | # Therefore pthread_in_use() needs to actually try to create a | 241 | # Therefore pthread_in_use() needs to actually try to create a |
| @@ -262,14 +243,13 @@ AC_DEFUN([gl_PTHREADLIB_BODY], | |||
| 262 | # pthread_create will actually create a thread. | 243 | # pthread_create will actually create a thread. |
| 263 | # On Solaris 10 or newer, this test is no longer needed, because | 244 | # On Solaris 10 or newer, this test is no longer needed, because |
| 264 | # libc contains the fully functional pthread functions. | 245 | # libc contains the fully functional pthread functions. |
| 265 | case "$host_os" in | 246 | AS_CASE([$host_os], |
| 266 | changequote(,)dnl | 247 | [[solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*]], |
| 267 | solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*) | 248 | [ |
| 268 | changequote([,])dnl | 249 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], |
| 269 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], | 250 | [Define if the pthread_in_use() detection is hard.]) |
| 270 | [Define if the pthread_in_use() detection is hard.]) | 251 | ]) |
| 271 | esac | 252 | ]) |
| 272 | fi | ||
| 273 | ], | 253 | ], |
| 274 | [dnl This is needed on FreeBSD 5.2.1. | 254 | [dnl This is needed on FreeBSD 5.2.1. |
| 275 | AC_CHECK_LIB([thr], [pthread_kill], | 255 | AC_CHECK_LIB([thr], [pthread_kill], |
| @@ -280,35 +260,36 @@ changequote([,])dnl | |||
| 280 | fi | 260 | fi |
| 281 | ]) | 261 | ]) |
| 282 | ]) | 262 | ]) |
| 283 | elif test $gl_pthread_api != yes; then | 263 | ], [test $gl_pthread_api != yes], [ |
| 284 | # Some library is needed. Try libpthread and libc_r. | 264 | # Some library is needed. Try libpthread and libc_r. |
| 285 | AC_CHECK_LIB([pthread], [pthread_kill], | 265 | AC_CHECK_LIB([pthread], [pthread_kill], |
| 286 | [gl_pthread_api=yes | 266 | [gl_pthread_api=yes |
| 287 | LIBPTHREAD=-lpthread | 267 | LIBPTHREAD=-lpthread |
| 288 | LIBPMULTITHREAD=-lpthread]) | 268 | LIBPMULTITHREAD=-lpthread]) |
| 289 | if test $gl_pthread_api != yes; then | 269 | AS_IF([test $gl_pthread_api != yes], [ |
| 290 | # For FreeBSD 4. | 270 | # For FreeBSD 4. |
| 291 | AC_CHECK_LIB([c_r], [pthread_kill], | 271 | AC_CHECK_LIB([c_r], [pthread_kill], |
| 292 | [gl_pthread_api=yes | 272 | [gl_pthread_api=yes |
| 293 | LIBPTHREAD=-lc_r | 273 | LIBPTHREAD=-lc_r |
| 294 | LIBPMULTITHREAD=-lc_r]) | 274 | LIBPMULTITHREAD=-lc_r]) |
| 295 | fi | 275 | ]) |
| 296 | fi | 276 | ]) |
| 297 | echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD | 277 | echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD |
| 298 | fi | 278 | ]) |
| 299 | AC_MSG_CHECKING([whether POSIX threads API is available]) | 279 | AC_MSG_CHECKING([whether POSIX threads API is available]) |
| 300 | AC_MSG_RESULT([$gl_pthread_api]) | 280 | AC_MSG_RESULT([$gl_pthread_api]) |
| 301 | AC_SUBST([LIBPTHREAD]) | 281 | AC_SUBST([LIBPTHREAD]) |
| 302 | AC_SUBST([LIBPMULTITHREAD]) | 282 | AC_SUBST([LIBPMULTITHREAD]) |
| 303 | if test $gl_pthread_api = yes; then | 283 | AS_IF([test $gl_pthread_api = yes], [ |
| 304 | AC_DEFINE([HAVE_PTHREAD_API], [1], | 284 | AC_DEFINE([HAVE_PTHREAD_API], [1], |
| 305 | [Define if you have the <pthread.h> header and the POSIX threads API.]) | 285 | [Define if you have the <pthread.h> header and the POSIX threads API.]) |
| 306 | fi | 286 | ]) |
| 307 | 287 | ||
| 308 | dnl On some systems, sched_yield is in librt, rather than in libpthread. | 288 | dnl On some systems, sched_yield is in librt, rather than in libpthread. |
| 309 | AC_LINK_IFELSE( | 289 | AC_LINK_IFELSE( |
| 310 | [AC_LANG_PROGRAM( | 290 | [AC_LANG_PROGRAM( |
| 311 | [[#include <sched.h>]], | 291 | [[#include <sched.h> |
| 292 | ]], | ||
| 312 | [[sched_yield ();]])], | 293 | [[sched_yield ();]])], |
| 313 | [SCHED_YIELD_LIB= | 294 | [SCHED_YIELD_LIB= |
| 314 | ], | 295 | ], |
| @@ -323,7 +304,7 @@ changequote([,])dnl | |||
| 323 | AC_SUBST([LIB_SCHED_YIELD]) | 304 | AC_SUBST([LIB_SCHED_YIELD]) |
| 324 | 305 | ||
| 325 | gl_pthreadlib_body_done=done | 306 | gl_pthreadlib_body_done=done |
| 326 | fi | 307 | ]) |
| 327 | ]) | 308 | ]) |
| 328 | 309 | ||
| 329 | AC_DEFUN([gl_PTHREADLIB], | 310 | AC_DEFUN([gl_PTHREADLIB], |
| @@ -350,44 +331,45 @@ AC_DEFUN([gl_STDTHREADLIB_BODY], | |||
| 350 | [ | 331 | [ |
| 351 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) | 332 | AC_REQUIRE([gl_ANYTHREADLIB_EARLY]) |
| 352 | AC_REQUIRE([AC_CANONICAL_HOST]) | 333 | AC_REQUIRE([AC_CANONICAL_HOST]) |
| 353 | if test -z "$gl_stdthreadlib_body_done"; then | 334 | AS_IF([test -z "$gl_stdthreadlib_body_done"], [ |
| 354 | AC_CHECK_HEADERS_ONCE([threads.h]) | 335 | AC_CHECK_HEADERS_ONCE([threads.h]) |
| 355 | 336 | ||
| 356 | case "$host_os" in | 337 | AS_CASE([$host_os], |
| 357 | mingw* | windows*) | 338 | [mingw* | windows*], |
| 339 | [ | ||
| 358 | LIBSTDTHREAD= | 340 | LIBSTDTHREAD= |
| 359 | ;; | 341 | ], |
| 360 | *) | 342 | [ |
| 361 | gl_PTHREADLIB_BODY | 343 | gl_PTHREADLIB_BODY |
| 362 | if test $ac_cv_header_threads_h = yes; then | 344 | AS_IF([test $ac_cv_header_threads_h = yes], [ |
| 363 | dnl glibc >= 2.29 has thrd_create in libpthread. | 345 | dnl glibc >= 2.29 has thrd_create in libpthread. |
| 364 | dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends | 346 | dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends |
| 365 | dnl on libpthread (for the symbol 'pthread_mutexattr_gettype'). | 347 | 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 | 348 | dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in |
| 367 | dnl libc. | 349 | dnl libc. |
| 368 | gl_CHECK_FUNCS_ANDROID([thrd_create], [[#include <threads.h>]]) | 350 | gl_CHECK_FUNCS_ANDROID([thrd_create], [[#include <threads.h> |
| 369 | if test $ac_cv_func_thrd_create = yes; then | 351 | ]]) |
| 352 | AS_IF([test $ac_cv_func_thrd_create = yes], [ | ||
| 370 | LIBSTDTHREAD= | 353 | LIBSTDTHREAD= |
| 371 | else | 354 | ], [ |
| 372 | AC_CHECK_LIB([stdthreads], [thrd_create], [ | 355 | AC_CHECK_LIB([stdthreads], [thrd_create], [ |
| 373 | LIBSTDTHREAD='-lstdthreads -lpthread' | 356 | LIBSTDTHREAD="-lstdthreads -lpthread" |
| 374 | ], [ | 357 | ], [ |
| 375 | dnl Guess that thrd_create is in libpthread. | 358 | dnl Guess that thrd_create is in libpthread. |
| 376 | LIBSTDTHREAD="$LIBPMULTITHREAD" | 359 | LIBSTDTHREAD="$LIBPMULTITHREAD" |
| 377 | ]) | 360 | ]) |
| 378 | fi | 361 | ]) |
| 379 | else | 362 | ], [ |
| 380 | dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c. | 363 | dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c. |
| 381 | LIBSTDTHREAD="$LIBPMULTITHREAD $SCHED_YIELD_LIB" | 364 | LIBSTDTHREAD="$LIBPMULTITHREAD $SCHED_YIELD_LIB" |
| 382 | fi | 365 | ]) |
| 383 | ;; | 366 | ]) |
| 384 | esac | ||
| 385 | AC_SUBST([LIBSTDTHREAD]) | 367 | AC_SUBST([LIBSTDTHREAD]) |
| 386 | 368 | ||
| 387 | AC_MSG_CHECKING([whether ISO C threads API is available]) | 369 | AC_MSG_CHECKING([whether ISO C threads API is available]) |
| 388 | AC_MSG_RESULT([$ac_cv_header_threads_h]) | 370 | AC_MSG_RESULT([$ac_cv_header_threads_h]) |
| 389 | gl_stdthreadlib_body_done=done | 371 | gl_stdthreadlib_body_done=done |
| 390 | fi | 372 | ]) |
| 391 | ]) | 373 | ]) |
| 392 | 374 | ||
| 393 | AC_DEFUN([gl_STDTHREADLIB], | 375 | AC_DEFUN([gl_STDTHREADLIB], |
| @@ -404,7 +386,7 @@ dnl ------------ | |||
| 404 | dnl Tests for a multithreading library to be used. | 386 | dnl Tests for a multithreading library to be used. |
| 405 | dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO | 387 | 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 | 388 | 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 | 389 | 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 | 390 | dnl can change the choice through the options --enable-threads=choice or |
| 409 | dnl --disable-threads. | 391 | dnl --disable-threads. |
| 410 | dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, | 392 | dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, |
| @@ -449,51 +431,46 @@ AC_DEFUN([gl_THREADLIB_EARLY_BODY], | |||
| 449 | m4_ifdef([gl_THREADLIB_DEFAULT_NO], | 431 | m4_ifdef([gl_THREADLIB_DEFAULT_NO], |
| 450 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])], | 432 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])], |
| 451 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=])]) | 433 | [m4_divert_text([DEFAULTS], [gl_use_threads_default=])]) |
| 452 | dnl gl_use_winpthreads_default defaults to 'no', because in mingw 10, like | 434 | 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. | 435 | dnl in mingw 5, the use of libwinpthread still makes test-pthread-tss crash. |
| 454 | m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=no]) | 436 | m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=no]) |
| 437 | dnl Don't display the --disable-threads option | ||
| 438 | dnl - if the package builds one or more libraries, because libraries must | ||
| 439 | dnl always be multithread-safe (as far as possible), | ||
| 440 | dnl - if the package defines gl_THREADLIB_DEFAULT_NO, because the option | ||
| 441 | dnl would then be a no-op. | ||
| 455 | AC_ARG_ENABLE([threads], | 442 | AC_ARG_ENABLE([threads], |
| 456 | AS_HELP_STRING([[--enable-threads={isoc|posix|isoc+posix|windows}]], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [ | 443 | AS_HELP_STRING([[--enable-threads={isoc|posix|isoc+posix|windows}]], [specify multithreading API])m4_ifdef([LT_INIT], [], [m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [ |
| 457 | AS_HELP_STRING([[--disable-threads]], [build without multithread safety])]), | 444 | AS_HELP_STRING([[--disable-threads]], [build without multithread safety])])]), |
| 458 | [gl_use_threads=$enableval], | 445 | [gl_use_threads=$enableval], |
| 459 | [if test -n "$gl_use_threads_default"; then | 446 | [if test -n "$gl_use_threads_default"; then |
| 460 | gl_use_threads="$gl_use_threads_default" | 447 | gl_use_threads="$gl_use_threads_default" |
| 461 | else | 448 | else |
| 462 | changequote(,)dnl | 449 | AS_CASE([$host_os], |
| 463 | case "$host_os" in | ||
| 464 | dnl Disable multithreading by default on OSF/1, because it interferes | ||
| 465 | dnl with fork()/exec(): When msgexec is linked with -lpthread, its | ||
| 466 | dnl child process gets an endless segmentation fault inside execvp(). | ||
| 467 | osf*) gl_use_threads=no ;; | ||
| 468 | dnl Disable multithreading by default on Cygwin 1.5.x, because it has | 450 | dnl Disable multithreading by default on Cygwin 1.5.x, because it has |
| 469 | dnl bugs that lead to endless loops or crashes. See | 451 | dnl bugs that lead to endless loops or crashes. See |
| 470 | dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>. | 452 | dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>. |
| 471 | cygwin*) | 453 | [cygwin*], |
| 472 | case `uname -r` in | 454 | [AS_CASE([$(uname -r)], |
| 473 | 1.[0-5].*) gl_use_threads=no ;; | 455 | [[1.[0-5].*]], [gl_use_threads=no], |
| 474 | *) gl_use_threads=yes ;; | 456 | [gl_use_threads=yes]) |
| 475 | esac | 457 | ], |
| 476 | ;; | ||
| 477 | dnl Obey gl_AVOID_WINPTHREAD on mingw. | 458 | dnl Obey gl_AVOID_WINPTHREAD on mingw. |
| 478 | mingw* | windows*) | 459 | [mingw* | windows*], |
| 479 | case "$gl_use_winpthreads_default" in | 460 | [AS_CASE([$gl_use_winpthreads_default], |
| 480 | yes) gl_use_threads=posix ;; | 461 | [yes], [gl_use_threads=posix], |
| 481 | no) gl_use_threads=windows ;; | 462 | [no], [gl_use_threads=windows], |
| 482 | *) gl_use_threads=yes ;; | 463 | [gl_use_threads=yes]) |
| 483 | esac | 464 | ], |
| 484 | ;; | 465 | [gl_use_threads=yes]) |
| 485 | *) gl_use_threads=yes ;; | ||
| 486 | esac | ||
| 487 | changequote([,])dnl | ||
| 488 | fi | 466 | fi |
| 489 | ]) | 467 | ]) |
| 490 | if test "$gl_use_threads" = yes \ | 468 | AS_CASE([$gl_use_threads], |
| 491 | || test "$gl_use_threads" = isoc \ | 469 | [yes | isoc | posix | isoc+posix], |
| 492 | || test "$gl_use_threads" = posix \ | 470 | [ |
| 493 | || test "$gl_use_threads" = isoc+posix; then | 471 | # For using <threads.h> or <pthread.h>: |
| 494 | # For using <threads.h> or <pthread.h>: | 472 | gl_ANYTHREADLIB_EARLY |
| 495 | gl_ANYTHREADLIB_EARLY | 473 | ]) |
| 496 | fi | ||
| 497 | ]) | 474 | ]) |
| 498 | 475 | ||
| 499 | dnl The guts of gl_THREADLIB. Needs to be expanded only once. | 476 | dnl The guts of gl_THREADLIB. Needs to be expanded only once. |
| @@ -506,90 +483,95 @@ AC_DEFUN([gl_THREADLIB_BODY], | |||
| 506 | LTLIBTHREAD= | 483 | LTLIBTHREAD= |
| 507 | LIBMULTITHREAD= | 484 | LIBMULTITHREAD= |
| 508 | LTLIBMULTITHREAD= | 485 | LTLIBMULTITHREAD= |
| 509 | if test "$gl_use_threads" != no; then | 486 | AS_IF([test "$gl_use_threads" = no], |
| 487 | [AC_DEFINE([AVOID_ANY_THREADS], [1], | ||
| 488 | [Define if no multithread safety and no multithreading is desired.])], | ||
| 489 | [ | ||
| 510 | dnl Check whether the compiler and linker support weak declarations. | 490 | dnl Check whether the compiler and linker support weak declarations. |
| 511 | gl_WEAK_SYMBOLS | 491 | gl_WEAK_SYMBOLS |
| 512 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then | 492 | AS_CASE([$gl_cv_have_weak], |
| 513 | dnl If we use weak symbols to implement pthread_in_use / pth_in_use / | 493 | [*yes], |
| 514 | dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create | 494 | [ |
| 515 | dnl facility is in use. | 495 | dnl If we use weak symbols to implement pthread_in_use / pth_in_use / |
| 516 | AC_CHECK_HEADERS_ONCE([threads.h]) | 496 | dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create |
| 517 | : | 497 | dnl facility is in use. |
| 518 | fi | 498 | AC_CHECK_HEADERS_ONCE([threads.h]) |
| 519 | if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then | 499 | : |
| 520 | AC_CHECK_HEADERS_ONCE([threads.h]) | 500 | ]) |
| 521 | gl_have_isoc_threads="$ac_cv_header_threads_h" | 501 | AS_CASE([$gl_use_threads], |
| 522 | fi | 502 | [isoc | isoc+posix], |
| 523 | if test "$gl_use_threads" = yes \ | 503 | [ |
| 524 | || test "$gl_use_threads" = posix \ | 504 | AC_CHECK_HEADERS_ONCE([threads.h]) |
| 525 | || test "$gl_use_threads" = isoc+posix; then | 505 | gl_have_isoc_threads="$ac_cv_header_threads_h" |
| 526 | gl_PTHREADLIB_BODY | 506 | ]) |
| 527 | LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD | 507 | AS_CASE([$gl_use_threads], |
| 528 | LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD | 508 | [yes | posix | isoc+posix], |
| 529 | if test $gl_pthread_api = yes; then | 509 | [ |
| 530 | if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then | 510 | gl_PTHREADLIB_BODY |
| 531 | gl_threads_api='isoc+posix' | 511 | LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD |
| 532 | AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1], | 512 | LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD |
| 533 | [Define if the combination of the ISO C and POSIX multithreading APIs can be used.]) | 513 | AS_IF([test $gl_pthread_api = yes], [ |
| 534 | LIBTHREAD= LTLIBTHREAD= | 514 | AS_IF([test "$gl_use_threads" = isoc+posix && |
| 535 | else | 515 | test "$gl_have_isoc_threads" = yes], [ |
| 536 | gl_threads_api=posix | 516 | gl_threads_api="isoc+posix" |
| 537 | AC_DEFINE([USE_POSIX_THREADS], [1], | 517 | AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1], |
| 538 | [Define if the POSIX multithreading library can be used.]) | 518 | [Define if the combination of the ISO C and POSIX multithreading APIs can be used.]) |
| 539 | if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then | 519 | LIBTHREAD= LTLIBTHREAD= |
| 540 | AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1], | 520 | ], [ |
| 541 | [Define if references to the POSIX multithreading library are satisfied by libc.]) | 521 | gl_threads_api=posix |
| 542 | else | 522 | AC_DEFINE([USE_POSIX_THREADS], [1], |
| 543 | if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then | 523 | [Define if the POSIX multithreading library can be used.]) |
| 544 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], | 524 | AS_IF([test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"], [ |
| 545 | [Define if references to the POSIX multithreading library should be made weak.]) | 525 | AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1], |
| 546 | LIBTHREAD= LTLIBTHREAD= | 526 | [Define if references to the POSIX multithreading library are satisfied by libc.]) |
| 547 | else | 527 | ], [ |
| 548 | case "$host_os" in | 528 | AS_CASE([$gl_cv_have_weak], |
| 549 | freebsd* | dragonfly* | midnightbsd*) | 529 | [*yes], |
| 550 | if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then | 530 | [ |
| 551 | dnl If weak symbols can't tell whether pthread_create(), pthread_key_create() | 531 | AC_DEFINE([USE_POSIX_THREADS_WEAK], [1], |
| 552 | dnl etc. will succeed, we need a runtime test. | 532 | [Define if references to the POSIX multithreading library should be made weak.]) |
| 553 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], | 533 | LIBTHREAD= LTLIBTHREAD= |
| 554 | [Define if the pthread_in_use() detection is hard.]) | 534 | ], |
| 555 | fi | 535 | [AS_CASE([$host_os], |
| 556 | ;; | 536 | [freebsd* | dragonfly* | midnightbsd*], |
| 557 | esac | 537 | [ |
| 558 | fi | 538 | AS_IF([test "x$LIBTHREAD" != "x$LIBMULTITHREAD"], [ |
| 559 | fi | 539 | dnl If weak symbols cannot tell whether |
| 560 | fi | 540 | dnl pthread_create(), dnl pthread_key_create() |
| 561 | fi | 541 | dnl etc. will succeed, we need a runtime test. |
| 562 | fi | 542 | AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1], |
| 563 | if test $gl_threads_api = none; then | 543 | [Define if the pthread_in_use() detection is hard.]) |
| 564 | if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then | 544 | ]) |
| 545 | ]) | ||
| 546 | ]) | ||
| 547 | ]) | ||
| 548 | ]) | ||
| 549 | ]) | ||
| 550 | ]) | ||
| 551 | AS_IF([test $gl_threads_api = none], [ | ||
| 552 | AS_IF([test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes], [ | ||
| 565 | gl_STDTHREADLIB_BODY | 553 | gl_STDTHREADLIB_BODY |
| 566 | LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD | 554 | LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD |
| 567 | LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD | 555 | LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD |
| 568 | gl_threads_api=isoc | 556 | gl_threads_api=isoc |
| 569 | AC_DEFINE([USE_ISOC_THREADS], [1], | 557 | AC_DEFINE([USE_ISOC_THREADS], [1], |
| 570 | [Define if the ISO C multithreading library can be used.]) | 558 | [Define if the ISO C multithreading library can be used.]) |
| 571 | fi | 559 | ]) |
| 572 | fi | 560 | ]) |
| 573 | if test $gl_threads_api = none; then | 561 | AS_IF([test $gl_threads_api = none], [ |
| 574 | case "$gl_use_threads" in | 562 | # The "win32" is for backward compatibility. |
| 575 | yes | windows | win32) # The 'win32' is for backward compatibility. | 563 | AS_CASE([$gl_use_threads], |
| 576 | if { case "$host_os" in | 564 | [yes | windows | win32], |
| 577 | mingw* | windows*) true;; | 565 | [AS_CASE([$host_os], |
| 578 | *) false;; | 566 | [mingw* | windows*], |
| 579 | esac | 567 | [ |
| 580 | }; then | 568 | gl_threads_api=windows |
| 581 | gl_threads_api=windows | 569 | AC_DEFINE([USE_WINDOWS_THREADS], [1], |
| 582 | AC_DEFINE([USE_WINDOWS_THREADS], [1], | 570 | [Define if the native Windows multithreading API can be used.]) |
| 583 | [Define if the native Windows multithreading API can be used.]) | 571 | ]) |
| 584 | fi | 572 | ]) |
| 585 | ;; | 573 | ]) |
| 586 | esac | 574 | ]) |
| 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]) | 575 | AC_MSG_CHECKING([for multithread API to use]) |
| 594 | AC_MSG_RESULT([$gl_threads_api]) | 576 | AC_MSG_RESULT([$gl_threads_api]) |
| 595 | AC_SUBST([LIBTHREAD]) | 577 | AC_SUBST([LIBTHREAD]) |
| @@ -609,7 +591,7 @@ dnl gl_DISABLE_THREADS | |||
| 609 | dnl ------------------ | 591 | dnl ------------------ |
| 610 | dnl Sets the gl_THREADLIB default so that threads are not used by default. | 592 | 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 | 593 | dnl The user can still override it at installation time, by using the |
| 612 | dnl configure option '--enable-threads'. | 594 | dnl configure option "--enable-threads". |
| 613 | 595 | ||
| 614 | AC_DEFUN([gl_DISABLE_THREADS], [ | 596 | AC_DEFUN([gl_DISABLE_THREADS], [ |
| 615 | m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) | 597 | m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no]) |
| @@ -621,7 +603,7 @@ dnl ------------------- | |||
| 621 | dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the | 603 | dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the |
| 622 | dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. | 604 | dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. |
| 623 | dnl The user can still override it at installation time, by using the | 605 | dnl The user can still override it at installation time, by using the |
| 624 | dnl configure option '--enable-threads=posix'. | 606 | dnl configure option "--enable-threads=posix". |
| 625 | dnl As of 2023, this is now the default. | 607 | dnl As of 2023, this is now the default. |
| 626 | 608 | ||
| 627 | AC_DEFUN([gl_AVOID_WINPTHREAD], [ | 609 | AC_DEFUN([gl_AVOID_WINPTHREAD], [ |
| @@ -667,13 +649,8 @@ dnl | |||
| 667 | dnl HP-UX 11 posix -lpthread N (cc) OK | 649 | dnl HP-UX 11 posix -lpthread N (cc) OK |
| 668 | dnl Y (gcc) | 650 | dnl Y (gcc) |
| 669 | dnl | 651 | dnl |
| 670 | dnl IRIX 6.5 posix -lpthread Y 0.5 | ||
| 671 | dnl | ||
| 672 | dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK | 652 | dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK |
| 673 | dnl | 653 | dnl |
| 674 | dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK | ||
| 675 | dnl -lpthread (gcc) Y | ||
| 676 | dnl | ||
| 677 | dnl Cygwin posix -lpthread Y OK | 654 | dnl Cygwin posix -lpthread Y OK |
| 678 | dnl | 655 | dnl |
| 679 | dnl Mingw windows N OK | 656 | dnl Mingw windows N OK |
