Merge commit 'a39d4083cab589d7cd6a13e8a4b8db8875261d75'
[gnulib.git] / m4 / nanosleep.m4
index e336f35..d1d6111 100644 (file)
@@ -1,11 +1,11 @@
-# serial 31
+# serial 36
 
 dnl From Jim Meyering.
 dnl Check for the nanosleep function.
 dnl If not found, use the supplied replacement.
 dnl
 
-# Copyright (C) 1999-2001, 2003-2010 Free Software Foundation, Inc.
+# Copyright (C) 1999-2001, 2003-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -13,10 +13,12 @@ dnl
 
 AC_DEFUN([gl_FUNC_NANOSLEEP],
 [
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
  dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
 
- AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
  AC_CHECK_HEADERS_ONCE([sys/time.h])
  AC_REQUIRE([gl_FUNC_SELECT])
 
@@ -34,7 +36,7 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
 
    AC_REQUIRE([gl_MULTIARCH])
    if test $APPLE_UNIVERSAL_BUILD = 1; then
-     # A universal build on Apple MacOS X platforms.
+     # A universal build on Apple Mac OS X platforms.
      # The test result would be 'no (mishandles large arguments)' in 64-bit
      # mode but 'yes' in 32-bit mode. But we need a configuration result that
      # is valid in both modes.
@@ -58,7 +60,7 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
           #define TYPE_MAXIMUM(t) \
             ((t) (! TYPE_SIGNED (t) \
                   ? (t) -1 \
-                  : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
+                  : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
 
           static void
           check_for_SIGALRM (int sig)
@@ -73,8 +75,9 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
             static struct timespec ts_sleep;
             static struct timespec ts_remaining;
             static struct sigaction act;
+            /* Test for major problems first.  */
             if (! nanosleep)
-              return 1;
+              return 2;
             act.sa_handler = check_for_SIGALRM;
             sigemptyset (&act.sa_mask);
             sigaction (SIGALRM, &act, NULL);
@@ -82,46 +85,59 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
             ts_sleep.tv_nsec = 1;
             alarm (1);
             if (nanosleep (&ts_sleep, NULL) != 0)
-              return 1;
+              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 && errno == EINTR
-                && TYPE_MAXIMUM (time_t) - 10 < ts_remaining.tv_sec)
-              return 0;
-            return 119;
+            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;
+            return 0;
           }]])],
        [gl_cv_func_nanosleep=yes],
        [case $? in dnl (
-        119) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
+        4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
         *)   gl_cv_func_nanosleep=no;;
         esac],
-       [gl_cv_func_nanosleep=cross-compiling])
+       [case "$host_os" in dnl ((
+          linux*) # Guess it halfway works when the kernel is Linux.
+            gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
+          *)      # If we don't know, assume the worst.
+            gl_cv_func_nanosleep='guessing no' ;;
+        esac
+       ])
     ])
-   if test "$gl_cv_func_nanosleep" = yes; then
-     REPLACE_NANOSLEEP=0
-   else
-     REPLACE_NANOSLEEP=1
-     if test "$gl_cv_func_nanosleep" = 'no (mishandles large arguments)'; then
-       AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
-         [Define to 1 if nanosleep mishandles large arguments.])
-     else
-       for ac_lib in $LIBSOCKET; do
-         case " $LIB_NANOSLEEP " in
-         *" $ac_lib "*) ;;
-         *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
-         esac
-       done
-     fi
-   fi
+   case "$gl_cv_func_nanosleep" in
+     *yes)
+       REPLACE_NANOSLEEP=0
+       ;;
+     *)
+       REPLACE_NANOSLEEP=1
+       case "$gl_cv_func_nanosleep" in
+         *"mishandles large arguments"*)
+           AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
+             [Define to 1 if nanosleep mishandles large arguments.])
+           ;;
+         *)
+           # The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
+           for ac_lib in $LIBSOCKET; do
+             case " $LIB_NANOSLEEP " in
+               *" $ac_lib "*) ;;
+               *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
+             esac
+           done
+           ;;
+       esac
+       ;;
+   esac
  else
    HAVE_NANOSLEEP=0
  fi
  LIBS=$nanosleep_save_libs
- if test $HAVE_NANOSLEEP = 0 || test $REPLACE_NANOSLEEP = 1; then
-   AC_LIBOBJ([nanosleep])
-   gl_PREREQ_NANOSLEEP
- fi
 ])
 
 # Prerequisites of lib/nanosleep.c.