[libdispatch-dev] Some questions about source handling

Dave Zarzycki zarzycki at apple.com
Sat Sep 11 13:35:26 PDT 2010


On Sep 8, 2010, at 8:42 PM, cee1 wrote:

> Questions:
> 1. How does a source's event handler accesses data returned by kevent?
> 
> Data returned by kevent will finally be recorded is ds_data field in _dispatch_source_latch_and_call. The event handler will be called with ds_handler_ctxt, which shoule be do_ctxt. "do_ctxt" can be set by function dispatch_set_context. The problem is:
> If a handler need to access ds_data, we have to set a proper do_ctxt (e.g. a do_ctxt of source). That's not convenient.
It is only inconvenient if you're in the prototyping stage of a project. By the time a project matures, there will surely be a data structure that tracks a connection, and as a part of that connection, a pointer back to the dispatch_source_t. For example:

struct my_connection_s {
	...
	dispatch_source_t source;
	...
};

...

void my_connection_handler(void *ctxt)
{
	struct my_connection_s *mc = ctxt;

	printf("new data: %lu\n", dispatch_source_get_data(mc->source));
}

...

struct my_connection_s *mc = my_connection_create();

mc->source = dispatch_source_create(...);

dispatch_set_context(mc->source, mc);
dispatch_source_set_event_handler_f(mc->source, my_connection_handler);
dispatch_resume(mc->source);

...


> "ds_data" is a member of dispatch_source_t, and dispatch_source_t is an opaque struct to client code.
See the example above where dispatch_source_get_data() is used.

> 2. We have custom source of type DISPATCH_SOURCE_TYPE_DATA_ADD and DISPATCH_SOURCE_TYPE_DATA_OR, and can use dispatch_source_merge_data
> to fire custom sources. Why we don't have an 'is_level' source?

> An "is_level" source may not make much sense, but can be attached with cancel handler, this may be useful in some cases.

If you can think of a practical use for that, then let us know.

davez
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-dev/attachments/20100911/4cac6331/attachment.html>


More information about the libdispatch-dev mailing list