Prevent select(2) from blocking if a pending event is found during
knote registering.

OK?

Index: kern/sys_generic.c
===================================================================
RCS file: src/sys/kern/sys_generic.c,v
retrieving revision 1.143
diff -u -p -r1.143 sys_generic.c
--- kern/sys_generic.c  22 Nov 2021 17:15:05 -0000      1.143
+++ kern/sys_generic.c  29 Nov 2021 16:12:17 -0000
@@ -600,6 +600,7 @@ dopselect(struct proc *p, int nd, fd_set
     struct timespec *timeout, const sigset_t *sigmask, register_t *retval)
 {
        struct kqueue_scan_state scan;
+       struct timespec zerots = {};
        fd_mask bits[6];
        fd_set *pibits[3], *pobits[3];
        int error, ncollected = 0, nevents = 0;
@@ -679,6 +680,10 @@ dopselect(struct proc *p, int nd, fd_set
                goto done;
        }
 
+       /* Do not block if registering found pending events. */
+       if (ncollected > 0)
+               timeout = &zerots;
+
        /* Collect at most `nevents' possibly waiting in kqueue_scan() */
        kqueue_scan_setup(&scan, p->p_kq);
        while (nevents > 0) {

Reply via email to