[libdispatch-changes] [153] trunk/src
source_changes at macosforge.org
source_changes at macosforge.org
Sat Nov 14 08:53:10 PST 2009
Revision: 153
http://trac.macosforge.org/projects/libdispatch/changeset/153
Author: robert at fledge.watson.org
Date: 2009-11-14 08:53:08 -0800 (Sat, 14 Nov 2009)
Log Message:
-----------
Complete separation of kqueue-specific portions of source.c into
source_kevent.c.
This differs from the submitted patch in the following ways: conflicts with
another submitted patch resolved, house style adopted in some additional
places, and __linux__ struct kevent definition removed.
Submitted by: Paolo Bonzini <bonzini at gnu.org>
Modified Paths:
--------------
trunk/src/kevent_internal.h
trunk/src/source.c
trunk/src/source_internal.h
trunk/src/source_kevent.c
Modified: trunk/src/kevent_internal.h
===================================================================
--- trunk/src/kevent_internal.h 2009-11-13 14:18:10 UTC (rev 152)
+++ trunk/src/kevent_internal.h 2009-11-14 16:53:08 UTC (rev 153)
@@ -28,6 +28,7 @@
#define __DISPATCH_KEVENT_INTERNAL__
#include <internal.h>
+#include <sys/event.h>
struct dispatch_kevent_s {
TAILQ_ENTRY(dispatch_kevent_s) dk_list;
@@ -35,11 +36,6 @@
struct kevent dk_kevent;
};
-#define DISPATCH_EVFILT_TIMER (-EVFILT_SYSCOUNT - 1)
-#define DISPATCH_EVFILT_CUSTOM_ADD (-EVFILT_SYSCOUNT - 2)
-#define DISPATCH_EVFILT_CUSTOM_OR (-EVFILT_SYSCOUNT - 3)
-#define DISPATCH_EVFILT_SYSCOUNT (EVFILT_SYSCOUNT + 3)
-
extern const struct dispatch_source_vtable_s _dispatch_source_kevent_vtable;
#if DISPATCH_DEBUG
Modified: trunk/src/source.c
===================================================================
--- trunk/src/source.c 2009-11-13 14:18:10 UTC (rev 152)
+++ trunk/src/source.c 2009-11-14 16:53:08 UTC (rev 153)
@@ -25,8 +25,6 @@
#endif
#include <sys/mount.h>
-#include "kevent_internal.h"
-
#ifndef DISPATCH_NO_LEGACY
struct dispatch_source_attr_vtable_s {
DISPATCH_VTABLE_HEADER(dispatch_source_attr_s);
@@ -392,50 +390,19 @@
unsigned long mask,
dispatch_queue_t q)
{
- const struct kevent *proto_kev = &type->ke;
dispatch_source_t ds = NULL;
static char source_label[sizeof(ds->dq_label)] = "source";
- dispatch_kevent_t dk = NULL;
// input validation
if (type == NULL || (mask & ~type->mask)) {
goto out_bad;
}
- switch (type->ke.filter) {
- case EVFILT_SIGNAL:
- if (handle >= NSIG) {
- goto out_bad;
- }
- break;
- case EVFILT_FS:
- case DISPATCH_EVFILT_CUSTOM_ADD:
- case DISPATCH_EVFILT_CUSTOM_OR:
- case DISPATCH_EVFILT_TIMER:
- if (handle) {
- goto out_bad;
- }
- break;
- default:
- break;
- }
-
ds = calloc(1ul, sizeof(struct dispatch_source_s));
if (slowpath(!ds)) {
goto out_bad;
}
- dk = calloc(1ul, sizeof(struct dispatch_kevent_s));
- if (slowpath(!dk)) {
- goto out_bad;
- }
- dk->dk_kevent = *proto_kev;
- dk->dk_kevent.ident = handle;
- dk->dk_kevent.flags |= EV_ADD|EV_ENABLE;
- dk->dk_kevent.fflags |= (uint32_t)mask;
- dk->dk_kevent.udata = dk;
- TAILQ_INIT(&dk->dk_sources);
-
// Initialize as a queue first, then override some settings below.
_dispatch_queue_init((dispatch_queue_t)ds);
memcpy(ds->dq_label, source_label, sizeof(source_label));
@@ -447,22 +414,10 @@
// do_targetq will be retained below, past point of no-return
ds->do_targetq = q;
- // Dispatch Source
- ds->ds_ident_hack = dk->dk_kevent.ident;
- ds->ds_dkev = dk;
- ds->ds_pending_data_mask = dk->dk_kevent.fflags;
- if ((EV_DISPATCH|EV_ONESHOT) & proto_kev->flags) {
- 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 (slowpath(!type->init(ds, type, handle, mask, q))) {
+ goto out_bad;
}
-
- // 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__);
@@ -473,7 +428,6 @@
out_bad:
free(ds);
- free(dk);
return NULL;
}
Modified: trunk/src/source_internal.h
===================================================================
--- trunk/src/source_internal.h 2009-11-13 14:18:10 UTC (rev 152)
+++ trunk/src/source_internal.h 2009-11-14 16:53:08 UTC (rev 153)
@@ -103,7 +103,6 @@
bool _dispatch_source_probe(dispatch_source_t ds);
void _dispatch_source_dispose(dispatch_source_t ds);
size_t _dispatch_source_debug(dispatch_source_t ds, char* buf, size_t bufsiz);
-void _dispatch_source_merge_kevent(dispatch_source_t ds, const struct kevent *ke);
void _dispatch_source_kevent_resume(dispatch_source_t ds, uint32_t new_flags, uint32_t del_flags);
void _dispatch_kevent_merge(dispatch_source_t ds);
@@ -113,7 +112,7 @@
struct dispatch_source_type_s {
struct kevent ke;
uint64_t mask;
- void (*init) (dispatch_source_t ds,
+ bool (*init) (dispatch_source_t ds,
dispatch_source_type_t type,
uintptr_t handle,
unsigned long mask,
Modified: trunk/src/source_kevent.c
===================================================================
--- trunk/src/source_kevent.c 2009-11-13 14:18:10 UTC (rev 152)
+++ trunk/src/source_kevent.c 2009-11-14 16:53:08 UTC (rev 153)
@@ -67,6 +67,7 @@
.dk_sources = TAILQ_HEAD_INITIALIZER(_dispatch_kevent_data_add.dk_sources),
};
+static void _dispatch_source_merge_kevent(dispatch_source_t ds, const struct kevent *ke);
static void _dispatch_kevent_resume(dispatch_kevent_t dk, uint32_t new_flags, uint32_t del_flags);
#if HAVE_MACH
static void _dispatch_kevent_machport_resume(dispatch_kevent_t dk, uint32_t new_flags, uint32_t del_flags);
@@ -563,11 +564,65 @@
_dispatch_source_merge_kevent(ds, &kev);
}
-static void
+static bool
+dispatch_source_type_kevent_init(dispatch_source_t ds, dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t q)
+{
+ const struct kevent *proto_kev = &type->ke;
+ dispatch_kevent_t dk = NULL;
+
+ switch (type->ke.filter) {
+ case EVFILT_SIGNAL:
+ if (handle >= NSIG) {
+ return false;
+ }
+ break;
+ case EVFILT_FS:
+ case DISPATCH_EVFILT_CUSTOM_ADD:
+ case DISPATCH_EVFILT_CUSTOM_OR:
+ case DISPATCH_EVFILT_TIMER:
+ if (handle) {
+ return false;
+ }
+ break;
+ default:
+ break;
+ }
+
+ dk = calloc(1ul, sizeof(struct dispatch_kevent_s));
+ if (slowpath(!dk)) {
+ return false;
+ }
+
+ dk->dk_kevent = *proto_kev;
+ dk->dk_kevent.ident = handle;
+ dk->dk_kevent.flags |= EV_ADD|EV_ENABLE;
+ dk->dk_kevent.fflags |= (uint32_t)mask;
+ dk->dk_kevent.udata = dk;
+ TAILQ_INIT(&dk->dk_sources);
+
+ // Dispatch Source
+ ds->ds_ident_hack = dk->dk_kevent.ident;
+ ds->ds_dkev = dk;
+ ds->ds_pending_data_mask = dk->dk_kevent.fflags;
+ if ((EV_DISPATCH|EV_ONESHOT) & proto_kev->flags) {
+ 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;
+ }
+ return true;
+}
+
+static bool
dispatch_source_type_timer_init(dispatch_source_t ds, dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t q)
{
+ if (!dispatch_source_type_kevent_init(ds, type, handle, mask, q)) {
+ return false;
+ }
ds->ds_needs_rearm = true;
ds->ds_timer.flags = mask;
+ return true;
}
const struct dispatch_source_type_s _dispatch_source_type_timer = {
@@ -583,6 +638,7 @@
.filter = EVFILT_READ,
.flags = EV_DISPATCH,
},
+ .init = dispatch_source_type_kevent_init,
};
const struct dispatch_source_type_s _dispatch_source_type_write = {
@@ -590,6 +646,7 @@
.filter = EVFILT_WRITE,
.flags = EV_DISPATCH,
},
+ .init = dispatch_source_type_kevent_init,
};
const struct dispatch_source_type_s _dispatch_source_type_proc = {
@@ -605,12 +662,14 @@
|NOTE_REAP
#endif
,
+ .init = dispatch_source_type_kevent_init,
};
const struct dispatch_source_type_s _dispatch_source_type_signal = {
.ke = {
.filter = EVFILT_SIGNAL,
},
+ .init = dispatch_source_type_kevent_init,
};
const struct dispatch_source_type_s _dispatch_source_type_vnode = {
@@ -624,6 +683,7 @@
|NOTE_NONE
#endif
,
+ .init = dispatch_source_type_kevent_init,
};
const struct dispatch_source_type_s _dispatch_source_type_vfs = {
@@ -640,17 +700,22 @@
|VQ_VERYLOWDISK
#endif
,
+ .init = dispatch_source_type_kevent_init,
};
#if HAVE_MACH
-static void
+static bool
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;
+ if (!dispatch_source_type_kevent_init(ds, type, handle, mask, q)) {
+ return false;
+ }
ds->ds_is_level = false;
dispatch_once_f(&pred, NULL, _dispatch_mach_notify_source_init);
+ return true;
}
const struct dispatch_source_type_s _dispatch_source_type_mach_send = {
@@ -663,10 +728,14 @@
.init = dispatch_source_type_mach_send_init,
};
-static void
+static bool
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)
{
+ if (!dispatch_source_type_kevent_init(ds, type, handle, mask, q)) {
+ return false;
+ }
ds->ds_is_level = false;
+ return true;
}
const struct dispatch_source_type_s _dispatch_source_type_mach_recv = {
@@ -683,6 +752,7 @@
.ke = {
.filter = DISPATCH_EVFILT_CUSTOM_ADD,
},
+ .init = dispatch_source_type_kevent_init,
};
const struct dispatch_source_type_s _dispatch_source_type_data_or = {
@@ -691,6 +761,7 @@
.flags = EV_CLEAR,
.fflags = ~0,
},
+ .init = dispatch_source_type_kevent_init,
};
// Updates the ordered list of timers based on next fire date for changes to ds.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-changes/attachments/20091114/1a8d87d8/attachment-0001.html>
More information about the libdispatch-changes
mailing list