<div dir="ltr">As a followup, the iOS bindings also created an event base that worked native w/ grand central dispatch.  Ideally Android could work the same way without an additional worker thread.<br></div><br><div class="gmail_quote">On Tue, Apr 21, 2015 at 11:11 AM Willem Toorop <<a href="mailto:willem@nlnetlabs.nl">willem@nlnetlabs.nl</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Scott,<br>
<br>
With our getdns implementation, the extensions are wrappers that provide<br>
a uniform interface for different event bases.  We provide extensions<br>
for libevent, libev and libuv.  We also have a built in event base<br>
(mini_event) based on select, that will we the default extension when<br>
you did not set one explicitly with getdns_extension_set_libevent_base,<br>
getdns_extension_set_libev_loop and getdns_extension_set_libuv_loop.<br>
<br>
All those extension provide their uniform interface through a list of<br>
function pointers with the same signature (the virtual method table<br>
(hence vmt)) in another struct which might have extension specific data<br>
(like the event base itself where the extension provides the uniform<br>
interface for).  So they are actually objects for the getdns_eventloop<br>
class...<br>
<br>
One of the functions in the VMT is the cleanup function which will<br>
destroy the extension, but in case of the libevent, libev and libuv<br>
extension, not the event bases with which the extension was created and<br>
set.  Only with mini_event there was no event base on which the<br>
extension was based, so that will destroy the event base with the extension.<br>
<br>
I think this answers everything you wanted to know about this, but there<br>
is something else interesting too.<br>
<br>
Our implementation provides means to create an event base extension<br>
yourself.  In fact, the node bindings use this to hook into the node<br>
native libuv event loop (so it does not use the libuv extension!).<br>
I do not know how async operation is handled with php normally, but to<br>
just give an example for its potential (which might event not be<br>
realistic)... If we could provide python bindings for those methods to<br>
create your own extension, it might be possible to hook into native<br>
python event systems, like twisted.<br>
<br>
Food for thought ;)<br>
<br>
Cheers,<br>
-- Willem<br>
<br>
<br>
<br>
<br>
<br>
Op 21-04-15 om 13:30 schreef Hollenbeck, Scott:<br>
>> -----Original Message-----<br>
>> From: getdns-api [mailto:<a href="mailto:getdns-api-bounces@vpnc.org" target="_blank">getdns-api-bounces@vpnc.org</a>] On Behalf Of<br>
>> Goyal, Neel<br>
>> Sent: Monday, April 20, 2015 1:58 PM<br>
>> To: Melinda Shore; <a href="mailto:getdns-api@vpnc.org" target="_blank">getdns-api@vpnc.org</a><br>
>> Subject: Re: [getdns-api] PHP Language Bindings and Async Event<br>
>> Management<br>
>><br>
>> Freeing the context should not clean up the event base.  If the event<br>
>> base<br>
>> is shared between other async libs and they are adding to that event<br>
>> base,<br>
>> a context destroy should not prevent those libs from still functioning.<br>
>> The context_destroy makes sure the context is detached from the<br>
>> event_base, but any structures specific to libevent are not cleaned up.<br>
>> Much like the user has to create the lib event base explicitly and then<br>
>> attach it to getdns, the user has to free it.<br>
><br>
> Neel, in a note I sent to this list last week (BTW, it looks like recent notes aren't being archived) I described a challenge I found in trying to use the PHP libevent extension with getdns. I can create an event base, but I don't see an easy way to attach that to a context. Come on down if you have a chance and I'll walk you through what I found.<br>
><br>
> So, I took a look at how I could use the functions provided by the getdns libevent extension. Looking at the code in context.c, I found that getdns_context_create() calls getdns_context_create_with_memory_functions(), which calls getdns_context_create_with_extended_memory_functions(). That function calls getdns_mini_event_init() (in file libmini_event.c), which creates an event base and sets an event loop. That base is cleaned up when calling getdns_context_destroy(), which calls context->extension->vmt->cleanup(context->extension).<br>
><br>
> Scott<br>
><br>
> _______________________________________________<br>
> getdns-api mailing list<br>
> <a href="mailto:getdns-api@vpnc.org" target="_blank">getdns-api@vpnc.org</a><br>
><br>
<br>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@getdnsapi.net" target="_blank">Users@getdnsapi.net</a><br>
<a href="http://getdnsapi.net/mailman/listinfo/users" target="_blank">http://getdnsapi.net/mailman/listinfo/users</a><br>
</blockquote></div>