From: Wouter Wijngaards Date: Thu, 18 Oct 2007 20:31:43 +0000 (+0000) Subject: regional nicer, remove region-allocator. X-Git-Tag: release-0.6~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6f49c2fe55d8715999901e2145c155a249bb1713;p=thirdparty%2Funbound.git regional nicer, remove region-allocator. git-svn-id: file:///svn/unbound/trunk@697 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/checkconf/unbound-checkconf.c b/checkconf/unbound-checkconf.c index ded21e4b0..9efedb5f5 100644 --- a/checkconf/unbound-checkconf.c +++ b/checkconf/unbound-checkconf.c @@ -47,7 +47,7 @@ #include "util/config_file.h" #include "util/module.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "iterator/iterator.h" #include "validator/validator.h" #include @@ -72,14 +72,16 @@ check_mod(struct config_file* cfg, struct module_func_block* fb) struct module_env env; memset(&env, 0, sizeof(env)); env.cfg = cfg; - env.scratch = region_create(malloc, free); + env.scratch = regional_create(); env.scratch_buffer = ldns_buffer_new(BUFSIZ); + if(!env.scratch || !env.scratch_buffer) + fatal_exit("out of memory"); if(!(*fb->init)(&env, 0)) { fatal_exit("bad config for %s module", fb->name); } (*fb->deinit)(&env, 0); ldns_buffer_free(env.scratch_buffer); - region_destroy(env.scratch); + regional_destroy(env.scratch); } /** check configuration for errors */ diff --git a/daemon/worker.c b/daemon/worker.c index a8bf661d6..6754d9c81 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -48,7 +48,7 @@ #include "util/netevent.h" #include "util/config_file.h" #include "util/module.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/storage/slabhash.h" #include "services/listen_dnsport.h" #include "services/outside_network.h" @@ -144,10 +144,11 @@ worker_mem_report(struct worker* ATTR_UNUSED(worker), (&worker->env, i); } me = sizeof(*worker) + sizeof(*worker->base) + sizeof(*worker->comsig) - + comm_point_get_mem(worker->cmd_com) + - sizeof(worker->rndstate) + region_get_mem(worker->scratchpad)+ - sizeof(*worker->env.scratch_buffer) + - ldns_buffer_capacity(worker->env.scratch_buffer); + + comm_point_get_mem(worker->cmd_com) + + sizeof(worker->rndstate) + + regional_get_mem(worker->scratchpad) + + sizeof(*worker->env.scratch_buffer) + + ldns_buffer_capacity(worker->env.scratch_buffer); if(cur_serv) { me += serviced_get_mem(cur_serv); } @@ -390,7 +391,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo, qinfo->qname_len, qinfo->qtype, qinfo->qclass, worker->scratchpad, &msg, timenow); if(!dp) { /* no delegation, need to reprime */ - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); return 0; } if(must_validate) { @@ -398,7 +399,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo, case sec_status_unchecked: /* some rrsets have not been verified yet, go and * let validator do that */ - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); return 0; case sec_status_bogus: /* some rrsets are bogus, reply servfail */ @@ -408,7 +409,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo, edns->bits &= EDNS_DO; error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL, &msg->qinfo, id, flags, edns); - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); return 1; case sec_status_secure: /* all rrsets are secure */ @@ -437,7 +438,7 @@ answer_norec_from_cache(struct worker* worker, struct query_info* qinfo, error_encode(repinfo->c->buffer, LDNS_RCODE_SERVFAIL, &msg->qinfo, id, flags, edns); } - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); return 1; } @@ -510,7 +511,7 @@ answer_from_cache(struct worker* worker, struct lruhash_entry* e, uint16_t id, bail_out: rrset_array_unlock_touch(worker->env.rrset_cache, worker->scratchpad, rep->ref, rep->rrset_count); - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); return 0; } } @@ -525,7 +526,7 @@ answer_from_cache(struct worker* worker, struct lruhash_entry* e, uint16_t id, &mrentry->key, id, flags, edns); rrset_array_unlock_touch(worker->env.rrset_cache, worker->scratchpad, rep->ref, rep->rrset_count); - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); return 1; } else if( rep->security == sec_status_unchecked && must_validate) { verbose(VERB_ALGO, "Cache reply: unchecked entry needs " @@ -558,7 +559,7 @@ answer_from_cache(struct worker* worker, struct lruhash_entry* e, uint16_t id, * is bad while holding locks. */ rrset_array_unlock_touch(worker->env.rrset_cache, worker->scratchpad, rep->ref, rep->rrset_count); - region_free_all(worker->scratchpad); + regional_free_all(worker->scratchpad); /* go and return this buffer to the client */ return 1; } @@ -940,8 +941,7 @@ worker_init(struct worker* worker, struct config_file *cfg, } /* we use the msg_buffer_size as a good estimate for what the * user wants for memory usage sizes */ - worker->scratchpad = region_create_custom(malloc, free, - cfg->msg_buffer_size, cfg->msg_buffer_size/4, 32, 1); + worker->scratchpad = regional_create_custom(cfg->msg_buffer_size); if(!worker->scratchpad) { log_err("malloc failure"); worker_delete(worker); @@ -1006,7 +1006,7 @@ worker_delete(struct worker* worker) close(worker->cmd_recv_fd); worker->cmd_recv_fd = -1; alloc_clear(&worker->alloc); - region_destroy(worker->scratchpad); + regional_destroy(worker->scratchpad); free(worker); } @@ -1043,7 +1043,7 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype, struct module_qstate* q) { struct worker* worker = q->env->worker; - struct outbound_entry* e = (struct outbound_entry*)region_alloc( + struct outbound_entry* e = (struct outbound_entry*)regional_alloc( q->region, sizeof(*e)); if(!e) return NULL; diff --git a/daemon/worker.h b/daemon/worker.h index de30e935c..abf0b58fe 100644 --- a/daemon/worker.h +++ b/daemon/worker.h @@ -57,7 +57,7 @@ struct config_file; struct daemon; struct listen_port; struct ub_randstate; -struct region; +struct regional; /** size of table used for random numbers. large to be more secure. */ #define RND_STATE_SIZE 256 @@ -105,8 +105,8 @@ struct worker { struct alloc_cache alloc; /** per thread statistics */ struct server_stats stats; - /** thread scratch region */ - struct region* scratchpad; + /** thread scratch regional */ + struct regional* scratchpad; /** module environment passed to modules, changed for this thread */ struct module_env env; diff --git a/doc/Changelog b/doc/Changelog index c13265b74..d474f146b 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -11,6 +11,8 @@ - ldns-src.tar.gz is used if no ldns is found on the system, and statically linked into unbound. - start of regional allocator code. + - regional uses less memory and variables, simplified code. + - remove of region-allocator. 17 October 2007: Wouter - fixup another cycle detect and ns-addr timeout resolution bug. diff --git a/iterator/iter_delegpt.c b/iterator/iter_delegpt.c index 8272f4dce..4c17fc896 100644 --- a/iterator/iter_delegpt.c +++ b/iterator/iter_delegpt.c @@ -42,23 +42,24 @@ #include "config.h" #include "iterator/iter_delegpt.h" #include "services/cache/dns.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/data/dname.h" #include "util/data/packed_rrset.h" #include "util/data/msgreply.h" #include "util/net_help.h" struct delegpt* -delegpt_create(struct region* region) +delegpt_create(struct regional* region) { - struct delegpt* dp=(struct delegpt*)region_alloc(region, sizeof(*dp)); + struct delegpt* dp=(struct delegpt*)regional_alloc( + region, sizeof(*dp)); if(!dp) return NULL; memset(dp, 0, sizeof(*dp)); return dp; } -struct delegpt* delegpt_copy(struct delegpt* dp, struct region* region) +struct delegpt* delegpt_copy(struct delegpt* dp, struct regional* region) { struct delegpt* copy = delegpt_create(region); struct delegpt_ns* ns; @@ -80,15 +81,15 @@ struct delegpt* delegpt_copy(struct delegpt* dp, struct region* region) } int -delegpt_set_name(struct delegpt* dp, struct region* region, uint8_t* name) +delegpt_set_name(struct delegpt* dp, struct regional* region, uint8_t* name) { dp->namelabs = dname_count_size_labels(name, &dp->namelen); - dp->name = region_alloc_init(region, name, dp->namelen); + dp->name = regional_alloc_init(region, name, dp->namelen); return dp->name != 0; } int -delegpt_add_ns(struct delegpt* dp, struct region* region, uint8_t* name) +delegpt_add_ns(struct delegpt* dp, struct regional* region, uint8_t* name) { struct delegpt_ns* ns; size_t len; @@ -97,14 +98,14 @@ delegpt_add_ns(struct delegpt* dp, struct region* region, uint8_t* name) * adding the same server as a dependency twice */ if(delegpt_find_ns(dp, name, len)) return 1; - ns = (struct delegpt_ns*)region_alloc(region, + ns = (struct delegpt_ns*)regional_alloc(region, sizeof(struct delegpt_ns)); if(!ns) return 0; ns->next = dp->nslist; ns->namelen = len; dp->nslist = ns; - ns->name = region_alloc_init(region, name, ns->namelen); + ns->name = regional_alloc_init(region, name, ns->namelen); ns->resolved = 0; return 1; } @@ -124,7 +125,7 @@ delegpt_find_ns(struct delegpt* dp, uint8_t* name, size_t namelen) } int -delegpt_add_target(struct delegpt* dp, struct region* region, +delegpt_add_target(struct delegpt* dp, struct regional* region, uint8_t* name, size_t namelen, struct sockaddr_storage* addr, socklen_t addrlen) { @@ -138,10 +139,10 @@ delegpt_add_target(struct delegpt* dp, struct region* region, } int -delegpt_add_addr(struct delegpt* dp, struct region* region, +delegpt_add_addr(struct delegpt* dp, struct regional* region, struct sockaddr_storage* addr, socklen_t addrlen) { - struct delegpt_addr* a = (struct delegpt_addr*)region_alloc(region, + struct delegpt_addr* a = (struct delegpt_addr*)regional_alloc(region, sizeof(struct delegpt_addr)); if(!a) return 0; @@ -256,7 +257,7 @@ find_NS(struct reply_info* rep, size_t from, size_t to) } struct delegpt* -delegpt_from_message(struct dns_msg* msg, struct region* region) +delegpt_from_message(struct dns_msg* msg, struct regional* region) { struct ub_packed_rrset_key* ns_rrset = NULL; struct delegpt* dp; @@ -305,7 +306,7 @@ delegpt_from_message(struct dns_msg* msg, struct region* region) } int -delegpt_rrset_add_ns(struct delegpt* dp, struct region* region, +delegpt_rrset_add_ns(struct delegpt* dp, struct regional* region, struct ub_packed_rrset_key* ns_rrset) { struct packed_rrset_data* nsdata = (struct packed_rrset_data*) @@ -324,7 +325,7 @@ delegpt_rrset_add_ns(struct delegpt* dp, struct region* region, } int -delegpt_add_rrset_A(struct delegpt* dp, struct region* region, +delegpt_add_rrset_A(struct delegpt* dp, struct regional* region, struct ub_packed_rrset_key* ak) { struct packed_rrset_data* d=(struct packed_rrset_data*)ak->entry.data; @@ -347,7 +348,7 @@ delegpt_add_rrset_A(struct delegpt* dp, struct region* region, } int -delegpt_add_rrset_AAAA(struct delegpt* dp, struct region* region, +delegpt_add_rrset_AAAA(struct delegpt* dp, struct regional* region, struct ub_packed_rrset_key* ak) { struct packed_rrset_data* d=(struct packed_rrset_data*)ak->entry.data; @@ -370,7 +371,7 @@ delegpt_add_rrset_AAAA(struct delegpt* dp, struct region* region, } int -delegpt_add_rrset(struct delegpt* dp, struct region* region, +delegpt_add_rrset(struct delegpt* dp, struct regional* region, struct ub_packed_rrset_key* rrset) { if(!rrset) diff --git a/iterator/iter_delegpt.h b/iterator/iter_delegpt.h index 6c4170028..ce0ce1753 100644 --- a/iterator/iter_delegpt.h +++ b/iterator/iter_delegpt.h @@ -43,7 +43,7 @@ #ifndef ITERATOR_ITER_DELEGPT_H #define ITERATOR_ITER_DELEGPT_H #include "util/log.h" -struct region; +struct regional; struct delegpt_ns; struct delegpt_addr; struct dns_msg; @@ -110,51 +110,53 @@ struct delegpt_addr { /** * Create new delegation point. - * @param region: where to allocate it. + * @param regional: where to allocate it. * @return new delegation point or NULL on error. */ -struct delegpt* delegpt_create(struct region* region); +struct delegpt* delegpt_create(struct regional* regional); /** * Create a copy of a delegation point. * @param dp: delegation point to copy. - * @param region: where to allocate it. + * @param regional: where to allocate it. * @return new delegation point or NULL on error. */ -struct delegpt* delegpt_copy(struct delegpt* dp, struct region* region); +struct delegpt* delegpt_copy(struct delegpt* dp, struct regional* regional); /** * Set name of delegation point. * @param dp: delegation point. - * @param region: where to allocate the name copy. + * @param regional: where to allocate the name copy. * @param name: name to use. * @return false on error. */ -int delegpt_set_name(struct delegpt* dp, struct region* region, uint8_t* name); +int delegpt_set_name(struct delegpt* dp, struct regional* regional, + uint8_t* name); /** * Add a name to the delegation point. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param name: domain name in wire format. * @return false on error. */ -int delegpt_add_ns(struct delegpt* dp, struct region* region, uint8_t* name); +int delegpt_add_ns(struct delegpt* dp, struct regional* regional, + uint8_t* name); /** * Add NS rrset; calls add_ns repeatedly. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param ns_rrset: NS rrset. * return 0 on alloc error. */ -int delegpt_rrset_add_ns(struct delegpt* dp, struct region* region, +int delegpt_rrset_add_ns(struct delegpt* dp, struct regional* regional, struct ub_packed_rrset_key* ns_rrset); /** * Add target address to the delegation point. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param name: name for which target was found (must be in nslist). * This name is marked resolved. * @param namelen: length of name. @@ -162,49 +164,49 @@ int delegpt_rrset_add_ns(struct delegpt* dp, struct region* region, * @param addrlen: the length of addr. * @return false on error. */ -int delegpt_add_target(struct delegpt* dp, struct region* region, +int delegpt_add_target(struct delegpt* dp, struct regional* regional, uint8_t* name, size_t namelen, struct sockaddr_storage* addr, socklen_t addrlen); /** * Add A RRset to delegpt. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param rrset: RRset A to add. * @return 0 on alloc error. */ -int delegpt_add_rrset_A(struct delegpt* dp, struct region* region, +int delegpt_add_rrset_A(struct delegpt* dp, struct regional* regional, struct ub_packed_rrset_key* rrset); /** * Add AAAA RRset to delegpt. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param rrset: RRset AAAA to add. * @return 0 on alloc error. */ -int delegpt_add_rrset_AAAA(struct delegpt* dp, struct region* region, +int delegpt_add_rrset_AAAA(struct delegpt* dp, struct regional* regional, struct ub_packed_rrset_key* rrset); /** * Add any RRset to delegpt. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param rrset: RRset to add, NS, A, AAAA. * @return 0 on alloc error. */ -int delegpt_add_rrset(struct delegpt* dp, struct region* region, +int delegpt_add_rrset(struct delegpt* dp, struct regional* regional, struct ub_packed_rrset_key* rrset); /** * Add address to the delegation point. No servername is associated or checked. * @param dp: delegation point. - * @param region: where to allocate the info. + * @param regional: where to allocate the info. * @param addr: the address. * @param addrlen: the length of addr. * @return false on error. */ -int delegpt_add_addr(struct delegpt* dp, struct region* region, +int delegpt_add_addr(struct delegpt* dp, struct regional* regional, struct sockaddr_storage* addr, socklen_t addrlen); /** @@ -251,11 +253,11 @@ size_t delegpt_count_missing_targets(struct delegpt* dp); * find "glue" in either the ADDITIONAL section or the ANSWER section. * * @param msg: the dns message, referral. - * @param region: where to allocate delegation point. + * @param regional: where to allocate delegation point. * @return new delegation point or NULL on alloc error, or if the * message was not appropriate. */ struct delegpt* delegpt_from_message(struct dns_msg* msg, - struct region* region); + struct regional* regional); #endif /* ITERATOR_ITER_DELEGPT_H */ diff --git a/iterator/iter_donotq.c b/iterator/iter_donotq.c index 0687b3eab..3bf4522c8 100644 --- a/iterator/iter_donotq.c +++ b/iterator/iter_donotq.c @@ -43,7 +43,7 @@ */ #include "config.h" #include "iterator/iter_donotq.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/log.h" #include "util/config_file.h" #include "util/net_help.h" @@ -63,7 +63,7 @@ donotq_create() sizeof(struct iter_donotq)); if(!dq) return NULL; - dq->region = region_create(malloc, free); + dq->region = regional_create(); if(!dq->region) { donotq_delete(dq); return NULL; @@ -76,7 +76,7 @@ donotq_delete(struct iter_donotq* dq) { if(!dq) return; - region_destroy(dq->region); + regional_destroy(dq->region); free(dq->tree); free(dq); } @@ -86,7 +86,7 @@ static int donotq_insert(struct iter_donotq* dq, struct sockaddr_storage* addr, socklen_t addrlen) { - struct iter_donotq_addr* node = region_alloc(dq->region, + struct iter_donotq_addr* node = regional_alloc(dq->region, sizeof(struct iter_donotq_addr)); if(!node) return 0; @@ -151,5 +151,5 @@ size_t donotq_get_mem(struct iter_donotq* donotq) { if(!donotq) return 0; - return sizeof(*donotq) + region_get_mem(donotq->region); + return sizeof(*donotq) + regional_get_mem(donotq->region); } diff --git a/iterator/iter_donotq.h b/iterator/iter_donotq.h index 72d4de67c..d86e3535d 100644 --- a/iterator/iter_donotq.h +++ b/iterator/iter_donotq.h @@ -45,14 +45,14 @@ #include "util/rbtree.h" struct iter_env; struct config_file; -struct region; +struct regional; /** * Iterator donotqueryaddresses structure */ struct iter_donotq { - /** region for allocation */ - struct region* region; + /** regional for allocation */ + struct regional* region; /** * Tree of the single addresses that are blocked. * contents of type iter_donotq_addr. diff --git a/iterator/iter_fwd.c b/iterator/iter_fwd.c index c3da77872..449a62d9e 100644 --- a/iterator/iter_fwd.c +++ b/iterator/iter_fwd.c @@ -42,7 +42,7 @@ #include "config.h" #include "iterator/iter_fwd.h" #include "iterator/iter_delegpt.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/log.h" #include "util/config_file.h" #include "util/net_help.h" @@ -70,7 +70,7 @@ forwards_create() sizeof(struct iter_forwards)); if(!fwd) return NULL; - fwd->region = region_create(malloc, free); + fwd->region = regional_create(); if(!fwd->region) { forwards_delete(fwd); return NULL; @@ -83,7 +83,7 @@ forwards_delete(struct iter_forwards* fwd) { if(!fwd) return; - region_destroy(fwd->region); + regional_destroy(fwd->region); free(fwd->tree); free(fwd); } @@ -92,13 +92,13 @@ forwards_delete(struct iter_forwards* fwd) static int forwards_insert(struct iter_forwards* fwd, uint16_t c, struct delegpt* dp) { - struct iter_forward_zone* node = region_alloc(fwd->region, + struct iter_forward_zone* node = regional_alloc(fwd->region, sizeof(struct iter_forward_zone)); if(!node) return 0; node->node.key = node; node->dclass = c; - node->name = region_alloc_init(fwd->region, dp->name, dp->namelen); + node->name = regional_alloc_init(fwd->region, dp->name, dp->namelen); if(!node->name) return 0; node->namelen = dp->namelen; @@ -288,5 +288,5 @@ forwards_get_mem(struct iter_forwards* fwd) { if(!fwd) return 0; - return sizeof(*fwd) + region_get_mem(fwd->region); + return sizeof(*fwd) + regional_get_mem(fwd->region); } diff --git a/iterator/iter_fwd.h b/iterator/iter_fwd.h index 8d9743a36..dca4e648b 100644 --- a/iterator/iter_fwd.h +++ b/iterator/iter_fwd.h @@ -46,14 +46,14 @@ struct iter_env; struct config_file; struct delegpt; -struct region; +struct regional; /** * Iterator forward zones structure */ struct iter_forwards { - /** region where forward zone server addresses are allocated */ - struct region* region; + /** regional where forward zone server addresses are allocated */ + struct regional* region; /** * Zones are stored in this tree. Sort order is specially chosen. * first sorted on qtype. Then on dname in nsec-like order, so that diff --git a/iterator/iter_hints.c b/iterator/iter_hints.c index 6866f2893..dd9c9e121 100644 --- a/iterator/iter_hints.c +++ b/iterator/iter_hints.c @@ -42,7 +42,7 @@ #include "config.h" #include "iterator/iter_hints.h" #include "iterator/iter_delegpt.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/log.h" #include "util/config_file.h" #include "util/net_help.h" @@ -70,7 +70,7 @@ hints_create() sizeof(struct iter_hints)); if(!hints) return NULL; - hints->region = region_create(malloc, free); + hints->region = regional_create(); if(!hints->region) { hints_delete(hints); return NULL; @@ -83,14 +83,14 @@ hints_delete(struct iter_hints* hints) { if(!hints) return; - region_destroy(hints->region); + regional_destroy(hints->region); free(hints->tree); free(hints); } /** add hint to delegation hints */ static int -ah(struct delegpt* dp, struct region* r, const char* sv, const char* ip) +ah(struct delegpt* dp, struct regional* r, const char* sv, const char* ip) { struct sockaddr_storage addr; socklen_t addrlen; @@ -112,7 +112,7 @@ ah(struct delegpt* dp, struct region* r, const char* sv, const char* ip) /** obtain compiletime provided root hints */ static struct delegpt* -compile_time_root_prime(struct region* r) +compile_time_root_prime(struct regional* r) { /* from: ; This file is made available by InterNIC @@ -149,13 +149,13 @@ compile_time_root_prime(struct region* r) static int hints_insert(struct iter_hints* hints, uint16_t c, struct delegpt* dp) { - struct iter_hints_stub* node = region_alloc(hints->region, + struct iter_hints_stub* node = regional_alloc(hints->region, sizeof(struct iter_hints_stub)); if(!node) return 0; node->node.key = node; node->hint_class = c; - node->name = region_alloc_init(hints->region, dp->name, dp->namelen); + node->name = regional_alloc_init(hints->region, dp->name, dp->namelen); if(!node->name) return 0; node->namelen = dp->namelen; @@ -379,5 +379,5 @@ size_t hints_get_mem(struct iter_hints* hints) { if(!hints) return 0; - return sizeof(*hints) + region_get_mem(hints->region); + return sizeof(*hints) + regional_get_mem(hints->region); } diff --git a/iterator/iter_hints.h b/iterator/iter_hints.h index 35f559ce9..363bdf209 100644 --- a/iterator/iter_hints.h +++ b/iterator/iter_hints.h @@ -46,14 +46,14 @@ struct iter_env; struct config_file; struct delegpt; -struct region; +struct regional; /** * Iterator hints structure */ struct iter_hints { - /** region where hints are allocated */ - struct region* region; + /** regional where hints are allocated */ + struct regional* region; /** * Hints are stored in this tree. Sort order is specially chosen. * first sorted on qtype. Then on dname in nsec-like order, so that diff --git a/iterator/iter_scrub.c b/iterator/iter_scrub.c index 6edd7620f..50939cd7f 100644 --- a/iterator/iter_scrub.c +++ b/iterator/iter_scrub.c @@ -44,7 +44,7 @@ #include "services/cache/rrset.h" #include "util/log.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/config_file.h" #include "util/module.h" #include "util/data/msgparse.h" @@ -224,22 +224,22 @@ synth_cname(uint8_t* qname, size_t qnamelen, struct rrset_parse* dname_rrset, /** synthesize a CNAME rrset */ static struct rrset_parse* synth_cname_rrset(uint8_t** sname, size_t* snamelen, uint8_t* alias, - size_t aliaslen, struct region* region, struct msg_parse* msg, + size_t aliaslen, struct regional* region, struct msg_parse* msg, struct rrset_parse* rrset, struct rrset_parse* prev, struct rrset_parse* nx, ldns_buffer* pkt) { - struct rrset_parse* cn = (struct rrset_parse*)region_alloc(region, + struct rrset_parse* cn = (struct rrset_parse*)regional_alloc(region, sizeof(struct rrset_parse)); if(!cn) return NULL; memset(cn, 0, sizeof(*cn)); - cn->rr_first = (struct rr_parse*)region_alloc(region, + cn->rr_first = (struct rr_parse*)regional_alloc(region, sizeof(struct rr_parse)); if(!cn->rr_first) return NULL; cn->rr_last = cn->rr_first; /* CNAME from sname to alias */ - cn->dname = (uint8_t*)region_alloc(region, *snamelen); + cn->dname = (uint8_t*)regional_alloc(region, *snamelen); if(!cn->dname) return NULL; dname_pkt_copy(pkt, cn->dname, *sname); @@ -253,7 +253,7 @@ synth_cname_rrset(uint8_t** sname, size_t* snamelen, uint8_t* alias, /* allocate TTL + rdatalen + uncompressed dname */ memset(cn->rr_first, 0, sizeof(struct rr_parse)); cn->rr_first->outside_packet = 1; - cn->rr_first->ttl_data = (uint8_t*)region_alloc(region, + cn->rr_first->ttl_data = (uint8_t*)regional_alloc(region, sizeof(uint32_t)+sizeof(uint16_t)+aliaslen); if(!cn->rr_first->ttl_data) return NULL; @@ -312,7 +312,7 @@ pkt_sub(ldns_buffer* pkt, uint8_t* comprname, uint8_t* zone) */ static int scrub_normalize(ldns_buffer* pkt, struct msg_parse* msg, - struct query_info* qinfo, struct region* region) + struct query_info* qinfo, struct regional* region) { uint8_t* sname = qinfo->qname; size_t snamelen = qinfo->qname_len; @@ -545,7 +545,7 @@ scrub_sanitize(ldns_buffer* pkt, struct msg_parse* msg, uint8_t* zonename, int scrub_message(ldns_buffer* pkt, struct msg_parse* msg, - struct query_info* qinfo, uint8_t* zonename, struct region* region, + struct query_info* qinfo, uint8_t* zonename, struct regional* region, struct module_env* env) { /* basic sanity checks */ diff --git a/iterator/iter_scrub.h b/iterator/iter_scrub.h index 0ac5768bf..7ec9b76e1 100644 --- a/iterator/iter_scrub.h +++ b/iterator/iter_scrub.h @@ -44,7 +44,7 @@ #define ITERATOR_ITER_SCRUB_H struct msg_parse; struct query_info; -struct region; +struct regional; struct module_env; /** @@ -55,12 +55,12 @@ struct module_env; * @param qinfo: the query info that was sent to the server. Checked. * @param zonename: the name of the last delegation point. * Used to determine out of bailiwick information. - * @param region: where to allocate (new) parts of the message. + * @param regional: where to allocate (new) parts of the message. * @param env: module environment with config settings and cache. * @return: false if the message is total waste. true if scrubbed with success. */ int scrub_message(ldns_buffer* pkt, struct msg_parse* msg, - struct query_info* qinfo, uint8_t* zonename, struct region* region, + struct query_info* qinfo, uint8_t* zonename, struct regional* regional, struct module_env* env); #endif /* ITERATOR_ITER_SCRUB_H */ diff --git a/iterator/iter_utils.c b/iterator/iter_utils.c index b07711a6b..1c2dc1114 100644 --- a/iterator/iter_utils.c +++ b/iterator/iter_utils.c @@ -53,7 +53,7 @@ #include "util/module.h" #include "util/log.h" #include "util/config_file.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/data/msgparse.h" #include "util/data/dname.h" #include "util/random.h" @@ -243,9 +243,10 @@ iter_server_selection(struct iter_env* iter_env, } struct dns_msg* -dns_alloc_msg(ldns_buffer* pkt, struct msg_parse* msg, struct region* region) +dns_alloc_msg(ldns_buffer* pkt, struct msg_parse* msg, + struct regional* region) { - struct dns_msg* m = (struct dns_msg*)region_alloc(region, + struct dns_msg* m = (struct dns_msg*)regional_alloc(region, sizeof(struct dns_msg)); if(!m) return NULL; @@ -258,14 +259,14 @@ dns_alloc_msg(ldns_buffer* pkt, struct msg_parse* msg, struct region* region) } struct dns_msg* -dns_copy_msg(struct dns_msg* from, struct region* region) +dns_copy_msg(struct dns_msg* from, struct regional* region) { - struct dns_msg* m = (struct dns_msg*)region_alloc(region, + struct dns_msg* m = (struct dns_msg*)regional_alloc(region, sizeof(struct dns_msg)); if(!m) return NULL; m->qinfo = from->qinfo; - if(!(m->qinfo.qname = region_alloc_init(region, from->qinfo.qname, + if(!(m->qinfo.qname = regional_alloc_init(region, from->qinfo.qname, from->qinfo.qname_len))) return NULL; if(!(m->rep = reply_info_copy(from->rep, NULL, region))) diff --git a/iterator/iter_utils.h b/iterator/iter_utils.h index 6cc7a6c01..8b0c1c83e 100644 --- a/iterator/iter_utils.h +++ b/iterator/iter_utils.h @@ -47,7 +47,7 @@ struct config_file; struct module_env; struct delegpt_addr; struct delegpt; -struct region; +struct regional; struct msg_parse; struct ub_randstate; struct query_info; @@ -81,22 +81,22 @@ struct delegpt_addr* iter_server_selection(struct iter_env* iter_env, size_t namelen); /** - * Allocate dns_msg from parsed msg, in region. + * Allocate dns_msg from parsed msg, in regional. * @param pkt: packet. - * @param msg: parsed message (cleaned and ready for region allocation). - * @param region: region to use for allocation. + * @param msg: parsed message (cleaned and ready for regional allocation). + * @param regional: regional to use for allocation. * @return newly allocated dns_msg, or NULL on memory error. */ struct dns_msg* dns_alloc_msg(ldns_buffer* pkt, struct msg_parse* msg, - struct region* region); + struct regional* regional); /** - * Copy a dns_msg to this region. - * @param from: dns message, also in region. - * @param region: region to use for allocation. + * Copy a dns_msg to this regional. + * @param from: dns message, also in regional. + * @param regional: regional to use for allocation. * @return newly allocated dns_msg, or NULL on memory error. */ -struct dns_msg* dns_copy_msg(struct dns_msg* from, struct region* region); +struct dns_msg* dns_copy_msg(struct dns_msg* from, struct regional* regional); /** * Allocate a dns_msg with malloc/alloc structure and store in dns cache. diff --git a/iterator/iterator.c b/iterator/iterator.c index 3890a67e8..eb0e9269e 100644 --- a/iterator/iterator.c +++ b/iterator/iterator.c @@ -54,7 +54,7 @@ #include "util/module.h" #include "util/netevent.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/data/dname.h" #include "util/data/msgencode.h" #include "util/fptr_wlist.h" @@ -94,7 +94,7 @@ iter_deinit(struct module_env* env, int id) static int iter_new(struct module_qstate* qstate, int id) { - struct iter_qstate* iq = (struct iter_qstate*)region_alloc( + struct iter_qstate* iq = (struct iter_qstate*)regional_alloc( qstate->region, sizeof(struct iter_qstate)); qstate->minfo[id] = iq; if(!iq) @@ -225,7 +225,7 @@ error_response(struct module_qstate* qstate, int id, int rcode) /** prepend the prepend list in the answer and authority section of dns_msg */ static int iter_prepend(struct iter_qstate* iq, struct dns_msg* msg, - struct region* region) + struct regional* region) { struct iter_prep_list* p; struct ub_packed_rrset_key** sets; @@ -237,7 +237,7 @@ iter_prepend(struct iter_qstate* iq, struct dns_msg* msg, if(num_an + num_ns == 0) return 1; verbose(VERB_ALGO, "prepending %d rrsets", (int)num_an + (int)num_ns); - sets = region_alloc(region, (num_an+num_ns+msg->rep->rrset_count) * + sets = regional_alloc(region, (num_an+num_ns+msg->rep->rrset_count) * sizeof(struct ub_packed_rrset_key*)); if(!sets) return 0; @@ -281,7 +281,7 @@ static int iter_add_prepend_answer(struct module_qstate* qstate, struct iter_qstate* iq, struct ub_packed_rrset_key* rrset) { - struct iter_prep_list* p = (struct iter_prep_list*)region_alloc( + struct iter_prep_list* p = (struct iter_prep_list*)regional_alloc( qstate->region, sizeof(struct iter_prep_list)); if(!p) return 0; @@ -306,7 +306,7 @@ static int iter_add_prepend_auth(struct module_qstate* qstate, struct iter_qstate* iq, struct ub_packed_rrset_key* rrset) { - struct iter_prep_list* p = (struct iter_prep_list*)region_alloc( + struct iter_prep_list* p = (struct iter_prep_list*)regional_alloc( qstate->region, sizeof(struct iter_prep_list)); if(!p) return 0; @@ -440,7 +440,7 @@ generate_sub_request(uint8_t* qname, size_t qnamelen, uint16_t qtype, /* initialise the new subquery */ subq->curmod = id; subq->ext_state[id] = module_state_initial; - subq->minfo[id] = region_alloc(subq->region, + subq->minfo[id] = regional_alloc(subq->region, sizeof(struct iter_qstate)); if(!subq->minfo[id]) { log_err("init subq: out of memory"); @@ -1641,7 +1641,7 @@ process_response(struct module_qstate* qstate, struct iter_qstate* iq, } /* parse message */ - prs = (struct msg_parse*)region_alloc(qstate->env->scratch, + prs = (struct msg_parse*)regional_alloc(qstate->env->scratch, sizeof(struct msg_parse)); if(!prs) { log_err("out of memory on incoming message"); diff --git a/services/cache/dns.c b/services/cache/dns.c index 5d0c8cf4b..a05665f88 100644 --- a/services/cache/dns.c +++ b/services/cache/dns.c @@ -47,7 +47,7 @@ #include "util/data/dname.h" #include "util/module.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" /** store rrsets in the rrset cache. * @param env: module environment with caches. @@ -103,10 +103,10 @@ dns_cache_store_msg(struct module_env* env, struct query_info* qinfo, /** allocate rrset in region - no more locks needed */ static struct ub_packed_rrset_key* -copy_rrset(struct ub_packed_rrset_key* key, struct region* region, +copy_rrset(struct ub_packed_rrset_key* key, struct regional* region, uint32_t now) { - struct ub_packed_rrset_key* ck = region_alloc(region, + struct ub_packed_rrset_key* ck = regional_alloc(region, sizeof(struct ub_packed_rrset_key)); struct packed_rrset_data* d; struct packed_rrset_data* data = (struct packed_rrset_data*) @@ -119,12 +119,12 @@ copy_rrset(struct ub_packed_rrset_key* key, struct region* region, ck->entry.hash = key->entry.hash; ck->entry.key = ck; ck->rk = key->rk; - ck->rk.dname = region_alloc_init(region, key->rk.dname, + ck->rk.dname = regional_alloc_init(region, key->rk.dname, key->rk.dname_len); if(!ck->rk.dname) return NULL; dsize = packed_rrset_sizeof(data); - d = (struct packed_rrset_data*)region_alloc_init(region, data, dsize); + d = (struct packed_rrset_data*)regional_alloc_init(region, data, dsize); if(!d) return NULL; ck->entry.data = d; @@ -167,7 +167,7 @@ find_closest_of_type(struct module_env* env, uint8_t* qname, size_t qnamelen, /** add addr to additional section */ static void -addr_to_additional(struct ub_packed_rrset_key* rrset, struct region* region, +addr_to_additional(struct ub_packed_rrset_key* rrset, struct regional* region, struct dns_msg* msg, uint32_t now) { if((msg->rep->rrsets[msg->rep->rrset_count] = @@ -179,8 +179,9 @@ addr_to_additional(struct ub_packed_rrset_key* rrset, struct region* region, /** find and add A and AAAA records for nameservers in delegpt */ static int -find_add_addrs(struct module_env* env, uint16_t qclass, struct region* region, - struct delegpt* dp, uint32_t now, struct dns_msg** msg) +find_add_addrs(struct module_env* env, uint16_t qclass, + struct regional* region, struct delegpt* dp, uint32_t now, + struct dns_msg** msg) { struct delegpt_ns* ns; struct ub_packed_rrset_key* akey; @@ -214,7 +215,7 @@ find_add_addrs(struct module_env* env, uint16_t qclass, struct region* region, /** find and add A and AAAA records for missing nameservers in delegpt */ int cache_fill_missing(struct module_env* env, uint16_t qclass, - struct region* region, struct delegpt* dp) + struct regional* region, struct delegpt* dp) { struct delegpt_ns* ns; struct ub_packed_rrset_key* akey; @@ -250,7 +251,7 @@ cache_fill_missing(struct module_env* env, uint16_t qclass, /** find and add DS or NSEC to delegation msg */ static void -find_add_ds(struct module_env* env, struct region* region, +find_add_ds(struct module_env* env, struct regional* region, struct dns_msg* msg, struct delegpt* dp, uint32_t now) { /* Lookup the DS or NSEC at the delegation point. */ @@ -281,21 +282,21 @@ find_add_ds(struct module_env* env, struct region* region, /** create referral message with NS and query */ static struct dns_msg* create_msg(uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, - struct region* region, struct ub_packed_rrset_key* nskey, + struct regional* region, struct ub_packed_rrset_key* nskey, struct packed_rrset_data* nsdata, uint32_t now) { - struct dns_msg* msg = (struct dns_msg*)region_alloc(region, + struct dns_msg* msg = (struct dns_msg*)regional_alloc(region, sizeof(struct dns_msg)); if(!msg) return NULL; - msg->qinfo.qname = region_alloc_init(region, qname, qnamelen); + msg->qinfo.qname = regional_alloc_init(region, qname, qnamelen); if(!msg->qinfo.qname) return NULL; msg->qinfo.qname_len = qnamelen; msg->qinfo.qtype = qtype; msg->qinfo.qclass = qclass; /* non-packed reply_info, because it needs to grow the array */ - msg->rep = (struct reply_info*)region_alloc(region, + msg->rep = (struct reply_info*)regional_alloc(region, sizeof(struct reply_info)-sizeof(struct rrset_ref)); if(!msg->rep) return NULL; @@ -308,7 +309,8 @@ create_msg(uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, * A rrset for every NS RR * AAAA rrset for every NS RR */ - msg->rep->rrsets = (struct ub_packed_rrset_key**)region_alloc(region, + msg->rep->rrsets = (struct ub_packed_rrset_key**) + regional_alloc(region, (2 + nsdata->count*2)*sizeof(struct ub_packed_rrset_key*)); if(!msg->rep->rrsets) return NULL; @@ -323,7 +325,7 @@ create_msg(uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, struct delegpt* dns_cache_find_delegation(struct module_env* env, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, - struct region* region, struct dns_msg** msg, uint32_t now) + struct regional* region, struct dns_msg** msg, uint32_t now) { /* try to find closest NS rrset */ struct ub_packed_rrset_key* nskey; @@ -366,22 +368,23 @@ dns_cache_find_delegation(struct module_env* env, uint8_t* qname, /** allocate dns_msg from query_info and reply_info */ static struct dns_msg* -gen_dns_msg(struct region* region, struct query_info* q, size_t num) +gen_dns_msg(struct regional* region, struct query_info* q, size_t num) { - struct dns_msg* msg = (struct dns_msg*)region_alloc(region, + struct dns_msg* msg = (struct dns_msg*)regional_alloc(region, sizeof(struct dns_msg)); if(!msg) return NULL; memcpy(&msg->qinfo, q, sizeof(struct query_info)); - msg->qinfo.qname = region_alloc_init(region, q->qname, q->qname_len); + msg->qinfo.qname = regional_alloc_init(region, q->qname, q->qname_len); if(!msg->qinfo.qname) return NULL; /* allocate replyinfo struct and rrset key array separately */ - msg->rep = (struct reply_info*)region_alloc(region, + msg->rep = (struct reply_info*)regional_alloc(region, sizeof(struct reply_info) - sizeof(struct rrset_ref)); if(!msg->rep) return NULL; - msg->rep->rrsets = (struct ub_packed_rrset_key**)region_alloc(region, + msg->rep->rrsets = (struct ub_packed_rrset_key**) + regional_alloc(region, num * sizeof(struct ub_packed_rrset_key*)); if(!msg->rep->rrsets) return NULL; @@ -391,7 +394,7 @@ gen_dns_msg(struct region* region, struct query_info* q, size_t num) /** generate dns_msg from cached message */ static struct dns_msg* tomsg(struct module_env* env, struct msgreply_entry* e, struct reply_info* r, - struct region* region, uint32_t now, struct region* scratch) + struct regional* region, uint32_t now, struct regional* scratch) { struct dns_msg* msg; size_t i; @@ -424,7 +427,7 @@ tomsg(struct module_env* env, struct msgreply_entry* e, struct reply_info* r, /** synthesize RRset-only response from cached RRset item */ static struct dns_msg* -rrset_msg(struct ub_packed_rrset_key* rrset, struct region* region, +rrset_msg(struct ub_packed_rrset_key* rrset, struct regional* region, uint32_t now, struct query_info* q) { struct dns_msg* msg; @@ -451,7 +454,7 @@ rrset_msg(struct ub_packed_rrset_key* rrset, struct region* region, /** synthesize DNAME+CNAME response from cached DNAME item */ static struct dns_msg* -synth_dname_msg(struct ub_packed_rrset_key* rrset, struct region* region, +synth_dname_msg(struct ub_packed_rrset_key* rrset, struct regional* region, uint32_t now, struct query_info* q) { struct dns_msg* msg; @@ -485,7 +488,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct region* region, msg->rep->flags |= LDNS_RCODE_YXDOMAIN; return msg; } - newname = (uint8_t*)region_alloc(region, newlen); + newname = (uint8_t*)regional_alloc(region, newlen); if(!newname) return NULL; /* new name is concatenation of qname front (without DNAME owner) @@ -493,7 +496,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct region* region, memcpy(newname, q->qname, q->qname_len-rrset->rk.dname_len); memmove(newname+(q->qname_len-rrset->rk.dname_len), dtarg, dtarglen); /* create rest of CNAME rrset */ - ck = (struct ub_packed_rrset_key*)region_alloc(region, + ck = (struct ub_packed_rrset_key*)regional_alloc(region, sizeof(struct ub_packed_rrset_key)); if(!ck) return NULL; @@ -503,12 +506,12 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct region* region, ck->rk.type = htons(LDNS_RR_TYPE_CNAME); ck->rk.rrset_class = rrset->rk.rrset_class; ck->rk.flags = 0; - ck->rk.dname = region_alloc_init(region, q->qname, q->qname_len); + ck->rk.dname = regional_alloc_init(region, q->qname, q->qname_len); if(!ck->rk.dname) return NULL; ck->rk.dname_len = q->qname_len; ck->entry.hash = rrset_key_hash(&ck->rk); - newd = (struct packed_rrset_data*)region_alloc(region, + newd = (struct packed_rrset_data*)regional_alloc(region, sizeof(struct packed_rrset_data) + sizeof(size_t) + sizeof(uint8_t*) + sizeof(uint32_t) + sizeof(uint16_t) + newlen); @@ -535,7 +538,7 @@ synth_dname_msg(struct ub_packed_rrset_key* rrset, struct region* region, struct dns_msg* dns_cache_lookup(struct module_env* env, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, - struct region* region, struct region* scratch) + struct regional* region, struct regional* scratch) { struct lruhash_entry* e; struct query_info k; diff --git a/services/cache/dns.h b/services/cache/dns.h index 33303883c..152c44ad2 100644 --- a/services/cache/dns.h +++ b/services/cache/dns.h @@ -46,7 +46,7 @@ struct module_env; struct query_info; struct reply_info; -struct region; +struct regional; struct delegpt; /** @@ -107,7 +107,7 @@ void dns_cache_store_msg(struct module_env* env, struct query_info* qinfo, */ struct delegpt* dns_cache_find_delegation(struct module_env* env, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, - struct region* region, struct dns_msg** msg, uint32_t timenow); + struct regional* region, struct dns_msg** msg, uint32_t timenow); /** * Find cached message @@ -124,7 +124,7 @@ struct delegpt* dns_cache_find_delegation(struct module_env* env, */ struct dns_msg* dns_cache_lookup(struct module_env* env, uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, - struct region* region, struct region* scratch); + struct regional* region, struct regional* scratch); /** * find and add A and AAAA records for missing nameservers in delegpt @@ -135,7 +135,7 @@ struct dns_msg* dns_cache_lookup(struct module_env* env, * @return false on alloc failure. */ int cache_fill_missing(struct module_env* env, uint16_t qclass, - struct region* region, struct delegpt* dp); + struct regional* region, struct delegpt* dp); /** Find covering DNAME */ diff --git a/services/cache/rrset.c b/services/cache/rrset.c index 431a660b9..523d12bc0 100644 --- a/services/cache/rrset.c +++ b/services/cache/rrset.c @@ -44,7 +44,7 @@ #include "util/config_file.h" #include "util/data/packed_rrset.h" #include "util/data/msgreply.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/alloc.h" struct rrset_cache* rrset_cache_create(struct config_file* cfg, @@ -287,12 +287,12 @@ rrset_array_unlock(struct rrset_ref* ref, size_t count) } void -rrset_array_unlock_touch(struct rrset_cache* r, struct region* scratch, +rrset_array_unlock_touch(struct rrset_cache* r, struct regional* scratch, struct rrset_ref* ref, size_t count) { hashvalue_t* h; size_t i; - if(!(h = (hashvalue_t*)region_alloc(scratch, + if(!(h = (hashvalue_t*)regional_alloc(scratch, sizeof(hashvalue_t)*count))) log_warn("rrset LRU: memory allocation failed"); else /* store hash values */ diff --git a/services/cache/rrset.h b/services/cache/rrset.h index 3fcee79eb..46239e065 100644 --- a/services/cache/rrset.h +++ b/services/cache/rrset.h @@ -47,7 +47,7 @@ struct config_file; struct alloc_cache; struct rrset_ref; -struct region; +struct regional; /** * The rrset cache @@ -181,7 +181,7 @@ void rrset_array_unlock(struct rrset_ref* ref, size_t count); * duplicate references are allowed and handled. * @param count: size of array. */ -void rrset_array_unlock_touch(struct rrset_cache* r, struct region* scratch, +void rrset_array_unlock_touch(struct rrset_cache* r, struct regional* scratch, struct rrset_ref* ref, size_t count); /** diff --git a/services/mesh.c b/services/mesh.c index 35dcb9306..1ec5ca8c4 100644 --- a/services/mesh.c +++ b/services/mesh.c @@ -49,7 +49,7 @@ #include "util/log.h" #include "util/net_help.h" #include "util/module.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/data/msgencode.h" #include "util/timehist.h" #include "util/fptr_wlist.h" @@ -195,15 +195,15 @@ struct mesh_state* mesh_state_create(struct module_env* env, struct query_info* qinfo, uint16_t qflags, int prime) { - region_type* region = region_create(malloc, free); + struct regional* region = regional_create(); struct mesh_state* mstate; int i; if(!region) return NULL; - mstate = (struct mesh_state*)region_alloc(region, + mstate = (struct mesh_state*)regional_alloc(region, sizeof(struct mesh_state)); if(!mstate) { - region_destroy(region); + regional_destroy(region); return NULL; } memset(mstate, 0, sizeof(*mstate)); @@ -219,10 +219,10 @@ mesh_state_create(struct module_env* env, struct query_info* qinfo, mstate->s.qinfo.qtype = qinfo->qtype; mstate->s.qinfo.qclass = qinfo->qclass; mstate->s.qinfo.qname_len = qinfo->qname_len; - mstate->s.qinfo.qname = region_alloc_init(region, qinfo->qname, + mstate->s.qinfo.qname = regional_alloc_init(region, qinfo->qname, qinfo->qname_len); if(!mstate->s.qinfo.qname) { - region_destroy(region); + regional_destroy(region); return NULL; } /* remove all weird bits from qflags */ @@ -258,7 +258,7 @@ mesh_state_cleanup(struct mesh_state* mstate) mstate->s.minfo[i] = NULL; mstate->s.ext_state[i] = module_finished; } - region_destroy(mstate->s.region); + regional_destroy(mstate->s.region); } void @@ -349,9 +349,9 @@ int mesh_state_attachment(struct mesh_state* super, struct mesh_state* sub) struct rbnode_t* n; struct mesh_state_ref* subref; /* points to sub, inserted in super */ struct mesh_state_ref* superref; /* points to super, inserted in sub */ - if( !(subref = region_alloc(super->s.region, + if( !(subref = regional_alloc(super->s.region, sizeof(struct mesh_state_ref))) || - !(superref = region_alloc(sub->s.region, + !(superref = regional_alloc(sub->s.region, sizeof(struct mesh_state_ref))) ) { log_err("mesh_state_attachment: out of memory"); return 0; @@ -516,7 +516,7 @@ struct mesh_state* mesh_area_find(struct mesh_area* mesh, int mesh_state_add_reply(struct mesh_state* s, struct edns_data* edns, struct comm_reply* rep, uint16_t qid, uint16_t qflags) { - struct mesh_reply* r = region_alloc(s->s.region, + struct mesh_reply* r = regional_alloc(s->s.region, sizeof(struct mesh_reply)); if(!r) return 0; @@ -607,7 +607,7 @@ void mesh_run(struct mesh_area* mesh, struct mesh_state* mstate, /* examine results */ mstate->s.reply = NULL; - region_free_all(mstate->s.env->scratch); + regional_free_all(mstate->s.env->scratch); s = mstate->s.ext_state[mstate->s.curmod]; verbose(VERB_ALGO, "mesh_run: %s module exit state is %s", mesh->modfunc[mstate->s.curmod]->name, strextstate(s)); @@ -675,7 +675,7 @@ mesh_get_mem(struct mesh_area* mesh) sizeof(struct th_buck)*mesh->histogram->num; RBTREE_FOR(m, struct mesh_state*, &mesh->all) { /* all, including m itself allocated in qstate region */ - s += region_get_mem(m->s.region); + s += regional_get_mem(m->s.region); } return s; } diff --git a/testcode/unitmsgparse.c b/testcode/unitmsgparse.c index 43e5c3723..8ec4da8a8 100644 --- a/testcode/unitmsgparse.c +++ b/testcode/unitmsgparse.c @@ -45,7 +45,7 @@ #include "util/data/msgreply.h" #include "util/data/msgencode.h" #include "util/alloc.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/net_help.h" #include "testcode/readhex.h" @@ -258,7 +258,7 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, uint16_t id; uint16_t flags; uint32_t timenow = 0; - region_type *region = region_create(malloc, free); + struct regional* region = regional_create(); struct edns_data edns; hex_to_buf(pkt, hex); @@ -307,7 +307,7 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out, query_info_clear(&qi); reply_info_parsedelete(rep, alloc); - region_destroy(region); + regional_destroy(region); } /** simple test of parsing */ diff --git a/testcode/unitverify.c b/testcode/unitverify.c index 2936309fe..66462c774 100644 --- a/testcode/unitverify.c +++ b/testcode/unitverify.c @@ -49,7 +49,7 @@ #include "util/data/msgreply.h" #include "util/data/msgparse.h" #include "util/data/dname.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/alloc.h" #include "util/rbtree.h" #include "util/net_help.h" @@ -86,8 +86,8 @@ entry_to_buf(struct entry* e, ldns_buffer* pkt) /** entry to reply info conversion */ static void -entry_to_repinfo(struct entry* e, struct alloc_cache* alloc, struct region* - region, ldns_buffer* pkt, struct query_info* qi, +entry_to_repinfo(struct entry* e, struct alloc_cache* alloc, + struct regional* region, ldns_buffer* pkt, struct query_info* qi, struct reply_info** rep) { int ret; @@ -109,8 +109,8 @@ entry_to_repinfo(struct entry* e, struct alloc_cache* alloc, struct region* /** extract DNSKEY rrset from answer and convert it */ static struct ub_packed_rrset_key* -extract_keys(struct entry* e, struct alloc_cache* alloc, struct region* - region, ldns_buffer* pkt) +extract_keys(struct entry* e, struct alloc_cache* alloc, + struct regional* region, ldns_buffer* pkt) { struct ub_packed_rrset_key* dnskey = NULL; struct query_info qinfo; @@ -167,15 +167,16 @@ verifytest_rrset(struct module_env* env, struct val_env* ve, /** verify and test an entry - every rr in the message */ static void -verifytest_entry(struct entry* e, struct alloc_cache* alloc, struct region* - region, ldns_buffer* pkt, struct ub_packed_rrset_key* dnskey, - struct module_env* env, struct val_env* ve) +verifytest_entry(struct entry* e, struct alloc_cache* alloc, + struct regional* region, ldns_buffer* pkt, + struct ub_packed_rrset_key* dnskey, struct module_env* env, + struct val_env* ve) { struct query_info qinfo; struct reply_info* rep = NULL; size_t i; - region_free_all(region); + regional_free_all(region); if(vsig) { printf("verifying pkt:\n"); ldns_pkt_print(stdout, e->reply_list->reply); @@ -205,15 +206,15 @@ find_rrset_type(struct reply_info* rep, uint16_t type) /** DS sig test an entry - get DNSKEY and DS in entry and verify */ static void -dstest_entry(struct entry* e, struct alloc_cache* alloc, struct region* - region, ldns_buffer* pkt, struct module_env* env) +dstest_entry(struct entry* e, struct alloc_cache* alloc, + struct regional* region, ldns_buffer* pkt, struct module_env* env) { struct query_info qinfo; struct reply_info* rep = NULL; struct ub_packed_rrset_key* ds, *dnskey; int ret; - region_free_all(region); + regional_free_all(region); if(vsig) { printf("verifying DS-DNSKEY match:\n"); ldns_pkt_print(stdout, e->reply_list->reply); @@ -255,7 +256,7 @@ verifytest_file(const char* fname, const char* at_date) * The answer rrset is the keyset that will be used for verification */ struct ub_packed_rrset_key* dnskey; - struct region* region = region_create(malloc, free); + struct regional* region = regional_create(); struct alloc_cache alloc; ldns_buffer* buf = ldns_buffer_new(65535); struct entry* e; @@ -282,7 +283,7 @@ verifytest_file(const char* fname, const char* at_date) } delete_entry(list); - region_destroy(region); + regional_destroy(region); alloc_clear(&alloc); ldns_buffer_free(buf); } @@ -296,7 +297,7 @@ dstest_file(const char* fname) * The first entry must be a query for DNSKEY. * The answer rrset is the keyset that will be used for verification */ - struct region* region = region_create(malloc, free); + struct regional* region = regional_create(); struct alloc_cache alloc; ldns_buffer* buf = ldns_buffer_new(65535); struct entry* e; @@ -317,7 +318,7 @@ dstest_file(const char* fname) } delete_entry(list); - region_destroy(region); + regional_destroy(region); alloc_clear(&alloc); ldns_buffer_free(buf); } @@ -374,7 +375,7 @@ nsectest() /** Test hash algo - NSEC3 hash it and compare result */ static void nsec3_hash_test_entry(struct entry* e, rbtree_t* ct, - struct alloc_cache* alloc, struct region* region, + struct alloc_cache* alloc, struct regional* region, ldns_buffer* buf) { struct query_info qinfo; @@ -392,7 +393,7 @@ nsec3_hash_test_entry(struct entry* e, rbtree_t* ct, entry_to_repinfo(e, alloc, region, buf, &qinfo, &rep); nsec3 = find_rrset_type(rep, LDNS_RR_TYPE_NSEC3); answer = find_rrset_type(rep, LDNS_RR_TYPE_AAAA); - qname = region_alloc_init(region, qinfo.qname, qinfo.qname_len); + qname = regional_alloc_init(region, qinfo.qname, qinfo.qname_len); /* check test is OK */ unit_assert(nsec3 && answer && qname); @@ -429,7 +430,7 @@ nsec3_hash_test(const char* fname) * The test does not perform canonicalization during the compare. */ rbtree_t ct; - struct region* region = region_create(malloc, free); + struct regional* region = regional_create(); struct alloc_cache alloc; ldns_buffer* buf = ldns_buffer_new(65535); struct entry* e; @@ -447,7 +448,7 @@ nsec3_hash_test(const char* fname) } delete_entry(list); - region_destroy(region); + regional_destroy(region); alloc_clear(&alloc); ldns_buffer_free(buf); } diff --git a/util/alloc.c b/util/alloc.c index 2583d2e43..a6ac2caee 100644 --- a/util/alloc.c +++ b/util/alloc.c @@ -393,23 +393,4 @@ void *unbound_stat_realloc_log(void *ptr, size_t size, const char* file, return unbound_stat_realloc(ptr, size); } -/** special routine for region-allocator, print to log */ -void *unbound_stat_malloc_region(size_t size) -{ - log_info("region malloc(%u)", (unsigned)size); - return unbound_stat_malloc(size); -} - -/** special routine for region-allocator, print to log */ -void unbound_stat_free_region(void *ptr) -{ - if(ptr && memcmp(ptr-8, &mem_special, sizeof(mem_special)) == 0) { - size_t s; - memcpy(&s, ptr-16, sizeof(s)); - log_info("region free(%p) size %u", ptr, (unsigned)s); - } else - log_info("region unmatched free(%p)", ptr); - unbound_stat_free(ptr); -} - #endif /* UNBOUND_ALLOC_STATS */ diff --git a/util/data/msgencode.c b/util/data/msgencode.c index fdba17304..e387ecc27 100644 --- a/util/data/msgencode.c +++ b/util/data/msgencode.c @@ -45,7 +45,7 @@ #include "util/data/msgparse.h" #include "util/data/dname.h" #include "util/log.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/net_help.h" /** return code that means the function ran out of memory. negative so it does @@ -162,12 +162,12 @@ compress_tree_lookup(struct compress_tree_node* tree, uint8_t* dname, */ static struct compress_tree_node* compress_tree_insert(struct compress_tree_node** tree, uint8_t* dname, - int labs, size_t offset, region_type* region) + int labs, size_t offset, struct regional* region) { int c, m; struct compress_tree_node* p, **prev; struct compress_tree_node* n = (struct compress_tree_node*) - region_alloc(region, sizeof(struct compress_tree_node)); + regional_alloc(region, sizeof(struct compress_tree_node)); if(!n) return 0; n->left = 0; n->right = 0; @@ -209,7 +209,7 @@ compress_tree_insert(struct compress_tree_node** tree, uint8_t* dname, */ static int compress_tree_store(struct compress_tree_node** tree, uint8_t* dname, - int labs, size_t offset, region_type* region, + int labs, size_t offset, struct regional* region, struct compress_tree_node* closest) { uint8_t lablen; @@ -284,7 +284,7 @@ write_compressed_dname(ldns_buffer* pkt, uint8_t* dname, int labs, /** compress owner name of RR, return RETVAL_OUTMEM RETVAL_TRUNC */ static int compress_owner(struct ub_packed_rrset_key* key, ldns_buffer* pkt, - region_type* region, struct compress_tree_node** tree, + struct regional* region, struct compress_tree_node** tree, size_t owner_pos, uint16_t* owner_ptr, int owner_labs) { struct compress_tree_node* p; @@ -332,7 +332,7 @@ compress_owner(struct ub_packed_rrset_key* key, ldns_buffer* pkt, /** compress any domain name to the packet, return RETVAL_* */ static int compress_any_dname(uint8_t* dname, ldns_buffer* pkt, int labs, - region_type* region, struct compress_tree_node** tree) + struct regional* region, struct compress_tree_node** tree) { struct compress_tree_node* p; size_t pos = ldns_buffer_position(pkt); @@ -362,7 +362,7 @@ type_rdata_compressable(struct ub_packed_rrset_key* key) /** compress domain names in rdata, return RETVAL_* */ static int compress_rdata(ldns_buffer* pkt, uint8_t* rdata, size_t todolen, - region_type* region, struct compress_tree_node** tree, + struct regional* region, struct compress_tree_node** tree, const ldns_rr_descriptor* desc) { int labs, r, rdf = 0; @@ -444,7 +444,7 @@ rrset_belongs_in_reply(ldns_pkt_section s, uint16_t rrtype, uint16_t qtype, /** store rrset in buffer in wireformat, return RETVAL_* */ static int packed_rrset_encode(struct ub_packed_rrset_key* key, ldns_buffer* pkt, - uint16_t* num_rrs, uint32_t timenow, region_type* region, + uint16_t* num_rrs, uint32_t timenow, struct regional* region, int do_data, int do_sig, struct compress_tree_node** tree, ldns_pkt_section s, uint16_t qtype, int dnssec) { @@ -524,7 +524,7 @@ packed_rrset_encode(struct ub_packed_rrset_key* key, ldns_buffer* pkt, static int insert_section(struct reply_info* rep, size_t num_rrsets, uint16_t* num_rrs, ldns_buffer* pkt, size_t rrsets_before, uint32_t timenow, - region_type* region, struct compress_tree_node** tree, + struct regional* region, struct compress_tree_node** tree, ldns_pkt_section s, uint16_t qtype, int dnssec) { int r; @@ -574,7 +574,7 @@ insert_section(struct reply_info* rep, size_t num_rrsets, uint16_t* num_rrs, /** store query section in wireformat buffer, return RETVAL */ static int insert_query(struct query_info* qinfo, struct compress_tree_node** tree, - ldns_buffer* buffer, struct region* region) + ldns_buffer* buffer, struct regional* region) { if(ldns_buffer_remaining(buffer) < qinfo->qname_len+sizeof(uint16_t)*2) @@ -592,7 +592,7 @@ insert_query(struct query_info* qinfo, struct compress_tree_node** tree, int reply_info_encode(struct query_info* qinfo, struct reply_info* rep, uint16_t id, uint16_t flags, ldns_buffer* buffer, uint32_t timenow, - region_type* region, uint16_t udpsize, int dnssec) + struct regional* region, uint16_t udpsize, int dnssec) { uint16_t ancount=0, nscount=0, arcount=0; struct compress_tree_node* tree = 0; @@ -708,7 +708,7 @@ attach_edns_record(ldns_buffer* pkt, struct edns_data* edns) int reply_info_answer_encode(struct query_info* qinf, struct reply_info* rep, uint16_t id, uint16_t qflags, ldns_buffer* pkt, uint32_t timenow, - int cached, struct region* region, uint16_t udpsize, + int cached, struct regional* region, uint16_t udpsize, struct edns_data* edns, int dnssec, int secure) { uint16_t flags; diff --git a/util/data/msgencode.h b/util/data/msgencode.h index 3040c235c..74d6c1fb2 100644 --- a/util/data/msgencode.h +++ b/util/data/msgencode.h @@ -44,7 +44,7 @@ #define UTIL_DATA_MSGENCODE_H struct query_info; struct reply_info; -struct region; +struct regional; struct edns_data; /** @@ -67,7 +67,7 @@ struct edns_data; */ int reply_info_answer_encode(struct query_info* qinf, struct reply_info* rep, uint16_t id, uint16_t qflags, ldns_buffer* dest, uint32_t timenow, - int cached, struct region* region, uint16_t udpsize, + int cached, struct regional* region, uint16_t udpsize, struct edns_data* edns, int dnssec, int secure); /** @@ -89,7 +89,7 @@ int reply_info_answer_encode(struct query_info* qinf, struct reply_info* rep, */ int reply_info_encode(struct query_info* qinfo, struct reply_info* rep, uint16_t id, uint16_t flags, ldns_buffer* buffer, uint32_t timenow, - struct region* region, uint16_t udpsize, int dnssec); + struct regional* region, uint16_t udpsize, int dnssec); /** * Encode query packet. Assumes the buffer is large enough. diff --git a/util/data/msgparse.c b/util/data/msgparse.c index f13c9c6d0..cd3323166 100644 --- a/util/data/msgparse.c +++ b/util/data/msgparse.c @@ -42,7 +42,7 @@ #include "util/data/dname.h" #include "util/data/packed_rrset.h" #include "util/storage/lookup3.h" -#include "util/region-allocator.h" +#include "util/regional.h" /** smart comparison of (compressed, valid) dnames from packet */ static int @@ -68,9 +68,10 @@ smart_compare(ldns_buffer* pkt, uint8_t* dnow, static struct rrset_parse* new_rrset(struct msg_parse* msg, uint8_t* dname, size_t dnamelen, uint16_t type, uint16_t dclass, hashvalue_t hash, - uint32_t rrset_flags, ldns_pkt_section section, region_type* region) + uint32_t rrset_flags, ldns_pkt_section section, + struct regional* region) { - struct rrset_parse* p = region_alloc(region, sizeof(*p)); + struct rrset_parse* p = regional_alloc(region, sizeof(*p)); if(!p) return NULL; p->rrset_bucket_next = msg->hashtable[hash & (PARSE_TABLE_SIZE-1)]; msg->hashtable[hash & (PARSE_TABLE_SIZE-1)] = p; @@ -301,7 +302,7 @@ rrset_has_sigover(ldns_buffer* pkt, struct rrset_parse* rrset, uint16_t type, /** move rrsigs from sigset to dataset */ static int -moveover_rrsigs(ldns_buffer* pkt, region_type* region, +moveover_rrsigs(ldns_buffer* pkt, struct regional* region, struct rrset_parse* sigset, struct rrset_parse* dataset, int duplicate) { struct rr_parse* sig = sigset->rr_first; @@ -312,8 +313,8 @@ moveover_rrsigs(ldns_buffer* pkt, region_type* region, dataset->type)) { if(duplicate) { /* new */ - insert = (struct rr_parse*)region_alloc(region, - sizeof(struct rr_parse)); + insert = (struct rr_parse*)regional_alloc( + region, sizeof(struct rr_parse)); insert->outside_packet = 0; insert->ttl_data = sig->ttl_data; insert->size = sig->size; @@ -346,7 +347,7 @@ moveover_rrsigs(ldns_buffer* pkt, region_type* region, static struct rrset_parse* change_rrsig_rrset(struct rrset_parse* sigset, struct msg_parse* msg, ldns_buffer* pkt, uint16_t datatype, uint32_t rrset_flags, - int hasother, ldns_pkt_section section, region_type* region) + int hasother, ldns_pkt_section section, struct regional* region) { struct rrset_parse* dataset = sigset; hashvalue_t hash = pkt_hash_rrset(pkt, sigset->dname, datatype, @@ -420,7 +421,7 @@ find_rrset(struct msg_parse* msg, ldns_buffer* pkt, uint8_t* dname, uint8_t** prev_dname_first, uint8_t** prev_dname_last, size_t* prev_dnamelen, uint16_t* prev_type, uint16_t* prev_dclass, struct rrset_parse** rrset_prev, - ldns_pkt_section section, region_type* region) + ldns_pkt_section section, struct regional* region) { uint16_t covtype; if(rrset_prev) { @@ -686,7 +687,7 @@ sig_is_double(ldns_buffer* pkt, struct rrset_parse* rrset, uint8_t* ttldata) /** Add rr (from packet here) to rrset, skips rr */ static int add_rr_to_rrset(struct rrset_parse* rrset, ldns_buffer* pkt, - struct msg_parse* msg, region_type* region, + struct msg_parse* msg, struct regional* region, ldns_pkt_section section, uint16_t type) { struct rr_parse* rr; @@ -718,7 +719,7 @@ add_rr_to_rrset(struct rrset_parse* rrset, ldns_buffer* pkt, } /* create rr */ - if(!(rr = (struct rr_parse*)region_alloc(region, sizeof(*rr)))) + if(!(rr = (struct rr_parse*)regional_alloc(region, sizeof(*rr)))) return LDNS_RCODE_SERVFAIL; rr->outside_packet = 0; rr->ttl_data = ldns_buffer_current(pkt); @@ -757,8 +758,9 @@ add_rr_to_rrset(struct rrset_parse* rrset, ldns_buffer* pkt, * @return: 0 if OK, or rcode on error. */ static int -parse_section(ldns_buffer* pkt, struct msg_parse* msg, region_type* region, - ldns_pkt_section section, uint16_t num_rrs, size_t* num_rrsets) +parse_section(ldns_buffer* pkt, struct msg_parse* msg, + struct regional* region, ldns_pkt_section section, + uint16_t num_rrs, size_t* num_rrsets) { uint16_t i; uint8_t* dname, *prev_dname_f = NULL, *prev_dname_l = NULL; @@ -829,7 +831,7 @@ parse_section(ldns_buffer* pkt, struct msg_parse* msg, region_type* region, } int -parse_packet(ldns_buffer* pkt, struct msg_parse* msg, region_type* region) +parse_packet(ldns_buffer* pkt, struct msg_parse* msg, struct regional* region) { int ret; if(ldns_buffer_remaining(pkt) < LDNS_HEADER_SIZE) diff --git a/util/data/msgparse.h b/util/data/msgparse.h index 7e9af9fc9..438687c06 100644 --- a/util/data/msgparse.h +++ b/util/data/msgparse.h @@ -65,7 +65,7 @@ #include "util/storage/lruhash.h" struct rrset_parse; struct rr_parse; -struct region; +struct regional; /** number of buckets in parse rrset hash table. Must be power of 2. */ #define PARSE_TABLE_SIZE 1024 @@ -227,7 +227,7 @@ size_t get_rdf_size(ldns_rdf_type rdf); * @return: 0 if OK, or rcode on error. */ int parse_packet(ldns_buffer* pkt, struct msg_parse* msg, - struct region* region); + struct regional* region); /** * After parsing the packet, extract EDNS data from packet. diff --git a/util/data/msgreply.c b/util/data/msgreply.c index 77dae9346..64bb12a77 100644 --- a/util/data/msgreply.c +++ b/util/data/msgreply.c @@ -47,18 +47,18 @@ #include "util/netevent.h" #include "util/net_help.h" #include "util/data/dname.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/data/msgparse.h" #include "util/data/msgencode.h" /** allocate qinfo, return 0 on error */ static int parse_create_qinfo(ldns_buffer* pkt, struct msg_parse* msg, - struct query_info* qinf, struct region* region) + struct query_info* qinf, struct regional* region) { if(msg->qname) { if(region) - qinf->qname = (uint8_t*)region_alloc(region, + qinf->qname = (uint8_t*)regional_alloc(region, msg->qname_len); else qinf->qname = (uint8_t*)malloc(msg->qname_len); if(!qinf->qname) return 0; @@ -72,7 +72,7 @@ parse_create_qinfo(ldns_buffer* pkt, struct msg_parse* msg, /** constructor for replyinfo */ static struct reply_info* -construct_reply_info_base(struct region* region, uint16_t flags, size_t qd, +construct_reply_info_base(struct regional* region, uint16_t flags, size_t qd, uint32_t ttl, size_t an, size_t ns, size_t ar, size_t total, enum sec_status sec) { @@ -81,7 +81,7 @@ construct_reply_info_base(struct region* region, uint16_t flags, size_t qd, size_t s = sizeof(struct reply_info) - sizeof(struct rrset_ref) + sizeof(struct ub_packed_rrset_key*) * total; if(region) - rep = (struct reply_info*)region_alloc(region, s); + rep = (struct reply_info*)regional_alloc(region, s); else rep = (struct reply_info*)malloc(s + sizeof(struct rrset_ref) * (total)); if(!rep) @@ -108,7 +108,7 @@ construct_reply_info_base(struct region* region, uint16_t flags, size_t qd, /** allocate replyinfo, return 0 on error */ static int parse_create_repinfo(struct msg_parse* msg, struct reply_info** rep, - struct region* region) + struct regional* region) { *rep = construct_reply_info_base(region, msg->flags, msg->qdcount, 0, msg->an_rrsets, msg->ns_rrsets, msg->ar_rrsets, @@ -121,13 +121,13 @@ parse_create_repinfo(struct msg_parse* msg, struct reply_info** rep, /** allocate (special) rrset keys, return 0 on error */ static int repinfo_alloc_rrset_keys(struct reply_info* rep, struct alloc_cache* alloc, - struct region* region) + struct regional* region) { size_t i; for(i=0; irrset_count; i++) { if(region) { rep->rrsets[i] = (struct ub_packed_rrset_key*) - region_alloc(region, + regional_alloc(region, sizeof(struct ub_packed_rrset_key)); if(rep->rrsets[i]) { memset(rep->rrsets[i], 0, @@ -264,7 +264,7 @@ parse_rr_copy(ldns_buffer* pkt, struct rrset_parse* pset, /** create rrset return 0 on failure */ static int parse_create_rrset(ldns_buffer* pkt, struct rrset_parse* pset, - struct packed_rrset_data** data, struct region* region) + struct packed_rrset_data** data, struct regional* region) { /* allocate */ size_t s = sizeof(struct packed_rrset_data) + @@ -272,7 +272,7 @@ parse_create_rrset(ldns_buffer* pkt, struct rrset_parse* pset, (sizeof(size_t)+sizeof(uint8_t*)+sizeof(uint32_t)) + pset->size; if(region) - *data = region_alloc(region, s); + *data = regional_alloc(region, s); else *data = malloc(s); if(!*data) return 0; @@ -303,14 +303,14 @@ get_rrset_trust(struct msg_parse* msg, struct rrset_parse* rrset) int parse_copy_decompress_rrset(ldns_buffer* pkt, struct msg_parse* msg, - struct rrset_parse *pset, struct region* region, + struct rrset_parse *pset, struct regional* region, struct ub_packed_rrset_key* pk) { struct packed_rrset_data* data; pk->rk.flags = pset->flags; pk->rk.dname_len = pset->dname_len; if(region) - pk->rk.dname = (uint8_t*)region_alloc( + pk->rk.dname = (uint8_t*)regional_alloc( region, pset->dname_len); else pk->rk.dname = (uint8_t*)malloc(pset->dname_len); @@ -341,7 +341,7 @@ parse_copy_decompress_rrset(ldns_buffer* pkt, struct msg_parse* msg, */ static int parse_copy_decompress(ldns_buffer* pkt, struct msg_parse* msg, - struct reply_info* rep, struct region* region) + struct reply_info* rep, struct regional* region) { size_t i; struct rrset_parse *pset = msg->rrset_first; @@ -368,7 +368,7 @@ parse_copy_decompress(ldns_buffer* pkt, struct msg_parse* msg, int parse_create_msg(ldns_buffer* pkt, struct msg_parse* msg, struct alloc_cache* alloc, struct query_info* qinf, - struct reply_info** rep, struct region* region) + struct reply_info** rep, struct regional* region) { log_assert(pkt && msg); if(!parse_create_qinfo(pkt, msg, qinf, region)) @@ -383,8 +383,8 @@ parse_create_msg(ldns_buffer* pkt, struct msg_parse* msg, } int reply_info_parse(ldns_buffer* pkt, struct alloc_cache* alloc, - struct query_info* qinf, struct reply_info** rep, struct region* region, - struct edns_data* edns) + struct query_info* qinf, struct reply_info** rep, + struct regional* region, struct edns_data* edns) { /* use scratch pad region-allocator during parsing. */ struct msg_parse* msg; @@ -392,7 +392,7 @@ int reply_info_parse(ldns_buffer* pkt, struct alloc_cache* alloc, qinf->qname = NULL; *rep = NULL; - if(!(msg = region_alloc(region, sizeof(*msg)))) { + if(!(msg = regional_alloc(region, sizeof(*msg)))) { return LDNS_RCODE_SERVFAIL; } memset(msg, 0, sizeof(*msg)); @@ -588,7 +588,7 @@ query_info_entrysetup(struct query_info* q, struct reply_info* r, /** copy rrsets from replyinfo to dest replyinfo */ static int repinfo_copy_rrsets(struct reply_info* dest, struct reply_info* from, - struct region* region) + struct regional* region) { size_t i, s; struct packed_rrset_data* fd, *dd; @@ -601,7 +601,7 @@ repinfo_copy_rrsets(struct reply_info* dest, struct reply_info* from, dk->rk = fk->rk; if(region) { dk->id = fk->id; - dk->rk.dname = (uint8_t*)region_alloc_init(region, + dk->rk.dname = (uint8_t*)regional_alloc_init(region, fk->rk.dname, fk->rk.dname_len); } else dk->rk.dname = (uint8_t*)memdup(fk->rk.dname, @@ -610,7 +610,7 @@ repinfo_copy_rrsets(struct reply_info* dest, struct reply_info* from, return 0; s = packed_rrset_sizeof(fd); if(region) - dd = (struct packed_rrset_data*)region_alloc_init( + dd = (struct packed_rrset_data*)regional_alloc_init( region, fd, s); else dd = (struct packed_rrset_data*)memdup(fd, s); if(!dd) @@ -623,7 +623,7 @@ repinfo_copy_rrsets(struct reply_info* dest, struct reply_info* from, struct reply_info* reply_info_copy(struct reply_info* rep, struct alloc_cache* alloc, - struct region* region) + struct regional* region) { struct reply_info* cp; cp = construct_reply_info_base(region, rep->flags, rep->qdcount, @@ -708,7 +708,7 @@ log_dns_msg(const char* str, struct query_info* qinfo, struct reply_info* rep) { /* not particularly fast but flexible, make wireformat and print */ ldns_buffer* buf = ldns_buffer_new(65535); - struct region* region = region_create(malloc, free); + struct regional* region = regional_create(); if(!reply_info_encode(qinfo, rep, 0, rep->flags, buf, 0, region, 65535, 1)) { log_info("%s: log_dns_msg: out of memory", str); @@ -733,7 +733,7 @@ log_dns_msg(const char* str, struct query_info* qinfo, struct reply_info* rep) ldns_pkt_free(pkt); } ldns_buffer_free(buf); - region_destroy(region); + regional_destroy(region); } void diff --git a/util/data/msgreply.h b/util/data/msgreply.h index b4e12591b..bf0ce473e 100644 --- a/util/data/msgreply.h +++ b/util/data/msgreply.h @@ -46,7 +46,7 @@ struct comm_reply; struct alloc_cache; struct iovec; -struct region; +struct regional; struct edns_data; struct msg_parse; struct rrset_parse; @@ -202,7 +202,7 @@ int query_info_parse(struct query_info* m, ldns_buffer* query); */ int reply_info_parse(ldns_buffer* pkt, struct alloc_cache* alloc, struct query_info* qinf, struct reply_info** rep, - struct region* region, struct edns_data* edns); + struct regional* region, struct edns_data* edns); /** * Allocate and decompress parsed message and rrsets. @@ -221,7 +221,7 @@ int reply_info_parse(ldns_buffer* pkt, struct alloc_cache* alloc, */ int parse_create_msg(ldns_buffer* pkt, struct msg_parse* msg, struct alloc_cache* alloc, struct query_info* qinf, - struct reply_info** rep, struct region* region); + struct reply_info** rep, struct regional* region); /** * Sorts the ref array. @@ -298,7 +298,7 @@ struct msgreply_entry* query_info_entrysetup(struct query_info* q, * @return new reply info or NULL on memory error. */ struct reply_info* reply_info_copy(struct reply_info* rep, - struct alloc_cache* alloc, struct region* region); + struct alloc_cache* alloc, struct regional* region); /** * Copy a parsed rrset into given key, decompressing and allocating rdata. @@ -312,7 +312,7 @@ struct reply_info* reply_info_copy(struct reply_info* rep, * @return false on alloc failure. */ int parse_copy_decompress_rrset(ldns_buffer* pkt, struct msg_parse* msg, - struct rrset_parse *pset, struct region* region, + struct rrset_parse *pset, struct regional* region, struct ub_packed_rrset_key* pk); /** diff --git a/util/fptr_wlist.c b/util/fptr_wlist.c index b71dd8d3f..d90be69df 100644 --- a/util/fptr_wlist.c +++ b/util/fptr_wlist.c @@ -125,23 +125,6 @@ fptr_whitelist_serviced_query(comm_point_callback_t *fptr) return 0; } -int -fptr_whitelist_region_allocator(void *(*fptr)(size_t)) -{ - /* TODO: remove callbacks from new region type */ - return 1; /* DEBUG for different mem allocs */ - if(fptr == &malloc) return 1; - return 0; -} - -int -fptr_whitelist_region_deallocator(void (*fptr)(void*)) -{ - return 1; /* DEBUG for different mem allocs */ - if(fptr == &free) return 1; - return 0; -} - int fptr_whitelist_rbtree_cmp(int (*fptr) (const void *, const void *)) { diff --git a/util/fptr_wlist.h b/util/fptr_wlist.h index 615db4884..89e3672b0 100644 --- a/util/fptr_wlist.h +++ b/util/fptr_wlist.h @@ -115,22 +115,6 @@ int fptr_whitelist_pending_tcp(comm_point_callback_t *fptr); */ int fptr_whitelist_serviced_query(comm_point_callback_t *fptr); -/** - * Check function pointer whitelist for region allocator callback values. - * - * @param fptr: function pointer to check. - * @return false if not in whitelist. - */ -int fptr_whitelist_region_allocator(void *(*fptr)(size_t)); - -/** - * Check function pointer whitelist for region deallocator callback values. - * - * @param fptr: function pointer to check. - * @return false if not in whitelist. - */ -int fptr_whitelist_region_deallocator(void (*fptr)(void*)); - /** * Check function pointer whitelist for rbtree cmp callback values. * diff --git a/util/module.h b/util/module.h index 83b1431bf..47b8ec10c 100644 --- a/util/module.h +++ b/util/module.h @@ -50,7 +50,7 @@ struct config_file; struct slabhash; struct query_info; struct edns_data; -struct region; +struct regional; struct worker; struct module_qstate; struct ub_randstate; @@ -180,7 +180,7 @@ struct module_env { struct query_info* qinfo, uint16_t flags, int prime); /** region for temporary usage. May be cleared after operate() call. */ - struct region* scratch; + struct regional* scratch; /** buffer for temporary usage. May be cleared after operate() call. */ ldns_buffer* scratch_buffer; /** internal data for daemon - worker thread. */ @@ -254,7 +254,7 @@ struct module_qstate { /** the rcode, in case of error, instead of a reply message */ int return_rcode; /** region for this query. Cleared when query process finishes. */ - struct region* region; + struct regional* region; /** which module is executing */ int curmod; diff --git a/util/region-allocator.c b/util/region-allocator.c deleted file mode 100644 index 23dac4d6b..000000000 --- a/util/region-allocator.c +++ /dev/null @@ -1,554 +0,0 @@ -/* - * region-allocator.c -- region based memory allocator. - * - * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. - * - * Copyright (c) 2007, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * \file - * Region allocator. Allocates small portions of of larger chunks. - */ - -#include "config.h" -#include "util/log.h" -#include "util/region-allocator.h" -#include "util/fptr_wlist.h" - -#ifdef ALIGNMENT -# undef ALIGNMENT -#endif -/** increase size until it fits alignment of s bytes */ -#define ALIGN_UP(x, s) (((x) + s - 1) & (~(s - 1))) -/** what size to align on */ -#define ALIGNMENT (sizeof(uint64_t)) -/** set to 1 to perform expensive check for double recycle() */ -#define CHECK_DOUBLE_FREE 0 - -/** typedef for cleanup structure */ -typedef struct cleanup cleanup_type; -/** store chunks and user cleanup actions */ -struct cleanup -{ - /** action to call (such as free) */ - void (*action)(void *); - /** pointer to pass to action. */ - void *data; -}; - -/** linked list of recycle elements of a certain size. */ -struct recycle_elem { - /** next in recycle list. First bytes of block is used for this ptr */ - struct recycle_elem* next; -}; - -/** hidden type of the region. */ -struct region -{ - /** total bytes allocated */ - size_t total_allocated; - /** number of small objects allocated */ - size_t small_objects; - /** number of large objects allocated */ - size_t large_objects; - /** number of chunks allocated */ - size_t chunk_count; - /** Unused space due to alignment, etc. */ - size_t unused_space; - - /** number of bytes allocated in the current chunk. */ - size_t allocated; - /** initial chunk */ - char *initial_data; - /** current chunk */ - char *data; - - /** how to allocate memory (for chunks) */ - void *(*allocator)(size_t); - /** how to deallocate memory (for chunks) */ - void (*deallocator)(void *); - - /** current max size of growing cleanup array */ - size_t maximum_cleanup_count; - /** number used inside the cleanup array */ - size_t cleanup_count; - /** cleanup array, chunks and user actions */ - cleanup_type *cleanups; - - /** size of chunks */ - size_t chunk_size; - /** large object size */ - size_t large_object_size; - - /** if not NULL recycling is enabled. - * It is an array of linked lists of parts held for recycle. - * The parts are all pointers to within the allocated chunks. - * Array [i] points to elements of size i. */ - struct recycle_elem** recycle_bin; - /** amount of memory in recycle storage */ - size_t recycle_size; -}; - - -/** common code to initialize a region */ -static region_type * -alloc_region_base(void *(*allocator)(size_t size), - void (*deallocator)(void *), - size_t initial_cleanup_count) -{ - region_type *result = (region_type *) allocator(sizeof(region_type)); - if (!result) return NULL; - - result->total_allocated = 0; - result->small_objects = 0; - result->large_objects = 0; - result->chunk_count = 1; - result->unused_space = 0; - result->recycle_bin = NULL; - result->recycle_size = 0; - - result->allocated = 0; - result->data = NULL; - result->initial_data = NULL; - - result->allocator = allocator; - result->deallocator = deallocator; - - log_assert(initial_cleanup_count > 0); - result->maximum_cleanup_count = initial_cleanup_count; - result->cleanup_count = 0; - log_assert(fptr_whitelist_region_allocator(allocator)); - result->cleanups = (cleanup_type *) allocator( - result->maximum_cleanup_count * sizeof(cleanup_type)); - if (!result->cleanups) { - log_assert(fptr_whitelist_region_deallocator(deallocator)); - deallocator(result); - return NULL; - } - - result->chunk_size = DEFAULT_CHUNK_SIZE; - result->large_object_size = DEFAULT_LARGE_OBJECT_SIZE; - return result; -} - -region_type * -region_create(void *(*allocator)(size_t), void (*deallocator)(void *)) -{ - region_type* result; -#ifdef UNBOUND_ALLOC_STATS - void *unbound_stat_malloc_region(size_t size); - void unbound_stat_free_region(void *ptr); - allocator = &unbound_stat_malloc_region; - deallocator = &unbound_stat_free_region; -#endif - log_assert(fptr_whitelist_region_allocator(allocator)); - result = alloc_region_base(allocator, deallocator, - DEFAULT_INITIAL_CLEANUP_SIZE); - if(!result) - return NULL; - result->data = (char *) allocator(result->chunk_size); - if (!result->data) { - log_assert(fptr_whitelist_region_deallocator(deallocator)); - deallocator(result->cleanups); - deallocator(result); - return NULL; - } - result->initial_data = result->data; - - return result; -} - - -region_type *region_create_custom(void *(*allocator)(size_t), - void (*deallocator)(void *), - size_t chunk_size, - size_t large_object_size, - size_t initial_cleanup_size, - int recycle) -{ - region_type* result; -#ifdef UNBOUND_ALLOC_STATS - void *unbound_stat_malloc_region(size_t size); - void unbound_stat_free_region(void *ptr); - allocator = &unbound_stat_malloc_region; - deallocator = &unbound_stat_free_region; -#endif - log_assert(fptr_whitelist_region_allocator(allocator)); - result = alloc_region_base(allocator, deallocator, - initial_cleanup_size); - if(!result) - return NULL; - log_assert(large_object_size <= chunk_size); - result->chunk_size = chunk_size; - result->large_object_size = large_object_size; - if(result->chunk_size > 0) { - result->data = (char *) allocator(result->chunk_size); - if (!result->data) { - log_assert(fptr_whitelist_region_deallocator( - deallocator)); - deallocator(result->cleanups); - deallocator(result); - return NULL; - } - result->initial_data = result->data; - } - if(recycle) { - result->recycle_bin = allocator(sizeof(struct recycle_elem*) - * result->large_object_size); - if(!result->recycle_bin) { - region_destroy(result); - return NULL; - } - memset(result->recycle_bin, 0, sizeof(struct recycle_elem*) - * result->large_object_size); - } - return result; -} - - -void -region_destroy(region_type *region) -{ - void (*deallocator)(void *); - if (!region) - return; - - deallocator = region->deallocator; - log_assert(fptr_whitelist_region_deallocator(deallocator)); - - region_free_all(region); - deallocator(region->cleanups); - deallocator(region->initial_data); - if(region->recycle_bin) - deallocator(region->recycle_bin); - deallocator(region); -} - - -size_t -region_add_cleanup(region_type *region, void (*action)(void *), void *data) -{ - log_assert(action); - - log_assert(fptr_whitelist_region_allocator(region->allocator)); - if (region->cleanup_count >= region->maximum_cleanup_count) { - cleanup_type *cleanups = (cleanup_type *) region->allocator( - 2 * region->maximum_cleanup_count * sizeof(cleanup_type)); - if (!cleanups) return 0; - - memcpy(cleanups, region->cleanups, - region->cleanup_count * sizeof(cleanup_type)); - log_assert(fptr_whitelist_region_deallocator( - region->deallocator)); - region->deallocator(region->cleanups); - - region->cleanups = cleanups; - region->maximum_cleanup_count *= 2; - } - - region->cleanups[region->cleanup_count].action = action; - region->cleanups[region->cleanup_count].data = data; - - ++region->cleanup_count; - return region->cleanup_count; -} - -void * -region_alloc(region_type *region, size_t size) -{ - size_t aligned_size; - void *result; - - if (size == 0) { - size = 1; - } - aligned_size = ALIGN_UP(size, ALIGNMENT); - - if (aligned_size >= region->large_object_size) { - log_assert(fptr_whitelist_region_allocator(region->allocator)); - result = region->allocator(size); - if (!result) return NULL; - - log_assert(fptr_whitelist_region_deallocator( - region->deallocator)); - if (!region_add_cleanup(region, region->deallocator, result)) { - region->deallocator(result); - return NULL; - } - - region->total_allocated += size; - ++region->large_objects; - - return result; - } - - if (region->recycle_bin && region->recycle_bin[aligned_size]) { - result = (void*)region->recycle_bin[aligned_size]; - region->recycle_bin[aligned_size] = region->recycle_bin[aligned_size]->next; - region->recycle_size -= aligned_size; - region->unused_space += aligned_size - size; - return result; - } - - log_assert(fptr_whitelist_region_allocator(region->allocator)); - if (region->allocated + aligned_size > region->chunk_size) { - void *chunk = region->allocator(region->chunk_size); - size_t wasted; - if (!chunk) return NULL; - - wasted = (region->chunk_size - region->allocated) & (~(ALIGNMENT-1)); - if(wasted >= ALIGNMENT) { - /* put wasted part in recycle bin for later use */ - region->total_allocated += wasted; - ++region->small_objects; - region_recycle(region, region->data+region->allocated, wasted); - region->allocated += wasted; - } - ++region->chunk_count; - region->unused_space += region->chunk_size - region->allocated; - - log_assert(fptr_whitelist_region_deallocator( - region->deallocator)); - if(!region_add_cleanup(region, region->deallocator, chunk)) { - region->deallocator(chunk); - region->chunk_count--; - region->unused_space -= - region->chunk_size - region->allocated; - return NULL; - } - region->allocated = 0; - region->data = (char *) chunk; - } - - result = region->data + region->allocated; - region->allocated += aligned_size; - - region->total_allocated += aligned_size; - region->unused_space += aligned_size - size; - ++region->small_objects; - - return result; -} - -void * -region_alloc_init(region_type *region, const void *init, size_t size) -{ - void *result = region_alloc(region, size); - if (!result) return NULL; - memcpy(result, init, size); - return result; -} - -void * -region_alloc_zero(region_type *region, size_t size) -{ - void *result = region_alloc(region, size); - if (!result) return NULL; - memset(result, 0, size); - return result; -} - -void -region_free_all(region_type *region) -{ - size_t i; - log_assert(region); - log_assert(region->cleanups); - - i = region->cleanup_count; - while (i > 0) { - --i; - log_assert(region->cleanups[i].action); - region->cleanups[i].action(region->cleanups[i].data); - } - - if(region->recycle_bin) { - memset(region->recycle_bin, 0, sizeof(struct recycle_elem*) - * region->large_object_size); - region->recycle_size = 0; - } - - region->data = region->initial_data; - region->cleanup_count = 0; - region->allocated = 0; - - region->total_allocated = 0; - region->small_objects = 0; - region->large_objects = 0; - region->chunk_count = 1; - region->unused_space = 0; -} - - -char * -region_strdup(region_type *region, const char *string) -{ - return (char *) region_alloc_init(region, string, strlen(string) + 1); -} - -void -region_recycle(region_type *region, void *block, size_t size) -{ - size_t aligned_size; - size_t i; - - if(!block || !region->recycle_bin) - return; - - if (size == 0) { - size = 1; - } - aligned_size = ALIGN_UP(size, ALIGNMENT); - - if(aligned_size < region->large_object_size) { - struct recycle_elem* elem = (struct recycle_elem*)block; - /* we rely on the fact that ALIGNMENT is void* so the next will fit */ - log_assert(aligned_size >= sizeof(struct recycle_elem)); - - if(CHECK_DOUBLE_FREE) { - /* make sure the same ptr is not freed twice. */ - struct recycle_elem *p = region->recycle_bin[aligned_size]; - while(p) { - log_assert(p != elem); - p = p->next; - } - } - - elem->next = region->recycle_bin[aligned_size]; - region->recycle_bin[aligned_size] = elem; - region->recycle_size += aligned_size; - region->unused_space -= aligned_size - size; - return; - } - - /* a large allocation */ - region->total_allocated -= size; - --region->large_objects; - for(i=0; icleanup_count; i++) { - while(region->cleanups[i].data == block) { - /* perform action (deallocator) on block */ - region->cleanups[i].action(block); - region->cleanups[i].data = NULL; - /* remove cleanup - move last entry here, check this one again */ - --region->cleanup_count; - region->cleanups[i].action = - region->cleanups[region->cleanup_count].action; - region->cleanups[i].data = - region->cleanups[region->cleanup_count].data; - } - } -} - -void -region_dump_stats(region_type *region, FILE *out) -{ - fprintf(out, "%lu objects (%lu small/%lu large), %lu bytes allocated (%lu wasted) in %lu chunks, %lu cleanups, %lu in recyclebin", - (unsigned long) (region->small_objects + region->large_objects), - (unsigned long) region->small_objects, - (unsigned long) region->large_objects, - (unsigned long) region->total_allocated, - (unsigned long) region->unused_space, - (unsigned long) region->chunk_count, - (unsigned long) region->cleanup_count, - (unsigned long) region->recycle_size); - if(1 && region->recycle_bin) { - /* print details of the recycle bin */ - size_t i; - for(i=0; ilarge_object_size; i++) { - size_t count = 0; - struct recycle_elem* el = region->recycle_bin[i]; - while(el) { - count++; - el = el->next; - } - if(i%ALIGNMENT == 0 && i!=0) - fprintf(out, " %lu", (unsigned long)count); - } - } -} - -size_t region_get_recycle_size(region_type* region) -{ - return region->recycle_size; -} - -/* debug routine, includes here to keep base region-allocator independent */ -#undef ALIGN_UP -#include "util/log.h" -void -region_log_stats(region_type *region) -{ - char buf[10240], *str=buf; - int len=0; - snprintf(str, sizeof(buf), "%lu objects (%lu small/%lu large), %lu bytes allocated (%lu wasted) in %lu chunks, %lu cleanups, %lu in recyclebin%n", - (unsigned long) (region->small_objects + region->large_objects), - (unsigned long) region->small_objects, - (unsigned long) region->large_objects, - (unsigned long) region->total_allocated, - (unsigned long) region->unused_space, - (unsigned long) region->chunk_count, - (unsigned long) region->cleanup_count, - (unsigned long) region->recycle_size, - &len); - str+=len; - if(1 && region->recycle_bin) { - /* print details of the recycle bin */ - size_t i; - for(i=0; ilarge_object_size; i++) { - size_t count = 0; - struct recycle_elem* el = region->recycle_bin[i]; - while(el) { - count++; - el = el->next; - } - if(i%ALIGNMENT == 0 && i!=0) { - snprintf(str, sizeof(buf)-(str-buf), " %lu%n", - (unsigned long)count, &len); - str+=len; - } - } - } - log_info("memory: %s", buf); -} - -size_t -region_get_mem(region_type* region) -{ - size_t s = sizeof(*region); - s += region->total_allocated + region->chunk_size - region->allocated; - s += region->maximum_cleanup_count * sizeof(cleanup_type); - if(region->recycle_bin) - s += sizeof(struct recycle_elem*)*region->large_object_size; - log_assert(s >= region->chunk_size * region->chunk_count); - return s; -} diff --git a/util/region-allocator.h b/util/region-allocator.h deleted file mode 100644 index c10897d9c..000000000 --- a/util/region-allocator.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * region-allocator.h -- region based memory allocator. - * - * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. - * - * Copyright (c) 2007, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * \file - * Region allocator. Allocates small portions of of larger chunks. - */ - -#ifndef _REGION_ALLOCATOR_H_ -#define _REGION_ALLOCATOR_H_ - -#include - -/** The region type */ -typedef struct region region_type; - -/** Default reasonable size for chunks */ -#define DEFAULT_CHUNK_SIZE 4096 -/** Default size for large objects - allocated outside of chunks. */ -#define DEFAULT_LARGE_OBJECT_SIZE (DEFAULT_CHUNK_SIZE / 8) -/** Default size for cleanup array initial size. */ -#define DEFAULT_INITIAL_CLEANUP_SIZE 16 - -/** - * Create a new region. - * @param allocator: 'malloc' or another memory allocator. - * @param deallocator: 'free' or another memory deallocator. - */ -region_type *region_create(void *(*allocator)(size_t), - void (*deallocator)(void *)); - - -/** - * Create a new region, with chunk size and large object size. - * @param allocator: 'malloc' or another memory allocator. - * @param deallocator: 'free' or another memory deallocator. - * @param chunk_size: size of chunks to allocate. - * @param large_object_size: - * Note that large_object_size must be <= chunk_size. - * Anything larger than the large object size is individually alloced. - * large_object_size = chunk_size/8 is reasonable; - * @param initial_cleanup_size: - * initial_cleanup_size is the number of prealloced ptrs for cleanups. - * The cleanups are in a growing array, and it must start larger than zero. - * @param recycle: - * If recycle is true, environmentally friendly memory recycling is enabled. - */ -region_type *region_create_custom(void *(*allocator)(size_t), - void (*deallocator)(void *), - size_t chunk_size, - size_t large_object_size, - size_t initial_cleanup_size, - int recycle); - - -/** - * Destroy REGION. All memory associated with REGION is freed as if - * region_free_all was called. - * @param region: to delete. - */ -void region_destroy(region_type *region); - - -/** - * Add a cleanup to REGION. - * @param region: the region. - * @param action: ACTION will be called with DATA as - * parameter when the region is freed or destroyed. - * @param data: argument to action. - * @return: 0 on failure. - */ -size_t region_add_cleanup(region_type *region, - void (*action)(void *), - void *data); - - -/** - * Allocate SIZE bytes of memory inside REGION. The memory is - * deallocated when region_free_all is called for this region. - * @param region: the region. - * @param size: number of bytes. - * @return: pointer to memory allocated. - */ -void *region_alloc(region_type *region, size_t size); - - -/** - * Allocate SIZE bytes of memory inside REGION and copy INIT into it. - * The memory is deallocated when region_free_all is called for this - * region. - * @param region: the region. - * @param init: to copy. - * @param size: number of bytes. - * @return: pointer to memory allocated. - */ -void *region_alloc_init(region_type *region, const void *init, size_t size); - - -/** - * Allocate SIZE bytes of memory inside REGION that are initialized to - * 0. The memory is deallocated when region_free_all is called for - * this region. - * @param region: the region. - * @param size: number of bytes. - * @return: pointer to memory allocated. - */ -void *region_alloc_zero(region_type *region, size_t size); - - -/** - * Run the cleanup actions and free all memory associated with REGION. - * @param region: the region. - */ -void region_free_all(region_type *region); - - -/** - * Duplicate STRING and allocate the result in REGION. - */ -char *region_strdup(region_type *region, const char *string); - -/** - * Recycle an allocated memory block. Pass size used to alloc it. - * Does nothing if recycling is not enabled for the region. - * @param region: the region. - * @param block: pointer to memory from region_alloc call. - * @param size: number of bytes, same as passed to region_alloc call. - */ -void region_recycle(region_type *region, void *block, size_t size); - -/** - * Print some REGION statistics to OUT - */ -void region_dump_stats(region_type *region, FILE *out); - -/** get size of recyclebin */ -size_t region_get_recycle_size(region_type* region); - -/** Debug print REGION statistics to LOG */ -void region_log_stats(region_type *region); - -/** get total memory size in use by region */ -size_t region_get_mem(region_type* region); - -#endif /* _REGION_ALLOCATOR_H_ */ diff --git a/util/regional.c b/util/regional.c index d22f149e1..71d76c147 100644 --- a/util/regional.c +++ b/util/regional.c @@ -37,7 +37,7 @@ /** * \file - * Region allocator. Allocates small portions of of larger chunks. + * Regional allocator. Allocates small portions of of larger chunks. */ #include "config.h" @@ -60,28 +60,27 @@ struct regional* regional_create() { - void *block = malloc(REGIONAL_CHUNK_SIZE); - if(!block) return NULL; - return regional_create_custom(block, REGIONAL_CHUNK_SIZE); + return regional_create_custom(REGIONAL_CHUNK_SIZE); } /** init regional struct with first block */ static void regional_init(struct regional* r) { + size_t a = ALIGN_UP(sizeof(struct regional), ALIGNMENT); + r->data = (char*)r + a; + r->available = r->first_size - a; r->next = NULL; - r->size = r->first_size; - r->allocated = ALIGN_UP(sizeof(struct regional), ALIGNMENT); - r->data = (char*)r; - r->total_large = 0; r->large_list = NULL; + r->total_large = 0; } struct regional* -regional_create_custom(void* block, size_t size) +regional_create_custom(size_t size) { - struct regional* r = (struct regional*)block; + struct regional* r = (struct regional*)malloc(size); log_assert(sizeof(struct regional) <= size); + if(!r) return NULL; r->first_size = size; regional_init(r); return r; @@ -108,6 +107,7 @@ regional_free_all(struct regional *r) void regional_destroy(struct regional *r) { + if(!r) return; regional_free_all(r); free(r); } @@ -127,17 +127,18 @@ regional_alloc(struct regional *r, size_t size) return s+ALIGNMENT; } /* create a new chunk */ - if(r->allocated + a > r->size) { + if(a > r->available) { s = malloc(REGIONAL_CHUNK_SIZE); if(!s) return NULL; - *(char**)s = r->data; - r->data = s; - r->allocated = ALIGNMENT; - r->size = REGIONAL_CHUNK_SIZE; + *(char**)s = r->next; + r->next = (char*)s; + r->data = (char*)s + ALIGNMENT; + r->available = REGIONAL_CHUNK_SIZE - ALIGNMENT; } /* put in this chunk */ - s = r->data + r->allocated; - r->allocated += a; + r->available -= a; + s = r->data; + r->data += a; return s; } @@ -145,8 +146,7 @@ void * regional_alloc_init(struct regional* r, const void *init, size_t size) { void *s = regional_alloc(r, size); - if(!s) - return NULL; + if(!s) return NULL; memcpy(s, init, size); return s; } @@ -155,8 +155,7 @@ void * regional_alloc_zero(struct regional *r, size_t size) { void *s = regional_alloc(r, size); - if(!s) - return NULL; + if(!s) return NULL; memset(s, 0, size); return s; } @@ -164,7 +163,7 @@ regional_alloc_zero(struct regional *r, size_t size) char * regional_strdup(struct regional *r, const char *string) { - return regional_alloc_init(r, string, strlen(string)+1); + return (char*)regional_alloc_init(r, string, strlen(string)+1); } /** @@ -201,6 +200,12 @@ count_large(struct regional* r) void regional_log_stats(struct regional *r) { + /* some basic assertions put here (non time critical code) */ + log_assert(ALIGNMENT >= sizeof(char*)); + log_assert(REGIONAL_CHUNK_SIZE > ALIGNMENT); + log_assert(REGIONAL_CHUNK_SIZE-ALIGNMENT > REGIONAL_LARGE_OBJECT_SIZE); + log_assert(REGIONAL_CHUNK_SIZE >= sizeof(struct regional)); + /* debug print */ log_info("regional %u chunks, %u large", (unsigned)count_chunks(r), (unsigned)count_large(r)); } diff --git a/util/regional.h b/util/regional.h index 7c2975f73..6090b8804 100644 --- a/util/regional.h +++ b/util/regional.h @@ -35,15 +35,17 @@ /** * \file - * Region allocator. Allocates small portions of of larger chunks. + * Regional allocator. Allocates small portions of of larger chunks. + * Based on region-allocator from NSD, but rewritten to be light. * * Different from (nsd) region-allocator.h * o does not have recycle bin - * o does not collect stats + * o does not collect stats; just enough to answer get_mem() in use. * o does not keep cleanup list * o does not have function pointers to setup * o allocs the regional struct inside the first block. * o can take a block to create regional from. + * o blocks and large allocations are kept on singly linked lists. */ #ifndef UTIL_REGIONAL_H_ @@ -56,40 +58,39 @@ */ struct regional { - /** next chunk. NULL if first chunk is the only chunk. */ - char* next; - /** number of bytes allocated in the current chunk. */ - size_t allocated; - /** initial chunk size */ - size_t first_size; - /** current chunk size */ - size_t size; - /** total large size */ - size_t total_large; /** - * current chunk - * can be cast to char** to obtain next chunk pointer. + * next chunk. NULL if first chunk is the only chunk. + * first inside that chunk is the char* next pointer. + * When regional_free_all() has been called this value is NULL. */ - char *data; + char* next; /** first large object, cast to char** to obtain next ptr */ char* large_list; + /** total large size */ + size_t total_large; + /** initial chunk size */ + size_t first_size; + /** number of bytes available in the current chunk. */ + size_t available; + /** current chunk data position. */ + char* data; }; /** * Create a new regional. + * @return: newly allocated regional. */ struct regional* regional_create(); /** * Create a new region, with custom settings. - * @param block: initial data block - * The regional returned is allocated in the block (start of it). - * @param size: length of block. + * @param size: length of first block. + * @return: newly allocated regional. */ -struct regional* regional_create_custom(void* block, size_t size); +struct regional* regional_create_custom(size_t size); /** - * Free all memory associated with REGION. Only keeps the first block with + * Free all memory associated with regional. Only keeps the first block with * the regional inside it. * @param r: the region. */ @@ -103,7 +104,7 @@ void regional_free_all(struct regional *r); void regional_destroy(struct regional *r); /** - * Allocate SIZE bytes of memory inside REGION. The memory is + * Allocate size bytes of memory inside regional. The memory is * deallocated when region_free_all is called for this region. * @param r: the region. * @param size: number of bytes. @@ -112,7 +113,7 @@ void regional_destroy(struct regional *r); void *regional_alloc(struct regional *r, size_t size); /** - * Allocate SIZE bytes of memory inside REGION and copy INIT into it. + * Allocate size bytes of memory inside regional and copy INIT into it. * The memory is deallocated when region_free_all is called for this * region. * @param r: the region. @@ -123,7 +124,7 @@ void *regional_alloc(struct regional *r, size_t size); void *regional_alloc_init(struct regional* r, const void *init, size_t size); /** - * Allocate SIZE bytes of memory inside REGION that are initialized to + * Allocate size bytes of memory inside regional that are initialized to * 0. The memory is deallocated when region_free_all is called for * this region. * @param r: the region. @@ -133,13 +134,14 @@ void *regional_alloc_init(struct regional* r, const void *init, size_t size); void *regional_alloc_zero(struct regional *r, size_t size); /** - * Duplicate STRING and allocate the result in REGION. + * Duplicate string and allocate the result in regional. * @param r: the region. * @param string: null terminated string. + * @return: pointer to memory allocated. */ char *regional_strdup(struct regional *r, const char *string); -/** Debug print REGION statistics to LOG */ +/** Debug print regional statistics to log */ void regional_log_stats(struct regional *r); /** get total memory size in use by region */ diff --git a/validator/val_anchor.c b/validator/val_anchor.c index 1a84c63ed..150476b4b 100644 --- a/validator/val_anchor.c +++ b/validator/val_anchor.c @@ -44,7 +44,7 @@ #include "util/data/dname.h" #include "util/log.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/config_file.h" int @@ -69,7 +69,7 @@ anchors_create() struct val_anchors* a = (struct val_anchors*)calloc(1, sizeof(*a)); if(!a) return NULL; - a->region = region_create(malloc, free); + a->region = regional_create(); if(!a->region) { free(a); return NULL; @@ -88,7 +88,7 @@ anchors_delete(struct val_anchors* anchors) if(!anchors) return; free(anchors->tree); - region_destroy(anchors->region); + regional_destroy(anchors->region); free(anchors); } @@ -153,13 +153,13 @@ anchor_new_ta(struct val_anchors* anchors, uint8_t* name, int namelabs, size_t namelen, uint16_t dclass) { rbnode_t* r; - struct trust_anchor* ta = (struct trust_anchor*)region_alloc( + struct trust_anchor* ta = (struct trust_anchor*)regional_alloc( anchors->region, sizeof(struct trust_anchor)); if(!ta) return NULL; memset(ta, 0, sizeof(*ta)); ta->node.key = ta; - ta->name = region_alloc_init(anchors->region, name, namelen); + ta->name = regional_alloc_init(anchors->region, name, namelen); if(!ta->name) return NULL; ta->namelabs = namelabs; @@ -189,12 +189,12 @@ static struct ta_key* anchor_new_ta_key(struct val_anchors* anchors, uint8_t* rdata, size_t rdata_len, uint16_t type) { - struct ta_key* k = (struct ta_key*)region_alloc(anchors->region, + struct ta_key* k = (struct ta_key*)regional_alloc(anchors->region, sizeof(*k)); if(!k) return NULL; memset(k, 0, sizeof(*k)); - k->data = region_alloc_init(anchors->region, rdata, rdata_len); + k->data = regional_alloc_init(anchors->region, rdata, rdata_len); if(!k->data) return NULL; k->len = rdata_len; @@ -663,18 +663,18 @@ anchor_read_bind_file(struct val_anchors* anchors, ldns_buffer* buffer, * @return rrset or NULL on error. */ static struct ub_packed_rrset_key* -assemble_it(struct region* region, struct trust_anchor* ta, size_t num, +assemble_it(struct regional* region, struct trust_anchor* ta, size_t num, uint16_t type) { struct ub_packed_rrset_key* pkey = (struct ub_packed_rrset_key*) - region_alloc(region, sizeof(*pkey)); + regional_alloc(region, sizeof(*pkey)); struct packed_rrset_data* pd; struct ta_key* tk; size_t i; if(!pkey) return NULL; memset(pkey, 0, sizeof(*pkey)); - pkey->rk.dname = region_alloc_init(region, ta->name, ta->namelen); + pkey->rk.dname = regional_alloc_init(region, ta->name, ta->namelen); if(!pkey->rk.dname) return NULL; @@ -683,19 +683,19 @@ assemble_it(struct region* region, struct trust_anchor* ta, size_t num, pkey->rk.rrset_class = htons(ta->dclass); /* The rrset is build in an uncompressed way. This means it * cannot be copied in the normal way. */ - pd = (struct packed_rrset_data*)region_alloc(region, sizeof(*pd)); + pd = (struct packed_rrset_data*)regional_alloc(region, sizeof(*pd)); if(!pd) return NULL; memset(pd, 0, sizeof(*pd)); pd->count = num; pd->trust = rrset_trust_ultimate; - pd->rr_len = (size_t*)region_alloc(region, num*sizeof(size_t)); + pd->rr_len = (size_t*)regional_alloc(region, num*sizeof(size_t)); if(!pd->rr_len) return NULL; - pd->rr_ttl = (uint32_t*)region_alloc(region, num*sizeof(uint32_t)); + pd->rr_ttl = (uint32_t*)regional_alloc(region, num*sizeof(uint32_t)); if(!pd->rr_ttl) return NULL; - pd->rr_data = (uint8_t**)region_alloc(region, num*sizeof(uint8_t*)); + pd->rr_data = (uint8_t**)regional_alloc(region, num*sizeof(uint8_t*)); if(!pd->rr_data) return NULL; /* fill in rrs */ @@ -829,5 +829,5 @@ anchors_lookup(struct val_anchors* anchors, size_t anchors_get_mem(struct val_anchors* anchors) { - return sizeof(*anchors) + region_get_mem(anchors->region); + return sizeof(*anchors) + regional_get_mem(anchors->region); } diff --git a/validator/val_anchor.h b/validator/val_anchor.h index b4f92c2db..2a9db472b 100644 --- a/validator/val_anchor.h +++ b/validator/val_anchor.h @@ -42,7 +42,7 @@ #ifndef VALIDATOR_VAL_ANCHOR_H #define VALIDATOR_VAL_ANCHOR_H #include "util/rbtree.h" -struct region; +struct regional; struct trust_anchor; struct config_file; struct ub_packed_rrset_key; @@ -52,7 +52,7 @@ struct ub_packed_rrset_key; */ struct val_anchors { /** region where trust anchors are allocated */ - struct region* region; + struct regional* region; /** * Anchors are store in this tree. Sort order is chosen, so that * dnames are in nsec-like order. A lookup on class, name will return diff --git a/validator/val_kcache.c b/validator/val_kcache.c index 56cef3f39..2104eddd9 100644 --- a/validator/val_kcache.c +++ b/validator/val_kcache.c @@ -119,7 +119,7 @@ key_cache_search(struct key_cache* kcache, uint8_t* name, size_t namelen, struct key_entry_key* key_cache_obtain(struct key_cache* kcache, uint8_t* name, size_t namelen, - uint16_t key_class, struct region* region) + uint16_t key_class, struct regional* region) { uint32_t now = time(NULL); /* keep looking until we find a nonexpired entry */ diff --git a/validator/val_kcache.h b/validator/val_kcache.h index 98fb9097b..5d767d405 100644 --- a/validator/val_kcache.h +++ b/validator/val_kcache.h @@ -45,7 +45,7 @@ struct key_entry_key; struct key_entry_data; struct config_file; -struct region; +struct regional; /** * Key cache @@ -92,7 +92,7 @@ void key_cache_insert(struct key_cache* kcache, struct key_entry_key* kkey); */ struct key_entry_key* key_cache_obtain(struct key_cache* kcache, uint8_t* name, size_t namelen, uint16_t key_class, - struct region* region); + struct regional* region); /** * Get memory in use by the key cache. diff --git a/validator/val_kentry.c b/validator/val_kentry.c index 8905b1640..b4c871fff 100644 --- a/validator/val_kentry.c +++ b/validator/val_kentry.c @@ -43,7 +43,7 @@ #include "util/data/packed_rrset.h" #include "util/data/dname.h" #include "util/storage/lookup3.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/net_help.h" size_t @@ -102,13 +102,13 @@ key_entry_hash(struct key_entry_key* kk) } struct key_entry_key* -key_entry_copy_toregion(struct key_entry_key* kkey, struct region* region) +key_entry_copy_toregion(struct key_entry_key* kkey, struct regional* region) { struct key_entry_key* newk; - newk = region_alloc_init(region, kkey, sizeof(*kkey)); + newk = regional_alloc_init(region, kkey, sizeof(*kkey)); if(!newk) return NULL; - newk->name = region_alloc_init(region, kkey->name, kkey->namelen); + newk->name = regional_alloc_init(region, kkey->name, kkey->namelen); if(!newk->name) return NULL; newk->entry.key = newk; @@ -117,12 +117,12 @@ key_entry_copy_toregion(struct key_entry_key* kkey, struct region* region) struct key_entry_data *d = (struct key_entry_data*) kkey->entry.data; struct key_entry_data *newd; - newd = region_alloc_init(region, d, sizeof(*d)); + newd = regional_alloc_init(region, d, sizeof(*d)); if(!newd) return NULL; /* copy rrset */ if(d->rrset_data) { - newd->rrset_data = region_alloc_init(region, + newd->rrset_data = regional_alloc_init(region, d->rrset_data, packed_rrset_sizeof(d->rrset_data)); if(!newd->rrset_data) @@ -201,21 +201,21 @@ key_entry_isbad(struct key_entry_key* kkey) /** setup key entry in region */ static int -key_entry_setup(struct region* region, +key_entry_setup(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass, struct key_entry_key** k, struct key_entry_data** d) { - *k = region_alloc(region, sizeof(**k)); + *k = regional_alloc(region, sizeof(**k)); if(!*k) return 0; memset(*k, 0, sizeof(**k)); (*k)->entry.key = *k; - (*k)->name = region_alloc_init(region, name, namelen); + (*k)->name = regional_alloc_init(region, name, namelen); if(!(*k)->name) return 0; (*k)->namelen = namelen; (*k)->key_class = dclass; - *d = region_alloc(region, sizeof(**d)); + *d = regional_alloc(region, sizeof(**d)); if(!*d) return 0; (*k)->entry.data = *d; @@ -223,7 +223,7 @@ key_entry_setup(struct region* region, } struct key_entry_key* -key_entry_create_null(struct region* region, +key_entry_create_null(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass, uint32_t ttl) { struct key_entry_key* k; @@ -238,7 +238,7 @@ key_entry_create_null(struct region* region, } struct key_entry_key* -key_entry_create_rrset(struct region* region, +key_entry_create_rrset(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass, struct ub_packed_rrset_key* rrset) { @@ -251,7 +251,7 @@ key_entry_create_rrset(struct region* region, d->ttl = rd->ttl + time(NULL); d->isbad = 0; d->rrset_type = ntohs(rrset->rk.type); - d->rrset_data = (struct packed_rrset_data*)region_alloc_init(region, + d->rrset_data = (struct packed_rrset_data*)regional_alloc_init(region, rd, packed_rrset_sizeof(rd)); if(!d->rrset_data) return NULL; @@ -260,7 +260,7 @@ key_entry_create_rrset(struct region* region, } struct key_entry_key* -key_entry_create_bad(struct region* region, +key_entry_create_bad(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass) { struct key_entry_key* k; @@ -275,25 +275,25 @@ key_entry_create_bad(struct region* region, } struct ub_packed_rrset_key* -key_entry_get_rrset(struct key_entry_key* kkey, struct region* region) +key_entry_get_rrset(struct key_entry_key* kkey, struct regional* region) { struct key_entry_data* d = (struct key_entry_data*)kkey->entry.data; struct ub_packed_rrset_key* rrk; struct packed_rrset_data* rrd; if(!d || !d->rrset_data) return NULL; - rrk = region_alloc(region, sizeof(*rrk)); + rrk = regional_alloc(region, sizeof(*rrk)); if(!rrk) return NULL; memset(rrk, 0, sizeof(*rrk)); - rrk->rk.dname = region_alloc_init(region, kkey->name, kkey->namelen); + rrk->rk.dname = regional_alloc_init(region, kkey->name, kkey->namelen); if(!rrk->rk.dname) return NULL; rrk->rk.dname_len = kkey->namelen; rrk->rk.type = htons(d->rrset_type); rrk->rk.rrset_class = htons(kkey->key_class); rrk->entry.key = rrk; - rrd = region_alloc_init(region, d->rrset_data, + rrd = regional_alloc_init(region, d->rrset_data, packed_rrset_sizeof(d->rrset_data)); if(!rrd) return NULL; diff --git a/validator/val_kentry.h b/validator/val_kentry.h index 95c6b61f8..bda29113e 100644 --- a/validator/val_kentry.h +++ b/validator/val_kentry.h @@ -42,7 +42,7 @@ #ifndef VALIDATOR_VAL_KENTRY_H #define VALIDATOR_VAL_KENTRY_H struct packed_rrset_data; -struct region; +struct regional; struct ub_packed_rrset_key; #include "util/storage/lruhash.h" @@ -108,7 +108,7 @@ void key_entry_hash(struct key_entry_key* kk); * @return newly region-allocated entry or NULL on a failure to allocate. */ struct key_entry_key* key_entry_copy_toregion(struct key_entry_key* kkey, - struct region* region); + struct regional* region); /** * Copy a key entry, malloced. @@ -147,7 +147,7 @@ int key_entry_isbad(struct key_entry_key* kkey); * @param ttl: what ttl should the key have. relative. * @return new key entry or NULL on alloc failure */ -struct key_entry_key* key_entry_create_null(struct region* region, +struct key_entry_key* key_entry_create_null(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass, uint32_t ttl); /** @@ -159,7 +159,7 @@ struct key_entry_key* key_entry_create_null(struct region* region, * @param rrset: data for key entry. This is copied to the region. * @return new key entry or NULL on alloc failure */ -struct key_entry_key* key_entry_create_rrset(struct region* region, +struct key_entry_key* key_entry_create_rrset(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass, struct ub_packed_rrset_key* rrset); @@ -171,7 +171,7 @@ struct key_entry_key* key_entry_create_rrset(struct region* region, * @param dclass: class of key entry. (host order); * @return new key entry or NULL on alloc failure */ -struct key_entry_key* key_entry_create_bad(struct region* region, +struct key_entry_key* key_entry_create_bad(struct regional* region, uint8_t* name, size_t namelen, uint16_t dclass); /** @@ -181,7 +181,7 @@ struct key_entry_key* key_entry_create_bad(struct region* region, * @return rrset copy; if no rrset or alloc error returns NULL. */ struct ub_packed_rrset_key* key_entry_get_rrset(struct key_entry_key* kkey, - struct region* region); + struct regional* region); /** * Get keysize of the keyentry. diff --git a/validator/val_nsec3.c b/validator/val_nsec3.c index 784939300..8e78f54ca 100644 --- a/validator/val_nsec3.c +++ b/validator/val_nsec3.c @@ -44,7 +44,7 @@ #include "validator/val_nsec3.h" #include "validator/validator.h" #include "validator/val_kentry.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/rbtree.h" #include "util/module.h" #include "util/net_help.h" @@ -484,7 +484,7 @@ nsec3_hash_cmp(const void* c1, const void* c2) /** perform hash of name */ static int -nsec3_calc_hash(struct region* region, ldns_buffer* buf, +nsec3_calc_hash(struct regional* region, ldns_buffer* buf, struct nsec3_cached_hash* c) { int algo = nsec3_get_algo(c->nsec3, c->rr); @@ -503,7 +503,8 @@ nsec3_calc_hash(struct region* region, ldns_buffer* buf, #ifdef SHA_DIGEST_LENGTH case NSEC3_HASH_SHA1: c->hash_len = SHA_DIGEST_LENGTH; - c->hash = (uint8_t*)region_alloc(region, c->hash_len); + c->hash = (uint8_t*)regional_alloc(region, + c->hash_len); if(!c->hash) return 0; (void)SHA1((unsigned char*)ldns_buffer_begin(buf), @@ -530,7 +531,7 @@ nsec3_calc_hash(struct region* region, ldns_buffer* buf, /** perform b32 encoding of hash */ static int -nsec3_calc_b32(struct region* region, ldns_buffer* buf, +nsec3_calc_b32(struct regional* region, ldns_buffer* buf, struct nsec3_cached_hash* c) { int r; @@ -542,14 +543,15 @@ nsec3_calc_b32(struct region* region, ldns_buffer* buf, return 0; } c->b32_len = (size_t)r; - c->b32 = region_alloc_init(region, ldns_buffer_begin(buf), c->b32_len); + c->b32 = regional_alloc_init(region, ldns_buffer_begin(buf), + c->b32_len); if(!c->b32) return 0; return 1; } int -nsec3_hash_name(rbtree_t* table, struct region* region, ldns_buffer* buf, +nsec3_hash_name(rbtree_t* table, struct regional* region, ldns_buffer* buf, struct ub_packed_rrset_key* nsec3, int rr, uint8_t* dname, size_t dname_len, struct nsec3_cached_hash** hash) { @@ -569,7 +571,7 @@ nsec3_hash_name(rbtree_t* table, struct region* region, ldns_buffer* buf, return 1; } /* create a new entry */ - c = (struct nsec3_cached_hash*)region_alloc(region, sizeof(*c)); + c = (struct nsec3_cached_hash*)regional_alloc(region, sizeof(*c)); if(!c) return 0; c->node.key = c; c->nsec3 = nsec3; @@ -920,13 +922,13 @@ nsec3_prove_closest_encloser(struct module_env* env, struct nsec3_filter* flt, /** allocate a wildcard for the closest encloser */ static uint8_t* -nsec3_ce_wildcard(struct region* region, uint8_t* ce, size_t celen, +nsec3_ce_wildcard(struct regional* region, uint8_t* ce, size_t celen, size_t* len) { uint8_t* nm; if(celen > LDNS_MAX_DOMAINLEN - 2) return 0; /* too long */ - nm = (uint8_t*)region_alloc(region, celen+2); + nm = (uint8_t*)regional_alloc(region, celen+2); if(!nm) { log_err("nsec3 wildcard: out of memory"); return 0; /* alloc failure */ diff --git a/validator/val_nsec3.h b/validator/val_nsec3.h index 0b691edfb..b6f914ef7 100644 --- a/validator/val_nsec3.h +++ b/validator/val_nsec3.h @@ -68,7 +68,7 @@ #define VALIDATOR_VAL_NSEC3_H #include "util/rbtree.h" struct val_env; -struct region; +struct regional; struct module_env; struct ub_packed_rrset_key; enum sec_status; @@ -266,7 +266,7 @@ int nsec3_hash_cmp(const void* c1, const void* c2); * 0 on a malloc failure. * -1 if the NSEC3 rr was badly formatted (i.e. formerr). */ -int nsec3_hash_name(rbtree_t* table, struct region* region, ldns_buffer* buf, +int nsec3_hash_name(rbtree_t* table, struct regional* region, ldns_buffer* buf, struct ub_packed_rrset_key* nsec3, int rr, uint8_t* dname, size_t dname_len, struct nsec3_cached_hash** hash); diff --git a/validator/val_sigcrypt.c b/validator/val_sigcrypt.c index dfc72fac8..353e0550a 100644 --- a/validator/val_sigcrypt.c +++ b/validator/val_sigcrypt.c @@ -49,7 +49,7 @@ #include "util/rbtree.h" #include "util/module.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" #ifndef HAVE_SSL #error "Need SSL library to do digital signature cryptography" @@ -342,7 +342,7 @@ int ds_digest_match_dnskey(struct module_env* env, return 0; /* DS algorithm and digest do not match */ } - digest = region_alloc(env->scratch, digestlen); + digest = regional_alloc(env->scratch, digestlen); if(!digest) { verbose(VERB_DETAIL, "DS fail: out of memory"); return 0; /* mem error */ @@ -1007,7 +1007,7 @@ canonicalize_rdata(ldns_buffer* buf, struct ub_packed_rrset_key* rrset, * @return false on alloc error. */ static int -rrset_canonical(struct region* region, ldns_buffer* buf, +rrset_canonical(struct regional* region, ldns_buffer* buf, struct ub_packed_rrset_key* k, uint8_t* sig, size_t siglen, struct rbtree_t** sortree) { @@ -1018,11 +1018,11 @@ rrset_canonical(struct region* region, ldns_buffer* buf, struct canon_rr* rrs; if(!*sortree) { - *sortree = (struct rbtree_t*)region_alloc(region, + *sortree = (struct rbtree_t*)regional_alloc(region, sizeof(rbtree_t)); if(!*sortree) return 0; - rrs = region_alloc(region, sizeof(struct canon_rr)*d->count); + rrs = regional_alloc(region, sizeof(struct canon_rr)*d->count); if(!rrs) { *sortree = NULL; return 0; @@ -1272,7 +1272,7 @@ verify_canonrrset(ldns_buffer* buf, int algo, unsigned char* sigblock, } enum sec_status -dnskey_verify_rrset_sig(struct region* region, ldns_buffer* buf, +dnskey_verify_rrset_sig(struct regional* region, ldns_buffer* buf, struct val_env* ve, struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey, size_t dnskey_idx, size_t sig_idx, diff --git a/validator/val_sigcrypt.h b/validator/val_sigcrypt.h index 08cb8a348..c838897a8 100644 --- a/validator/val_sigcrypt.h +++ b/validator/val_sigcrypt.h @@ -48,7 +48,7 @@ struct module_env; struct ub_packed_rrset_key; enum sec_status; struct rbtree_t; -struct region; +struct regional; /** * Check if dnskey matches a DS digest @@ -194,7 +194,7 @@ enum sec_status dnskeyset_verify_rrset_sig(struct module_env* env, * @return secure if this key signs this signature. unchecked on error or * bogus if it did not validate. */ -enum sec_status dnskey_verify_rrset_sig(struct region* region, +enum sec_status dnskey_verify_rrset_sig(struct regional* region, ldns_buffer* buf, struct val_env* ve, struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey, size_t dnskey_idx, size_t sig_idx, diff --git a/validator/val_utils.c b/validator/val_utils.c index c882ca8a9..8947d665c 100644 --- a/validator/val_utils.c +++ b/validator/val_utils.c @@ -50,7 +50,7 @@ #include "util/data/dname.h" #include "util/net_help.h" #include "util/module.h" -#include "util/region-allocator.h" +#include "util/regional.h" enum val_classification val_classify_response(uint16_t query_flags, struct query_info* qinf, @@ -311,7 +311,7 @@ val_verify_rrset(struct module_env* env, struct val_env* ve, ntohs(rrset->rk.type), ntohs(rrset->rk.rrset_class)); sec = dnskeyset_verify_rrset(env, ve, rrset, keys); verbose(VERB_ALGO, "verify result: %s", sec_status_to_string(sec)); - region_free_all(env->scratch); + regional_free_all(env->scratch); /* update rrset security status * only improves security status @@ -395,7 +395,7 @@ verify_dnskeys_with_ds_rr(struct module_env* env, struct val_env* ve, } struct key_entry_key* -val_verify_new_DNSKEYs(struct region* region, struct module_env* env, +val_verify_new_DNSKEYs(struct regional* region, struct module_env* env, struct val_env* ve, struct ub_packed_rrset_key* dnskey_rrset, struct ub_packed_rrset_key* ds_rrset) { diff --git a/validator/val_utils.h b/validator/val_utils.h index cd4579ed0..fc2dd8f7b 100644 --- a/validator/val_utils.h +++ b/validator/val_utils.h @@ -47,7 +47,7 @@ struct val_env; struct module_env; struct ub_packed_rrset_key; struct key_entry_key; -struct region; +struct regional; struct val_anchors; struct rrset_cache; enum sec_status; @@ -150,7 +150,7 @@ enum sec_status val_verify_rrset_entry(struct module_env* env, * this sort of thing is checked before fetching the matching DNSKEY * rrset. */ -struct key_entry_key* val_verify_new_DNSKEYs(struct region* region, +struct key_entry_key* val_verify_new_DNSKEYs(struct regional* region, struct module_env* env, struct val_env* ve, struct ub_packed_rrset_key* dnskey_rrset, struct ub_packed_rrset_key* ds_rrset); diff --git a/validator/validator.c b/validator/validator.c index 126b0918d..9cfe53423 100644 --- a/validator/validator.c +++ b/validator/validator.c @@ -52,7 +52,7 @@ #include "util/module.h" #include "util/log.h" #include "util/net_help.h" -#include "util/region-allocator.h" +#include "util/regional.h" #include "util/config_file.h" #include "util/fptr_wlist.h" @@ -171,7 +171,7 @@ val_deinit(struct module_env* env, int id) static struct val_qstate* val_new(struct module_qstate* qstate, int id) { - struct val_qstate* vq = (struct val_qstate*)region_alloc( + struct val_qstate* vq = (struct val_qstate*)regional_alloc( qstate->region, sizeof(*vq)); log_assert(!qstate->minfo[id]); if(!vq) @@ -182,12 +182,12 @@ val_new(struct module_qstate* qstate, int id) if(!qstate->return_msg || qstate->return_rcode != LDNS_RCODE_NOERROR) { /* create a message to verify */ verbose(VERB_ALGO, "constructing reply for validation"); - vq->orig_msg = (struct dns_msg*)region_alloc(qstate->region, + vq->orig_msg = (struct dns_msg*)regional_alloc(qstate->region, sizeof(struct dns_msg)); if(!vq->orig_msg) return NULL; vq->orig_msg->qinfo = qstate->qinfo; - vq->orig_msg->rep = (struct reply_info*)region_alloc( + vq->orig_msg->rep = (struct reply_info*)regional_alloc( qstate->region, sizeof(struct reply_info)); if(!vq->orig_msg->rep) return NULL; @@ -200,11 +200,12 @@ val_new(struct module_qstate* qstate, int id) } vq->qchase = qstate->qinfo; /* chase reply will be an edited (sub)set of the orig msg rrset ptrs */ - vq->chase_reply = region_alloc_init(qstate->region, vq->orig_msg->rep, + vq->chase_reply = regional_alloc_init(qstate->region, + vq->orig_msg->rep, sizeof(struct reply_info) - sizeof(struct rrset_ref)); if(!vq->chase_reply) return NULL; - vq->chase_reply->rrsets = region_alloc_init(qstate->region, + vq->chase_reply->rrsets = regional_alloc_init(qstate->region, vq->orig_msg->rep->rrsets, sizeof(struct ub_packed_rrset_key*) * vq->orig_msg->rep->rrset_count); if(!vq->chase_reply->rrsets) @@ -1907,7 +1908,7 @@ process_ds_response(struct module_qstate* qstate, struct val_qstate* vq, return; } if(dske == NULL) { - vq->empty_DS_name = region_alloc_init(qstate->region, + vq->empty_DS_name = regional_alloc_init(qstate->region, qinfo->qname, qinfo->qname_len); if(!vq->empty_DS_name) { log_err("malloc failure in empty_DS_name");