[getdns-api] user defined allocators

Willem Toorop willem at nlnetlabs.nl
Fri Sep 20 05:25:28 MST 2013

Op 21-08-13 13:04, Wiley, Glen schreef:
> As we are working on our implementation of the getdns API I realized 
> that there doesn't seem to be a way for the helper functions that 
> handle the dict and list types to get to the user defined allocator. 
>  The allocator is specified in a context, however the signatures of 
> the helper functions do not accept a context as an argument.  There 
> are a few ways to address this:
>  1. Add a context as an argument to the helper functions.  This is
>     probably the least disruptive to the rest of the API.
>  2. Change the way a user defined allocator is defined.  It is likely
>     that the application developer would expect to use the same
>     allocator throughout the application so it may be enough to make
>     an assignment outside a context as an initialization step.
> I am sure that there are other options, but I think approach #2 would 
> be a comfortable way to handle this.
I agree.

Also the custom memory management functions that may be specified have 
the same prototype as the standard C functions.  This restricts the type 
of custom memory functions to ones that either do no custom memory 
bookkeeping, or have the needed bookkeeping-journal in globals.  Having 
global custom memory functions in a individual getdns context feels as a 
discrepancy.  A global registration function would suit better. For 
example, just like the one in libevent:

*void*  getdns_set_mem_functions(*void*  *(*malloc_fn)(size_t sz),
                               *void*  *(*realloc_fn)(*void*  *ptr, size_t sz),
                               *void*  (*free_fn)(*void*  *ptr));

I prefer custom memory management functions to be implementation 
specific in the API, just like setting the event base is.  I feel there 
are too many variables to consider to have a conclusive solution that 
fits all.  It would also allow for implementations to match this 
capability with the capabilities of the event base.

-- Willem

PS. An implementations that would allow bookkeeping memory functions, 
could have a registration function that would look something like this:

*void*  getdns_context_set_mem_functions(getdns_context_t*  *context*,
                                       void*  *(*malloc_fn)(*void*  *journal, size_t sz),
                               *         void*  *(*realloc_fn)(*void*  *journal,*void*  *ptr, size_t sz),
                               *         void*  (*free_fn)(*void*  *journal,*void*  *ptr));

Of course it would then also need custom list and dict create functions:

struct getdns_list * getdns_list_create_custom(getdns_context_t*  *context*);*

struct getdns_dict * getdns_dict_create_custom(getdns_context_t*  *context*);


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vpnc.org/pipermail/getdns-api/attachments/20130920/edbcf2cf/attachment.html>

More information about the getdns-api mailing list