[libdispatch-changes] [73] trunk/src/source.c

source_changes at macosforge.org source_changes at macosforge.org
Sat Oct 31 03:54:20 PDT 2009


Revision: 73
          http://trac.macosforge.org/projects/libdispatch/changeset/73
Author:   robert at fledge.watson.org
Date:     2009-10-31 03:54:16 -0700 (Sat, 31 Oct 2009)
Log Message:
-----------
Add an optional 'init' method to struct dispatch_source_type_s, and
encapsulate type-specific initialization in those methods.

This commit differs from the submitted patch only in that it adopts the
house style.

Submitted by:	Paolo Bonzini <bonzini at gnu.org>

Modified Paths:
--------------
    trunk/src/source.c

Modified: trunk/src/source.c
===================================================================
--- trunk/src/source.c	2009-10-29 17:13:26 UTC (rev 72)
+++ trunk/src/source.c	2009-10-31 10:54:16 UTC (rev 73)
@@ -925,13 +925,23 @@
 struct dispatch_source_type_s {
 	struct kevent ke;
 	uint64_t mask;
+	void (*init)(dispatch_source_t ds, dispatch_source_type_t type,
+	    uintptr_t handle, unsigned long mask, dispatch_queue_t q);
 };
 
+static void
+dispatch_source_type_timer_init(dispatch_source_t ds, dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t q)
+{
+	ds->ds_needs_rearm = true;
+	ds->ds_timer.flags = mask;
+}
+
 const struct dispatch_source_type_s _dispatch_source_type_timer = {
 	.ke = {
 		.filter = DISPATCH_EVFILT_TIMER,
 	},
 	.mask = DISPATCH_TIMER_INTERVAL|DISPATCH_TIMER_ONESHOT|DISPATCH_TIMER_ABSOLUTE|DISPATCH_TIMER_WALL_CLOCK,
+	.init = dispatch_source_type_timer_init,
 };
 
 const struct dispatch_source_type_s _dispatch_source_type_read = {
@@ -999,6 +1009,16 @@
 };
 
 #ifdef HAVE_MACH
+
+static void
+dispatch_source_type_mach_send_init(dispatch_source_t ds, dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t q)
+{
+	static dispatch_once_t pred;
+
+	ds->ds_is_level = false;
+	dispatch_once_f(&pred, NULL, _dispatch_mach_notify_source_init);
+}
+
 const struct dispatch_source_type_s _dispatch_source_type_mach_send = {
 	.ke = {
 		.filter = EVFILT_MACHPORT,
@@ -1006,14 +1026,22 @@
 		.fflags = DISPATCH_MACHPORT_DEAD,
 	},
 	.mask = DISPATCH_MACH_SEND_DEAD,
+	.init = dispatch_source_type_mach_send_init,
 };
 
+static void
+dispatch_source_type_mach_recv_init(dispatch_source_t ds, dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t q)
+{
+	ds->ds_is_level = false;
+}
+
 const struct dispatch_source_type_s _dispatch_source_type_mach_recv = {
 	.ke = {
 		.filter = EVFILT_MACHPORT,
 		.flags = EV_DISPATCH,
 		.fflags = DISPATCH_MACHPORT_RECV,
 	},
+	.init = dispatch_source_type_mach_recv_init,
 };
 #endif
 
@@ -1096,38 +1124,22 @@
 	ds->ds_dkev = dk;
 	ds->ds_pending_data_mask = dk->dk_kevent.fflags;
 	if ((EV_DISPATCH|EV_ONESHOT) & proto_kev->flags) {
-#ifdef HAVE_MACH
-		if (proto_kev->filter != EVFILT_MACHPORT) {
-			ds->ds_is_level = true;
-		}
-#endif
+		ds->ds_is_level = true;
 		ds->ds_needs_rearm = true;
 	} else if (!(EV_CLEAR & proto_kev->flags)) {
 		// we cheat and use EV_CLEAR to mean a "flag thingy"
 		ds->ds_is_adder = true;
 	}
 	
-	// If its a timer source, it needs to be re-armed
-	if (type->ke.filter == DISPATCH_EVFILT_TIMER) {
-		ds->ds_needs_rearm = true;
+	// Some sources require special processing
+	if (type->init != NULL) {
+		type->init(ds, type, handle, mask, q);
 	}
-	
 	dispatch_assert(!(ds->ds_is_level && ds->ds_is_adder));
 #if DISPATCH_DEBUG
 	dispatch_debug(ds, __FUNCTION__);
 #endif
 
-	// Some sources require special processing
-#ifdef HAVE_MACH
-	if (type == DISPATCH_SOURCE_TYPE_MACH_SEND) {
-		static dispatch_once_t pred;
-		dispatch_once_f(&pred, NULL, _dispatch_mach_notify_source_init);
-	} else
-#endif
-	if (type == DISPATCH_SOURCE_TYPE_TIMER) {
-		ds->ds_timer.flags = mask;
-	}
-
 	_dispatch_retain(ds->do_targetq);
 	return ds;
 	
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-changes/attachments/20091031/3be8e37e/attachment.html>


More information about the libdispatch-changes mailing list