Author: file
Date: Sat Apr  4 15:24:51 2015
New Revision: 433994

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433994
Log:
Tweak cancellation of a query set.

Next up is tests which cover this!

Modified:
    team/group/dns_pjsip/main/dns_query_set.c

Modified: team/group/dns_pjsip/main/dns_query_set.c
URL: 
http://svnview.digium.com/svn/asterisk/team/group/dns_pjsip/main/dns_query_set.c?view=diff&rev=433994&r1=433993&r2=433994
==============================================================================
--- team/group/dns_pjsip/main/dns_query_set.c (original)
+++ team/group/dns_pjsip/main/dns_query_set.c Sat Apr  4 15:24:51 2015
@@ -54,6 +54,8 @@
        AST_VECTOR(, struct dns_query_set_query) queries;
        /*! \brief The total number of completed queries */
        int queries_completed;
+       /*! \brief The total number of cancelled queries */
+       int queries_cancelled;
        /*! \brief Callback to invoke upon completion */
        ast_dns_query_set_callback callback;
        /*! \brief User-specific data */
@@ -111,7 +113,9 @@
        }
 
        /* All queries have been completed, invoke final callback */
-       query_set->callback(query_set);
+       if (query_set->queries_cancelled != query_set->queries_completed) {
+               query_set->callback(query_set);
+       }
 
        ao2_cleanup(query_set->user_data);
        query_set->user_data = NULL;
@@ -237,20 +241,24 @@
 
 int ast_dns_query_set_resolve_cancel(struct ast_dns_query_set *query_set)
 {
-       int res = 0, idx;
+       int idx;
 
        for (idx = 0; idx < AST_VECTOR_SIZE(&query_set->queries); ++idx) {
                struct dns_query_set_query *query = 
AST_VECTOR_GET_ADDR(&query_set->queries, idx);
 
                if (query->started) {
-                       res |= query->query->resolver->cancel(query->query);
+                       if (!query->query->resolver->cancel(query->query)) {
+                               
ast_atomic_fetchadd_int(&query_set->queries_cancelled, +1);
+                               dns_query_set_callback(query->query);
+                       }
+               } else {
+                       ast_atomic_fetchadd_int(&query_set->queries_cancelled, 
+1);
                }
-
-       }
-
-       if (!res) {
+       }
+
+       if (query_set->queries_cancelled == query_set->queries_completed) {
                dns_query_set_release(query_set);
        }
 
-       return res;
+       return (query_set->queries_cancelled == query_set->queries_completed) ? 
0 : -1;
 }


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to