chiark
/
gitweb
/
~mdw
/
adns
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Reentrancy: Introduce adns__cancel
[adns]
/
src
/
query.c
diff --git
a/src/query.c
b/src/query.c
index ebbfd53a135416ea7b6575121b846a67d8c8f6ab..08085342283a8faa5537316270b156ff99ac482b 100644
(file)
--- 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);
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,
}
adns_status adns__ckl_hostname(adns_state ads, adns_queryflags flags,
@@
-148,6
+148,7
@@
static adns_status check_domain_name(adns_state ads, adns_queryflags flags,
}
adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
}
adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
+ adns_query parent,
const typeinfo *typei, adns_rrtype type,
vbuf *qumsg_vb, int id,
adns_queryflags flags, struct timeval now,
const typeinfo *typei, adns_rrtype type,
vbuf *qumsg_vb, int id,
adns_queryflags flags, struct timeval now,
@@
-161,6
+162,8
@@
adns_status adns__internal_submit(adns_state ads, adns_query *query_r,
if (!qu) { err = adns_s_nomemory; goto x_err; }
*query_r= qu;
if (!qu) { err = adns_s_nomemory; goto x_err; }
*query_r= qu;
+ qu->parent= parent;
+ LIST_LINK_TAIL_PART(parent->children,qu,siblings.);
memcpy(&qu->ctx,ctx,sizeof(qu->ctx));
query_submit(ads,qu, typei,qumsg_vb,id,flags,now);
memcpy(&qu->ctx,ctx,sizeof(qu->ctx));
query_submit(ads,qu, typei,qumsg_vb,id,flags,now);
@@
-309,18
+312,18
@@
int adns_submit(adns_state ads,
query_simple(ads,qu, owner,ol, typei,flags, now);
}
adns__autosys(ads,now);
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);
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);
return 0;
x_errno:
r= errno;
assert(r);
- adns__
consistency(ads,0,cc_entex
);
+ adns__
returning(ads,0
);
return r;
}
return r;
}
@@
-464,18
+467,18
@@
void *adns__alloc_final(adns_query qu, size_t sz) {
return rp;
}
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) {
ncqu= cqu->siblings.next;
adns_query cqu, ncqu;
for (cqu= qu->children.head; cqu; cqu= ncqu) {
ncqu= cqu->siblings.next;
- adns_cancel(cqu);
+ adns_
_
cancel(cqu);
}
}
void adns__reset_preserved(adns_query qu) {
assert(!qu->final_allocspace);
}
}
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;
qu->answer->nrrs= 0;
qu->answer->rrs.untyped= 0;
qu->interim_allocd= qu->preserved_allocd;
@@
-484,7
+487,7
@@
void adns__reset_preserved(adns_query qu) {
static void free_query_allocs(adns_query qu) {
allocnode *an, *ann;
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);
for (an= qu->allocations.head; an; an= ann) { ann= an->next; free(an); }
LIST_INIT(qu->allocations);
adns__vbuf_free(&qu->vb);
@@
-493,11
+496,15
@@
static void free_query_allocs(adns_query qu) {
qu->query_dgram= 0;
}
qu->query_dgram= 0;
}
-void adns_cancel(adns_query qu) {
+void adns__returning(adns_state ads, adns_query qu_for_caller) {
+ adns__consistency(ads,qu_for_caller,cc_entex);
+}
+
+void adns__cancel(adns_query qu) {
adns_state ads;
ads= qu->ads;
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:
if (qu->parent) LIST_UNLINK_PART(qu->parent->children,qu,siblings.);
switch (qu->state) {
case query_tosend:
@@
-518,7
+525,16
@@
void adns_cancel(adns_query qu) {
free_query_allocs(qu);
free(qu->answer);
free(qu);
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__update_expires(adns_query qu, unsigned long ttl,
@@
-572,7
+588,7
@@
void adns__query_done(adns_query qu) {
adns_answer *ans;
adns_query parent;
adns_answer *ans;
adns_query parent;
- cancel_children(qu);
+
adns__
cancel_children(qu);
qu->id= -1;
ans= qu->answer;
qu->id= -1;
ans= qu->answer;