chiark / gitweb /
Reentrancy: adns__internal_submit does list handling
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 12 Oct 2014 20:10:23 +0000 (21:10 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 13 Oct 2014 13:01:05 +0000 (14:01 +0100)
Move the formulaic queue management from the call sites to
adns__internal_submit.  The requirement to do this wasn't mentioned in
adns__internal_submit's comment, and now that it's not there it
probably isn't worth remarking on.

No ultimate functional change.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
Conflicts:
src/types.c

src/internal.h
src/query.c
src/types.c

index 3ea8a934426bb3e576944a169f981c88eb5854e8..658fded0fa3531a556d3ba904997e78c61dbce9d 100644 (file)
@@ -610,6 +610,7 @@ void adns__query_send(adns_query qu, struct timeval now);
 /* From query.c: */
 
 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,
index a5882f3ec5f19c6b6994e7095750bd4afbe39a15..6a1ec75ffd8df3b0d838793d8c6b0e1a76736e2b 100644 (file)
@@ -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_query parent,
                                  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;
 
+  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);
   
index 048e4ddb39584246881354ae9b194bfc112fd9ec..d53fe3e05bdc4b5ccf2fcab58aa609eeb67a0f24 100644 (file)
@@ -560,13 +560,11 @@ static void addr_subqueries(adns_query qu, struct timeval now,
     err= adns__mkquery_frdgram(qu->ads, &qu->vb, &id, qd_dgram,qd_dglen,
                               DNS_HDRSIZE, addr_all_rrtypes[i], qf);
     if (err) goto x_error;
-    err= adns__internal_submit(qu->ads, &cqu, &tinfo_addrsub,
+    err= adns__internal_submit(qu->ads, &cqu, qu, &tinfo_addrsub,
                               addr_all_rrtypes[i] | qtf,
                               &qu->vb, id, qf, now, &ctx);
     if (err) goto x_error;
     cqu->answer->rrsz= qu->answer->rrsz;
-    cqu->parent= qu;
-    LIST_LINK_TAIL_PART(qu->children, cqu,siblings.);
   }
   qu->state= query_childw;
   LIST_LINK_TAIL(qu->ads->childw, qu);
@@ -600,12 +598,10 @@ static adns_status addr_submit(adns_query parent, adns_query *query_r,
 
   ctx->tinfo.addr.want= want;
   ctx->tinfo.addr.have= 0;
-  err= adns__internal_submit(ads, &qu, adns__findtype(adns_r_addr),
+  err= adns__internal_submit(ads, &qu, parent, adns__findtype(adns_r_addr),
                             type, qumsg_vb, id, flags, now, ctx);
   if (err) return err;
 
-  qu->parent= parent;
-  LIST_LINK_TAIL_PART(parent->children, qu, siblings.);
   *query_r= qu;
   return adns_s_ok;
 }
@@ -1210,13 +1206,12 @@ static adns_status pa_ptr(const parseinfo *pai, int dmstart,
   ctx.callback= icb_ptr;
   memset(&ctx.pinfo,0,sizeof(ctx.pinfo));
   memset(&ctx.tinfo,0,sizeof(ctx.tinfo));
-  st= adns__internal_submit(pai->ads, &nqu, adns__findtype(rrtype),
+  st= adns__internal_submit(pai->ads, &nqu, pai->qu,
+                           adns__findtype(rrtype),
                            rrtype, &pai->qu->vb, id,
                            adns_qf_quoteok_query, pai->now, &ctx);
   if (st) return st;
 
-  nqu->parent= pai->qu;
-  LIST_LINK_TAIL_PART(pai->qu->children,nqu,siblings.);
   return adns_s_ok;
 }