]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
fixup
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 18 Jun 2007 10:27:54 +0000 (10:27 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 18 Jun 2007 10:27:54 +0000 (10:27 +0000)
git-svn-id: file:///svn/unbound/trunk@392 be551aaa-1e26-0410-a405-d3ace91eadb9

daemon/worker.c
doc/Changelog
iterator/iterator.c
services/outside_network.c
services/outside_network.h
testcode/fake_event.c

index 011924fee8a443d9245d003c58213ff55373adf5..90801c61565f37b2533f99df7821462791d2967e 100644 (file)
@@ -878,6 +878,17 @@ worker_send_packet(ldns_buffer* pkt, struct sockaddr_storage* addr,
                worker->rndstate) != 0;
 }
 
+/** compare outbound entry qstates */
+static int
+outbound_entry_compare(void* a, void* b)
+{
+       struct outbound_entry* e1 = (struct outbound_entry*)a;
+       struct outbound_entry* e2 = (struct outbound_entry*)b;
+       if(e1->qstate == e2->qstate)
+               return 1;
+       return 0;
+}
+
 struct outbound_entry*
 worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
        uint16_t qclass, uint16_t flags, int dnssec,
@@ -891,7 +902,8 @@ worker_send_query(uint8_t* qname, size_t qnamelen, uint16_t qtype,
        e->qstate = q;
        e->qsent = outnet_serviced_query(worker->back, qname,
                qnamelen, qtype, qclass, flags, dnssec, addr, addrlen, 
-               worker_handle_service_reply, e, worker->back->udp_buff);
+               worker_handle_service_reply, e, worker->back->udp_buff,
+               &outbound_entry_compare);
        if(!e->qsent) {
                free(e);
                return NULL;
index 475e15839c0c27da32a048500228c3faf0b51370..9923f739776597c64f61d05131ac7e2b59da51c9 100644 (file)
@@ -1,3 +1,7 @@
+18 June 2007: Wouter
+       - same, move subqueries to slumber list when first has resolved.
+       - fixup last fix for duplicate callbacks.
+
 15 June 2007: Wouter
        - if a query asks to be notified of the same serviced query result
          multiple times, this will succeed. Only one callback will happen;
index f895f99ba18fa970d64959dff6dfba00e63c10dd..97538f1d88b55791ea388a76f0d0e7d1f5a27e42 100644 (file)
@@ -1072,6 +1072,10 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
                                iq->num_current_queries);
                return 0;
        }
+       /* move other targets to slumber list */
+       if(iq->num_target_queries>0) {
+               (*qstate->env->remove_subqueries)(qstate);
+       }
 
        /* We have a valid target. */
        log_nametypeclass(VERB_DETAIL, "sending query:", qstate->qinfo.qname, 
index 2e83417b7756e737479c3ee8e823972a8a442b3f..e79a0f9133b54dd32d2e874527231fc9aee66365 100644 (file)
@@ -1132,11 +1132,12 @@ serviced_udp_callback(struct comm_point* c, void* arg, int error,
 
 /** find callback in list */
 static struct service_callback*
-callback_list_find(struct serviced_query* sq, void* cb_arg)
+callback_list_find(struct serviced_query* sq, void* cb_arg, 
+       int (*arg_compare)(void*,void*))
 {
        struct service_callback* p;
        for(p = sq->cblist; p; p = p->next) {
-               if(p->cb_arg == cb_arg)
+               if(arg_compare(p->cb_arg, cb_arg))
                        return p;
        }
        return NULL;
@@ -1147,7 +1148,8 @@ outnet_serviced_query(struct outside_network* outnet,
        uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
        uint16_t flags, int dnssec, struct sockaddr_storage* addr,
        socklen_t addrlen, comm_point_callback_t* callback,
-       void* callback_arg, ldns_buffer* buff)
+       void* callback_arg, ldns_buffer* buff, 
+       int (*arg_compare)(void*,void*))
 {
        struct serviced_query* sq;
        struct service_callback* cb;
@@ -1155,7 +1157,7 @@ outnet_serviced_query(struct outside_network* outnet,
        sq = lookup_serviced(outnet, buff, dnssec, addr, addrlen);
        if(sq) {
                /* see if it is a duplicate notification request for cb_arg */
-               if((cb = callback_list_find(sq, callback_arg))) {
+               if((cb = callback_list_find(sq, callback_arg, arg_compare))) {
                        return sq;
                }
        }
index 45d0d2dae7953a7c4df810b8a3472ad550f81b17..fb4f1a43d07afe221bd5c58b28dd9106615644ab 100644 (file)
@@ -324,6 +324,8 @@ void pending_delete(struct outside_network* outnet, struct pending* p);
  * @param addr: to which server to send the query.
  * @param addrlen: length of addr.
  * @param buff: scratch buffer to create query contents in. Empty on exit.
+ * @param arg_compare: function to compare callback args, return true if 
+ *     identical. It is given the callback_arg and args that are listed.
  * @return 0 on error, or pointer to serviced query that is used to answer
  *     this serviced query may be shared with other callbacks as well.
  */
@@ -331,7 +333,8 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
        uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
        uint16_t flags, int dnssec, struct sockaddr_storage* addr, 
        socklen_t addrlen, comm_point_callback_t* callback, 
-       void* callback_arg, ldns_buffer* buff);
+       void* callback_arg, ldns_buffer* buff, 
+       int (*arg_compare)(void*,void*));
 
 /**
  * Remove service query callback.
index b336deaba1c4b443609864c661e3777fe32a584e..ade1e1091002646a64b770ca4f4e99a7df9610e4 100644 (file)
@@ -770,12 +770,14 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
         uint8_t* qname, size_t qnamelen, uint16_t qtype, uint16_t qclass,
        uint16_t flags, int dnssec, struct sockaddr_storage* addr,
        socklen_t addrlen, comm_point_callback_t* callback,
-       void* callback_arg, ldns_buffer* ATTR_UNUSED(buff))
+       void* callback_arg, ldns_buffer* ATTR_UNUSED(buff),
+       int (*arg_compare)(void*,void*))
 {
        struct replay_runtime* runtime = (struct replay_runtime*)outnet->base;
        struct fake_pending* pend = (struct fake_pending*)calloc(1,
                sizeof(struct fake_pending));
        ldns_status status;
+       (void)arg_compare;
        log_assert(pend);
 
        /* create packet with EDNS */