From: Mark Wooding Date: Sat, 7 Jun 2014 18:47:28 +0000 (+0100) Subject: src/: Track sizes of interim-allocated blocks. X-Git-Tag: adns-1.5.0-rc0~75 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=adns.git;a=commitdiff_plain;h=2edb1757691323cf8a54d6acd68251781a4df521;hp=3eb20edd4ef2a509a0ff7d3973f663e35f812ea7 src/: Track sizes of interim-allocated blocks. Now callers don't need to keep track of them by hand, which is annoying and fiddly. Signed-off-by: Mark Wooding --- diff --git a/src/internal.h b/src/internal.h index f25fe9c..7faa212 100644 --- a/src/internal.h +++ b/src/internal.h @@ -229,6 +229,7 @@ adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, typedef struct allocnode { struct allocnode *next, *back; + size_t sz; } allocnode; union maxalign { @@ -657,8 +658,7 @@ void *adns__alloc_preserved(adns_query qu, size_t sz); * answer->cname and answer->owner are _preserved. */ -void adns__transfer_interim(adns_query from, adns_query to, - void *block, size_t sz); +void adns__transfer_interim(adns_query from, adns_query to, void *block); /* Transfers an interim allocation from one query to another, so that * the `to' query will have room for the data when we get to makefinal * and so that the free will happen when the `to' query is freed diff --git a/src/query.c b/src/query.c index c32acba..c18ba8e 100644 --- a/src/query.c +++ b/src/query.c @@ -382,6 +382,7 @@ static void *alloc_common(adns_query qu, size_t sz) { an= malloc(MEM_ROUND(MEM_ROUND(sizeof(*an)) + sz)); if (!an) return 0; LIST_LINK_TAIL(qu->allocations,an); + an->sz= sz; return (byte*)an + MEM_ROUND(sizeof(*an)); } @@ -405,16 +406,24 @@ void *adns__alloc_preserved(adns_query qu, size_t sz) { return rv; } +static allocnode *alloc_info(adns_query qu, void *p, size_t *sz_r) { + allocnode *an; + + if (!p || p == qu) { *sz_r= 0; return 0; } + an= (allocnode *)((byte *)p - MEM_ROUND(sizeof(allocnode))); + *sz_r= MEM_ROUND(an->sz); + return an; +} + void *adns__alloc_mine(adns_query qu, size_t sz) { return alloc_common(qu,MEM_ROUND(sz)); } -void adns__transfer_interim(adns_query from, adns_query to, - void *block, size_t sz) { - allocnode *an; +void adns__transfer_interim(adns_query from, adns_query to, void *block) { + size_t sz; + allocnode *an= alloc_info(from, block, &sz); - if (!block) return; - an= (void*)((byte*)block - MEM_ROUND(sizeof(*an))); + if (!an) return; assert(!to->final_allocspace); assert(!from->final_allocspace); @@ -422,7 +431,6 @@ void adns__transfer_interim(adns_query from, adns_query to, LIST_UNLINK(from->allocations,an); LIST_LINK_TAIL(to->allocations,an); - sz= MEM_ROUND(sz); from->interim_allocd -= sz; to->interim_allocd += sz; diff --git a/src/types.c b/src/types.c index ac6b310..7cae881 100644 --- a/src/types.c +++ b/src/types.c @@ -514,13 +514,12 @@ static void icb_hostaddr(adns_query parent, adns_query child) { adns_rr_hostaddr *rrp= child->ctx.pinfo.hostaddr; adns_state ads= parent->ads; adns_status st; - size_t addrsz= gsz_addr(0, parent->answer->type); st= cans->status; rrp->astatus= st; rrp->naddrs= (st>0 && st<=adns_s_max_tempfail) ? -1 : cans->nrrs; rrp->addrs= cans->rrs.addr; - adns__transfer_interim(child, parent, rrp->addrs, rrp->naddrs*addrsz); + adns__transfer_interim(child, parent, rrp->addrs); if (parent->children.head) { LIST_LINK_TAIL(ads->childw,parent);