mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-11 13:22:33 +00:00
libc: unify semantic of sleep functions
sleep(), usleep(), and nanosleep() now return immediately on zero-timeout. Also, non-zero timeouts sleep at least 1 ms (the current minimal timeout in libc), which compensates rounding errors. Issue #3550
This commit is contained in:
parent
ee7a77643e
commit
3d4bed3374
@ -53,10 +53,15 @@ static void millisleep(Genode::uint64_t timeout_ms)
|
||||
extern "C" __attribute__((weak))
|
||||
int nanosleep(const struct timespec *req, struct timespec *rem)
|
||||
{
|
||||
/* XXX nanosleep({0,0}) may yield but is not required to do so */
|
||||
if (!req->tv_sec && !req->tv_nsec) return 0;
|
||||
|
||||
Genode::uint64_t sleep_ms = (Genode::uint64_t)req->tv_sec*1000;
|
||||
if (req->tv_nsec)
|
||||
sleep_ms += req->tv_nsec / 1000000;
|
||||
millisleep(sleep_ms);
|
||||
|
||||
/* sleep at least 1 ms */
|
||||
millisleep(sleep_ms ? : 1);
|
||||
|
||||
if (rem)
|
||||
*rem = { 0, 0 };
|
||||
@ -101,8 +106,13 @@ int __sys_clock_nanosleep(clockid_t clock_id, int flags,
|
||||
extern "C" __attribute__((weak))
|
||||
unsigned int sleep(unsigned int seconds)
|
||||
{
|
||||
Genode::uint64_t const sleep_ms = 1000 * (Genode::uint64_t)seconds;
|
||||
millisleep(sleep_ms);
|
||||
/* XXX sleep(0) may yield but is not required to do so */
|
||||
if (!seconds) return 0;
|
||||
|
||||
Libc::uint64_t const sleep_ms = (Libc::uint64_t)seconds*1000;
|
||||
|
||||
/* sleep at least 1 ms */
|
||||
millisleep(sleep_ms ? : 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -110,8 +120,13 @@ unsigned int sleep(unsigned int seconds)
|
||||
extern "C" __attribute__((weak))
|
||||
int usleep(useconds_t useconds)
|
||||
{
|
||||
if (useconds)
|
||||
millisleep(useconds / 1000);
|
||||
/* XXX usleep(0) may yield but is not required to do so */
|
||||
if (!useconds) return 0;
|
||||
|
||||
Libc::uint64_t const sleep_ms = (Libc::uint64_t)useconds/1000;
|
||||
|
||||
/* sleep at least 1 ms */
|
||||
millisleep(sleep_ms ? : 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user