From 9510e5b5c28d696815e7880bf9e1298fe8f41481 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Tue, 7 Aug 2012 22:30:34 +0900 Subject: [PATCH] busy loop on EAGAIN when srfi-18 isn't loaded instead of returning EOF --- vm.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/vm.c b/vm.c index 1977bced..6dbec6e9 100644 --- a/vm.c +++ b/vm.c @@ -1922,10 +1922,10 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) { if (i == EOF) { #if SEXP_USE_GREEN_THREADS if ((sexp_port_stream(_ARG2) ? ferror(sexp_port_stream(_ARG2)) : 1) - && (errno == EAGAIN) - && sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) { + && (errno == EAGAIN)) { if (sexp_port_stream(_ARG1)) clearerr(sexp_port_stream(_ARG2)); - sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG2); + if (sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) + sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG2); fuel = 0; ip--; /* try again */ goto loop; @@ -2002,10 +2002,11 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) { if (i == EOF) { #if SEXP_USE_GREEN_THREADS if ((sexp_port_stream(_ARG1) ? ferror(sexp_port_stream(_ARG1)) : 1) - && (errno == EAGAIN) - && sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) { + && (errno == EAGAIN)) { if (sexp_port_stream(_ARG1)) clearerr(sexp_port_stream(_ARG1)); - sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1); + /* TODO: block and unblock */ + if (sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) + sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1); fuel = 0; ip--; /* try again */ } else @@ -2027,10 +2028,10 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) { if (i == EOF) { #if SEXP_USE_GREEN_THREADS if ((sexp_port_stream(_ARG1) ? ferror(sexp_port_stream(_ARG1)) : 1) - && (errno == EAGAIN) - && sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) { + && (errno == EAGAIN)) { if (sexp_port_stream(_ARG1)) clearerr(sexp_port_stream(_ARG1)); - sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1); + if (sexp_applicablep(sexp_global(ctx, SEXP_G_THREADS_BLOCKER))) + sexp_apply1(ctx, sexp_global(ctx, SEXP_G_THREADS_BLOCKER), _ARG1); fuel = 0; ip--; /* try again */ } else