thread-sleep! and other timeouts now accept ratios

This commit is contained in:
Alex Shinn 2012-09-17 15:11:05 +09:00
parent d56d6fd8c6
commit 35bfe1702b

View file

@ -147,7 +147,7 @@ static void sexp_insert_timed (sexp ctx, sexp thread, sexp timeout) {
sexp ls1=SEXP_NULL, ls2; sexp ls1=SEXP_NULL, ls2;
sexp_delete_list(ctx, SEXP_G_THREADS_PAUSED, thread); sexp_delete_list(ctx, SEXP_G_THREADS_PAUSED, thread);
ls2 = sexp_global(ctx, SEXP_G_THREADS_PAUSED); 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); gettimeofday(&sexp_context_timeval(thread), NULL);
if (sexp_fixnump(timeout)) { if (sexp_fixnump(timeout)) {
sexp_context_timeval(thread).tv_sec += sexp_unbox_fixnum(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_sec += 1;
sexp_context_timeval(thread).tv_usec -= 1000000; 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 #endif
} else if (sexp_contextp(timeout)) { } else if (sexp_contextp(timeout)) {
sexp_context_timeval(thread).tv_sec = sexp_context_timeval(timeout).tv_sec; 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_sec = 0;
sexp_context_timeval(thread).tv_usec = 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) while (sexp_pairp(ls2)
&& sexp_context_before(sexp_car(ls2), sexp_context_timeval(thread))) && sexp_context_before(sexp_car(ls2), sexp_context_timeval(thread)))
ls1=ls2, ls2=sexp_cdr(ls2); 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 sexp_thread_sleep (sexp ctx, sexp self, sexp_sint_t n, sexp timeout) {
sexp_context_waitp(ctx) = 1; sexp_context_waitp(ctx) = 1;
if (timeout != SEXP_TRUE) { 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_context_event(ctx) = SEXP_FALSE;
sexp_insert_timed(ctx, ctx, timeout); sexp_insert_timed(ctx, ctx, timeout);
} }