summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-10-22 15:46:04 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2010-10-22 15:46:04 +0200
commite9b9c97c33c52e9eafaf6bf6d682e43ecfa3aea7 (patch)
tree3845753f005bba882e99a83e2e9150fa56a6c81a
parent251a3c19cb4bba47fcd38c697b3d7679b3edb137 (diff)
sleep: tiny code shrink
...or rather, it WILL BE code shrink when gcc become clever enough to not emit a second, useless XORing of ebx: 31 db xor %ebx,%ebx 85 c0 test %eax,%eax 74 11 je 73 <__GI_sleep+0x73> 31 db xor %ebx,%ebx <=== ?! Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--libc/unistd/sleep.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/libc/unistd/sleep.c b/libc/unistd/sleep.c
index 438f5e282..6a237e3f9 100644
--- a/libc/unistd/sleep.c
+++ b/libc/unistd/sleep.c
@@ -82,6 +82,10 @@ unsigned int sleep (unsigned int seconds)
/* Run nanosleep, with SIGCHLD blocked if SIGCHLD is SIG_IGNed. */
result = nanosleep (&ts, &ts);
+ if (result != 0) {
+ /* Got EINTR. Return remaining time. */
+ result = (unsigned int) ts.tv_sec + (ts.tv_nsec >= 500000000L);
+ }
if (!__sigismember (&set, SIGCHLD)) {
/* We did block SIGCHLD, and old mask had no SIGCHLD bit.
@@ -91,10 +95,6 @@ unsigned int sleep (unsigned int seconds)
sigprocmask (SIG_SETMASK, &set, NULL); /* never fails */
}
- if (result != 0)
- /* Round remaining time. */
- result = (unsigned int) ts.tv_sec + (ts.tv_nsec >= 500000000L);
-
return result;
}
#endif