diff --git a/lib/srfi/18/threads.c b/lib/srfi/18/threads.c index 7ae68c72..87071a73 100644 --- a/lib/srfi/18/threads.c +++ b/lib/srfi/18/threads.c @@ -147,7 +147,7 @@ static void sexp_insert_timed (sexp ctx, sexp thread, sexp timeout) { sexp ls1=SEXP_NULL, ls2; sexp_delete_list(ctx, SEXP_G_THREADS_PAUSED, thread); ls2 = sexp_global(ctx, SEXP_G_THREADS_PAUSED); - if (sexp_fixnump(timeout) || sexp_flonump(timeout)) + if (sexp_realp(timeout)) gettimeofday(&sexp_context_timeval(thread), NULL); if (sexp_fixnump(timeout)) { sexp_context_timeval(thread).tv_sec += sexp_unbox_fixnum(timeout); @@ -160,6 +160,16 @@ static void sexp_insert_timed (sexp ctx, sexp thread, sexp timeout) { sexp_context_timeval(thread).tv_sec += 1; sexp_context_timeval(thread).tv_usec -= 1000000; } +#endif +#if SEXP_USE_RATIOS + } else if (sexp_ratiop(timeout)) { + d = sexp_ratio_to_double(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; @@ -168,7 +178,7 @@ static void sexp_insert_timed (sexp ctx, sexp thread, sexp timeout) { sexp_context_timeval(thread).tv_sec = 0; sexp_context_timeval(thread).tv_usec = 0; } - if (sexp_numberp(timeout) || sexp_contextp(timeout)) + if (sexp_realp(timeout) || sexp_contextp(timeout)) while (sexp_pairp(ls2) && sexp_context_before(sexp_car(ls2), sexp_context_timeval(thread))) ls1=ls2, ls2=sexp_cdr(ls2); @@ -196,7 +206,7 @@ sexp sexp_thread_join (sexp ctx, sexp self, sexp_sint_t n, sexp thread, sexp tim sexp sexp_thread_sleep (sexp ctx, sexp self, sexp_sint_t n, sexp timeout) { sexp_context_waitp(ctx) = 1; if (timeout != SEXP_TRUE) { - sexp_assert_type(ctx, sexp_numberp, SEXP_NUMBER, timeout); + sexp_assert_type(ctx, sexp_realp, SEXP_NUMBER, timeout); sexp_context_event(ctx) = SEXP_FALSE; sexp_insert_timed(ctx, ctx, timeout); }