diff options
author | jmg <jmg@FreeBSD.org> | 2006-09-24 04:47:47 +0000 |
---|---|---|
committer | jmg <jmg@FreeBSD.org> | 2006-09-24 04:47:47 +0000 |
commit | 28f00353ba5fc2f2baf2ccf2f0b9985f25059125 (patch) | |
tree | 87eb6e1d46cdd7b1acfa4bb3682b2e2722adc15e /sys/kern/kern_event.c | |
parent | 08d150cea64d52d18374d306967feb39d63c4e64 (diff) | |
download | FreeBSD-src-28f00353ba5fc2f2baf2ccf2f0b9985f25059125.zip FreeBSD-src-28f00353ba5fc2f2baf2ccf2f0b9985f25059125.tar.gz |
hide kqueue_register from public view, and replace it w/ kqfd_register...
this eliminates a possible race in aio registering a kevent..
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r-- | sys/kern/kern_event.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 8692808..a8c9638 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -88,6 +88,8 @@ TASKQUEUE_DEFINE_THREAD(kqueue); static int kevent_copyout(void *arg, struct kevent *kevp, int count); static int kevent_copyin(void *arg, struct kevent *kevp, int count); +static int kqueue_register(struct kqueue *kq, struct kevent *kev, + struct thread *td, int waitok); static int kqueue_aquire(struct file *fp, struct kqueue **kqp); static void kqueue_release(struct kqueue *kq, int locked); static int kqueue_expand(struct kqueue *kq, struct filterops *fops, @@ -783,11 +785,11 @@ kqueue_fo_release(int filt) } /* - * A ref to kq (obtained via kqueue_aquire) should be held. waitok will + * A ref to kq (obtained via kqueue_aquire) must be held. waitok will * influence if memory allocation should wait. Make sure it is 0 if you * hold any mutexes. */ -int +static int kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int waitok) { struct filterops *fops; @@ -1939,3 +1941,29 @@ knote_free(struct knote *kn) if (kn != NULL) uma_zfree(knote_zone, kn); } + +/* + * Register the kev w/ the kq specified by fd. + */ +int +kqfd_register(int fd, struct kevent *kev, struct thread *td, int waitok) +{ + struct kqueue *kq; + struct file *fp; + int error; + + if ((error = fget(td, fd, &fp)) != 0) + return (error); + if ((error = kqueue_aquire(fp, &kq)) != 0) + goto noaquire; + + error = kqueue_register(kq, kev, td, waitok); + + kqueue_release(kq, 0); + +noaquire: + if (fp != NULL) + fdrop(fp, td); + + return error; +} |