From f553c5da47c3f4b716ed3f052b8768c91016af06 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Fri, 6 Sep 2024 00:00:09 -0500 Subject: [PATCH] Update ev.c with workaround for failing chat server. 2 issues: - With poll backend, we were polling for writes even after we finished writing. Presents as wasting a lot of CPU. - Fixes strange closing behavior of chat server. --- examples/chatserver.janet | 5 +++-- src/core/ev.c | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/examples/chatserver.janet b/examples/chatserver.janet index 11bce077..c9b5646f 100644 --- a/examples/chatserver.janet +++ b/examples/chatserver.janet @@ -8,7 +8,7 @@ (defn handler [connection] - (print "created " connection) + (print "connection: " connection) (net/write connection "Whats your name?\n") (def name (string/trim (string (ev/read connection 100)))) (print name " connected") @@ -23,13 +23,14 @@ (put conmap name nil) (:close connection)) (while (def msg (ev/read connection 100)) - (broadcast name (string msg))) + (broadcast name (string msg))) (print name " disconnected"))))) (defn main [& args] (printf "STARTING SERVER...") (flush) (def my-server (net/listen "127.0.0.1" "8000")) + '(handler (net/accept my-server)) (forever (def connection (net/accept my-server)) (ev/call handler connection))) diff --git a/src/core/ev.c b/src/core/ev.c index 1ee0b207..03a4b623 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -2277,6 +2277,7 @@ void ev_callback_read(JanetFiber *fiber, JanetAsyncEvent event) { break; case JANET_ASYNC_EVENT_CLOSE: janet_schedule(fiber, janet_wrap_nil()); + stream->read_fiber = NULL; janet_async_end(fiber); break; #ifdef JANET_WINDOWS @@ -2361,6 +2362,7 @@ void ev_callback_read(JanetFiber *fiber, JanetAsyncEvent event) { } else { janet_schedule(fiber, janet_wrap_nil()); } + stream->read_fiber = NULL; janet_async_end(fiber); break; } @@ -2402,6 +2404,7 @@ void ev_callback_read(JanetFiber *fiber, JanetAsyncEvent event) { nread = 0; } else { janet_cancel(fiber, janet_ev_lasterr()); + stream->read_fiber = NULL; janet_async_end(fiber); break; } @@ -2411,6 +2414,7 @@ void ev_callback_read(JanetFiber *fiber, JanetAsyncEvent event) { state->bytes_read += nread; if (state->bytes_read == 0 && (state->mode != JANET_ASYNC_READMODE_RECVFROM)) { janet_schedule(fiber, janet_wrap_nil()); + stream->read_fiber = NULL; janet_async_end(fiber); break; } @@ -2434,6 +2438,7 @@ void ev_callback_read(JanetFiber *fiber, JanetAsyncEvent event) { resume_val = janet_wrap_buffer(buffer); } janet_schedule(fiber, resume_val); + stream->read_fiber = NULL; janet_async_end(fiber); break; } @@ -2526,6 +2531,7 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) { } case JANET_ASYNC_EVENT_CLOSE: janet_cancel(fiber, janet_cstringv("stream closed")); + stream->write_fiber = NULL; janet_async_end(fiber); break; #ifdef JANET_WINDOWS @@ -2612,10 +2618,12 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) { #else case JANET_ASYNC_EVENT_ERR: janet_cancel(fiber, janet_cstringv("stream err")); + stream->write_fiber = NULL; janet_async_end(fiber); break; case JANET_ASYNC_EVENT_HUP: janet_cancel(fiber, janet_cstringv("stream hup")); + stream->write_fiber = NULL; janet_async_end(fiber); break; case JANET_ASYNC_EVENT_INIT: @@ -2653,6 +2661,7 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) { if (nwrote == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) break; janet_cancel(fiber, janet_ev_lasterr()); + stream->write_fiber = NULL; janet_async_end(fiber); break; } @@ -2660,6 +2669,7 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) { /* Unless using datagrams, empty message is a disconnect */ if (nwrote == 0 && !dest_abst) { janet_cancel(fiber, janet_cstringv("disconnect")); + stream->write_fiber = NULL; janet_async_end(fiber); break; } @@ -2673,6 +2683,7 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) { state->start = start; if (start >= len) { janet_schedule(fiber, janet_wrap_nil()); + stream->write_fiber = NULL; janet_async_end(fiber); break; }