summaryrefslogtreecommitdiffstats
path: root/gl/m4/threadlib.m4
diff options
context:
space:
mode:
Diffstat (limited to 'gl/m4/threadlib.m4')
-rw-r--r--gl/m4/threadlib.m4376
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
3dnl Copyright (C) 2005-2024 Free Software Foundation, Inc. 3dnl Copyright (C) 2005-2025 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation 4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it, 5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved. 6dnl with or without modifications, as long as this notice is preserved.
7dnl This file is offered as-is, without any warranty.
7 8
8dnl From Bruno Haible. 9dnl 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
168dnl ============================================================================ 166dnl ============================================================================
@@ -188,15 +186,15 @@ dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
188AC_DEFUN([gl_PTHREADLIB_BODY], 186AC_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],
266changequote(,)dnl 264 [[solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*]],
267 solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*) 265 [
268changequote([,])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
329AC_DEFUN([gl_PTHREADLIB], 327AC_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
393AC_DEFUN([gl_STDTHREADLIB], 392AC_DEFUN([gl_STDTHREADLIB],
@@ -404,7 +403,7 @@ dnl ------------
404dnl Tests for a multithreading library to be used. 403dnl Tests for a multithreading library to be used.
405dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO 404dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
406dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the 405dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
407dnl default is 'no', otherwise it is system dependent. In both cases, the user 406dnl default is "no", otherwise it is system dependent. In both cases, the user
408dnl can change the choice through the options --enable-threads=choice or 407dnl can change the choice through the options --enable-threads=choice or
409dnl --disable-threads. 408dnl --disable-threads.
410dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, 409dnl 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
462changequote(,)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
487changequote([,])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
499dnl The guts of gl_THREADLIB. Needs to be expanded only once. 492dnl 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
609dnl ------------------ 607dnl ------------------
610dnl Sets the gl_THREADLIB default so that threads are not used by default. 608dnl Sets the gl_THREADLIB default so that threads are not used by default.
611dnl The user can still override it at installation time, by using the 609dnl The user can still override it at installation time, by using the
612dnl configure option '--enable-threads'. 610dnl configure option "--enable-threads".
613 611
614AC_DEFUN([gl_DISABLE_THREADS], [ 612AC_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 -------------------
621dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the 619dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the
622dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. 620dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided.
623dnl The user can still override it at installation time, by using the 621dnl The user can still override it at installation time, by using the
624dnl configure option '--enable-threads=posix'. 622dnl configure option "--enable-threads=posix".
625dnl As of 2023, this is now the default. 623dnl As of 2023, this is now the default.
626 624
627AC_DEFUN([gl_AVOID_WINPTHREAD], [ 625AC_DEFUN([gl_AVOID_WINPTHREAD], [