From 8367ceb6f209401105284bc7d8136a6b94595803 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 12 May 2018 13:27:04 +0200 Subject: [PATCH] nanosleep: Avoid test failure on mingw when it has nanosleep. Reported by Eli Zaretskii . * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Check whether alarm() exists. If it does not exist, use a simpler test program that does not call alarm(). --- ChangeLog | 8 ++++++++ m4/nanosleep.m4 | 45 ++++++++++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d3924a142..95a4203631 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2018-05-12 Bruno Haible + + nanosleep: Avoid test failure on mingw when it has nanosleep. + Reported by Eli Zaretskii . + * m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Check whether alarm() exists. + If it does not exist, use a simpler test program that does not call + alarm(). + 2018-05-10 Bruno Haible lock, cond, thread, tls: Use a different symbol as libpthread witness. diff --git a/m4/nanosleep.m4 b/m4/nanosleep.m4 index 89037346e1..7c945cc3a6 100644 --- a/m4/nanosleep.m4 +++ b/m4/nanosleep.m4 @@ -1,4 +1,4 @@ -# serial 37 +# serial 38 dnl From Jim Meyering. dnl Check for the nanosleep function. @@ -22,6 +22,8 @@ AC_DEFUN([gl_FUNC_NANOSLEEP], AC_CHECK_HEADERS_ONCE([sys/time.h]) AC_REQUIRE([gl_FUNC_SELECT]) + AC_CHECK_DECLS_ONCE([alarm]) + nanosleep_save_libs=$LIBS # Solaris 2.5.1 needs -lposix4 to get the nanosleep function. @@ -62,40 +64,49 @@ AC_DEFUN([gl_FUNC_NANOSLEEP], ? (t) -1 \ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) + #if HAVE_DECL_ALARM static void check_for_SIGALRM (int sig) { if (sig != SIGALRM) _exit (1); } + #endif int main () { static struct timespec ts_sleep; static struct timespec ts_remaining; - static struct sigaction act; /* Test for major problems first. */ if (! nanosleep) return 2; - act.sa_handler = check_for_SIGALRM; - sigemptyset (&act.sa_mask); - sigaction (SIGALRM, &act, NULL); ts_sleep.tv_sec = 0; ts_sleep.tv_nsec = 1; - alarm (1); - if (nanosleep (&ts_sleep, NULL) != 0) + #if HAVE_DECL_ALARM + { + static struct sigaction act; + act.sa_handler = check_for_SIGALRM; + sigemptyset (&act.sa_mask); + sigaction (SIGALRM, &act, NULL); + alarm (1); + if (nanosleep (&ts_sleep, NULL) != 0) + return 3; + /* Test for a minor problem: the handling of large arguments. */ + ts_sleep.tv_sec = TYPE_MAXIMUM (time_t); + ts_sleep.tv_nsec = 999999999; + alarm (1); + if (nanosleep (&ts_sleep, &ts_remaining) != -1) + return 4; + if (errno != EINTR) + return 5; + if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10) + return 6; + } + #else /* A simpler test for native Windows. */ + if (nanosleep (&ts_sleep, &ts_remaining) < 0) return 3; - /* Test for a minor problem: the handling of large arguments. */ - ts_sleep.tv_sec = TYPE_MAXIMUM (time_t); - ts_sleep.tv_nsec = 999999999; - alarm (1); - if (nanosleep (&ts_sleep, &ts_remaining) != -1) - return 4; - if (errno != EINTR) - return 5; - if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10) - return 6; + #endif return 0; }]])], [gl_cv_func_nanosleep=yes], -- 2.39.5