Author: file
Date: Fri Apr  3 08:12:51 2015
New Revision: 433965

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433965
Log:
Fix up cancellation behavior and some reference counting.

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=433965&r1=433964&r2=433965
==============================================================================
--- team/group/dns_pjsip/main/dns_query_set.c (original)
+++ team/group/dns_pjsip/main/dns_query_set.c Fri Apr  3 08:12:51 2015
@@ -40,10 +40,18 @@
 #include "asterisk/dns_internal.h"
 #include "asterisk/dns_resolver.h"
 
+/*! \brief A DNS query, which includes its state */
+struct dns_query_set_query {
+       /*! \brief Whether the query started successfully or not */
+       unsigned int started;
+       /*! \brief THe query itself */
+       struct ast_dns_query *query;
+};
+
 /*! \brief A set of DNS queries */
 struct ast_dns_query_set {
        /*! \brief DNS queries */
-       AST_VECTOR(, struct ast_dns_query *) queries;
+       AST_VECTOR(, struct dns_query_set_query) queries;
        /*! \brief The total number of completed queries */
        int queries_completed;
        /*! \brief Callback to invoke upon completion */
@@ -52,19 +60,26 @@
        void *user_data;
 };
 
+/*! \brief Release all queries held in a query set */
+static void dns_query_set_release(struct ast_dns_query_set *query_set)
+{
+       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);
+
+               ao2_ref(query->query, -1);
+       }
+
+       AST_VECTOR_FREE(&query_set->queries);
+}
+
 /*! \brief Destructor for DNS query set */
 static void dns_query_set_destroy(void *data)
 {
        struct ast_dns_query_set *query_set = data;
-       int idx;
-
-       for (idx = 0; idx < AST_VECTOR_SIZE(&query_set->queries); ++idx) {
-               struct ast_dns_query *query = 
AST_VECTOR_GET(&query_set->queries, idx);
-
-               ao2_ref(query, -1);
-       }
-       AST_VECTOR_FREE(&query_set->queries);
-
+
+       dns_query_set_release(query_set);
        ao2_cleanup(query_set->user_data);
 }
 
@@ -100,14 +115,18 @@
 
        ao2_cleanup(query_set->user_data);
        query_set->user_data = NULL;
+
+       dns_query_set_release(query_set);
 }
 
 int ast_dns_query_set_add(struct ast_dns_query_set *query_set, const char 
*name, int rr_type, int rr_class)
 {
-       struct ast_dns_query *query;
-
-       query = dns_query_alloc(name, rr_type, rr_class, 
dns_query_set_callback, query_set);
-       if (!query) {
+       struct dns_query_set_query query = {
+               .started = 0,
+       };
+
+       query.query = dns_query_alloc(name, rr_type, rr_class, 
dns_query_set_callback, query_set);
+       if (!query.query) {
                return -1;
        }
 
@@ -133,7 +152,7 @@
                return NULL;
        }
 
-       return AST_VECTOR_GET(&query_set->queries, index);
+       return AST_VECTOR_GET_ADDR(&query_set->queries, index)->query;
 }
 
 void *ast_dns_query_set_get_data(const struct ast_dns_query_set *query_set)
@@ -149,13 +168,14 @@
        query_set->user_data = ao2_bump(data);
 
        for (idx = 0; idx < AST_VECTOR_SIZE(&query_set->queries); ++idx) {
-               struct ast_dns_query *query = 
AST_VECTOR_GET(&query_set->queries, idx);
-
-               if (!query->resolver->resolve(query)) {
+               struct dns_query_set_query *query = 
AST_VECTOR_GET_ADDR(&query_set->queries, idx);
+
+               if (!query->query->resolver->resolve(query->query)) {
+                       query->started = 1;
                        continue;
                }
 
-               dns_query_set_callback(query);
+               dns_query_set_callback(query->query);
        }
 }
 
@@ -220,10 +240,17 @@
        int res = 0, idx;
 
        for (idx = 0; idx < AST_VECTOR_SIZE(&query_set->queries); ++idx) {
-               struct ast_dns_query *query = 
AST_VECTOR_GET(&query_set->queries, idx);
-
-               res |= query->resolver->cancel(query);
+               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 (!res) {
+               dns_query_set_release(query_set);
        }
 
        return res;
-}
+}


-- 
_____________________________________________________________________
-- 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