Blame m4/nanosleep.m4

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