Mercurial > hg > nginx
comparison src/event/ngx_event_accept.c @ 248:e885208c518b
nginx-0.0.2-2004-02-03-00:19:52 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 02 Feb 2004 21:19:52 +0000 |
parents | 008276b9e061 |
children | b6793bc5034b |
comparison
equal
deleted
inserted
replaced
247:008276b9e061 | 248:e885208c518b |
---|---|
21 ngx_connection_t *c, *ls; | 21 ngx_connection_t *c, *ls; |
22 ngx_event_conf_t *ecf; | 22 ngx_event_conf_t *ecf; |
23 | 23 |
24 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); | 24 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); |
25 | 25 |
26 if (ngx_event_flags & (NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) { | |
27 ev->available = 1; | |
28 | |
29 } else if (!(ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)) { | |
30 ev->available = ecf->multi_accept; | |
31 } | |
32 | |
26 ls = ev->data; | 33 ls = ev->data; |
27 | 34 |
28 ngx_log_debug(ev->log, "accept on %s ready: %d" _ | 35 ngx_log_debug(ev->log, "accept on %s ready: %d" _ |
29 ls->listening->addr_text.data _ | 36 ls->listening->addr_text.data _ |
30 ev->available); | 37 ev->available); |
31 | 38 |
32 ev->ready = 0; | 39 ev->ready = 0; |
33 accepted = 0; | 40 accepted = 0; |
41 pool = NULL; | |
34 | 42 |
35 do { | 43 do { |
36 | 44 |
37 /* | 45 if (pool == NULL) { |
38 * Create the pool before accept() to avoid copy the sockaddr. | 46 |
39 * Although accept() can fail it's an uncommon case | 47 /* |
40 * and besides the pool can be got from the free pool list | 48 * Create the pool before accept() to avoid copy the sockaddr. |
41 */ | 49 * Although accept() can fail it's an uncommon case |
42 | 50 * and besides the pool can be got from the free pool list |
43 if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { | 51 */ |
44 return; | 52 |
53 if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { | |
54 return; | |
55 } | |
45 } | 56 } |
46 | 57 |
47 if (!(sa = ngx_palloc(pool, ls->listening->socklen))) { | 58 if (!(sa = ngx_palloc(pool, ls->listening->socklen))) { |
59 ngx_destroy_pool(pool); | |
48 return; | 60 return; |
49 } | 61 } |
50 | 62 |
51 if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) { | 63 if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) { |
52 return; | 64 ngx_destroy_pool(pool); |
53 } | 65 return; |
66 } | |
67 | |
54 ngx_memcpy(log, ls->log, sizeof(ngx_log_t)); | 68 ngx_memcpy(log, ls->log, sizeof(ngx_log_t)); |
55 pool->log = log; | 69 pool->log = log; |
56 | 70 |
57 log->data = ls->listening->addr_text.data; | 71 log->data = ls->listening->addr_text.data; |
58 log->handler = ngx_accept_log_error; | 72 log->handler = ngx_accept_log_error; |
65 | 79 |
66 if (err == NGX_EAGAIN) { | 80 if (err == NGX_EAGAIN) { |
67 ngx_log_error(NGX_LOG_NOTICE, log, err, | 81 ngx_log_error(NGX_LOG_NOTICE, log, err, |
68 "EAGAIN after %d accepted connection(s)", | 82 "EAGAIN after %d accepted connection(s)", |
69 accepted); | 83 accepted); |
84 | |
85 ngx_destroy_pool(pool); | |
70 return; | 86 return; |
71 } | 87 } |
72 | 88 |
73 ngx_log_error(NGX_LOG_ALERT, ev->log, err, | 89 ngx_log_error(NGX_LOG_ALERT, ev->log, err, |
74 "accept() on %s failed", | 90 "accept() on %s failed", |
75 ls->listening->addr_text.data); | 91 ls->listening->addr_text.data); |
92 | |
93 if (err == NGX_ECONNABORTED) { | |
94 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | |
95 ev->available--; | |
96 } | |
97 | |
98 if (ev->available) { | |
99 /* reuse the previously allocated pool */ | |
100 continue; | |
101 } | |
102 } | |
76 | 103 |
77 ngx_destroy_pool(pool); | 104 ngx_destroy_pool(pool); |
78 return; | 105 return; |
79 } | 106 } |
80 | 107 |
185 c->unexpected_eof = 1; | 212 c->unexpected_eof = 1; |
186 | 213 |
187 wev->write = 1; | 214 wev->write = 1; |
188 wev->ready = 1; | 215 wev->ready = 1; |
189 | 216 |
190 if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) { | 217 if (ngx_event_flags |
191 /* aio, iocp, epoll */ | 218 & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) |
219 { | |
220 /* aio, iocp, sigio, epoll */ | |
192 rev->ready = 1; | 221 rev->ready = 1; |
193 } | 222 } |
194 | 223 |
195 if (ev->deferred_accept) { | 224 if (ev->deferred_accept) { |
196 rev->ready = 1; | 225 rev->ready = 1; |
227 ngx_destroy_pool(pool); | 256 ngx_destroy_pool(pool); |
228 return; | 257 return; |
229 } | 258 } |
230 } | 259 } |
231 | 260 |
261 pool = NULL; | |
262 | |
232 log->data = NULL; | 263 log->data = NULL; |
233 log->handler = NULL; | 264 log->handler = NULL; |
234 | 265 |
235 ls->listening->handler(c); | 266 ls->listening->handler(c); |
236 | 267 |