1 # threadlib.m4 serial 32a
2 dnl Copyright (C) 2005-2023 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
11 dnl The general structure of the multithreading modules in gnulib is that we
12 dnl have three set of modules:
15 dnl pthread, which combines
27 dnl threads, which combines
34 dnl * Gnulib API, with an implementation that can be chosen at configure
35 dnl time through the option --enable-threads=...
42 dnl They are independent, except for the fact that
43 dnl - the implementation of the ISO C API may use the POSIX (or some other
44 dnl platform dependent) API,
45 dnl - the implementation of the Gnulib API may use the POSIX or ISO C or
46 dnl some other platform dependent API, depending on the --enable-threads
49 dnl This file contains macros for all of these APIs!
51 dnl ============================================================================
52 dnl Macros for all thread APIs
54 AC_DEFUN([gl_ANYTHREADLIB_EARLY],
56 AC_REQUIRE([AC_CANONICAL_HOST])
57 if test -z "$gl_anythreadlib_early_done"; then
60 # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
61 # 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,
63 # 2. putting a flag into CPPFLAGS that has an effect on the linker
64 # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
65 # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
66 CPPFLAGS="$CPPFLAGS -D_REENTRANT"
69 # Some systems optimize for single-threaded programs by default, and
70 # need special flags to disable these optimizations. For example, the
71 # definition of 'errno' in <errno.h>.
73 aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
74 solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
76 gl_anythreadlib_early_done=done
80 dnl Checks whether the compiler and linker support weak declarations of symbols.
82 AC_DEFUN([gl_WEAK_SYMBOLS],
84 AC_REQUIRE([AC_CANONICAL_HOST])
85 AC_CACHE_CHECK([whether imported symbols can be declared weak],
89 dnl On Cygwin 3.2.0 with gcc 10.2, the test below would succeed, but
90 dnl programs that use pthread_in_use() with weak symbol references
91 dnl crash miserably at runtime.
92 gl_cv_have_weak="guessing no"
96 dnl First, test whether the compiler accepts it syntactically.
99 [[extern void xyzzy ();
100 #pragma weak xyzzy]],
102 [gl_cv_have_weak=maybe])
103 if test $gl_cv_have_weak = maybe; then
104 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.
112 return (fputs == NULL);
114 [gl_cv_have_weak=yes],
115 [gl_cv_have_weak=no],
116 [dnl When cross-compiling, assume that only ELF platforms support
118 AC_EGREP_CPP([Extensible Linking Format],
120 Extensible Linking Format
123 [gl_cv_have_weak="guessing yes"],
124 [gl_cv_have_weak="guessing no"])
129 dnl But when linking statically, weak symbols don't work.
131 *" -static "*) gl_cv_have_weak=no ;;
133 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 the shared library that defines the symbol.
136 case "$gl_cv_have_weak" in
139 freebsd* | dragonfly* | midnightbsd*)
141 $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1
142 cat <<EOF > conftest2.c
144 #pragma weak pthread_mutexattr_gettype
147 return (pthread_mutexattr_gettype != NULL);
150 $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \
151 || gl_cv_have_weak=no
152 rm -f conftest1.c libempty.so conftest2.c conftest
158 case "$gl_cv_have_weak" in
160 AC_DEFINE([HAVE_WEAK_SYMBOLS], [1],
161 [Define to 1 if the compiler and linker support weak declarations of symbols.])
166 dnl ============================================================================
167 dnl Macros for the POSIX API
171 dnl Tests for the libraries needs for using the POSIX threads API.
172 dnl Sets the variable LIBPTHREAD to the linker options for use in a Makefile.
173 dnl Sets the variable LIBPMULTITHREAD, for programs that really need
174 dnl multithread functionality. The difference between LIBPTHREAD and
175 dnl LIBPMULTITHREAD is that on platforms supporting weak symbols, typically
176 dnl LIBPTHREAD is empty whereas LIBPMULTITHREAD is not.
177 dnl Sets the variable LIB_SCHED_YIELD to the linker options needed to use the
178 dnl sched_yield() function.
179 dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
180 dnl multithread-safe programs.
181 dnl Defines the C macro HAVE_PTHREAD_API if (at least parts of) the POSIX
182 dnl threads API is available.
184 dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
186 AC_DEFUN([gl_PTHREADLIB_BODY],
188 AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
189 if test -z "$gl_pthreadlib_body_done"; then
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.
195 AC_CHECK_HEADER([pthread.h],
196 [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
197 if test "$gl_have_pthread_h" = yes; then
198 # Other possible tests:
199 # -lpthreads (FSU threads, PCthreads)
201 # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
202 # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
203 # the second one only in libpthread, and lock.c needs it.
205 # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
206 # needs -pthread for some reason. See:
207 # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
209 for gl_pthread in '' '-pthread'; do
210 LIBS="$LIBS $gl_pthread"
213 [[#include <pthread.h>
215 pthread_mutexattr_t ma;
217 [[pthread_mutex_lock (&m);
218 pthread_mutexattr_init (&ma);]])],
220 LIBPTHREAD=$gl_pthread
221 LIBPMULTITHREAD=$gl_pthread])
223 test $gl_pthread_api = yes && break
225 echo "$as_me:__oline__: gl_pthread_api=$gl_pthread_api" >&AS_MESSAGE_LOG_FD
226 echo "$as_me:__oline__: LIBPTHREAD=$LIBPTHREAD" >&AS_MESSAGE_LOG_FD
228 gl_pthread_in_glibc=no
229 # On Linux with glibc >= 2.34, libc contains the fully functional
233 AC_EGREP_CPP([Lucky user],
234 [#include <features.h>
235 #ifdef __GNU_LIBRARY__
236 #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 34) || (__GLIBC__ > 2)
241 [gl_pthread_in_glibc=yes],
245 echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD
247 # Test for libpthread by looking for pthread_kill. (Not pthread_self,
248 # since it is defined as a macro on OSF/1.)
249 if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
250 # The program links fine without libpthread. But it may actually
251 # need to link with libpthread in order to create multiple threads.
252 AC_CHECK_LIB([pthread], [pthread_kill],
253 [if test $gl_pthread_in_glibc = yes; then
256 LIBPMULTITHREAD=-lpthread
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
259 # thread: pthread_create from libc will fail, whereas
260 # pthread_create will actually create a thread.
261 # On Solaris 10 or newer, this test is no longer needed, because
262 # libc contains the fully functional pthread functions.
265 solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
267 AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
268 [Define if the pthread_in_use() detection is hard.])
272 elif test $gl_pthread_api != yes; then
273 # Some library is needed. Try libpthread and libc_r.
274 AC_CHECK_LIB([pthread], [pthread_kill],
277 LIBPMULTITHREAD=-lpthread])
278 if test $gl_pthread_api != yes; then
280 AC_CHECK_LIB([c_r], [pthread_kill],
283 LIBPMULTITHREAD=-lc_r])
286 echo "$as_me:__oline__: LIBPMULTITHREAD=$LIBPMULTITHREAD" >&AS_MESSAGE_LOG_FD
288 AC_MSG_CHECKING([whether POSIX threads API is available])
289 AC_MSG_RESULT([$gl_pthread_api])
290 AC_SUBST([LIBPTHREAD])
291 AC_SUBST([LIBPMULTITHREAD])
292 if test $gl_pthread_api = yes; then
293 AC_DEFINE([HAVE_PTHREAD_API], [1],
294 [Define if you have the <pthread.h> header and the POSIX threads API.])
297 dnl On some systems, sched_yield is in librt, rather than in libpthread.
300 [[#include <sched.h>]],
301 [[sched_yield ();]])],
304 [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],
306 [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])])
309 AC_SUBST([LIB_SCHED_YIELD])
311 gl_pthreadlib_body_done=done
315 AC_DEFUN([gl_PTHREADLIB],
317 AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
321 dnl ============================================================================
322 dnl Macros for the ISO C API
326 dnl Tests for the libraries needs for using the ISO C threads API.
327 dnl Sets the variable LIBSTDTHREAD to the linker options for use in a Makefile.
328 dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
329 dnl multithread-safe programs.
330 dnl Defines the C macro HAVE_THREADS_H if (at least parts of) the ISO C threads
331 dnl API is available.
333 dnl The guts of gl_STDTHREADLIB. Needs to be expanded only once.
335 AC_DEFUN([gl_STDTHREADLIB_BODY],
337 AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
338 AC_REQUIRE([AC_CANONICAL_HOST])
339 if test -z "$gl_stdthreadlib_body_done"; then
340 AC_CHECK_HEADERS_ONCE([threads.h])
348 if test $ac_cv_header_threads_h = yes; then
349 dnl glibc >= 2.29 has thrd_create in libpthread.
350 dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends
351 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
354 AC_CHECK_FUNCS([thrd_create])
355 if test $ac_cv_func_thrd_create = yes; then
358 AC_CHECK_LIB([stdthreads], [thrd_create], [
359 LIBSTDTHREAD='-lstdthreads -lpthread'
361 dnl Guess that thrd_create is in libpthread.
362 LIBSTDTHREAD="$LIBPMULTITHREAD"
366 dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c.
367 LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
371 AC_SUBST([LIBSTDTHREAD])
373 AC_MSG_CHECKING([whether ISO C threads API is available])
374 AC_MSG_RESULT([$ac_cv_header_threads_h])
375 gl_stdthreadlib_body_done=done
379 AC_DEFUN([gl_STDTHREADLIB],
381 AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
385 dnl ============================================================================
386 dnl Macros for the Gnulib API
390 dnl Tests for a multithreading library to be used.
391 dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
392 dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
393 dnl default is 'no', otherwise it is system dependent. In both cases, the user
394 dnl can change the choice through the options --enable-threads=choice or
395 dnl --disable-threads.
396 dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS,
397 dnl USE_ISOC_AND_POSIX_THREADS, USE_WINDOWS_THREADS.
398 dnl The choice --enable-threads=isoc+posix is available only on platforms that
399 dnl have both the ISO C and the POSIX threads APIs. It has the effect of using
400 dnl the ISO C API for most things and the POSIX API only for creating and
401 dnl controlling threads (because there is no equivalent to pthread_atfork in
403 dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
404 dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
406 dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
407 dnl programs that really need multithread functionality. The difference
408 dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
409 dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not.
410 dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
411 dnl multithread-safe programs.
412 dnl Since support for GNU pth was removed, $LTLIBTHREAD and $LIBTHREAD have the
413 dnl same value, and similarly $LTLIBMULTITHREAD and $LIBMULTITHREAD have the
414 dnl same value. Only system libraries are needed.
416 AC_DEFUN([gl_THREADLIB_EARLY],
418 AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
421 dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
423 AC_DEFUN([gl_THREADLIB_EARLY_BODY],
425 dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
426 dnl influences the result of the autoconf tests that test for *_unlocked
427 dnl declarations, on AIX 5 at least. Therefore it must come early.
428 AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
429 AC_BEFORE([$0], [gl_ARGP])dnl
431 AC_REQUIRE([AC_CANONICAL_HOST])
432 dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
433 AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
434 dnl Check for multithreading.
435 m4_ifdef([gl_THREADLIB_DEFAULT_NO],
436 [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
437 [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
438 m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=])
439 AC_ARG_ENABLE([threads],
440 AS_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
441 AS_HELP_STRING([--disable-threads], [build without multithread safety])]),
442 [gl_use_threads=$enableval],
443 [if test -n "$gl_use_threads_default"; then
444 gl_use_threads="$gl_use_threads_default"
448 dnl Disable multithreading by default on OSF/1, because it interferes
449 dnl with fork()/exec(): When msgexec is linked with -lpthread, its
450 dnl child process gets an endless segmentation fault inside execvp().
451 osf*) gl_use_threads=no ;;
452 dnl Disable multithreading by default on Cygwin 1.5.x, because it has
453 dnl bugs that lead to endless loops or crashes. See
454 dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
457 1.[0-5].*) gl_use_threads=no ;;
458 *) gl_use_threads=yes ;;
461 dnl Obey gl_AVOID_WINPTHREAD on mingw.
463 case "$gl_use_winpthreads_default" in
464 yes) gl_use_threads=posix ;;
465 no) gl_use_threads=windows ;;
466 *) gl_use_threads=yes ;;
469 *) gl_use_threads=yes ;;
474 if test "$gl_use_threads" = yes \
475 || test "$gl_use_threads" = isoc \
476 || test "$gl_use_threads" = posix \
477 || test "$gl_use_threads" = isoc+posix; then
478 # For using <threads.h> or <pthread.h>:
479 gl_ANYTHREADLIB_EARLY
483 dnl The guts of gl_THREADLIB. Needs to be expanded only once.
485 AC_DEFUN([gl_THREADLIB_BODY],
487 AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
493 if test "$gl_use_threads" != no; then
494 dnl Check whether the compiler and linker support weak declarations.
496 if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
497 dnl If we use weak symbols to implement pthread_in_use / pth_in_use /
498 dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create
499 dnl facility is in use.
500 AC_CHECK_HEADERS_ONCE([threads.h])
503 if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
504 AC_CHECK_HEADERS_ONCE([threads.h])
505 gl_have_isoc_threads="$ac_cv_header_threads_h"
507 if test "$gl_use_threads" = yes \
508 || test "$gl_use_threads" = posix \
509 || test "$gl_use_threads" = isoc+posix; then
511 LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
512 LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
513 if test $gl_pthread_api = yes; then
514 if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
515 gl_threads_api='isoc+posix'
516 AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1],
517 [Define if the combination of the ISO C and POSIX multithreading APIs can be used.])
518 LIBTHREAD= LTLIBTHREAD=
521 AC_DEFINE([USE_POSIX_THREADS], [1],
522 [Define if the POSIX multithreading library can be used.])
523 if test -z "$LIBMULTITHREAD" && test -z "$LTLIBMULTITHREAD"; then
524 AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1],
525 [Define if references to the POSIX multithreading library are satisfied by libc.])
527 if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
528 AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
529 [Define if references to the POSIX multithreading library should be made weak.])
530 LIBTHREAD= LTLIBTHREAD=
533 freebsd* | dragonfly* | midnightbsd*)
534 if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
535 dnl If weak symbols can't tell whether pthread_create(), pthread_key_create()
536 dnl etc. will succeed, we need a runtime test.
537 AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
538 [Define if the pthread_in_use() detection is hard.])
547 if test $gl_threads_api = none; then
548 if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
550 LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
551 LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
553 AC_DEFINE([USE_ISOC_THREADS], [1],
554 [Define if the ISO C multithreading library can be used.])
557 if test $gl_threads_api = none; then
558 case "$gl_use_threads" in
559 yes | windows | win32) # The 'win32' is for backward compatibility.
560 if { case "$host_os" in
565 gl_threads_api=windows
566 AC_DEFINE([USE_WINDOWS_THREADS], [1],
567 [Define if the native Windows multithreading API can be used.])
573 AC_MSG_CHECKING([for multithread API to use])
574 AC_MSG_RESULT([$gl_threads_api])
575 AC_SUBST([LIBTHREAD])
576 AC_SUBST([LTLIBTHREAD])
577 AC_SUBST([LIBMULTITHREAD])
578 AC_SUBST([LTLIBMULTITHREAD])
581 AC_DEFUN([gl_THREADLIB],
583 AC_REQUIRE([gl_THREADLIB_EARLY])
584 AC_REQUIRE([gl_THREADLIB_BODY])
588 dnl gl_DISABLE_THREADS
589 dnl ------------------
590 dnl Sets the gl_THREADLIB default so that threads are not used by default.
591 dnl The user can still override it at installation time, by using the
592 dnl configure option '--enable-threads'.
594 AC_DEFUN([gl_DISABLE_THREADS], [
595 m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
599 dnl gl_AVOID_WINPTHREAD
600 dnl -------------------
601 dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the
602 dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided.
603 dnl The user can still override it at installation time, by using the
604 dnl configure option '--enable-threads'.
606 AC_DEFUN([gl_AVOID_WINPTHREAD], [
607 m4_divert_text([INIT_PREPARE], [gl_use_winpthreads_default=no])
611 dnl ============================================================================
614 dnl Survey of platforms:
616 dnl Platform Available Compiler Supports test-lock
617 dnl flavours option weak result
618 dnl --------------- --------- --------- -------- ---------
619 dnl Linux 2.4/glibc posix -lpthread Y OK
621 dnl Linux/glibc 2.34 posix Y OK
623 dnl GNU Hurd/glibc posix -lpthread Y OK
625 dnl Ubuntu 14.04 posix -pthread Y OK
627 dnl FreeBSD 5.3 posix -lc_r Y
629 dnl posix -lpthread ? Y
632 dnl FreeBSD 5.2 posix -lc_r Y
636 dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
640 dnl OpenBSD 3.4 posix -lpthread Y OK
642 dnl Mac OS X 10.[123] posix -lpthread Y OK
644 dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
646 dnl HP-UX 11 posix -lpthread N (cc) OK
649 dnl IRIX 6.5 posix -lpthread Y 0.5
651 dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
653 dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
654 dnl -lpthread (gcc) Y
656 dnl Cygwin posix -lpthread Y OK
658 dnl Mingw windows N OK
662 dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
664 dnl OK if all three tests terminate OK,
665 dnl 0.5 if the first test terminates OK but the second one loops endlessly,
666 dnl 0.0 if the first test already loops endlessly.