[API 0.367] Custom memory management functions

This commit is contained in:
Willem Toorop 2013-12-04 16:47:46 +01:00
parent f7f35e3a9d
commit 678d6eec19
4 changed files with 272 additions and 58 deletions

View File

@ -38,8 +38,17 @@ uint8_t * uint8ptrarg;
uint16_t * uint16ptrarg;
uint32_t * uint32ptrarg;
void * arrayarg;
void allocfunctionarg(size_t foo) {UNUSED_PARAM(foo);}
void * userarg;
void * allocfunctionarg(size_t foo) {UNUSED_PARAM(foo); return NULL; }
void * reallocfunctionarg(void* foo, size_t bar)
{UNUSED_PARAM(foo); UNUSED_PARAM(bar); return NULL; }
void deallocfunctionarg(void* foo) {UNUSED_PARAM(foo);}
void * extendedallocfunctionarg(void* userarg, size_t foo)
{UNUSED_PARAM(userarg); UNUSED_PARAM(foo); return NULL; }
void * extendedreallocfunctionarg(void* userarg, void* foo, size_t bar)
{UNUSED_PARAM(userarg); UNUSED_PARAM(foo); UNUSED_PARAM(bar); return NULL; }
void extendeddeallocfunctionarg(void* userarg, void* foo)
{UNUSED_PARAM(userarg); UNUSED_PARAM(foo);}
void setcallbackfunctionarg(struct getdns_context *foo1, uint16_t foo2)
{UNUSED_PARAM(foo1);UNUSED_PARAM(foo2);}
@ -88,6 +97,23 @@ retregular = getdns_context_create(
boolarg
);
retregular = getdns_context_create_with_memory_functions(
&contextarg,
boolarg,
allocfunctionarg,
reallocfunctionarg,
deallocfunctionarg
);
retregular = getdns_context_create_with_extended_memory_functions(
&contextarg,
boolarg,
userarg,
extendedallocfunctionarg,
extendedreallocfunctionarg,
extendeddeallocfunctionarg
);
getdns_context_destroy(
contextarg
);
@ -141,6 +167,18 @@ retregular = getdns_dict_get_bindata(dictarg, charstararg, bindataptrarg);
retregular = getdns_dict_get_int(dictarg, charstararg, uint32ptrarg);
listarg = getdns_list_create();
listarg = getdns_list_create_with_context(contextarg);
listarg = getdns_list_create_with_memory_functions(
allocfunctionarg,
reallocfunctionarg,
deallocfunctionarg
);
listarg = getdns_list_create_with_extended_memory_functions(
userarg,
extendedallocfunctionarg,
extendedreallocfunctionarg,
extendeddeallocfunctionarg
);
getdns_list_destroy(listarg);
retregular = getdns_list_set_dict(listarg, sizetarg, dictarg);
retregular = getdns_list_set_list(listarg, sizetarg, listarg);
@ -148,6 +186,18 @@ retregular = getdns_list_set_bindata(listarg, sizetarg, bindataarg);
retregular = getdns_list_set_int(listarg, sizetarg, uint32arg);
dictarg = getdns_dict_create();
dictarg = getdns_dict_create_with_context(contextarg);
dictarg = getdns_dict_create_with_memory_functions(
allocfunctionarg,
reallocfunctionarg,
deallocfunctionarg
);
dictarg = getdns_dict_create_with_extended_memory_functions(
userarg,
extendedallocfunctionarg,
extendedreallocfunctionarg,
extendeddeallocfunctionarg
);
getdns_dict_destroy(dictarg);
retregular = getdns_dict_set_dict(dictarg, charstararg, dictarg);
retregular = getdns_dict_set_list(dictarg, charstararg, listarg);
@ -270,19 +320,19 @@ retregular = getdns_context_set_edns_do_bit(
uint8arg
);
retregular = getdns_context_set_memory_allocator(
contextarg,
allocfunctionarg
);
retregular = getdns_context_set_memory_deallocator(
retregular = getdns_context_set_memory_functions(
contextarg,
allocfunctionarg,
reallocfunctionarg,
deallocfunctionarg
);
retregular = getdns_context_set_memory_reallocator(
retregular = getdns_context_set_extended_memory_functions(
contextarg,
deallocfunctionarg
userarg,
extendedallocfunctionarg,
extendedreallocfunctionarg,
extendeddeallocfunctionarg
);
return(0); } /* End of main() */

View File

@ -63,6 +63,31 @@ getdns_context_create(
)
{ UNUSED_PARAM(context); UNUSED_PARAM(set_from_os); return GETDNS_RETURN_GOOD; }
getdns_return_t
getdns_context_create_with_memory_functions(
struct getdns_context **context,
int set_from_os,
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(void *)
)
{ UNUSED_PARAM(context); UNUSED_PARAM(set_from_os);
UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return GETDNS_RETURN_GOOD; }
getdns_return_t
getdns_context_create_with_extended_memory_functions(
struct getdns_context **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 *)
)
{ UNUSED_PARAM(context); UNUSED_PARAM(set_from_os); UNUSED_PARAM(userarg);
UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return GETDNS_RETURN_GOOD; }
void
getdns_context_destroy(
struct getdns_context *context
@ -162,6 +187,29 @@ getdns_return_t getdns_dict_get_int(struct getdns_dict *this_dict, char *name, u
struct getdns_list * getdns_list_create()
{ return NULL; }
struct getdns_list * getdns_list_create_with_context(
struct getdns_context *context
)
{ UNUSED_PARAM(context); return NULL; }
struct getdns_list * getdns_list_create_with_memory_functions(
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(void *)
)
{ UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return NULL; }
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 *)
)
{ UNUSED_PARAM(userarg);
UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return NULL; }
void getdns_list_destroy(struct getdns_list *this_list)
{ UNUSED_PARAM(this_list); }
@ -180,6 +228,29 @@ getdns_return_t getdns_list_set_int(struct getdns_list *this_list, size_t index,
struct getdns_dict * getdns_dict_create()
{ return NULL; }
struct getdns_dict * getdns_dict_create_with_context(
struct getdns_context *context
)
{ UNUSED_PARAM(context); return NULL; }
struct getdns_dict * getdns_dict_create_with_memory_functions(
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(void *)
)
{ UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return NULL; }
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 *)
)
{ UNUSED_PARAM(userarg);
UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return NULL; }
void getdns_dict_destroy(struct getdns_dict *this_dict)
{ UNUSED_PARAM(this_dict); }
@ -370,25 +441,28 @@ getdns_context_set_edns_do_bit(
{ UNUSED_PARAM(context); UNUSED_PARAM(value); return GETDNS_RETURN_GOOD; }
getdns_return_t
getdns_context_set_memory_allocator(
struct getdns_context *context,
void (*value)(size_t somesize)
getdns_context_set_memory_functions(
struct getdns_context *context,
void *(*malloc) (size_t),
void *(*realloc) (void *, size_t),
void (*free) (void *)
)
{ UNUSED_PARAM(context); UNUSED_PARAM(value); return GETDNS_RETURN_GOOD; }
{ UNUSED_PARAM(context);
UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return GETDNS_RETURN_GOOD; }
getdns_return_t
getdns_context_set_memory_deallocator(
struct getdns_context *context,
void (*value)(void*)
getdns_context_set_extended_memory_functions(
struct getdns_context *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)
)
{ UNUSED_PARAM(context); UNUSED_PARAM(value); return GETDNS_RETURN_GOOD; }
{ UNUSED_PARAM(context); UNUSED_PARAM(userarg);
UNUSED_PARAM(malloc); UNUSED_PARAM(realloc); UNUSED_PARAM(free);
return GETDNS_RETURN_GOOD; }
getdns_return_t
getdns_context_set_memory_reallocator(
struct getdns_context *context,
void (*value)(void*)
)
{ UNUSED_PARAM(context); UNUSED_PARAM(value); return GETDNS_RETURN_GOOD; }
getdns_return_t
getdns_extension_set_libevent_base(

View File

@ -1,4 +1,4 @@
/* Created at 2013-12-04-16-46-17*/
/* Created at 2013-12-04-16-47-24*/
#ifndef GETDNS_H
#define GETDNS_H
@ -279,6 +279,20 @@ getdns_return_t getdns_dict_get_int(struct getdns_dict *this_dict, char *name, u
/* Lists: create, destroy, and set the data at a given position */
struct getdns_list * getdns_list_create();
struct getdns_list * getdns_list_create_with_context(
struct getdns_context *context
);
struct getdns_list * getdns_list_create_with_memory_functions(
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(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 *)
);
void getdns_list_destroy(struct getdns_list *this_list);
getdns_return_t getdns_list_set_dict(struct getdns_list *this_list, size_t index, struct getdns_dict *child_dict);
getdns_return_t getdns_list_set_list(struct getdns_list *this_list, size_t index, struct getdns_list *child_list);
@ -287,6 +301,20 @@ getdns_return_t getdns_list_set_int(struct getdns_list *this_list, size_t index,
/* Dicts: create, destroy, and set the data at a given name */
struct getdns_dict * getdns_dict_create();
struct getdns_dict * getdns_dict_create_with_context(
struct getdns_context *context
);
struct getdns_dict * getdns_dict_create_with_memory_functions(
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(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 *)
);
void getdns_dict_destroy(struct getdns_dict *this_dict);
getdns_return_t getdns_dict_set_dict(struct getdns_dict *this_dict, char *name, struct getdns_dict *child_dict);
getdns_return_t getdns_dict_set_list(struct getdns_dict *this_dict, char *name, struct getdns_list *child_list);
@ -347,6 +375,24 @@ getdns_context_create(
int set_from_os
);
getdns_return_t
getdns_context_create_with_memory_functions(
struct getdns_context **context,
int set_from_os,
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(void *)
);
getdns_return_t
getdns_context_create_with_extended_memory_functions(
struct getdns_context **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 *)
);
void
getdns_context_destroy(
struct getdns_context *context
@ -532,21 +578,20 @@ getdns_context_set_edns_do_bit(
);
getdns_return_t
getdns_context_set_memory_allocator(
struct getdns_context *context,
void (*value)(size_t somesize)
getdns_context_set_memory_functions(
struct getdns_context *context,
void *(*malloc) (size_t),
void *(*realloc) (void *, size_t),
void (*free) (void *)
);
getdns_return_t
getdns_context_set_memory_deallocator(
struct getdns_context *context,
void (*value)(void*)
);
getdns_return_t
getdns_context_set_memory_reallocator(
struct getdns_context *context,
void (*value)(void*)
getdns_context_set_extended_memory_functions(
struct getdns_context *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)
);
#endif /* GETDNS_H */

View File

@ -332,6 +332,25 @@ getdns_context_create(
be used with other API calls; that context contains the API's default values. Most applications will
want <code>set_from_os</code> set to <code>1</code>.</p>
<div class=forh>getdns_return_t
getdns_context_create_with_memory_functions(
struct getdns_context **context,
int set_from_os,
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(void *)
);
getdns_return_t
getdns_context_create_with_extended_memory_functions(
struct getdns_context **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 *)
);
</div>
<p>To clean up the context, including cleaning up all outstanding transactions that were called
using this context, use the function:</p>
@ -418,7 +437,7 @@ Definition of main()
specifically designed to allow an application that wants to process results in polling instead of in
callbacks to be able to create its own polling interface fairly trivially. Such a program would
create a data structure for the calls, including their <code>transaction_id</code> and
<code>userag</code>. The <code>userarg</code> could be the polling data structure or have a pointer to it.
<code>userarg</code>. The <code>userarg</code> could be the polling data structure or have a pointer to it.
The application would have just
one callback function for all requests, and that function would copy the <code>response</code> into
application memory, update the data structure based on the <code>transaction_id</code> index,
@ -542,6 +561,20 @@ you need to create a dict. The requisite functions are:</p>
<div class=forh id="datasetters">
/* Lists: create, destroy, and set the data at a given position */
struct getdns_list * getdns_list_create();
struct getdns_list * getdns_list_create_with_context(
struct getdns_context *context
);
struct getdns_list * getdns_list_create_with_memory_functions(
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(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 *)
);
void getdns_list_destroy(struct getdns_list *this_list);
getdns_return_t getdns_list_set_dict(struct getdns_list *this_list, size_t index, struct getdns_dict *child_dict);
getdns_return_t getdns_list_set_list(struct getdns_list *this_list, size_t index, struct getdns_list *child_list);
@ -550,6 +583,20 @@ getdns_return_t getdns_list_set_int(struct getdns_list *this_list, size_t index,
/* Dicts: create, destroy, and set the data at a given name */
struct getdns_dict * getdns_dict_create();
struct getdns_dict * getdns_dict_create_with_context(
struct getdns_context *context
);
struct getdns_dict * getdns_dict_create_with_memory_functions(
void *(*malloc)(size_t),
void *(*realloc)(void *, size_t),
void (*free)(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 *)
);
void getdns_dict_destroy(struct getdns_dict *this_dict);
getdns_return_t getdns_dict_set_dict(struct getdns_dict *this_dict, char *name, struct getdns_dict *child_dict);
getdns_return_t getdns_dict_set_list(struct getdns_dict *this_dict, char *name, struct getdns_list *child_list);
@ -2042,34 +2089,32 @@ getdns_context_set_edns_do_bit(
<p class=cont>The value is between 0 and 1; the default
is <span class=default>0</span>.</p>
<h2>8.9 Context Use of C Functions</h2>
<h2>8.9 Context use of custom memory management functions</h2>
<div class=forh>
getdns_return_t
getdns_context_set_memory_allocator(
struct getdns_context *context,
void (*value)(size_t somesize)
getdns_context_set_memory_functions(
struct getdns_context *context,
void *(*malloc) (size_t),
void *(*realloc) (void *, size_t),
void (*free) (void *)
);</div>
<p class=cont>The value is a function pointer to the memory allocator; the
default is the <span class=default>malloc</span> function.</p>
<p class=cont>The given memory management functions will be used for creating the response dicts.
The response dicts inherit the custom memory management functions from the context and will deallocate themselves (and their members) with the custom deallocator.
By default the system <span class=default>malloc</span>, <span class=default>realloc</span> and <span>free</span> are used.</p>
<div class=forh>
getdns_return_t
getdns_context_set_memory_deallocator(
struct getdns_context *context,
void (*value)(void*)
getdns_context_set_extended_memory_functions(
struct getdns_context *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)
);</div>
<p class=cont>The value is a function pointer to the memory deallocator; the
default is the <span class=default>free</span> function.</p>
<div class=forh>
getdns_return_t
getdns_context_set_memory_reallocator(
struct getdns_context *context,
void (*value)(void*)
);</div>
<p class=cont>The value is a function pointer to the memory reallocator; the
default is the <span class=default>realloc</span> function.</p>
<p class=cont><p class=cont>The given extended memory management functions will be used for creating the response dicts.
The value of <code>userarg</code> argument will be passed to the custom <code>malloc<code>, <code>realloc</code> and <code>free</code>.
The response dicts inherit the custom memory management functions and the value for <code>userarg</code> from the context and will deallocate themselves (and their members) with the custom deallocator.</p>
<h2>8.10 <a id="ContextCodes">Context Codes</a></h2>
@ -2115,7 +2160,7 @@ default is the <span class=default>realloc</span> function.</p>
<h1>9. The Generated Files</h1>
<p>There is <a href="getdns-0.366.tgz">a tarball</a> that includes the .h files,
<p>There is <a href="getdns-0.367.tgz">a tarball</a> that includes the .h files,
the examples, and so on. The examples all make, even though there is no API implementation, based
on a pseudo-implementation in the tarball; see make-examples-PLATFORM.sh. Note that this currently builds fine
on the Macintosh and Ubuntu; help is definitely appreciated on making the build process