1
0
mirror of https://github.com/janet-lang/janet synced 2024-12-22 22:40:26 +00:00

Fix #1321, poll event loop CPU usage issue

A stream may have a fiber attached for memory management purposes, but
not actually be waiting on anything. Be more seletive with poll, which
is not edge-triggered, to not poll for readiness on these streams.
This commit is contained in:
Calvin Rose 2023-10-29 11:34:21 -05:00
parent 609b629c22
commit 3b189eab64
2 changed files with 4 additions and 5 deletions

View File

@ -1818,8 +1818,8 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp timeout) {
JanetStream *stream = janet_vm.streams[i]; JanetStream *stream = janet_vm.streams[i];
janet_vm.fds[i + 1].events = 0; janet_vm.fds[i + 1].events = 0;
janet_vm.fds[i + 1].revents = 0; janet_vm.fds[i + 1].revents = 0;
if (stream->read_fiber) janet_vm.fds[i + 1].events |= POLLIN; if (stream->read_fiber && stream->read_fiber->ev_callback) janet_vm.fds[i + 1].events |= POLLIN;
if (stream->write_fiber) janet_vm.fds[i + 1].events |= POLLOUT; if (stream->write_fiber && stream->write_fiber->ev_callback) janet_vm.fds[i + 1].events |= POLLOUT;
} }
/* Poll for events */ /* Poll for events */

View File

@ -125,7 +125,7 @@ void net_callback_connect(JanetFiber *fiber, JanetAsyncEvent event) {
default: default:
break; break;
#ifndef JANET_WINDOWS #ifndef JANET_WINDOWS
/* Wait until we have an actually event before checking. /* Wait until we have an actual event before checking.
* Windows doesn't support async connect with this, just try immediately.*/ * Windows doesn't support async connect with this, just try immediately.*/
case JANET_ASYNC_EVENT_INIT: case JANET_ASYNC_EVENT_INIT:
#endif #endif
@ -160,7 +160,7 @@ void net_callback_connect(JanetFiber *fiber, JanetAsyncEvent event) {
janet_async_end(fiber); janet_async_end(fiber);
} }
static void net_sched_connect(JanetStream *stream) { static JANET_NO_RETURN void net_sched_connect(JanetStream *stream) {
NetStateConnect *state = janet_malloc(sizeof(NetStateConnect)); NetStateConnect *state = janet_malloc(sizeof(NetStateConnect));
state->did_connect = 0; state->did_connect = 0;
janet_async_start(stream, JANET_ASYNC_LISTEN_WRITE, net_callback_connect, state); janet_async_start(stream, JANET_ASYNC_LISTEN_WRITE, net_callback_connect, state);
@ -575,7 +575,6 @@ JANET_CORE_FN(cfun_net_connect,
} }
net_sched_connect(stream); net_sched_connect(stream);
janet_await();
} }
static const char *serverify_socket(JSock sfd) { static const char *serverify_socket(JSock sfd) {