diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-01-22 19:09:49 -0500 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2020-02-05 16:28:53 -0500 |
commit | 561c55ecb2c396d14a2940fe7ae451fc72497154 (patch) | |
tree | f47a57ce02029590d460d460c11f5ac349edb68e | |
parent | c1f18474ab2ac8cff249ef0f4b7803fabc6b3670 (diff) | |
download | haskell-561c55ecb2c396d14a2940fe7ae451fc72497154.tar.gz |
rts: Use nanosleep instead of usleep
usleep was removed in POSIX.1-2008.
-rw-r--r-- | rts/posix/itimer/Pthread.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/rts/posix/itimer/Pthread.c b/rts/posix/itimer/Pthread.c index 6f9cd8f4b3..7ddc44e538 100644 --- a/rts/posix/itimer/Pthread.c +++ b/rts/posix/itimer/Pthread.c @@ -95,6 +95,19 @@ static Condition start_cond; static Mutex mutex; static OSThreadId thread; +/* N.B. usleep has been removed from POSIX 2008 */ +static int my_sleep(Time t) +{ + struct timespec req; + req.tv_sec = TimeToSeconds(t); + req.tv_nsec = (t - req.tv_sec * TIME_RESOLUTION); + int ret; + do { + ret = nanosleep(&req, &req); + } while (ret == -1 && errno == EINTR); + return ret; +} + static void *itimer_thread_func(void *_handle_tick) { TickProc handle_tick = _handle_tick; @@ -127,8 +140,8 @@ static void *itimer_thread_func(void *_handle_tick) } } } else { - if (usleep(TimeToUS(itimer_interval)) != 0 && errno != EINTR) { - sysErrorBelch("usleep(TimeToUS(itimer_interval) failed"); + if (my_sleep(itimer_interval) != 0 && errno != EINTR) { + sysErrorBelch("ITimer: nanosleep failed"); } } |