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