aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_resolver.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-02-28 20:38:34 +0000
committerIgor Sysoev <igor@sysoev.ru>2008-02-28 20:38:34 +0000
commit4491daef308a52f611bde5b6a9f5fb85b21f8fa3 (patch)
tree0f9ec0cd3b8b5adfcc3b2fee9485a8cf8f39f5af /src/core/ngx_resolver.c
parent02aa53be8397f170f2db4b9039fe3e9fff933ca5 (diff)
downloadnginx-4491daef308a52f611bde5b6a9f5fb85b21f8fa3.tar.gz
nginx-4491daef308a52f611bde5b6a9f5fb85b21f8fa3.zip
cleanup resolver
Diffstat (limited to 'src/core/ngx_resolver.c')
-rw-r--r--src/core/ngx_resolver.c86
1 files changed, 79 insertions, 7 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index d3e6c43c1..eab57eb28 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -50,6 +50,8 @@ typedef struct {
ngx_int_t ngx_udp_connect(ngx_udp_connection_t *uc);
+static void ngx_resolver_cleanup(void *data);
+static void ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree);
static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r,
ngx_resolver_ctx_t *ctx);
static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree,
@@ -90,17 +92,27 @@ static void *ngx_resolver_dup(ngx_resolver_t *r, void *src, size_t size);
/* STUB: ngx_peer_addr_t * */
ngx_resolver_t *
-ngx_resolver_create(ngx_peer_addr_t *addr, ngx_log_t *log)
+ngx_resolver_create(ngx_pool_t *pool, ngx_peer_addr_t *addr)
{
ngx_resolver_t *r;
+ ngx_pool_cleanup_t *cln;
ngx_udp_connection_t *uc;
- r = ngx_calloc(sizeof(ngx_resolver_t), log);
+ cln = ngx_pool_cleanup_add(pool, 0);
+ if (cln == NULL) {
+ return NULL;
+ }
+
+ cln->handler = ngx_resolver_cleanup;
+
+ r = ngx_calloc(sizeof(ngx_resolver_t), pool->log);
if (r == NULL) {
return NULL;
}
- r->event = ngx_calloc(sizeof(ngx_event_t), log);
+ cln->data = r;
+
+ r->event = ngx_calloc(sizeof(ngx_event_t), pool->log);
if (r->event == NULL) {
return NULL;
}
@@ -119,18 +131,18 @@ ngx_resolver_create(ngx_peer_addr_t *addr, ngx_log_t *log)
r->event->handler = ngx_resolver_resend_handler;
r->event->data = r;
- r->event->log = log;
+ r->event->log = pool->log;
r->ident = -1;
r->resend_timeout = 5;
r->expire = 30;
r->valid = 300;
- r->log = log;
+ r->log = pool->log;
r->log_level = NGX_LOG_ALERT;
if (addr) {
- uc = ngx_calloc(sizeof(ngx_udp_connection_t), log);
+ uc = ngx_calloc(sizeof(ngx_udp_connection_t), pool->log);
if (uc == NULL) {
return NULL;
}
@@ -140,13 +152,72 @@ ngx_resolver_create(ngx_peer_addr_t *addr, ngx_log_t *log)
uc->sockaddr = addr->sockaddr;
uc->socklen = addr->socklen;
uc->server = addr->name;
- uc->log = log;
+ uc->log = pool->log;
}
return r;
}
+static void
+ngx_resolver_cleanup(void *data)
+{
+ ngx_resolver_t *r = data;
+
+ if (r) {
+ ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
+ "cleanup resolver");
+
+ ngx_resolver_cleanup_tree(r, &r->name_rbtree);
+
+ ngx_resolver_cleanup_tree(r, &r->addr_rbtree);
+
+ if (r->event) {
+ ngx_free(r->event);
+ }
+
+ if (r->udp_connection) {
+ if (r->udp_connection->connection) {
+ ngx_close_connection(r->udp_connection->connection);
+ }
+
+ ngx_free(r->udp_connection);
+ }
+
+ ngx_free(r);
+ }
+}
+
+
+static void
+ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree)
+{
+ ngx_resolver_ctx_t *ctx, *next;
+ ngx_resolver_node_t *rn;
+
+ while (tree->root != tree->sentinel) {
+
+ rn = (ngx_resolver_node_t *) ngx_rbtree_min(tree->root, tree->sentinel);
+
+ ngx_queue_remove(&rn->queue);
+
+ for (ctx = rn->waiting; ctx; ctx = next) {
+ next = ctx->next;
+
+ if (ctx->event) {
+ ngx_resolver_free(r, ctx->event);
+ }
+
+ ngx_resolver_free(r, ctx);
+ }
+
+ ngx_rbtree_delete(tree, &rn->node);
+
+ ngx_resolver_free_node(r, rn);
+ }
+}
+
+
ngx_resolver_ctx_t *
ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp)
{
@@ -707,6 +778,7 @@ ngx_resolver_send_query(ngx_resolver_t *r, ngx_resolver_node_t *rn)
uc->connection->data = r;
uc->connection->read->handler = ngx_resolver_read_response;
+ uc->connection->read->resolver = 1;
}
n = ngx_send(uc->connection, rn->query, rn->qlen);