svn commit: r197242 - in head: lib/libc/sys sys/kern sys/sys
Stacey Son
sson at FreeBSD.org
Wed Sep 16 03:37:40 UTC 2009
Author: sson
Date: Wed Sep 16 03:37:39 2009
New Revision: 197242
URL: http://svn.freebsd.org/changeset/base/197242
Log:
Add the EV_DISPATCH flag to kevents.
When the EV_DISPATCH flag is used the event source will be disabled
immediately after the delivery of an event. This is similar to the
EV_ONESHOT flag but it doesn't delete the event.
Approved by: rwatson (co-mentor)
Modified:
head/lib/libc/sys/kqueue.2
head/sys/kern/kern_event.c
head/sys/sys/event.h
Modified: head/lib/libc/sys/kqueue.2
==============================================================================
--- head/lib/libc/sys/kqueue.2 Wed Sep 16 03:30:12 2009 (r197241)
+++ head/lib/libc/sys/kqueue.2 Wed Sep 16 03:37:39 2009 (r197242)
@@ -201,6 +201,11 @@ Disable the event so
.Fn kevent
will not return it.
The filter itself is not disabled.
+.It EV_DISPATCH
+Disable the event source immediately after delivery of an event.
+See
+.Dv EV_DISABLE
+above.
.It EV_DELETE
Removes the event from the kqueue.
Events which are attached to
Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c Wed Sep 16 03:30:12 2009 (r197241)
+++ head/sys/kern/kern_event.c Wed Sep 16 03:37:39 2009 (r197242)
@@ -1445,15 +1445,17 @@ start:
*kevp = kn->kn_kevent;
KQ_LOCK(kq);
KQ_GLOBAL_UNLOCK(&kq_global, haskqglobal);
- if (kn->kn_flags & EV_CLEAR) {
+ if (kn->kn_flags & (EV_CLEAR | EV_DISPATCH)) {
/*
* Manually clear knotes who weren't
* 'touch'ed.
*/
- if (touch == 0) {
+ if (touch == 0 && kn->kn_flags & EV_CLEAR) {
kn->kn_data = 0;
kn->kn_fflags = 0;
}
+ if (kn->kn_flags & EV_DISPATCH)
+ kn->kn_status |= KN_DISABLED;
kn->kn_status &= ~(KN_QUEUED | KN_ACTIVE);
kq->kq_count--;
} else
Modified: head/sys/sys/event.h
==============================================================================
--- head/sys/sys/event.h Wed Sep 16 03:30:12 2009 (r197241)
+++ head/sys/sys/event.h Wed Sep 16 03:37:39 2009 (r197242)
@@ -72,6 +72,8 @@ struct kevent {
/* flags */
#define EV_ONESHOT 0x0010 /* only report one occurrence */
#define EV_CLEAR 0x0020 /* clear event state after reporting */
+ /* 0x0040 reserved for EV_RECEIPT */
+#define EV_DISPATCH 0x0080 /* disable event after reporting */
#define EV_SYSFLAGS 0xF000 /* reserved by system */
#define EV_FLAG1 0x2000 /* filter-specific flag */
More information about the svn-src-head
mailing list