Author: sson
Date: Wed Sep 16 03:49:54 2009
New Revision: 197243
URL: http://svn.freebsd.org/changeset/base/197243

Log:
  Add EV_RECEIPT to kevents.
  
  EV_RECEIPT is useful to disambiguating error conditions when multiple
  events structures are passed to kevent(2).  The error code is returned
  in the data field and EV_ERROR is set.
  
  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:37:39 2009        (r197242)
+++ head/lib/libc/sys/kqueue.2  Wed Sep 16 03:49:54 2009        (r197243)
@@ -211,6 +211,15 @@ Removes the event from the kqueue.
 Events which are attached to
 file descriptors are automatically deleted on the last close of
 the descriptor.
+.It EV_RECEIPT
+This flag is useful for making bulk changes to a kqueue without draining
+any pending events.
+When passed as input, it forces
+.Dv EV_ERROR
+to always be returned.
+When a filter is successfully added the 
+.Va data
+field will be zero.
 .It EV_ONESHOT
 Causes the event to return only the first occurrence of the filter
 being triggered.

Modified: head/sys/kern/kern_event.c
==============================================================================
--- head/sys/kern/kern_event.c  Wed Sep 16 03:37:39 2009        (r197242)
+++ head/sys/kern/kern_event.c  Wed Sep 16 03:49:54 2009        (r197243)
@@ -832,7 +832,7 @@ kern_kevent(struct thread *td, int fd, i
                                continue;
                        kevp->flags &= ~EV_SYSFLAGS;
                        error = kqueue_register(kq, kevp, td, 1);
-                       if (error) {
+                       if (error || (kevp->flags & EV_RECEIPT)) {
                                if (nevents != 0) {
                                        kevp->flags = EV_ERROR;
                                        kevp->data = error;

Modified: head/sys/sys/event.h
==============================================================================
--- head/sys/sys/event.h        Wed Sep 16 03:37:39 2009        (r197242)
+++ head/sys/sys/event.h        Wed Sep 16 03:49:54 2009        (r197243)
@@ -72,7 +72,7 @@ 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_RECEIPT     0x0040          /* force EV_ERROR on success, data=0 */
 #define EV_DISPATCH    0x0080          /* disable event after reporting */
 
 #define EV_SYSFLAGS    0xF000          /* reserved by system */
_______________________________________________
[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