[PATCH v2 1/3] compat/posix.h: track SA_RESTART fallback
From: Carlo Marcelo Arenas Belón via GitGitGadget <hidden>
Date: 2025-06-25 07:35:33
Subsystem:
kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers:
Nathan Chancellor, Nicolas Schier, Linus Torvalds
From: =?UTF-8?q?Carlo=20Marcelo=20Arenas=20Bel=C3=B3n?= <redacted> Systems without SA_RESTART are using custom CFLAGS or headers instead of the standard header file. Correct that, and invent a Makefile variable to track the exceptions which will become handy in the next commits. Signed-off-by: Carlo Marcelo Arenas Belón <redacted> --- Makefile | 6 ++++++ compat/mingw-posix.h | 1 - compat/posix.h | 8 ++++++++ config.mak.uname | 7 ++++--- configure.ac | 17 +++++++++++++++++ meson.build | 4 ++++ 6 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/Makefile b/Makefile
index 70d1543b6b86..c4e6fc7bfd13 100644
--- a/Makefile
+++ b/Makefile@@ -37,6 +37,9 @@ include shared.mak # when attempting to read from an fopen'ed directory (or even to fopen # it at all). # +# Define USE_NON_POSIX_SIGNAL if don't have support for SA_RESTART or +# prefer to use ANSI C signal() over POSIX sigaction() +# # Define OPEN_RETURNS_EINTR if your open() system call may return EINTR # when a signal is received (as opposed to restarting). #
@@ -1811,6 +1814,9 @@ ifdef FREAD_READS_DIRECTORIES COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES COMPAT_OBJS += compat/fopen.o endif +ifdef USE_NON_POSIX_SIGNAL + COMPAT_CFLAGS += -DUSE_NON_POSIX_SIGNAL +endif ifdef OPEN_RETURNS_EINTR COMPAT_CFLAGS += -DOPEN_RETURNS_EINTR endif
diff --git a/compat/mingw-posix.h b/compat/mingw-posix.h
index 88e0cf92924b..a0dca756d104 100644
--- a/compat/mingw-posix.h
+++ b/compat/mingw-posix.h@@ -95,7 +95,6 @@ struct sigaction { sig_handler_t sa_handler; unsigned sa_flags; }; -#define SA_RESTART 0 struct itimerval { struct timeval it_value, it_interval;
diff --git a/compat/posix.h b/compat/posix.h
index 067a00f33b83..84ad2c9647aa 100644
--- a/compat/posix.h
+++ b/compat/posix.h@@ -250,6 +250,14 @@ char *gitdirname(char *); #define NAME_MAX 255 #endif +/* + * On most systems <signal.h> would have given us this, but + * not on some systems (e.g. NonStop, QNX). + */ +#ifndef SA_RESTART +# define SA_RESTART 0 /* disabled for sigaction() */ +#endif + typedef uintmax_t timestamp_t; #define PRItime PRIuMAX #define parse_timestamp strtoumax
diff --git a/config.mak.uname b/config.mak.uname
index b1c5c4d5e8ed..1914982eb13e 100644
--- a/config.mak.uname
+++ b/config.mak.uname@@ -486,6 +486,7 @@ ifeq ($(uname_S),Windows) NO_STRTOUMAX = YesPlease NO_MKDTEMP = YesPlease NO_INTTYPES_H = YesPlease + USE_NON_POSIX_SIGNAL = YesPlease CSPRNG_METHOD = rtlgenrandom # VS2015 with UCRT claims that snprintf and friends are C99 compliant, # so we don't need this:
@@ -654,8 +655,6 @@ ifeq ($(uname_S),NONSTOP_KERNEL) FREAD_READS_DIRECTORIES = UnfortunatelyYes # Not detected (nor checked for) by './configure'. - # We don't have SA_RESTART on NonStop, unfortunalety. - COMPAT_CFLAGS += -DSA_RESTART=0 # Apparently needed in compat/fnmatch/fnmatch.c. COMPAT_CFLAGS += -DHAVE_STRING_H=1 NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
@@ -664,6 +663,7 @@ ifeq ($(uname_S),NONSTOP_KERNEL) NO_MMAP = YesPlease NO_POLL = YesPlease NO_INTPTR_T = UnfortunatelyYes + USE_NON_POSIX_SIGNAL = UnfortunatelyYes CSPRNG_METHOD = openssl SANE_TOOL_PATH = /usr/coreutils/bin:/usr/local/bin SHELL_PATH = /usr/coreutils/bin/bash
@@ -699,6 +699,7 @@ ifeq ($(uname_S),MINGW) NEEDS_LIBICONV = YesPlease NO_STRTOUMAX = YesPlease NO_MKDTEMP = YesPlease + USE_NON_POSIX_SIGNAL = YesPlease NO_SVN_TESTS = YesPlease # The builtin FSMonitor requires Named Pipes and Threads on Windows.
@@ -782,7 +783,6 @@ ifeq ($(uname_S),MINGW) endif endif ifeq ($(uname_S),QNX) - COMPAT_CFLAGS += -DSA_RESTART=0 EXPAT_NEEDS_XMLPARSE_H = YesPlease HAVE_STRINGS_H = YesPlease NEEDS_SOCKET = YesPlease
@@ -794,4 +794,5 @@ ifeq ($(uname_S),QNX) NO_PTHREADS = YesPlease NO_STRCASESTR = YesPlease NO_STRLCPY = YesPlease + USE_NON_POSIX_SIGNAL = UnfortunatelyYes endif
diff --git a/configure.ac b/configure.ac
index f6caab919a3e..8c52fd129f31 100644
--- a/configure.ac
+++ b/configure.ac@@ -862,6 +862,23 @@ fi GIT_CONF_SUBST([ICONV_OMITS_BOM]) fi +# Define USE_NON_POSIX_SIGNAL if don't have support for SA_RESTART or +# prefer using ANSI C signal() over POSIX sigaction() + +AC_CACHE_CHECK([whether SA_RESTART is supported], [ac_cv_siginterrupt], [ + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([#include <signal.h>], [[ + #ifdef SA_RESTART + #endif + siginterrupt(SIGCHLD, 1) + ]])],[ac_cv_siginterrupt=yes],[ + ac_cv_siginterrupt=no + USE_NON_POSIX_SIGNAL=UnfortunatelyYes + ] + ) +]) +GIT_CONF_SUBST([USE_NON_POSIX_SIGNAL]) + ## Checks for typedefs, structures, and compiler characteristics. AC_MSG_NOTICE([CHECKS for typedefs, structures, and compiler characteristics]) #
diff --git a/meson.build b/meson.build
index 7fea4a34d684..f27c37e430ae 100644
--- a/meson.build
+++ b/meson.build@@ -1094,6 +1094,10 @@ else build_options_config.set('NO_EXPAT', '1') endif +if compiler.get_define('SA_RESTART', prefix: '#include <signal.h>') == '' + libgit_c_args += '-DUSE_NON_POSIX_SIGNAL' +endif + if not compiler.has_header('sys/select.h') libgit_c_args += '-DNO_SYS_SELECT_H' endif
--
gitgitgadget