Context has own mem-funcs

It keeps using mem funcs for internal state that were given upon context creation.
Only dicts and lists are created with mem funcs set by getdns_context_set_memory_functions
This commit is contained in:
Willem Toorop 2013-12-08 23:15:57 +01:00
parent 8fe9da6503
commit 70e5193b3f
2 changed files with 18 additions and 9 deletions

View File

@ -74,7 +74,7 @@ static void cancel_dns_req(getdns_dns_req *);
static uint16_t * static uint16_t *
create_default_namespaces(struct getdns_context *context) create_default_namespaces(struct getdns_context *context)
{ {
uint16_t *result = GETDNS_XMALLOC(context, uint16_t, 2); uint16_t *result = GETDNS_XMALLOC(&context->my_mf, uint16_t, 2);
result[0] = GETDNS_CONTEXT_NAMESPACE_LOCALNAMES; result[0] = GETDNS_CONTEXT_NAMESPACE_LOCALNAMES;
result[1] = GETDNS_CONTEXT_NAMESPACE_DNS; result[1] = GETDNS_CONTEXT_NAMESPACE_DNS;
return result; return result;
@ -256,6 +256,10 @@ getdns_context_create_with_memory_functions(struct getdns_context ** context,
if (!result) { if (!result) {
return GETDNS_RETURN_GENERIC_ERROR; return GETDNS_RETURN_GENERIC_ERROR;
} }
result->my_mf.mf_arg = MF_PLAIN;
result->my_mf.mf.pln.malloc = malloc;
result->my_mf.mf.pln.realloc = realloc;
result->my_mf.mf.pln.free = free;
result->update_callback = NULL; result->update_callback = NULL;
@ -334,7 +338,7 @@ getdns_context_destroy(struct getdns_context *context)
return; return;
} }
if (context->namespaces) if (context->namespaces)
GETDNS_FREE(context, context->namespaces); GETDNS_FREE(&context->my_mf, context->namespaces);
getdns_list_destroy(context->dns_root_servers); getdns_list_destroy(context->dns_root_servers);
getdns_list_destroy(context->suffix); getdns_list_destroy(context->suffix);
@ -349,7 +353,7 @@ getdns_context_destroy(struct getdns_context *context)
ldns_rbtree_free(context->outbound_requests); ldns_rbtree_free(context->outbound_requests);
GETDNS_FREE(context, context); GETDNS_FREE(&context->my_mf, context);
return; return;
} /* getdns_context_destroy */ } /* getdns_context_destroy */
@ -450,10 +454,10 @@ getdns_context_set_namespaces(struct getdns_context *context,
} }
/** clean up old namespaces **/ /** clean up old namespaces **/
GETDNS_FREE(context, context->namespaces); GETDNS_FREE(&context->my_mf, context->namespaces);
/** duplicate **/ /** duplicate **/
context->namespaces = GETDNS_XMALLOC(context, uint16_t, context->namespaces = GETDNS_XMALLOC(&context->my_mf, uint16_t,
namespace_count); namespace_count);
memcpy(context->namespaces, namespaces, memcpy(context->namespaces, namespaces,
namespace_count * sizeof(uint16_t)); namespace_count * sizeof(uint16_t));
@ -879,7 +883,7 @@ getdns_context_cancel_request(struct getdns_context *context,
user_pointer = req->user_pointer; user_pointer = req->user_pointer;
/* clean up */ /* clean up */
GETDNS_FREE(context, node); GETDNS_FREE(&context->my_mf, node);
dns_req_free(req); dns_req_free(req);
/* fire callback */ /* fire callback */
@ -964,7 +968,7 @@ getdns_context_track_outbound_request(getdns_dns_req * req)
return GETDNS_RETURN_GENERIC_ERROR; return GETDNS_RETURN_GENERIC_ERROR;
} }
struct getdns_context *context = req->context; struct getdns_context *context = req->context;
ldns_rbnode_t *node = GETDNS_MALLOC(context, ldns_rbnode_t); ldns_rbnode_t *node = GETDNS_MALLOC(&context->my_mf, ldns_rbnode_t);
if (!node) { if (!node) {
return GETDNS_RETURN_GENERIC_ERROR; return GETDNS_RETURN_GENERIC_ERROR;
} }
@ -972,7 +976,7 @@ getdns_context_track_outbound_request(getdns_dns_req * req)
node->data = req; node->data = req;
if (!ldns_rbtree_insert(context->outbound_requests, node)) { if (!ldns_rbtree_insert(context->outbound_requests, node)) {
/* free the node */ /* free the node */
GETDNS_FREE(context, node); GETDNS_FREE(&context->my_mf, node);
return GETDNS_RETURN_GENERIC_ERROR; return GETDNS_RETURN_GENERIC_ERROR;
} }
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
@ -988,7 +992,7 @@ getdns_context_clear_outbound_request(getdns_dns_req * req)
ldns_rbnode_t *node = ldns_rbtree_delete(context->outbound_requests, ldns_rbnode_t *node = ldns_rbtree_delete(context->outbound_requests,
&(req->trans_id)); &(req->trans_id));
if (node) { if (node) {
GETDNS_FREE(context, node); GETDNS_FREE(&context->my_mf, node);
} }
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} }

View File

@ -62,6 +62,11 @@ struct getdns_context {
void *mf_arg; void *mf_arg;
mem_funcs mf; mem_funcs mf;
struct {
void *mf_arg;
mem_funcs mf;
} my_mf;
/* Event loop for sync requests */ /* Event loop for sync requests */
struct event_base *event_base_sync; struct event_base *event_base_sync;
/* Event loop for async requests */ /* Event loop for async requests */