diff options
author | green <green@FreeBSD.org> | 2004-02-20 04:00:48 +0000 |
---|---|---|
committer | green <green@FreeBSD.org> | 2004-02-20 04:00:48 +0000 |
commit | 59b7a05d47a71d19ef8540b882ab62c6ac273af1 (patch) | |
tree | 21de92dfa711b878f420f34736c8c3e2f097061d | |
parent | 0cd09e871801870673939336dc721e674047f03c (diff) | |
download | FreeBSD-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.c | 4 |
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; |