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 */
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to