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.m4403
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
3dnl Copyright (C) 2005-2024 Free Software Foundation, Inc. 3dnl Copyright (C) 2005-2026 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,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
168dnl ============================================================================ 156dnl ============================================================================
@@ -188,36 +176,30 @@ dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
188AC_DEFUN([gl_PTHREADLIB_BODY], 176AC_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],
266changequote(,)dnl 247 [[solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*]],
267 solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*) 248 [
268changequote([,])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
329AC_DEFUN([gl_PTHREADLIB], 310AC_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
393AC_DEFUN([gl_STDTHREADLIB], 375AC_DEFUN([gl_STDTHREADLIB],
@@ -404,7 +386,7 @@ dnl ------------
404dnl Tests for a multithreading library to be used. 386dnl Tests for a multithreading library to be used.
405dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO 387dnl 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 388dnl (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 389dnl 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 390dnl can change the choice through the options --enable-threads=choice or
409dnl --disable-threads. 391dnl --disable-threads.
410dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS, 392dnl 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],
456AS_HELP_STRING([[--enable-threads={isoc|posix|isoc+posix|windows}]], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [ 443AS_HELP_STRING([[--enable-threads={isoc|posix|isoc+posix|windows}]], [specify multithreading API])m4_ifdef([LT_INIT], [], [m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
457AS_HELP_STRING([[--disable-threads]], [build without multithread safety])]), 444AS_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
462changequote(,)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
487changequote([,])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
499dnl The guts of gl_THREADLIB. Needs to be expanded only once. 476dnl 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
609dnl ------------------ 591dnl ------------------
610dnl Sets the gl_THREADLIB default so that threads are not used by default. 592dnl 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 593dnl The user can still override it at installation time, by using the
612dnl configure option '--enable-threads'. 594dnl configure option "--enable-threads".
613 595
614AC_DEFUN([gl_DISABLE_THREADS], [ 596AC_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 -------------------
621dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the 603dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the
622dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided. 604dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided.
623dnl The user can still override it at installation time, by using the 605dnl The user can still override it at installation time, by using the
624dnl configure option '--enable-threads=posix'. 606dnl configure option "--enable-threads=posix".
625dnl As of 2023, this is now the default. 607dnl As of 2023, this is now the default.
626 608
627AC_DEFUN([gl_AVOID_WINPTHREAD], [ 609AC_DEFUN([gl_AVOID_WINPTHREAD], [
@@ -667,13 +649,8 @@ dnl
667dnl HP-UX 11 posix -lpthread N (cc) OK 649dnl HP-UX 11 posix -lpthread N (cc) OK
668dnl Y (gcc) 650dnl Y (gcc)
669dnl 651dnl
670dnl IRIX 6.5 posix -lpthread Y 0.5
671dnl
672dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK 652dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
673dnl 653dnl
674dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
675dnl -lpthread (gcc) Y
676dnl
677dnl Cygwin posix -lpthread Y OK 654dnl Cygwin posix -lpthread Y OK
678dnl 655dnl
679dnl Mingw windows N OK 656dnl Mingw windows N OK