# threadlib.m4
-# serial 42
+# serial 43
dnl Copyright (C) 2005-2025 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
[
AC_REQUIRE([AC_CANONICAL_HOST])
if test -z "$gl_anythreadlib_early_done"; then
- case "$host_os" in
- osf*)
- # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+ AS_CASE([$host_os],
+ [osf*],
+ [# On OSF/1, the compiler needs the flag -D_REENTRANT so that it
# groks <pthread.h>. cc also understands the flag -pthread, but
- # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+ # we do not use it because 1. gcc-2.95 does not understand -pthread,
# 2. putting a flag into CPPFLAGS that has an effect on the linker
# causes the AC_LINK_IFELSE test below to succeed unexpectedly,
# leading to wrong values of LIBTHREAD and LTLIBTHREAD.
CPPFLAGS="$CPPFLAGS -D_REENTRANT"
- ;;
- esac
+ ])
# Some systems optimize for single-threaded programs by default, and
# need special flags to disable these optimizations. For example, the
- # definition of 'errno' in <errno.h>.
- case "$host_os" in
- aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
- solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
- esac
+ # definition of errno in <errno.h>.
+ AS_CASE([$host_os],
+ [aix* | freebsd*], [CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE"],
+ [solaris*], [CPPFLAGS="$CPPFLAGS -D_REENTRANT"])
gl_anythreadlib_early_done=done
fi
])
AC_REQUIRE([AC_CANONICAL_HOST])
AC_CACHE_CHECK([whether imported symbols can be declared weak],
[gl_cv_have_weak],
- [case "$host_os" in
- cygwin* | mingw* | windows*)
+ [AS_CASE([$host_os],
+ [cygwin* | mingw* | windows*],
+ [
dnl On Cygwin 3.2.0 with gcc 10.2, and likewise on mingw 10.0.0 with
dnl gcc 11.3, the test below would succeed, but programs that use
dnl pthread_in_use() with weak symbol references crash miserably at
dnl runtime.
gl_cv_have_weak="guessing no"
- ;;
- *)
+ ],
+ [
gl_cv_have_weak=no
dnl First, test whether the compiler accepts it syntactically.
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
[[extern void xyzzy ();
-#pragma weak xyzzy]],
+#pragma weak xyzzy
+ ]],
[[xyzzy();]])],
[gl_cv_have_weak=maybe])
if test $gl_cv_have_weak = maybe; then
[gl_cv_have_weak="guessing no"])
])
fi
- ;;
- esac
- dnl But when linking statically, weak symbols don't work.
- case " $LDFLAGS " in
- *" -static "*) gl_cv_have_weak=no ;;
- esac
+ ])
+ dnl But when linking statically, weak symbols do not work.
+ AS_CASE([" $LDFLAGS "],
+ [*" -static "*], [gl_cv_have_weak=no])
dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak
dnl symbol and linking against a shared library that has a dependency on
dnl the shared library that defines the symbol.
- case "$gl_cv_have_weak" in
- *yes)
- case "$host_os" in
- freebsd* | dragonfly* | midnightbsd*)
+ AS_CASE([$gl_cv_have_weak],
+ [*yes],
+ [AS_CASE([$host_os],
+ [freebsd* | dragonfly* | midnightbsd*],
+ [
: > conftest1.c
$CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1
cat <<EOF > conftest2.c
$CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \
|| gl_cv_have_weak=no
rm -f conftest1.c libempty.so conftest2.c conftest
- ;;
- esac
- ;;
- esac
+ ])])
])
- case "$gl_cv_have_weak" in
- *yes)
+ AS_CASE([$gl_cv_have_weak],
+ [*yes], [
AC_DEFINE([HAVE_WEAK_SYMBOLS], [1],
[Define to 1 if the compiler and linker support weak declarations of symbols.])
- ;;
- esac
+ ])
])
dnl ============================================================================
LIBPTHREAD=
LIBPMULTITHREAD=
# On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
- # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+ # it groks <pthread.h>. It is added above, in gl_ANYTHREADLIB_EARLY.
AC_CHECK_HEADER([pthread.h],
[gl_have_pthread_h=yes], [gl_have_pthread_h=no])
if test "$gl_have_pthread_h" = yes; then
# needs -pthread for some reason. See:
# https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
saved_LIBS="$LIBS"
- for gl_pthread in '' '-pthread'; do
+ for gl_pthread in "" "-pthread"; do
LIBS="$LIBS $gl_pthread"
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
gl_pthread_in_glibc=no
# On Linux with glibc >= 2.34, libc contains the fully functional
# pthread functions.
- case "$host_os" in
- linux*)
+ AS_CASE([$host_os], [linux*], [
AC_EGREP_CPP([Lucky user],
[#include <features.h>
#ifdef __GNU_LIBRARY__
],
[gl_pthread_in_glibc=yes],
[])
- ;;
- esac
+ ])
echo "$as_me:__oline__: gl_pthread_in_glibc=$gl_pthread_in_glibc" >&AS_MESSAGE_LOG_FD
# Test for libpthread by looking for pthread_kill. (Not pthread_self,
# pthread_create will actually create a thread.
# On Solaris 10 or newer, this test is no longer needed, because
# libc contains the fully functional pthread functions.
- case "$host_os" in
-changequote(,)dnl
- solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
-changequote([,])dnl
+ AS_CASE([$host_os],
+ [[solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*]],
+ [
AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
[Define if the pthread_in_use() detection is hard.])
- esac
+ ])
fi
],
[dnl This is needed on FreeBSD 5.2.1.
dnl On some systems, sched_yield is in librt, rather than in libpthread.
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
- [[#include <sched.h>]],
+ [[#include <sched.h>
+ ]],
[[sched_yield ();]])],
[SCHED_YIELD_LIB=
],
if test -z "$gl_stdthreadlib_body_done"; then
AC_CHECK_HEADERS_ONCE([threads.h])
- case "$host_os" in
- mingw* | windows*)
+ AS_CASE([$host_os],
+ [mingw* | windows*],
+ [
LIBSTDTHREAD=
- ;;
- *)
+ ],
+ [
gl_PTHREADLIB_BODY
if test $ac_cv_header_threads_h = yes; then
dnl glibc >= 2.29 has thrd_create in libpthread.
dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends
- dnl on libpthread (for the symbol 'pthread_mutexattr_gettype').
+ dnl on libpthread (for the symbol pthread_mutexattr_gettype).
dnl glibc >= 2.34, AIX >= 7.1, and Solaris >= 11.4 have thrd_create in
dnl libc.
- gl_CHECK_FUNCS_ANDROID([thrd_create], [[#include <threads.h>]])
+ gl_CHECK_FUNCS_ANDROID([thrd_create], [[#include <threads.h>
+ ]])
if test $ac_cv_func_thrd_create = yes; then
LIBSTDTHREAD=
else
AC_CHECK_LIB([stdthreads], [thrd_create], [
- LIBSTDTHREAD='-lstdthreads -lpthread'
+ LIBSTDTHREAD="-lstdthreads -lpthread"
], [
dnl Guess that thrd_create is in libpthread.
LIBSTDTHREAD="$LIBPMULTITHREAD"
dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c.
LIBSTDTHREAD="$LIBPMULTITHREAD $SCHED_YIELD_LIB"
fi
- ;;
- esac
+ ])
AC_SUBST([LIBSTDTHREAD])
AC_MSG_CHECKING([whether ISO C threads API is available])
dnl Tests for a multithreading library to be used.
dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
-dnl default is 'no', otherwise it is system dependent. In both cases, the user
+dnl default is "no", otherwise it is system dependent. In both cases, the user
dnl can change the choice through the options --enable-threads=choice or
dnl --disable-threads.
dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS,
m4_ifdef([gl_THREADLIB_DEFAULT_NO],
[m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
[m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
- dnl gl_use_winpthreads_default defaults to 'no', because in mingw 10, like
+ dnl gl_use_winpthreads_default defaults to "no", because in mingw 10, like
dnl in mingw 5, the use of libwinpthread still makes test-pthread-tss crash.
m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=no])
AC_ARG_ENABLE([threads],
[if test -n "$gl_use_threads_default"; then
gl_use_threads="$gl_use_threads_default"
else
-changequote(,)dnl
- case "$host_os" in
+ AS_CASE([$host_os],
dnl Disable multithreading by default on OSF/1, because it interferes
dnl with fork()/exec(): When msgexec is linked with -lpthread, its
dnl child process gets an endless segmentation fault inside execvp().
- osf*) gl_use_threads=no ;;
+ [osf*], [gl_use_threads=no],
dnl Disable multithreading by default on Cygwin 1.5.x, because it has
dnl bugs that lead to endless loops or crashes. See
dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
- cygwin*)
- case `uname -r` in
- 1.[0-5].*) gl_use_threads=no ;;
- *) gl_use_threads=yes ;;
- esac
- ;;
+ [cygwin*],
+ [AS_CASE([$(uname -r)],
+ [[1.[0-5].*]], [gl_use_threads=no],
+ [gl_use_threads=yes])],
dnl Obey gl_AVOID_WINPTHREAD on mingw.
- mingw* | windows*)
- case "$gl_use_winpthreads_default" in
- yes) gl_use_threads=posix ;;
- no) gl_use_threads=windows ;;
- *) gl_use_threads=yes ;;
- esac
- ;;
- *) gl_use_threads=yes ;;
- esac
-changequote([,])dnl
+ [mingw* | windows*],
+ [AS_CASE([$gl_use_winpthreads_default],
+ [yes], [gl_use_threads=posix],
+ [no], [gl_use_threads=windows],
+ [gl_use_threads=yes])],
+ [gl_use_threads=yes])
fi
])
if test "$gl_use_threads" = yes \
if test "$gl_use_threads" != no; then
dnl Check whether the compiler and linker support weak declarations.
gl_WEAK_SYMBOLS
- if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+ AS_CASE([$gl_cv_have_weak], [*yes], [
dnl If we use weak symbols to implement pthread_in_use / pth_in_use /
dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create
dnl facility is in use.
AC_CHECK_HEADERS_ONCE([threads.h])
:
- fi
+ ])
if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
AC_CHECK_HEADERS_ONCE([threads.h])
gl_have_isoc_threads="$ac_cv_header_threads_h"
LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
if test $gl_pthread_api = yes; then
if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
- gl_threads_api='isoc+posix'
+ gl_threads_api=isoc+posix
AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1],
[Define if the combination of the ISO C and POSIX multithreading APIs can be used.])
LIBTHREAD= LTLIBTHREAD=
AC_DEFINE([USE_POSIX_THREADS_FROM_LIBC], [1],
[Define if references to the POSIX multithreading library are satisfied by libc.])
else
- if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+ AS_CASE([$gl_cv_have_weak], [*yes],
+ [
AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
[Define if references to the POSIX multithreading library should be made weak.])
LIBTHREAD= LTLIBTHREAD=
- else
- case "$host_os" in
- freebsd* | dragonfly* | midnightbsd*)
+ ],
+ [AS_CASE([$host_os],
+ [freebsd* | dragonfly* | midnightbsd*],
+ [
if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
- dnl If weak symbols can't tell whether pthread_create(), pthread_key_create()
+ dnl If weak symbols cannot tell whether
+ dnl pthread_create(), dnl pthread_key_create()
dnl etc. will succeed, we need a runtime test.
AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
[Define if the pthread_in_use() detection is hard.])
fi
- ;;
- esac
- fi
+ ])])
fi
fi
fi
fi
fi
if test $gl_threads_api = none; then
- case "$gl_use_threads" in
- yes | windows | win32) # The 'win32' is for backward compatibility.
- if { case "$host_os" in
- mingw* | windows*) true;;
- *) false;;
- esac
- }; then
+ # The "win32" is for backward compatibility.
+ AS_CASE([$gl_use_threads], [yes | windows | win32],
+ [AS_CASE([$host_os], [mingw* | windows*],
+ [
gl_threads_api=windows
AC_DEFINE([USE_WINDOWS_THREADS], [1],
[Define if the native Windows multithreading API can be used.])
- fi
- ;;
- esac
+ ])])
fi
else
dnl "$gl_use_threads" is "no".
dnl ------------------
dnl Sets the gl_THREADLIB default so that threads are not used by default.
dnl The user can still override it at installation time, by using the
-dnl configure option '--enable-threads'.
+dnl configure option "--enable-threads".
AC_DEFUN([gl_DISABLE_THREADS], [
m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the
dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided.
dnl The user can still override it at installation time, by using the
-dnl configure option '--enable-threads=posix'.
+dnl configure option "--enable-threads=posix".
dnl As of 2023, this is now the default.
AC_DEFUN([gl_AVOID_WINPTHREAD], [