From: Bruno Haible Date: Thu, 28 Mar 2024 21:05:39 +0000 (+0100) Subject: pthread-h: Fix override of pthread_spinlock_t with non-GNU compilers. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=dd11baf0f8e86c2abd67cc61ed8e7b51509b7332;p=gnulib.git pthread-h: Fix override of pthread_spinlock_t with non-GNU compilers. * m4/pthread-spin.m4 (gl_PTHREAD_SPIN): Define through AC_DEFUN_ONCE. Require gl_PTHREAD_H_PART1, not gl_PTHREAD_H. * m4/pthread_h.m4 (gl_PTHREAD_H_PART1): New macro, extracted from gl_PTHREAD_H. (gl_PTHREAD_H): Require it. Invoke gl_PTHREAD_SPIN. * lib/pthread.in.h (pthread_spinlock_t, GNULIB_defined_pthread_spin_types): Don't define if HAVE_PTHREAD_SPIN_INIT && !REPLACE_PTHREAD_SPIN_INIT. * modules/pthread-h (Files): Add m4/pthread-spin.m4. --- diff --git a/ChangeLog b/ChangeLog index 690d0c8e1e..be46eefc67 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2024-03-28 Bruno Haible + + pthread-h: Fix override of pthread_spinlock_t with non-GNU compilers. + * m4/pthread-spin.m4 (gl_PTHREAD_SPIN): Define through AC_DEFUN_ONCE. + Require gl_PTHREAD_H_PART1, not gl_PTHREAD_H. + * m4/pthread_h.m4 (gl_PTHREAD_H_PART1): New macro, extracted from + gl_PTHREAD_H. + (gl_PTHREAD_H): Require it. Invoke gl_PTHREAD_SPIN. + * lib/pthread.in.h (pthread_spinlock_t, + GNULIB_defined_pthread_spin_types): Don't define if + HAVE_PTHREAD_SPIN_INIT && !REPLACE_PTHREAD_SPIN_INIT. + * modules/pthread-h (Files): Add m4/pthread-spin.m4. + 2024-03-28 Bruno Haible havelib: Recognize ELF platform despite SunPRO C on Linux. diff --git a/lib/pthread.in.h b/lib/pthread.in.h index 48e0837478..81598616df 100644 --- a/lib/pthread.in.h +++ b/lib/pthread.in.h @@ -1,6 +1,6 @@ /* Implement the most essential subset of POSIX 1003.1-2008 pthread.h. - Copyright (C) 2009-2023 Free Software Foundation, Inc. + Copyright (C) 2009-2024 Free Software Foundation, Inc. This file is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -417,16 +417,21 @@ typedef pthread_mutex_t pthread_spinlock_t; #else # if @HAVE_PTHREAD_SPINLOCK_T@ /* exists and defines pthread_spinlock_t. */ -# if !(((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) \ - || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 1)) \ - || (((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) \ - && !defined __ANDROID__) \ - || __clang_major__ >= 3)) \ - && !defined __ibmxl__) +# if !@HAVE_PTHREAD_SPIN_INIT@ || @REPLACE_PTHREAD_SPIN_INIT@ +/* If the 'pthread-spin' module is in use, it defines all the pthread_spin* + functions. Prepare for it by overriding pthread_spinlock_t if that might + be needed. */ +# if !(((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) \ + || __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 1)) \ + || (((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) \ + && !defined __ANDROID__) \ + || __clang_major__ >= 3)) \ + && !defined __ibmxl__) /* We can't use GCC built-ins. Approximate spinlocks with mutexes. */ -# if !GNULIB_defined_pthread_spin_types -# define pthread_spinlock_t pthread_mutex_t -# define GNULIB_defined_pthread_spin_types 1 +# if !GNULIB_defined_pthread_spin_types +# define pthread_spinlock_t pthread_mutex_t +# define GNULIB_defined_pthread_spin_types 1 +# endif # endif # endif # else diff --git a/m4/pthread-spin.m4 b/m4/pthread-spin.m4 index e00f9a8ce7..4eeb3e5e75 100644 --- a/m4/pthread-spin.m4 +++ b/m4/pthread-spin.m4 @@ -1,12 +1,12 @@ -# pthread-spin.m4 serial 2.2 +# pthread-spin.m4 serial 2.3 dnl Copyright (C) 2019-2024 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. -AC_DEFUN([gl_PTHREAD_SPIN], +AC_DEFUN_ONCE([gl_PTHREAD_SPIN], [ - AC_REQUIRE([gl_PTHREAD_H]) + AC_REQUIRE([gl_PTHREAD_H_PART1]) AC_REQUIRE([AC_CANONICAL_HOST]) if { case "$host_os" in mingw*) true;; *) false;; esac; } \ diff --git a/m4/pthread_h.m4 b/m4/pthread_h.m4 index 0d536fc97a..dc72483140 100644 --- a/m4/pthread_h.m4 +++ b/m4/pthread_h.m4 @@ -1,10 +1,10 @@ -# pthread_h.m4 serial 8 -dnl Copyright (C) 2009-2023 Free Software Foundation, Inc. +# pthread_h.m4 serial 8.1 +dnl Copyright (C) 2009-2024 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. -AC_DEFUN_ONCE([gl_PTHREAD_H], +AC_DEFUN_ONCE([gl_PTHREAD_H_PART1], [ dnl Ensure to expand the default settings once only, before all statements dnl that occur in other macros. @@ -41,6 +41,14 @@ AC_DEFUN_ONCE([gl_PTHREAD_H], if test $ac_cv_type_pthread_spinlock_t != yes; then HAVE_PTHREAD_SPINLOCK_T=0 fi +]) + +AC_DEFUN([gl_PTHREAD_H], +[ + AC_REQUIRE([gl_PTHREAD_H_PART1]) + + dnl Set HAVE_PTHREAD_SPIN_INIT, REPLACE_PTHREAD_SPIN_INIT. + gl_PTHREAD_SPIN dnl Constants may be defined as C preprocessor macros or as enum items. diff --git a/modules/pthread-h b/modules/pthread-h index 6daa6d02a7..241671404c 100644 --- a/modules/pthread-h +++ b/modules/pthread-h @@ -5,6 +5,7 @@ Files: lib/pthread.in.h m4/pthread_h.m4 m4/threadlib.m4 +m4/pthread-spin.m4 Depends-on: extensions