49 lines
1.6 KiB
Diff
49 lines
1.6 KiB
Diff
--- sys/kern/kern_event.c.orig
|
|
+++ sys/kern/kern_event.c
|
|
@@ -1296,6 +1296,8 @@
|
|
kn->kn_kevent.flags &= ~(EV_ADD | EV_DELETE |
|
|
EV_ENABLE | EV_DISABLE | EV_FORCEONESHOT);
|
|
kn->kn_status = KN_INFLUX|KN_DETACHED;
|
|
+ if ((kev->flags & EV_DISABLE) != 0)
|
|
+ kn->kn_status |= KN_DISABLED;
|
|
|
|
error = knote_attach(kn, kq);
|
|
KQ_UNLOCK(kq);
|
|
@@ -1332,6 +1334,11 @@
|
|
KNOTE_ACTIVATE(kn, 1);
|
|
}
|
|
|
|
+ if ((kev->flags & EV_ENABLE) != 0)
|
|
+ kn->kn_status &= ~KN_DISABLED;
|
|
+ else if ((kev->flags & EV_DISABLE) != 0)
|
|
+ kn->kn_status |= KN_DISABLED;
|
|
+
|
|
/*
|
|
* The user may change some filter values after the initial EV_ADD,
|
|
* but doing so will not reset any filter which has already been
|
|
@@ -1348,19 +1355,17 @@
|
|
kn->kn_sdata = kev->data;
|
|
}
|
|
|
|
+done_ev_add:
|
|
/*
|
|
* We can get here with kn->kn_knlist == NULL. This can happen when
|
|
* the initial attach event decides that the event is "completed"
|
|
- * already. i.e. filt_procattach is called on a zombie process. It
|
|
- * will call filt_proc which will remove it from the list, and NULL
|
|
+ * already, e.g., filt_procattach() is called on a zombie process. It
|
|
+ * will call filt_proc() which will remove it from the list, and NULL
|
|
* kn_knlist.
|
|
+ *
|
|
+ * KN_DISABLED will be stable while the knote is in flux, so the
|
|
+ * unlocked read will not race with an update.
|
|
*/
|
|
-done_ev_add:
|
|
- 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
|