lib: Allow mtio block to take no file descriptor, allowing threads to just sleep.
authorFredrik Tolf <fredrik@dolda2000.com>
Tue, 13 May 2025 01:11:27 +0000 (03:11 +0200)
committerFredrik Tolf <fredrik@dolda2000.com>
Tue, 13 May 2025 01:11:27 +0000 (03:11 +0200)
lib/mtio-epoll.c
lib/mtio-kqueue.c
lib/mtio-select.c

index f4c4970..4636873 100644 (file)
@@ -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)
index 7d086e2..a821688 100644 (file)
@@ -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));
index e0a4177..167bd6f 100644 (file)
@@ -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 = &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);