comparison src/core/ngx_resolver.c @ 7298:f37d8fb25de5

Resolver: allocate resolver from configuration pool. Before 4a8c9139e579, ngx_resolver_create() didn't use configuration pool, and allocations were done using malloc(). In 016352c19049, when resolver gained support of several servers, new allocations were done from the pool.
author Ruslan Ermilov <ru@nginx.com>
date Wed, 13 Jun 2018 22:37:42 +0300
parents 91ea68dd1501
children faf14dc9ab4d
comparison
equal deleted inserted replaced
7297:a10e5fe44762 7298:f37d8fb25de5
139 ngx_uint_t i, j; 139 ngx_uint_t i, j;
140 ngx_resolver_t *r; 140 ngx_resolver_t *r;
141 ngx_pool_cleanup_t *cln; 141 ngx_pool_cleanup_t *cln;
142 ngx_resolver_connection_t *rec; 142 ngx_resolver_connection_t *rec;
143 143
144 r = ngx_pcalloc(cf->pool, sizeof(ngx_resolver_t));
145 if (r == NULL) {
146 return NULL;
147 }
148
149 r->event = ngx_pcalloc(cf->pool, sizeof(ngx_event_t));
150 if (r->event == NULL) {
151 return NULL;
152 }
153
144 cln = ngx_pool_cleanup_add(cf->pool, 0); 154 cln = ngx_pool_cleanup_add(cf->pool, 0);
145 if (cln == NULL) { 155 if (cln == NULL) {
146 return NULL; 156 return NULL;
147 } 157 }
148 158
149 cln->handler = ngx_resolver_cleanup; 159 cln->handler = ngx_resolver_cleanup;
150
151 r = ngx_calloc(sizeof(ngx_resolver_t), cf->log);
152 if (r == NULL) {
153 return NULL;
154 }
155
156 cln->data = r; 160 cln->data = r;
157
158 r->event = ngx_calloc(sizeof(ngx_event_t), cf->log);
159 if (r->event == NULL) {
160 return NULL;
161 }
162 161
163 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel, 162 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel,
164 ngx_resolver_rbtree_insert_value); 163 ngx_resolver_rbtree_insert_value);
165 164
166 ngx_rbtree_init(&r->srv_rbtree, &r->srv_sentinel, 165 ngx_rbtree_init(&r->srv_rbtree, &r->srv_sentinel,
286 ngx_resolver_t *r = data; 285 ngx_resolver_t *r = data;
287 286
288 ngx_uint_t i; 287 ngx_uint_t i;
289 ngx_resolver_connection_t *rec; 288 ngx_resolver_connection_t *rec;
290 289
291 if (r) { 290 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "cleanup resolver");
292 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, 291
293 "cleanup resolver"); 292 ngx_resolver_cleanup_tree(r, &r->name_rbtree);
294 293
295 ngx_resolver_cleanup_tree(r, &r->name_rbtree); 294 ngx_resolver_cleanup_tree(r, &r->srv_rbtree);
296 295
297 ngx_resolver_cleanup_tree(r, &r->srv_rbtree); 296 ngx_resolver_cleanup_tree(r, &r->addr_rbtree);
298 297
299 ngx_resolver_cleanup_tree(r, &r->addr_rbtree); 298 #if (NGX_HAVE_INET6)
300 299 ngx_resolver_cleanup_tree(r, &r->addr6_rbtree);
301 #if (NGX_HAVE_INET6) 300 #endif
302 ngx_resolver_cleanup_tree(r, &r->addr6_rbtree); 301
303 #endif 302 if (r->event->timer_set) {
304 303 ngx_del_timer(r->event);
305 if (r->event) { 304 }
306 if (r->event->timer_set) { 305
307 ngx_del_timer(r->event); 306 rec = r->connections.elts;
308 } 307
309 308 for (i = 0; i < r->connections.nelts; i++) {
310 ngx_free(r->event); 309 if (rec[i].udp) {
311 } 310 ngx_close_connection(rec[i].udp);
312 311 }
313 312
314 rec = r->connections.elts; 313 if (rec[i].tcp) {
315 314 ngx_close_connection(rec[i].tcp);
316 for (i = 0; i < r->connections.nelts; i++) { 315 }
317 if (rec[i].udp) { 316
318 ngx_close_connection(rec[i].udp); 317 if (rec[i].read_buf) {
319 } 318 ngx_resolver_free(r, rec[i].read_buf->start);
320 319 ngx_resolver_free(r, rec[i].read_buf);
321 if (rec[i].tcp) { 320 }
322 ngx_close_connection(rec[i].tcp); 321
323 } 322 if (rec[i].write_buf) {
324 323 ngx_resolver_free(r, rec[i].write_buf->start);
325 if (rec[i].read_buf) { 324 ngx_resolver_free(r, rec[i].write_buf);
326 ngx_resolver_free(r, rec[i].read_buf->start); 325 }
327 ngx_resolver_free(r, rec[i].read_buf);
328 }
329
330 if (rec[i].write_buf) {
331 ngx_resolver_free(r, rec[i].write_buf->start);
332 ngx_resolver_free(r, rec[i].write_buf);
333 }
334 }
335
336 ngx_free(r);
337 } 326 }
338 } 327 }
339 328
340 329
341 static void 330 static void