summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2020-01-22 19:09:49 -0500
committerBen Gamari <ben@smart-cactus.org>2020-02-05 16:28:53 -0500
commit561c55ecb2c396d14a2940fe7ae451fc72497154 (patch)
treef47a57ce02029590d460d460c11f5ac349edb68e
parentc1f18474ab2ac8cff249ef0f4b7803fabc6b3670 (diff)
downloadhaskell-561c55ecb2c396d14a2940fe7ae451fc72497154.tar.gz
rts: Use nanosleep instead of usleep
usleep was removed in POSIX.1-2008.
-rw-r--r--rts/posix/itimer/Pthread.c17
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");
}
}