Blame m4/nanosleep.m4

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