[getdns-api] Custom memory management functions again

Matt Miller linuxwolf at outer-planes.net
Wed Nov 20 14:25:44 MST 2013


+1 to that.  Makes it even easier to integrate with a VMM.


- m&m

Matthew A. Miller
< http://goo.gl/LK55L >

On Nov 20, 2013, at 2:23 PM, Wiley, Glen <gwiley at verisign.com> wrote:

> Wouter had suggested adding a void* userarg to
> getdns_context_set_memory_functions() which I think may come in handy for
> folks that are taking things far enough to provide their own allocators.
> His suggested function signature would be:
> 
> void getdns_context_set_memory_functions(getdns_context_t context,
>    void *(*malloc)(void *userarg, size_t sz),
>    void *(*realloc)(void *userarg, void *ptr, size_t sz),
>    void (*free)(void *userarg, void *ptr),
>    void *userarg);
> 
> 
> 
> -- 
> Glen Wiley
> KK4SFV
> 
> Sr. Engineer
> The Hive, Verisign, Inc.
> 
> 
> 
> 
> On 11/20/13 10:00 AM, "Willem Toorop" <willem at nlnetlabs.nl> wrote:
> 
>> From talking to people involved in the getdns-api design at the IETF-88,
>> we learned that custom memory functions configured per context are an
>> essential part of the design.  They really did *not* want custom memory
>> functions to be global.  They did agree that setting all memory
>> functions in one go is the better method.
>> 
>> We propose to replace getdns_context_set_allocator,
>> getdns_context_set_reallocator and getdns_context_set_deallocator with
>> the following signature for setting them:
>> 
>> getdns_return_t
>> getdns_context_set_memory_functions(getdns_context_t context,
>>   void *(*malloc) (size_t),
>>   void *(*realloc) (void *, size_t),
>>   void (*free) (void *)
>>   );
>> 
>> Now the creation of the context itself should also be possible with
>> those custom memory function.  Therefore I propose to have this extra
>> context constructor:
>> 
>> getdns_return_t
>> getdns_context_create_with_memory_functions(
>>   getdns_context_t * context,
>>   int set_from_os,
>>   void *(*malloc) (size_t),
>>   void *(*realloc) (void *, size_t),
>>   void (*free) (void *)
>>   );
>> 
>> Dicts and lists that were generated as a result of actions done by the
>> library will inherit the custom memory functions from the context.
>> 
>> But the user is able to create dicts and lists on its own. We propose to
>> add the following signatures to facilitate creation of dicts and lists
>> by the user with custom memory functions:
>> 
>> struct getdns_list *
>> getdns_list_create_with_context(getdns_context_t context);
>> 
>> struct getdns_list *
>> getdns_list_create_with_memory_functions(
>>   void *(*malloc) (size_t),
>>   void *(*realloc) (void *, size_t),
>>   void (*free) (void *));
>> 
>> struct getdns_dict *
>> getdns_dict_create_with_context(getdns_context_t context);
>> 
>> struct getdns_dict *
>> getdns_dict_create_with_memory_functions(
>>   void *(*malloc) (size_t),
>>   void *(*realloc) (void *, size_t),
>>   void (*free) (void *));
>> 
>> 
>> Now custom memory functions might be even more useful if they have the
>> possibility to have state (i.e. the region with Region-based memory
>> management etc.).  This is best accomplished with a "user argument" that
>> will be passed to the custom memory management functions.
>> We propose four more API functions to allow for this:
>> 
>> void
>> getdns_context_set_extended_memory_functions(getdns_context_t context,
>>   void *userarg,
>>   void *(*malloc)(void *userarg, size_t sz),
>>   void *(*realloc)(void *userarg, void *ptr, size_t sz),
>>   void (*free)(void *userarg, void *ptr));
>> 
>> getdns_return_t
>> getdns_context_create_with_extended_memory_functions(
>>   getdns_context_t * context,
>>   int set_from_os,
>>   void *userarg,
>>   void *(*malloc) (void *userarg, size_t),
>>   void *(*realloc) (void *userarg, void *, size_t),
>>   void (*free) (void *userarg, void *)
>>   );
>> 
>> struct getdns_list *
>> getdns_list_create_with_extended_memory_functions(
>>   void *userarg,
>>   void *(*malloc) (void *userarg, size_t),
>>   void *(*realloc) (void *userarg, void *, size_t),
>>   void (*free) (void *userarg, void *));
>> 
>> 
>> struct getdns_dict *
>> getdns_dict_create_with_extended_memory_functions(
>>   void *userarg,
>>   void *(*malloc) (void *userarg, size_t),
>>   void *(*realloc) (void *userarg, void *, size_t),
>>   void (*free) (void *userarg, void *));
>> 
>> 
>> What do you think? Is it too much? Should we choose one type of custom
>> memory functions and if so, which one (extended or not)? Should we hide
>> the dict_create_* and list_create_* functions?
>> 
>> -- Willem
>> _______________________________________________
>> getdns-api mailing list
>> getdns-api at vpnc.org
> 
> 
> _______________________________________________
> getdns-api mailing list
> getdns-api at vpnc.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 496 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://www.vpnc.org/pipermail/getdns-api/attachments/20131120/530f1fed/attachment.bin>


More information about the getdns-api mailing list