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) {