From b6e3387a623d66c3cc1380561ea7cc3517b10c44 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Fri, 4 Nov 2011 22:45:47 +0900 Subject: [PATCH] Thread timeout patch from Lorenzo. --- lib/srfi/18/threads.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/srfi/18/threads.c b/lib/srfi/18/threads.c index fde12936..74e8da43 100644 --- a/lib/srfi/18/threads.c +++ b/lib/srfi/18/threads.c @@ -135,6 +135,10 @@ static void sexp_insert_timed (sexp ctx, sexp thread, sexp timeout) { d = sexp_flonum_value(timeout); sexp_context_timeval(thread).tv_sec += trunc(d); sexp_context_timeval(thread).tv_usec += (d-trunc(d))*1000000; + if (sexp_context_timeval(thread).tv_usec > 1000000) { + sexp_context_timeval(thread).tv_sec += 1; + sexp_context_timeval(thread).tv_usec -= 1000000; + } #endif } else if (sexp_contextp(timeout)) { sexp_context_timeval(thread).tv_sec = sexp_context_timeval(timeout).tv_sec; @@ -520,10 +524,11 @@ sexp sexp_scheduler (sexp ctx sexp_api_params(self, n), sexp root_thread) { } else { /* wait until the next timeout */ gettimeofday(&tval, NULL); - if (tval.tv_sec < sexp_context_timeval(res).tv_sec) + if (tval.tv_sec <= sexp_context_timeval(res).tv_sec) { usecs = (sexp_context_timeval(res).tv_sec - tval.tv_sec) * 1000000; - if (tval.tv_usec < sexp_context_timeval(res).tv_usec || usecs > 0) - usecs += sexp_context_timeval(res).tv_usec - tval.tv_usec; + if (tval.tv_usec < sexp_context_timeval(res).tv_usec || usecs > 0) + usecs += sexp_context_timeval(res).tv_usec - tval.tv_usec; + } } /* either wait on an fd, or just sleep */ pollfds = sexp_global(res, SEXP_G_THREADS_POLL_FDS);