summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/all-io.h8
-rw-r--r--include/c.h17
-rw-r--r--libmount/src/lock.c4
-rw-r--r--login-utils/sulogin.c4
-rw-r--r--sys-utils/hwclock-kd.c2
-rw-r--r--sys-utils/rtcwake.c2
-rw-r--r--term-utils/agetty.c2
-rw-r--r--text-utils/tailf.c2
8 files changed, 25 insertions, 16 deletions
diff --git a/include/all-io.h b/include/all-io.h
index 424ab7d3f..2546cff1b 100644
--- a/include/all-io.h
+++ b/include/all-io.h
@@ -29,7 +29,7 @@ static inline int write_all(int fd, const void *buf, size_t count)
} else if (errno != EINTR && errno != EAGAIN)
return -1;
if (errno == EAGAIN) /* Try later, *sigh* */
- usleep(10000);
+ xusleep(250000);
}
return 0;
}
@@ -49,7 +49,7 @@ static inline int fwrite_all(const void *ptr, size_t size,
} else if (errno != EINTR && errno != EAGAIN)
return -1;
if (errno == EAGAIN) /* Try later, *sigh* */
- usleep(10000);
+ xusleep(250000);
}
return 0;
}
@@ -65,8 +65,10 @@ static inline ssize_t read_all(int fd, char *buf, size_t count)
ret = read(fd, buf, count);
if (ret <= 0) {
if ((errno == EAGAIN || errno == EINTR || ret == 0) &&
- (tries++ < 5))
+ (tries++ < 5)) {
+ xusleep(250000);
continue;
+ }
return c ? c : -1;
}
if (ret > 0)
diff --git a/include/c.h b/include/c.h
index 4a9bf3d42..a192fb1dd 100644
--- a/include/c.h
+++ b/include/c.h
@@ -253,20 +253,27 @@ static inline size_t get_hostname_max(void)
return 64;
}
-#ifndef HAVE_USLEEP
/*
- * This function is marked obsolete in POSIX.1-2001 and removed in
- * POSIX.1-2008. It is replaced with nanosleep().
+ * The usleep function is marked obsolete in POSIX.1-2001 and removed in
+ * POSIX.1-2008. This is replaced with nanosleep() that provides more
+ * advantages (like no interaction with signals and other timer functions.
*/
-static inline int usleep(useconds_t usec)
+#include <time.h>
+
+static inline int xusleep(useconds_t usec)
{
+#ifdef HAVE_NANOSLEEP
struct timespec waittime = {
.tv_sec = usec / 1000000L,
.tv_nsec = (usec % 1000000L) * 1000
};
return nanosleep(&waittime, NULL);
-}
+#elif defined(HAVE_USLEEP)
+ return usleep(usec);
+#else
+# error "System with usleep() or nanosleep() required!"
#endif
+}
/*
* Constant strings for usage() functions. For more info see
diff --git a/libmount/src/lock.c b/libmount/src/lock.c
index d9b6f5939..734757d81 100644
--- a/libmount/src/lock.c
+++ b/libmount/src/lock.c
@@ -650,7 +650,7 @@ int test_lock(struct libmnt_test *ts, int argc, char *argv[])
if (synctime && synctime - tv.tv_sec > 1) {
usecs = ((synctime - tv.tv_sec) * 1000000UL) -
(1000000UL - tv.tv_usec);
- usleep(usecs);
+ xusleep(usecs);
}
}
@@ -676,7 +676,7 @@ int test_lock(struct libmnt_test *ts, int argc, char *argv[])
* concurrent processes happy.
*/
if (synctime)
- usleep(25000);
+ xusleep(25000);
}
return 0;
diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c
index 4560ee0fb..37d006dde 100644
--- a/login-utils/sulogin.c
+++ b/login-utils/sulogin.c
@@ -590,7 +590,7 @@ static char *getpasswd(struct console *con)
while (cp->eol == '\0') {
if (read(fd, &c, 1) < 1) {
if (errno == EINTR || errno == EAGAIN) {
- usleep(1000);
+ xusleep(250000);
continue;
}
ret = (char*)0;
@@ -993,7 +993,7 @@ int main(int argc, char **argv)
if (*usemask & (1<<con->id))
continue;
kill(con->pid, SIGHUP);
- usleep(5000);
+ usleep(50000);
kill(con->pid, SIGKILL);
}
}
diff --git a/sys-utils/hwclock-kd.c b/sys-utils/hwclock-kd.c
index 9ed83436a..8e67009cb 100644
--- a/sys-utils/hwclock-kd.c
+++ b/sys-utils/hwclock-kd.c
@@ -66,7 +66,7 @@ static int synchronize_to_clock_tick_kd(void)
* A2000 RTCs and simply hangs after some time. Inserting a
* sleep helps."
*/
- usleep(1);
+ xusleep(1);
if (ioctl(con_fd, KDGHWCLK, &nowtime) == -1) {
warn(_("KDGHWCLK ioctl to read time failed in loop"));
diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c
index eedf78d0c..51ffb3c5a 100644
--- a/sys-utils/rtcwake.c
+++ b/sys-utils/rtcwake.c
@@ -560,7 +560,7 @@ int main(int argc, char **argv)
program_invocation_short_name, suspend, devname,
ctime(&alarm));
fflush(stdout);
- usleep(10 * 1000);
+ xusleep(10 * 1000);
}
if (strcmp(suspend, "no") == 0) {
diff --git a/term-utils/agetty.c b/term-utils/agetty.c
index baa1b38cb..7c0579c63 100644
--- a/term-utils/agetty.c
+++ b/term-utils/agetty.c
@@ -1589,7 +1589,7 @@ static char *get_logname(struct options *op, struct termios *tp, struct chardata
/* The terminal could be open with O_NONBLOCK when
* -L (force CLOCAL) is specified... */
if (errno == EINTR || errno == EAGAIN) {
- usleep(250000);
+ xusleep(250000);
continue;
}
switch (errno) {
diff --git a/text-utils/tailf.c b/text-utils/tailf.c
index 2f611a4cb..d2366a6a0 100644
--- a/text-utils/tailf.c
+++ b/text-utils/tailf.c
@@ -133,7 +133,7 @@ watch_file(const char *filename, off_t *size)
{
do {
roll_file(filename, size);
- usleep(250000);
+ xusleep(250000);
} while(1);
}