diff options
author | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-06-03 08:11:56 +0000 |
---|---|---|
committer | Bernhard Reutner-Fischer <rep.dot.nop@gmail.com> | 2008-06-03 08:11:56 +0000 |
commit | 4cc4b30426c5e5a0ecf912791e3f27312438d10e (patch) | |
tree | 81c31f4bde953f135d9e63582b162c17cc173f10 /libc/unistd/sleep.c | |
parent | 1f124eb0280a5009f1265a9dca49fdb0d95b845e (diff) |
- adds several config-options to allow for turning off certain features
like
o UCLIBC_HAS_GNU_ERROR
o UCLIBC_HAS_BSD_ERR
o UCLIBC_HAS_PTY
o UCLIBC_HAS_GETPT (1)
o UCLIBC_SYSCALL_STUBS
o UCLIBC_SYSCALL_STUB_WARNING
o UCLIBC_LINUX_SPECIFIC (2)
o UCLIBC_BSD_SPECIFIC (3)
o UCLIBC_NTP_LEGACY (4)
o UCLIBC_SV4_DEPRECATED (5)
o UCLIBC_HAVE_REALTIME (6)
o UCLIBC_HAVE_ADVANCED_REALTIME (7)
o UCLIBC_HAVE_EPOLL (8)
o UCLIBC_HAVE_XATTR (9)
o UCLIBC_HAVE_PROFILING (10)
(1) make non-standard getpt optional and implement standard posix_openpt
(2) fstatfs(), inotify_*(), ioperm(), iopl(), madvise(), modify_ldt(),
personality()
ppoll(), setresuid()
(3) mincore(), getdomainname(), setdomainname()
(4) ntp_adjtime(), ntp_gettime() aliases
(5) ustat() [use statfs(2) in your code instead]
(6) All marked as "(REALTIME)" in SUSv3
(7) All marked as "(ADVANCED REALTIME)" in SUSv3
(8) epoll_create(), epoll_ctl(), epoll_wait()
(9) all Extended Attributes
(10) helpers for gcc's -finstrument-functions
- Fixes _dl_exit()
- Implements sleep(3) for !UCLIBC_HAVE_REALTIME
- Implements usleep(3) for !UCLIBC_HAVE_REALTIME
- adds #warning about incorrect posix_fadvise{,64}()
- removes unused and unwanted uselib()
Net outcome is that an allnoconfig with HAVE_SHARED is now about 88k instead
of formerly 130k.
Diffstat (limited to 'libc/unistd/sleep.c')
-rw-r--r-- | libc/unistd/sleep.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libc/unistd/sleep.c b/libc/unistd/sleep.c index 4381c45c7..c5c9cdd21 100644 --- a/libc/unistd/sleep.c +++ b/libc/unistd/sleep.c @@ -27,6 +27,9 @@ libc_hidden_proto(sleep) libc_hidden_proto(sigaction) libc_hidden_proto(sigprocmask) + +/* version perusing nanosleep */ +#if defined __UCLIBC_HAS_REALTIME__ //libc_hidden_proto(__sigaddset) //libc_hidden_proto(__sigemptyset) //libc_hidden_proto(__sigismember) @@ -114,4 +117,56 @@ unsigned int sleep (unsigned int seconds) return result; } #endif +#else /* __UCLIBC_HAS_REALTIME__ */ +libc_hidden_proto(sigaction) +/* no nanosleep, use signals and alarm() */ +static void sleep_alarm_handler(int attribute_unused sig) +{ +} +unsigned int sleep (unsigned int seconds) +{ + struct sigaction act, oact; + sigset_t set, oset; + unsigned int result, remaining; + time_t before, after; + int old_errno = errno; + + /* This is not necessary but some buggy programs depend on this. */ + if (seconds == 0) + return 0; + + /* block SIGALRM */ + if (__sigemptyset (&set) < 0 + || __sigaddset (&set, SIGALRM) < 0 + || sigprocmask (SIG_BLOCK, &set, &oset)) + return seconds; + + act.sa_handler = sleep_alarm_handler; + act.sa_flags = 0; + act.sa_mask = oset; + if (sigaction(SIGALRM, &act, &oact) < 0) + return seconds; + + before = time(NULL); + remaining = alarm(seconds); + if (remaining && remaining > seconds) { + /* restore user's alarm */ + (void) sigaction(SIGALRM, &oact, (struct sigaction *) NULL); + alarm(remaining); /* restore old alarm */ + sigsuspend(&oset); + after = time(NULL); + } else { + sigsuspend (&oset); + after = time(NULL); + (void) sigaction (SIGALRM, &oact, NULL); + } + result = after - before; + alarm(remaining > result ? remaining - result : 0); + sigprocmask (SIG_SETMASK, &oset, NULL); + + __set_errno(old_errno); + + return result > seconds ? 0 : seconds - result; +} +#endif /* __UCLIBC_HAS_REALTIME__ */ libc_hidden_def(sleep) |