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