Blame m4/nanosleep.m4

Packit Service 991b93
# serial 39
Packit aea12f
Packit aea12f
dnl From Jim Meyering.
Packit aea12f
dnl Check for the nanosleep function.
Packit aea12f
dnl If not found, use the supplied replacement.
Packit aea12f
dnl
Packit aea12f
Packit Service 991b93
# Copyright (C) 1999-2001, 2003-2020 Free Software Foundation, Inc.
Packit aea12f
Packit aea12f
# This file is free software; the Free Software Foundation
Packit aea12f
# gives unlimited permission to copy and/or distribute it,
Packit aea12f
# with or without modifications, as long as this notice is preserved.
Packit aea12f
Packit aea12f
AC_DEFUN([gl_FUNC_NANOSLEEP],
Packit aea12f
[
Packit aea12f
 AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
Packit aea12f
 AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit aea12f
Packit aea12f
 dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
Packit aea12f
 AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
Packit aea12f
Packit aea12f
 AC_CHECK_HEADERS_ONCE([sys/time.h])
Packit aea12f
 AC_REQUIRE([gl_FUNC_SELECT])
Packit aea12f
Packit aea12f
 AC_CHECK_DECLS_ONCE([alarm])
Packit aea12f
Packit aea12f
 nanosleep_save_libs=$LIBS
Packit aea12f
Packit aea12f
 # Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
Packit aea12f
 # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
Packit aea12f
 LIB_NANOSLEEP=
Packit aea12f
 AC_SUBST([LIB_NANOSLEEP])
Packit aea12f
 AC_SEARCH_LIBS([nanosleep], [rt posix4],
Packit aea12f
                [test "$ac_cv_search_nanosleep" = "none required" ||
Packit aea12f
                 LIB_NANOSLEEP=$ac_cv_search_nanosleep])
Packit aea12f
 if test "x$ac_cv_search_nanosleep" != xno; then
Packit aea12f
   dnl The system has a nanosleep function.
Packit aea12f
Packit aea12f
   AC_REQUIRE([gl_MULTIARCH])
Packit aea12f
   if test $APPLE_UNIVERSAL_BUILD = 1; then
Packit aea12f
     # A universal build on Apple Mac OS X platforms.
Packit aea12f
     # The test result would be 'no (mishandles large arguments)' in 64-bit
Packit aea12f
     # mode but 'yes' in 32-bit mode. But we need a configuration result that
Packit aea12f
     # is valid in both modes.
Packit aea12f
     gl_cv_func_nanosleep='no (mishandles large arguments)'
Packit aea12f
   fi
Packit aea12f
Packit aea12f
   AC_CACHE_CHECK([for working nanosleep],
Packit aea12f
    [gl_cv_func_nanosleep],
Packit aea12f
    [
Packit aea12f
     AC_RUN_IFELSE(
Packit aea12f
       [AC_LANG_SOURCE([[
Packit aea12f
          #include <errno.h>
Packit aea12f
          #include <limits.h>
Packit aea12f
          #include <signal.h>
Packit aea12f
          #if HAVE_SYS_TIME_H
Packit aea12f
           #include <sys/time.h>
Packit aea12f
          #endif
Packit aea12f
          #include <time.h>
Packit aea12f
          #include <unistd.h>
Packit aea12f
          #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
Packit aea12f
          #define TYPE_MAXIMUM(t) \
Packit aea12f
            ((t) (! TYPE_SIGNED (t) \
Packit aea12f
                  ? (t) -1 \
Packit aea12f
                  : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
Packit aea12f
Packit aea12f
          #if HAVE_DECL_ALARM
Packit aea12f
          static void
Packit aea12f
          check_for_SIGALRM (int sig)
Packit aea12f
          {
Packit aea12f
            if (sig != SIGALRM)
Packit aea12f
              _exit (1);
Packit aea12f
          }
Packit aea12f
          #endif
Packit aea12f
Packit aea12f
          int
Packit aea12f
          main ()
Packit aea12f
          {
Packit aea12f
            static struct timespec ts_sleep;
Packit aea12f
            static struct timespec ts_remaining;
Packit aea12f
            /* Test for major problems first.  */
Packit aea12f
            if (! nanosleep)
Packit aea12f
              return 2;
Packit aea12f
            ts_sleep.tv_sec = 0;
Packit aea12f
            ts_sleep.tv_nsec = 1;
Packit aea12f
            #if HAVE_DECL_ALARM
Packit aea12f
            {
Packit aea12f
              static struct sigaction act;
Packit aea12f
              act.sa_handler = check_for_SIGALRM;
Packit aea12f
              sigemptyset (&act.sa_mask);
Packit aea12f
              sigaction (SIGALRM, &act, NULL);
Packit aea12f
              alarm (1);
Packit aea12f
              if (nanosleep (&ts_sleep, NULL) != 0)
Packit aea12f
                return 3;
Packit aea12f
              /* Test for a minor problem: the handling of large arguments.  */
Packit aea12f
              ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
Packit aea12f
              ts_sleep.tv_nsec = 999999999;
Packit aea12f
              alarm (1);
Packit aea12f
              if (nanosleep (&ts_sleep, &ts_remaining) != -1)
Packit aea12f
                return 4;
Packit aea12f
              if (errno != EINTR)
Packit aea12f
                return 5;
Packit aea12f
              if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10)
Packit aea12f
                return 6;
Packit aea12f
            }
Packit aea12f
            #else /* A simpler test for native Windows.  */
Packit aea12f
            if (nanosleep (&ts_sleep, &ts_remaining) < 0)
Packit aea12f
              return 3;
Packit aea12f
            #endif
Packit aea12f
            return 0;
Packit aea12f
          }]])],
Packit aea12f
       [gl_cv_func_nanosleep=yes],
Packit aea12f
       [case $? in dnl (
Packit aea12f
        4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
Packit aea12f
        *)   gl_cv_func_nanosleep=no;;
Packit aea12f
        esac],
Packit aea12f
       [case "$host_os" in dnl ((
Packit aea12f
          linux*) # Guess it halfway works when the kernel is Linux.
Packit aea12f
            gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
Packit aea12f
          mingw*) # Guess no on native Windows.
Packit aea12f
            gl_cv_func_nanosleep='guessing no' ;;
Packit Service 991b93
          *)      # If we don't know, obey --enable-cross-guesses.
Packit Service 991b93
            gl_cv_func_nanosleep="$gl_cross_guess_normal" ;;
Packit aea12f
        esac
Packit aea12f
       ])
Packit aea12f
    ])
Packit aea12f
   case "$gl_cv_func_nanosleep" in
Packit aea12f
     *yes)
Packit aea12f
       REPLACE_NANOSLEEP=0
Packit aea12f
       ;;
Packit aea12f
     *)
Packit aea12f
       REPLACE_NANOSLEEP=1
Packit aea12f
       case "$gl_cv_func_nanosleep" in
Packit aea12f
         *"mishandles large arguments"*)
Packit aea12f
           AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
Packit aea12f
             [Define to 1 if nanosleep mishandles large arguments.])
Packit aea12f
           ;;
Packit aea12f
         *)
Packit aea12f
           # The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
Packit aea12f
           for ac_lib in $LIBSOCKET; do
Packit aea12f
             case " $LIB_NANOSLEEP " in
Packit aea12f
               *" $ac_lib "*) ;;
Packit aea12f
               *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
Packit aea12f
             esac
Packit aea12f
           done
Packit aea12f
           ;;
Packit aea12f
       esac
Packit aea12f
       ;;
Packit aea12f
   esac
Packit aea12f
 else
Packit aea12f
   HAVE_NANOSLEEP=0
Packit aea12f
 fi
Packit aea12f
 LIBS=$nanosleep_save_libs
Packit aea12f
])
Packit aea12f
Packit aea12f
# Prerequisites of lib/nanosleep.c.
Packit aea12f
AC_DEFUN([gl_PREREQ_NANOSLEEP],
Packit aea12f
[
Packit aea12f
  AC_CHECK_HEADERS_ONCE([sys/select.h])
Packit aea12f
  gl_PREREQ_SIG_HANDLER_H
Packit aea12f
])