From 99587986310c564757f0c8a15a44b74b98fc7898 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Tue, 13 May 2025 03:11:27 +0200 Subject: [PATCH] lib: Allow mtio block to take no file descriptor, allowing threads to just sleep. --- lib/mtio-epoll.c | 2 ++ lib/mtio-kqueue.c | 2 ++ lib/mtio-select.c | 30 +++++++++++++++++------------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/mtio-epoll.c b/lib/mtio-epoll.c index f4c4970..4636873 100644 --- a/lib/mtio-epoll.c +++ b/lib/mtio-epoll.c @@ -53,6 +53,8 @@ static int regfd(struct blocker *bl) struct blocker *o; struct epoll_event evd; + if(bl->fd < 0) + return(0); memset(&evd, 0, sizeof(evd)); evd.events = 0; if(bl->ev & EV_READ) diff --git a/lib/mtio-kqueue.c b/lib/mtio-kqueue.c index 7d086e2..a821688 100644 --- a/lib/mtio-kqueue.c +++ b/lib/mtio-kqueue.c @@ -54,6 +54,8 @@ static int regfd(struct blocker *bl) int prev; struct kevent evd; + if(bl->fd < 0) + return(0); if(bl->fd >= fdln) { if(fdlist) { fdlist = srealloc(fdlist, sizeof(*fdlist) * (bl->fd + 1)); diff --git a/lib/mtio-select.c b/lib/mtio-select.c index e0a4177..167bd6f 100644 --- a/lib/mtio-select.c +++ b/lib/mtio-select.c @@ -137,13 +137,15 @@ int ioloop(void) now = time(NULL); timeout = 0; for(bl = blockers; bl; bl = bl->n) { - if(bl->ev & EV_READ) - FD_SET(bl->fd, &rfds); - if(bl->ev & EV_WRITE) - FD_SET(bl->fd, &wfds); - FD_SET(bl->fd, &efds); - if(bl->fd > maxfd) - maxfd = bl->fd; + if(bl->fd >= 0) { + if(bl->ev & EV_READ) + FD_SET(bl->fd, &rfds); + if(bl->ev & EV_WRITE) + FD_SET(bl->fd, &wfds); + FD_SET(bl->fd, &efds); + if(bl->fd > maxfd) + maxfd = bl->fd; + } if((bl->to != 0) && ((timeout == 0) || (timeout > bl->to))) timeout = bl->to; } @@ -165,12 +167,14 @@ int ioloop(void) if((it.bl = bl->n) != NULL) it.bl->it = ⁢ ev = 0; - if(FD_ISSET(bl->fd, &rfds)) - ev |= EV_READ; - if(FD_ISSET(bl->fd, &wfds)) - ev |= EV_WRITE; - if(FD_ISSET(bl->fd, &efds)) - ev = -1; + if(bl->fd >= 0) { + if(FD_ISSET(bl->fd, &rfds)) + ev |= EV_READ; + if(FD_ISSET(bl->fd, &wfds)) + ev |= EV_WRITE; + if(FD_ISSET(bl->fd, &efds)) + ev = -1; + } if((ev < 0) || (ev & bl->ev)) { if(bl->id < 0) { resume(bl->th, ev); -- 2.11.0