summaryrefslogtreecommitdiff
path: root/gnulib-m4/pthread-once.m4
diff options
context:
space:
mode:
Diffstat (limited to 'gnulib-m4/pthread-once.m4')
-rw-r--r--gnulib-m4/pthread-once.m451
1 files changed, 49 insertions, 2 deletions
diff --git a/gnulib-m4/pthread-once.m4 b/gnulib-m4/pthread-once.m4
index 46b8840e..85549254 100644
--- a/gnulib-m4/pthread-once.m4
+++ b/gnulib-m4/pthread-once.m4
@@ -1,23 +1,27 @@
# pthread-once.m4
-# serial 3
-dnl Copyright (C) 2019-2024 Free Software Foundation, Inc.
+# serial 6
+dnl Copyright (C) 2019-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,
dnl with or without modifications, as long as this notice is preserved.
+dnl This file is offered as-is, without any warranty.
AC_DEFUN([gl_PTHREAD_ONCE],
[
AC_REQUIRE([gl_PTHREAD_H])
AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_PTHREADLIB])
if { case "$host_os" in mingw* | windows*) true;; *) false;; esac; } \
&& test $gl_threads_api = windows; then
dnl Choose function names that don't conflict with the mingw-w64 winpthreads
dnl library.
REPLACE_PTHREAD_ONCE=1
+ PTHREAD_ONCE_LIB=
else
if test $HAVE_PTHREAD_H = 0; then
HAVE_PTHREAD_ONCE=0
+ PTHREAD_ONCE_LIB=
else
dnl Work around Cygwin 3.5.3 bug.
AC_CACHE_CHECK([whether pthread_once works],
@@ -31,6 +35,49 @@ AC_DEFUN([gl_PTHREAD_ONCE],
*yes) ;;
*) REPLACE_PTHREAD_ONCE=1 ;;
esac
+ dnl Determine whether linking requires $(LIBPMULTITHREAD) or only
+ dnl $(LIBPTHREAD).
+ if test -z "$LIBPTHREAD" && test -n "$LIBPMULTITHREAD"; then
+ AC_CACHE_CHECK([whether pthread_once can be used without linking with libpthread],
+ [gl_cv_func_pthread_once_no_lib],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <pthread.h>
+ static pthread_once_t a_once = PTHREAD_ONCE_INIT;
+ static int a;
+ static void a_init (void) { a = 8647; }
+ ]],
+ [[if (pthread_once (&a_once, a_init)) return 1;
+ if (a != 8647) return 2;
+ return 0;
+ ]])],
+ [gl_cv_func_pthread_once_no_lib=yes],
+ [gl_cv_func_pthread_once_no_lib=no],
+ [case "$host_os" in
+ # Guess no on glibc.
+ *-gnu* | gnu*)
+ gl_cv_func_pthread_once_no_lib="guessing no" ;;
+ # Guess no on FreeBSD.
+ freebsd* | dragonfly* | midnightbsd*)
+ gl_cv_func_pthread_once_no_lib="guessing no" ;;
+ # Guess yes otherwise.
+ *)
+ gl_cv_func_pthread_once_no_lib="guessing yes" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_pthread_once_no_lib" in
+ *yes) PTHREAD_ONCE_LIB="$LIBPTHREAD" ;;
+ *) PTHREAD_ONCE_LIB="$LIBPMULTITHREAD" ;;
+ esac
+ dnl Expected result:
+ dnl PTHREAD_ONCE_LIB is $(LIBPMULTITHREAD) on glibc < 2.34, FreeBSD.
+ dnl PTHREAD_ONCE_LIB is $(LIBPTHREAD) in particular on
+ dnl musl libc, macOS, NetBSD, Solaris, Cygwin, Haiku, Android.
+ else
+ PTHREAD_ONCE_LIB="$LIBPTHREAD"
+ fi
fi
fi
+ AC_SUBST([PTHREAD_ONCE_LIB])
])