[getdns-api] Custom memory management functions again

Wiley, Glen gwiley at verisign.com
Wed Nov 20 22:23:29 CET 2013


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



More information about the spec mailing list