[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