summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgreen <green@FreeBSD.org>2004-02-20 04:00:48 +0000
committergreen <green@FreeBSD.org>2004-02-20 04:00:48 +0000
commit59b7a05d47a71d19ef8540b882ab62c6ac273af1 (patch)
tree21de92dfa711b878f420f34736c8c3e2f097061d
parent0cd09e871801870673939336dc721e674047f03c (diff)
downloadFreeBSD-src-59b7a05d47a71d19ef8540b882ab62c6ac273af1.zip
FreeBSD-src-59b7a05d47a71d19ef8540b882ab62c6ac273af1.tar.gz
Make sure to wake up any select waiters when closing a kqueue (also, not
crash). I am fairly sure that only people with SMP and multi-threaded apps using kqueue will be affected by this, so I have a stress-testing program on my web site: <URL:http://green.homeunix.org/~green/getaddrinfo-pthreads-stresstest.c>
-rw-r--r--sys/kern/kern_event.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index cf30f3d..1be6383 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -902,6 +902,10 @@ kqueue_close(struct file *fp, struct thread *td)
}
}
FILEDESC_UNLOCK(fdp);
+ if (kq->kq_state & KQ_SEL) {
+ kq->kq_state &= ~KQ_SEL;
+ selwakeuppri(&kq->kq_sel, PSOCK);
+ }
free(kq, M_KQUEUE);
fp->f_data = NULL;
OpenPOWER on IntegriCloud