[libdispatch-dev] [PATCH 17/17] remove last mention of struct kevent from "generic" code

Paolo Bonzini bonzini at gnu.org
Sun Oct 18 08:04:17 PDT 2009


Here is the final step.  I had to extract the "prototype" kevent
into a separate static struct, and put an opaque (void *) cookie
in the dispatch_source_type struct.
---
 src/internal.h        |    1 -
 src/source_internal.h |    2 +-
 src/source_kevent.c   |  114 +++++++++++++++++++++++++++++--------------------
 3 files changed, 69 insertions(+), 48 deletions(-)

diff --git a/src/internal.h b/src/internal.h
index be0336c..bd3ef43 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -86,7 +86,6 @@
 #ifdef HAVE_MALLOC_MALLOC_H
 #include <malloc/malloc.h>
 #endif
-#include <sys/event.h>
 #include <sys/mount.h>
 #include <sys/queue.h>
 #include <sys/stat.h>
diff --git a/src/source_internal.h b/src/source_internal.h
index 3711649..4c53efc 100644
--- a/src/source_internal.h
+++ b/src/source_internal.h
@@ -110,7 +110,7 @@ void _dispatch_kevent_release(dispatch_source_t ds);
 void _dispatch_timer_list_update(dispatch_source_t ds);
 
 struct dispatch_source_type_s {
-        struct kevent ke;
+        void *opaque;
         uint64_t mask;
         bool (*init) (dispatch_source_t ds,
                       dispatch_source_type_t type,
diff --git a/src/source_kevent.c b/src/source_kevent.c
index 6554040..70548c2 100644
--- a/src/source_kevent.c
+++ b/src/source_kevent.c
@@ -571,10 +571,10 @@ static bool dispatch_source_type_kevent_init (dispatch_source_t ds,
 				     	      unsigned long mask,
 				     	      dispatch_queue_t q)
 {
-        const struct kevent *proto_kev = &type->ke;
+        const struct kevent *proto_kev = type->opaque;
         dispatch_kevent_t dk = NULL;
 
-        switch (type->ke.filter) {
+        switch (proto_kev->filter) {
         case EVFILT_SIGNAL:
                 if (handle >= NSIG) {
                         return false;
@@ -632,35 +632,43 @@ static bool dispatch_source_type_timer_init (dispatch_source_t ds,
 	return true;
 }
 
+static const struct kevent _dispatch_source_type_timer_ke = {
+	.filter = DISPATCH_EVFILT_TIMER,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_timer = {
-	.ke = {
-		.filter = DISPATCH_EVFILT_TIMER,
-	},
+	.opaque = (void *) &_dispatch_source_type_timer_ke,
 	.mask = DISPATCH_TIMER_INTERVAL|DISPATCH_TIMER_ONESHOT|DISPATCH_TIMER_ABSOLUTE|DISPATCH_TIMER_WALL_CLOCK,
 	.init = dispatch_source_type_timer_init
 };
 
+static const struct kevent _dispatch_source_type_read_ke = {
+	.filter = EVFILT_READ,
+	.flags = EV_DISPATCH,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_read = {
-	.ke = {
-		.filter = EVFILT_READ,
-		.flags = EV_DISPATCH,
-	},
+	.opaque = (void *) &_dispatch_source_type_read_ke,
 	.init = dispatch_source_type_kevent_init
 };
 
+static const struct kevent _dispatch_source_type_write_ke = {
+	.filter = EVFILT_WRITE,
+	.flags = EV_DISPATCH,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_write = {
-	.ke = {
-		.filter = EVFILT_WRITE,
-		.flags = EV_DISPATCH,
-	},
+	.opaque = (void *) &_dispatch_source_type_write_ke,
 	.init = dispatch_source_type_kevent_init
 };
 
+static const struct kevent _dispatch_source_type_proc_ke = {
+	.filter = EVFILT_PROC,
+	.flags = EV_CLEAR,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_proc = {
-	.ke = {
-		.filter = EVFILT_PROC,
-		.flags = EV_CLEAR,
-	},
+	.opaque = (void *) &_dispatch_source_type_proc_ke,
 	.mask = NOTE_EXIT|NOTE_FORK|NOTE_EXEC
 #if HAVE_DECL_NOTE_SIGNAL
 	    |NOTE_SIGNAL
@@ -672,18 +680,22 @@ const struct dispatch_source_type_s _dispatch_source_type_proc = {
 	.init = dispatch_source_type_kevent_init
 };
 
+static const struct kevent _dispatch_source_type_signal_ke = {
+	.filter = EVFILT_SIGNAL,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_signal = {
-	.ke = {
-		.filter = EVFILT_SIGNAL,
-	},
+	.opaque = (void *) &_dispatch_source_type_signal_ke,
 	.init = dispatch_source_type_kevent_init
 };
 
+static const struct kevent _dispatch_source_type_vnode_ke = {
+	.filter = EVFILT_VNODE,
+	.flags = EV_CLEAR,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_vnode = {
-	.ke = {
-		.filter = EVFILT_VNODE,
-		.flags = EV_CLEAR,
-	},
+	.opaque = (void *) &_dispatch_source_type_vnode_ke,
 	.mask = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND|NOTE_ATTRIB|NOTE_LINK|
 	    NOTE_RENAME|NOTE_REVOKE
 #if HAVE_DECL_NOTE_NONE
@@ -693,11 +705,13 @@ const struct dispatch_source_type_s _dispatch_source_type_vnode = {
 	.init = dispatch_source_type_kevent_init
 };
 
+static const struct kevent _dispatch_source_type_vfs_ke = {
+	.filter = EVFILT_FS,
+	.flags = EV_CLEAR,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_vfs = {
-	.ke = {
-		.filter = EVFILT_FS,
-		.flags = EV_CLEAR,
-	},
+	.opaque = (void *) &_dispatch_source_type_vfs_ke,
 	.mask = VQ_NOTRESP|VQ_NEEDAUTH|VQ_LOWDISK|VQ_MOUNT|VQ_UNMOUNT|VQ_DEAD|
 	    VQ_ASSIST|VQ_NOTRESPLOCK
 #if HAVE_DECL_VQ_UPDATE
@@ -727,12 +741,14 @@ static bool dispatch_source_type_mach_send_init (dispatch_source_t ds,
 	return true;
 }
 
+static const struct kevent _dispatch_source_type_mach_send_ke = {
+	.filter = EVFILT_MACHPORT,
+	.flags = EV_DISPATCH,
+	.fflags = DISPATCH_MACHPORT_DEAD,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_mach_send = {
-	.ke = {
-		.filter = EVFILT_MACHPORT,
-		.flags = EV_DISPATCH,
-		.fflags = DISPATCH_MACHPORT_DEAD,
-	},
+	.opaque = (void *) &_dispatch_source_type_mach_send_ke,
 	.mask = DISPATCH_MACH_SEND_DEAD,
 	.init = dispatch_source_type_mach_send_init
 };
@@ -750,29 +766,35 @@ static bool dispatch_source_type_mach_recv_init (dispatch_source_t ds,
 	return true;
 }
 
+static const struct kevent _dispatch_source_type_mach_recv_ke = {
+	.filter = EVFILT_MACHPORT,
+	.flags = EV_DISPATCH,
+	.fflags = DISPATCH_MACHPORT_RECV,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_mach_recv = {
-	.ke = {
-		.filter = EVFILT_MACHPORT,
-		.flags = EV_DISPATCH,
-		.fflags = DISPATCH_MACHPORT_RECV,
-	},
+	.opaque = (void *) &_dispatch_source_type_mach_recv_ke,
 	.init = dispatch_source_type_mach_recv_init
 };
 #endif
 
+static const struct kevent _dispatch_source_type_data_add_ke = {
+        .filter = DISPATCH_EVFILT_CUSTOM_ADD,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_data_add = {
-        .ke = {
-                .filter = DISPATCH_EVFILT_CUSTOM_ADD,
-        },
+        .opaque = (void *) &_dispatch_source_type_data_add_ke,
 	.init = dispatch_source_type_kevent_init
 };
 
+static const struct kevent _dispatch_source_type_data_or_ke = {
+        .filter = DISPATCH_EVFILT_CUSTOM_OR,
+        .flags = EV_CLEAR,
+        .fflags = ~0,
+};
+
 const struct dispatch_source_type_s _dispatch_source_type_data_or = {
-        .ke = {
-                .filter = DISPATCH_EVFILT_CUSTOM_OR,
-                .flags = EV_CLEAR,
-                .fflags = ~0,
-        },
+        .opaque = (void *) &_dispatch_source_type_data_or_ke,
 	.init = dispatch_source_type_kevent_init
 };
 
-- 
1.6.2.5




More information about the libdispatch-dev mailing list