typedef struct allocnode {
struct allocnode *next, *back;
+ size_t sz;
} allocnode;
union maxalign {
* 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
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));
}
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);
LIST_UNLINK(from->allocations,an);
LIST_LINK_TAIL(to->allocations,an);
- sz= MEM_ROUND(sz);
from->interim_allocd -= sz;
to->interim_allocd += sz;
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);