comparison src/core/ngx_resolver.c @ 1906:4a8c9139e579

cleanup resolver
author Igor Sysoev <igor@sysoev.ru>
date Thu, 28 Feb 2008 20:38:34 +0000
parents 538f06aa8118
children c0f873458e2b
comparison
equal deleted inserted replaced
1905:0cafbfd8112e 1906:4a8c9139e579
48 48
49 49
50 ngx_int_t ngx_udp_connect(ngx_udp_connection_t *uc); 50 ngx_int_t ngx_udp_connect(ngx_udp_connection_t *uc);
51 51
52 52
53 static void ngx_resolver_cleanup(void *data);
54 static void ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree);
53 static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r, 55 static ngx_int_t ngx_resolve_name_locked(ngx_resolver_t *r,
54 ngx_resolver_ctx_t *ctx); 56 ngx_resolver_ctx_t *ctx);
55 static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree, 57 static void ngx_resolver_expire(ngx_resolver_t *r, ngx_rbtree_t *tree,
56 ngx_queue_t *queue); 58 ngx_queue_t *queue);
57 static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r, 59 static ngx_int_t ngx_resolver_send_query(ngx_resolver_t *r,
88 90
89 91
90 /* STUB: ngx_peer_addr_t * */ 92 /* STUB: ngx_peer_addr_t * */
91 93
92 ngx_resolver_t * 94 ngx_resolver_t *
93 ngx_resolver_create(ngx_peer_addr_t *addr, ngx_log_t *log) 95 ngx_resolver_create(ngx_pool_t *pool, ngx_peer_addr_t *addr)
94 { 96 {
95 ngx_resolver_t *r; 97 ngx_resolver_t *r;
98 ngx_pool_cleanup_t *cln;
96 ngx_udp_connection_t *uc; 99 ngx_udp_connection_t *uc;
97 100
98 r = ngx_calloc(sizeof(ngx_resolver_t), log); 101 cln = ngx_pool_cleanup_add(pool, 0);
102 if (cln == NULL) {
103 return NULL;
104 }
105
106 cln->handler = ngx_resolver_cleanup;
107
108 r = ngx_calloc(sizeof(ngx_resolver_t), pool->log);
99 if (r == NULL) { 109 if (r == NULL) {
100 return NULL; 110 return NULL;
101 } 111 }
102 112
103 r->event = ngx_calloc(sizeof(ngx_event_t), log); 113 cln->data = r;
114
115 r->event = ngx_calloc(sizeof(ngx_event_t), pool->log);
104 if (r->event == NULL) { 116 if (r->event == NULL) {
105 return NULL; 117 return NULL;
106 } 118 }
107 119
108 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel, 120 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel,
117 ngx_queue_init(&r->name_expire_queue); 129 ngx_queue_init(&r->name_expire_queue);
118 ngx_queue_init(&r->addr_expire_queue); 130 ngx_queue_init(&r->addr_expire_queue);
119 131
120 r->event->handler = ngx_resolver_resend_handler; 132 r->event->handler = ngx_resolver_resend_handler;
121 r->event->data = r; 133 r->event->data = r;
122 r->event->log = log; 134 r->event->log = pool->log;
123 r->ident = -1; 135 r->ident = -1;
124 136
125 r->resend_timeout = 5; 137 r->resend_timeout = 5;
126 r->expire = 30; 138 r->expire = 30;
127 r->valid = 300; 139 r->valid = 300;
128 140
129 r->log = log; 141 r->log = pool->log;
130 r->log_level = NGX_LOG_ALERT; 142 r->log_level = NGX_LOG_ALERT;
131 143
132 if (addr) { 144 if (addr) {
133 uc = ngx_calloc(sizeof(ngx_udp_connection_t), log); 145 uc = ngx_calloc(sizeof(ngx_udp_connection_t), pool->log);
134 if (uc == NULL) { 146 if (uc == NULL) {
135 return NULL; 147 return NULL;
136 } 148 }
137 149
138 r->udp_connection = uc; 150 r->udp_connection = uc;
139 151
140 uc->sockaddr = addr->sockaddr; 152 uc->sockaddr = addr->sockaddr;
141 uc->socklen = addr->socklen; 153 uc->socklen = addr->socklen;
142 uc->server = addr->name; 154 uc->server = addr->name;
143 uc->log = log; 155 uc->log = pool->log;
144 } 156 }
145 157
146 return r; 158 return r;
159 }
160
161
162 static void
163 ngx_resolver_cleanup(void *data)
164 {
165 ngx_resolver_t *r = data;
166
167 if (r) {
168 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
169 "cleanup resolver");
170
171 ngx_resolver_cleanup_tree(r, &r->name_rbtree);
172
173 ngx_resolver_cleanup_tree(r, &r->addr_rbtree);
174
175 if (r->event) {
176 ngx_free(r->event);
177 }
178
179 if (r->udp_connection) {
180 if (r->udp_connection->connection) {
181 ngx_close_connection(r->udp_connection->connection);
182 }
183
184 ngx_free(r->udp_connection);
185 }
186
187 ngx_free(r);
188 }
189 }
190
191
192 static void
193 ngx_resolver_cleanup_tree(ngx_resolver_t *r, ngx_rbtree_t *tree)
194 {
195 ngx_resolver_ctx_t *ctx, *next;
196 ngx_resolver_node_t *rn;
197
198 while (tree->root != tree->sentinel) {
199
200 rn = (ngx_resolver_node_t *) ngx_rbtree_min(tree->root, tree->sentinel);
201
202 ngx_queue_remove(&rn->queue);
203
204 for (ctx = rn->waiting; ctx; ctx = next) {
205 next = ctx->next;
206
207 if (ctx->event) {
208 ngx_resolver_free(r, ctx->event);
209 }
210
211 ngx_resolver_free(r, ctx);
212 }
213
214 ngx_rbtree_delete(tree, &rn->node);
215
216 ngx_resolver_free_node(r, rn);
217 }
147 } 218 }
148 219
149 220
150 ngx_resolver_ctx_t * 221 ngx_resolver_ctx_t *
151 ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp) 222 ngx_resolve_start(ngx_resolver_t *r, ngx_resolver_ctx_t *temp)
705 return NGX_ERROR; 776 return NGX_ERROR;
706 } 777 }
707 778
708 uc->connection->data = r; 779 uc->connection->data = r;
709 uc->connection->read->handler = ngx_resolver_read_response; 780 uc->connection->read->handler = ngx_resolver_read_response;
781 uc->connection->read->resolver = 1;
710 } 782 }
711 783
712 n = ngx_send(uc->connection, rn->query, rn->qlen); 784 n = ngx_send(uc->connection, rn->query, rn->qlen);
713 785
714 if (n == -1) { 786 if (n == -1) {