query_simple(ads,qu, owner,ol, typei,flags, now);
}
adns__autosys(ads,now);
- adns__consistency(ads,qu,cc_entex);
+ adns__returning(ads,qu);
return 0;
x_adnsfail:
adns__query_fail(qu,stat);
- adns__consistency(ads,qu,cc_entex);
+ adns__returning(ads,qu);
return 0;
x_errno:
r= errno;
assert(r);
- adns__consistency(ads,0,cc_entex);
+ adns__returning(ads,0);
return r;
}
for (cqu= qu->children.head; cqu; cqu= ncqu) {
ncqu= cqu->siblings.next;
- adns_cancel(cqu);
+ adns__cancel(cqu);
}
}
qu->query_dgram= 0;
}
-void adns_cancel(adns_query qu) {
+void adns__returning(adns_state ads, adns_query qu_for_caller) {
+ while (ads->intdone.head) {
+ adns_query iq= ads->intdone.head;
+ adns_query parent= iq->parent;
+ LIST_UNLINK_PART(parent->children,iq,siblings.);
+ LIST_UNLINK(iq->ads->childw,parent);
+ LIST_UNLINK(ads->intdone,iq);
+ iq->ctx.callback(parent,iq);
+ free_query_allocs(iq);
+ free(iq->answer);
+ free(iq);
+ }
+ adns__consistency(ads,qu_for_caller,cc_entex);
+}
+
+void adns__cancel(adns_query qu) {
adns_state ads;
ads= qu->ads;
- adns__consistency(ads,qu,cc_entex);
+ adns__consistency(ads,qu,cc_freq);
if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.);
switch (qu->state) {
case query_tosend:
LIST_UNLINK(ads->childw,qu);
break;
case query_done:
- LIST_UNLINK(ads->output,qu);
+ if (qu->parent)
+ LIST_UNLINK(ads->intdone,qu);
+ else
+ LIST_UNLINK(ads->output,qu);
break;
default:
abort();
free_query_allocs(qu);
free(qu->answer);
free(qu);
- adns__consistency(ads,0,cc_entex);
+}
+
+void adns_cancel(adns_query qu) {
+ adns_state ads;
+
+ assert(!qu->parent);
+ ads= qu->ads;
+ adns__consistency(ads,qu,cc_entex);
+ adns__cancel(qu);
+ adns__returning(ads,0);
}
void adns__update_expires(adns_query qu, unsigned long ttl,
}
void adns__query_done(adns_query qu) {
+ adns_state ads=qu->ads;
adns_answer *ans;
- adns_query parent;
adns__cancel_children(qu);
}
ans->expires= qu->expires;
- parent= qu->parent;
- if (parent) {
- LIST_UNLINK_PART(parent->children,qu,siblings.);
- LIST_UNLINK(qu->ads->childw,parent);
- qu->ctx.callback(parent,qu);
- free_query_allocs(qu);
- free(qu->answer);
- free(qu);
+ qu->state= query_done;
+ if (qu->parent) {
+ LIST_LINK_TAIL(ads->intdone,qu);
} else {
makefinal_query(qu);
LIST_LINK_TAIL(qu->ads->output,qu);
- qu->state= query_done;
}
}