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