* lib/nanosleep.c [HAVE_SYS_SELECT_H]: Include <sys/select.h>.
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 19 May 2006 17:49:21 +0000 (17:49 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 19 May 2006 17:49:21 +0000 (17:49 +0000)
Use the usual Autoconf way to include <time.h> and/or sys/time.h.
(my_usleep): Don't mishandle maximum value.
* m4/nanosleep.m4 (gl_FUNC_NANOSLEEP): Rename cache variables to use
gl_ rather than jm_.  Link, don't run, so that cross-compiles are
allowed.  Check that resulting type is arithmetic.  Move AC_REQUIRE
and AC_CHECK_HEADERS_ONCE outside of AC_CACHE_CHECK, since they're
not really conditional on the cache.
(gl_PREREQ_NANOSLEEP): Check for sys/select.h.

lib/ChangeLog
lib/nanosleep.c
m4/ChangeLog
m4/nanosleep.m4

index 1e398bf..ee82a46 100644 (file)
@@ -1,3 +1,9 @@
+2006-05-19  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * nanosleep.c [HAVE_SYS_SELECT_H]: Include <sys/select.h>.
+       Use the usual Autoconf way to include <time.h> and/or sys/time.h.
+       (my_usleep): Don't mishandle maximum value.
+
 2006-05-19  Jim Meyering  <jim@meyering.net>
 
        * getugroups.c: Correct an outdated comment.  From Bruno Haible.
index 61fc1b9..7ffe05d 100644 (file)
@@ -1,5 +1,7 @@
 /* Provide a replacement for the POSIX nanosleep function.
-   Copyright (C) 1999, 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
+
+   Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006 Free Software
+   Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include <stdbool.h>
 #include <stdio.h>
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
 #include <sys/types.h>
 #include <signal.h>
 
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
 #include <errno.h>
 
 #include <unistd.h>
@@ -57,7 +73,7 @@ sighandler (int sig)
   suspended = 1;
 }
 
-/* FIXME: comment */
+/* Suspend execution for at least *TS_DELAY seconds.  */
 
 static void
 my_usleep (const struct timespec *ts_delay)
@@ -67,13 +83,20 @@ my_usleep (const struct timespec *ts_delay)
   tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000;
   if (tv_delay.tv_usec == 1000000)
     {
-      tv_delay.tv_sec++;
-      tv_delay.tv_usec = 0;
+      time_t t1 = tv_delay.tv_sec + 1;
+      if (t1 < tv_delay.tv_sec)
+       tv_delay.tv_usec = 1000000 - 1; /* close enough */
+      else
+       {
+         tv_delay.tv_sec = t1;
+         tv_delay.tv_usec = 0;
+       }
     }
   select (0, NULL, NULL, NULL, &tv_delay);
 }
 
-/* FIXME: comment */
+/* Suspend execution for at least *REQUESTED_DELAY seconds.  The
+   *REMAINING_DELAY part isn't implemented yet.  */
 
 int
 rpl_nanosleep (const struct timespec *requested_delay,
index 8dd25f6..11a7d87 100644 (file)
@@ -1,3 +1,12 @@
+2006-05-19  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * nanosleep.m4 (gl_FUNC_NANOSLEEP): Rename cache variables to use
+       gl_ rather than jm_.  Link, don't run, so that cross-compiles are
+       allowed.  Check that resulting type is arithmetic.  Move AC_REQUIRE
+       and AC_CHECK_HEADERS_ONCE outside of AC_CACHE_CHECK, since they're
+       not really conditional on the cache.
+       (gl_PREREQ_NANOSLEEP): Check for sys/select.h.
+
 2006-05-14  Paul Eggert  <eggert@cs.ucla.edu>
 
        * stdbool.m4 (AC_HEADER_STDBOOL): Fix overly-picky
index 98495e0..56c66bb 100644 (file)
@@ -1,4 +1,4 @@
-#serial 16
+#serial 17
 
 dnl From Jim Meyering.
 dnl Check for the nanosleep function.
@@ -16,6 +16,12 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
 [
  AC_LIBSOURCES([nanosleep.c])
 
+ dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_HEADER_TIME])
+ AC_CHECK_HEADERS_ONCE(sys/time.h)
+
  nanosleep_save_libs=$LIBS
 
  # Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
@@ -25,15 +31,10 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
                 LIB_NANOSLEEP=$ac_cv_search_nanosleep])
  AC_SUBST([LIB_NANOSLEEP])
 
- AC_CACHE_CHECK([whether nanosleep works],
-  jm_cv_func_nanosleep_works,
+ AC_CACHE_CHECK([for nanosleep],
+  [gl_cv_func_nanosleep],
   [
-   dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
-   AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
-
-   AC_REQUIRE([AC_HEADER_TIME])
-   AC_CHECK_HEADERS_ONCE(sys/time.h)
-   AC_TRY_RUN([
+   AC_LINK_IFELSE([AC_LANG_SOURCE([[
 #   if TIME_WITH_SYS_TIME
 #    include <sys/time.h>
 #    include <time.h>
@@ -51,15 +52,13 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
       struct timespec ts_sleep, ts_remaining;
       ts_sleep.tv_sec = 0;
       ts_sleep.tv_nsec = 1;
-      return nanosleep (&ts_sleep, &ts_remaining) != 0;
+      return nanosleep (&ts_sleep, &ts_remaining) < 0;
     }
-         ],
-        jm_cv_func_nanosleep_works=yes,
-        jm_cv_func_nanosleep_works=no,
-        dnl When crosscompiling, assume the worst.
-        jm_cv_func_nanosleep_works=no)
+      ]])],
+     [gl_cv_func_nanosleep=yes],
+     [gl_cv_func_nanosleep=no])
   ])
-  if test $jm_cv_func_nanosleep_works = no; then
+  if test $gl_cv_func_nanosleep = no; then
     AC_LIBOBJ(nanosleep)
     AC_DEFINE(nanosleep, rpl_nanosleep,
       [Define to rpl_nanosleep if the replacement function should be used.])
@@ -73,4 +72,5 @@ AC_DEFUN([gl_FUNC_NANOSLEEP],
 AC_DEFUN([gl_PREREQ_NANOSLEEP],
 [
   AC_CHECK_FUNCS_ONCE(siginterrupt)
+  AC_CHECK_HEADERS_ONCE(sys/select.h)
 ])