X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fquery.c;h=a5882f3ec5f19c6b6994e7095750bd4afbe39a15;hb=e2fec10fdb9e1052965b7b37187e89a8b1db7073;hp=c32acbacf2cec16303c9528d7035bbfbed451478;hpb=60b40c591fd6136f91f7119383c34524279b7f1b;p=adns.git diff --git a/src/query.c b/src/query.c index c32acba..a5882f3 100644 --- a/src/query.c +++ b/src/query.c @@ -104,8 +104,8 @@ static void query_submit(adns_state ads, adns_query qu, qu->id= id; qu->query_dglen= qu->vb.used; memcpy(qu->query_dgram,qu->vb.buf,qu->vb.used); - - adns__query_send(qu,now); + + typei->query_send(qu,now); } adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags, @@ -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,35 @@ 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__free_interim(adns_query qu, void *p) { + size_t sz; + allocnode *an= alloc_info(qu, p, &sz); + + if (!an) return; + assert(!qu->final_allocspace); + LIST_UNLINK(qu->allocations, an); + free(an); + qu->interim_allocd -= sz; +} + 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 +442,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; @@ -445,7 +464,7 @@ void *adns__alloc_final(adns_query qu, size_t sz) { return rp; } -static void cancel_children(adns_query qu) { +void adns__cancel_children(adns_query qu) { adns_query cqu, ncqu; for (cqu= qu->children.head; cqu; cqu= ncqu) { @@ -456,7 +475,7 @@ static void cancel_children(adns_query qu) { void adns__reset_preserved(adns_query qu) { assert(!qu->final_allocspace); - cancel_children(qu); + adns__cancel_children(qu); qu->answer->nrrs= 0; qu->answer->rrs.untyped= 0; qu->interim_allocd= qu->preserved_allocd; @@ -465,7 +484,7 @@ void adns__reset_preserved(adns_query qu) { static void free_query_allocs(adns_query qu) { allocnode *an, *ann; - cancel_children(qu); + adns__cancel_children(qu); for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); } LIST_INIT(qu->allocations); adns__vbuf_free(&qu->vb); @@ -553,7 +572,7 @@ void adns__query_done(adns_query qu) { adns_answer *ans; adns_query parent; - cancel_children(qu); + adns__cancel_children(qu); qu->id= -1; ans= qu->answer;