summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2014-01-24 13:04:14 +0100
committerKarel Zak <kzak@redhat.com>2014-01-24 13:04:14 +0100
commita5bd7939961aaa6e39f3b298e556063cfd97d75a (patch)
treec7b5425996072f268f5cbb6c5496a4a2a95a5256
parent3523ca7da47b10088a396595580de8b27f3a7082 (diff)
downloadutil-linux-a5bd7939961aaa6e39f3b298e556063cfd97d75a.tar.gz
include/c.h: prefer nanosleep() over usleep()
Let's use nanosleep() although if usleep() exists. The nanosleep function does no interact with signals and other timers. The patch introduces xusleep() as replacement to libc (or our fallback) usleep(). Yes, we don't want to use struct timespec + nanosleep() everywhere in code as nano-time resolution is useless for us. The patch also enlarges delays in some busy wait loops. It seems enough to try read/write 4x per second. Signed-off-by: Karel Zak <kzak@redhat.com>
-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 424ab7d3..2546cff1 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 4a9bf3d4..a192fb1d 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 d9b6f593..734757d8 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 4560ee0f..37d006dd 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 9ed83436..8e67009c 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 eedf78d0..51ffb3c5 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 baa1b38c..7c0579c6 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 2f611a4c..d2366a6a 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);
}