Mercurial > hg > nginx
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) { |