Author: file Date: Fri Mar 6 07:10:48 2015 New Revision: 432513 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432513 Log: Add a scheduler for recurring DNS queries.
Modified: team/group/dns/main/dns_core.c Modified: team/group/dns/main/dns_core.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_core.c?view=diff&rev=432513&r1=432512&r2=432513 ============================================================================== --- team/group/dns/main/dns_core.c (original) +++ team/group/dns/main/dns_core.c Fri Mar 6 07:10:48 2015 @@ -35,6 +35,7 @@ #include "asterisk/vector.h" #include "asterisk/astobj2.h" #include "asterisk/strings.h" +#include "asterisk/sched.h" #include "asterisk/dns_core.h" #include "asterisk/dns_naptr.h" #include "asterisk/dns_srv.h" @@ -45,6 +46,8 @@ #include <arpa/nameser.h> AST_RWLIST_HEAD_STATIC(resolvers, ast_dns_resolver); + +static struct ast_sched_context *sched; const char *ast_dns_query_get_name(const struct ast_dns_query *query) { @@ -447,6 +450,14 @@ query->callback(query); } +static void dns_shutdown(void) +{ + if (sched) { + ast_sched_context_destroy(sched); + sched = NULL; + } +} + int ast_dns_resolver_register(struct ast_dns_resolver *resolver) { struct ast_dns_resolver *iter; @@ -468,6 +479,27 @@ } AST_RWLIST_WRLOCK(&resolvers); + + /* On the first registration of a resolver start a scheduler for recurring queries */ + if (AST_LIST_EMPTY(&resolvers) && !sched) { + sched = ast_sched_context_create(); + if (!sched) { + ast_log(LOG_ERROR, "DNS resolver '%s' could not be registered: Failed to create scheduler for recurring DNS queries\n", + resolver->name); + AST_RWLIST_UNLOCK(&resolvers); + return -1; + } + + if (ast_sched_start_thread(sched)) { + ast_log(LOG_ERROR, "DNS resolver '%s' could not be registered: Failed to start thread for recurring DNS queries\n", + resolver->name); + dns_shutdown(); + AST_RWLIST_UNLOCK(&resolvers); + return -1; + } + + ast_register_cleanup(dns_shutdown); + } AST_LIST_TRAVERSE(&resolvers, iter, next) { if (!strcmp(iter->name, resolver->name)) { @@ -513,6 +545,11 @@ } } AST_RWLIST_TRAVERSE_SAFE_END; + + if (AST_LIST_EMPTY(&resolvers)) { + dns_shutdown(); + } + AST_RWLIST_UNLOCK(&resolvers); ast_verb(2, "Unregistered DNS resolver '%s'\n", resolver->name); -- _____________________________________________________________________ -- 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