summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_event.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r--sys/kern/kern_event.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 805b6b5..0b6f7da 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -1116,6 +1116,9 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, struct thread *td, int wa
int error, filt, event;
int haskqglobal, filedesc_unlock;
+ if ((kev->flags & (EV_ENABLE | EV_DISABLE)) == (EV_ENABLE | EV_DISABLE))
+ return (EINVAL);
+
fp = NULL;
kn = NULL;
error = 0;
@@ -1320,27 +1323,24 @@ findkn:
* kn_knlist.
*/
done_ev_add:
- if ((kev->flags & EV_DISABLE) &&
- ((kn->kn_status & KN_DISABLED) == 0)) {
+ if ((kev->flags & EV_ENABLE) != 0)
+ kn->kn_status &= ~KN_DISABLED;
+ else if ((kev->flags & EV_DISABLE) != 0)
kn->kn_status |= KN_DISABLED;
- }
if ((kn->kn_status & KN_DISABLED) == 0)
event = kn->kn_fop->f_event(kn, 0);
else
event = 0;
+
KQ_LOCK(kq);
if (event)
- KNOTE_ACTIVATE(kn, 1);
+ kn->kn_status |= KN_ACTIVE;
+ if ((kn->kn_status & (KN_ACTIVE | KN_DISABLED | KN_QUEUED)) ==
+ KN_ACTIVE)
+ knote_enqueue(kn);
kn->kn_status &= ~(KN_INFLUX | KN_SCAN);
KN_LIST_UNLOCK(kn);
-
- if ((kev->flags & EV_ENABLE) && (kn->kn_status & KN_DISABLED)) {
- kn->kn_status &= ~KN_DISABLED;
- if ((kn->kn_status & KN_ACTIVE) &&
- ((kn->kn_status & KN_QUEUED) == 0))
- knote_enqueue(kn);
- }
KQ_UNLOCK_FLUX(kq);
done:
OpenPOWER on IntegriCloud