summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-05-19 18:03:25 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-05-19 18:03:25 +0000
commit86873e50825448c55e538a5210f9c4fcb0d87166 (patch)
tree2342c22194b4dde2d4c6d4b0b78a7f4a938d2e36
parent7e9a2a14296e6467d0dc238c4741b70be431c954 (diff)
downloadcoreutils-86873e50825448c55e538a5210f9c4fcb0d87166.tar.xz
Sync nanosleep from gnulib.
-rw-r--r--lib/ChangeLog6
-rw-r--r--lib/nanosleep.c33
-rw-r--r--m4/ChangeLog9
-rw-r--r--m4/nanosleep.m432
4 files changed, 59 insertions, 21 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 05b0daeac..5e6cb7e49 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -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-15 Jim Meyering <jim@meyering.net>
Avoid the expense of an fstat, when possible.
diff --git a/lib/nanosleep.c b/lib/nanosleep.c
index 61fc1b90b..7ffe05d2e 100644
--- a/lib/nanosleep.c
+++ b/lib/nanosleep.c
@@ -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
@@ -27,9 +29,23 @@
#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,
diff --git a/m4/ChangeLog b/m4/ChangeLog
index c984e9bb9..fa7bd23eb 100644
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -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
diff --git a/m4/nanosleep.m4 b/m4/nanosleep.m4
index 98495e0d1..56c66bbb9 100644
--- a/m4/nanosleep.m4
+++ b/m4/nanosleep.m4
@@ -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)
])