diff options
author | kib <kib@FreeBSD.org> | 2013-09-13 19:50:50 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2013-09-13 19:50:50 +0000 |
commit | 36c84de38fc0ad766cbad9ed3b1cbca82726035f (patch) | |
tree | 64ae80629089cd33a9a644518d498d0aff4181e8 | |
parent | 99904243da23aa13861ff7c8f308dd5d325cc765 (diff) | |
download | FreeBSD-src-36c84de38fc0ad766cbad9ed3b1cbca82726035f.zip FreeBSD-src-36c84de38fc0ad766cbad9ed3b1cbca82726035f.tar.gz |
Use TAILQ instead of STAILQ for kqeueue filedescriptors to ensure constant
time removal on kqueue close.
Reported and tested by: pho
Reviewed by: jmg
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Approved by: re (delphij)
-rw-r--r-- | sys/kern/kern_event.c | 6 | ||||
-rw-r--r-- | sys/sys/event.h | 2 | ||||
-rw-r--r-- | sys/sys/eventvar.h | 2 |
3 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 8bde25a..85ea78c 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -707,7 +707,7 @@ sys_kqueue(struct thread *td, struct kqueue_args *uap) TASK_INIT(&kq->kq_task, 0, kqueue_task, kq); FILEDESC_XLOCK(fdp); - SLIST_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list); + TAILQ_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list); FILEDESC_XUNLOCK(fdp); finit(fp, FREAD | FWRITE, DTYPE_KQUEUE, kq, &kqueueops); @@ -1718,7 +1718,7 @@ kqueue_close(struct file *fp, struct thread *td) KQ_UNLOCK(kq); FILEDESC_XLOCK(fdp); - SLIST_REMOVE(&fdp->fd_kqlist, kq, kqueue, kq_list); + TAILQ_REMOVE(&fdp->fd_kqlist, kq, kq_list); FILEDESC_XUNLOCK(fdp); seldrain(&kq->kq_sel); @@ -2095,7 +2095,7 @@ knote_fdclose(struct thread *td, int fd) * We shouldn't have to worry about new kevents appearing on fd * since filedesc is locked. */ - SLIST_FOREACH(kq, &fdp->fd_kqlist, kq_list) { + TAILQ_FOREACH(kq, &fdp->fd_kqlist, kq_list) { KQ_LOCK(kq); again: diff --git a/sys/sys/event.h b/sys/sys/event.h index 1066e36..03bd7b9 100644 --- a/sys/sys/event.h +++ b/sys/sys/event.h @@ -135,7 +135,7 @@ struct kevent { struct knote; SLIST_HEAD(klist, knote); struct kqueue; -SLIST_HEAD(kqlist, kqueue); +TAILQ_HEAD(kqlist, kqueue); struct knlist { struct klist kl_list; void (*kl_lock)(void *); /* lock function */ diff --git a/sys/sys/eventvar.h b/sys/sys/eventvar.h index bdb3adf..ed1067f1 100644 --- a/sys/sys/eventvar.h +++ b/sys/sys/eventvar.h @@ -41,7 +41,7 @@ struct kqueue { struct mtx kq_lock; int kq_refcnt; - SLIST_ENTRY(kqueue) kq_list; + TAILQ_ENTRY(kqueue) kq_list; TAILQ_HEAD(, knote) kq_head; /* list of pending event */ int kq_count; /* number of pending events */ struct selinfo kq_sel; |