comparison src/event/ngx_event_accept.c @ 236:c982febb7588 NGINX_0_4_3

nginx 0.4.3 *) Change: now the 499 error could not be redirected using an "error_page" directive. *) Feature: the Solaris 10 event ports support. *) Feature: the ngx_http_browser_module. *) Bugfix: a segmentation fault may occur while redirecting the 400 error to the proxied server using an "proxy_pass" directive. *) Bugfix: a segmentation fault occurred if an unix domain socket was used in an "proxy_pass" directive; bug appeared in 0.3.47. *) Bugfix: SSI did work with memcached and nonbuffered responses. *) Workaround: of the Sun Studio PAUSE hardware capability bug.
author Igor Sysoev <http://sysoev.ru>
date Tue, 26 Sep 2006 00:00:00 +0400
parents 0ad9eeb6ac7f
children 984bb0b1399b
comparison
equal deleted inserted replaced
235:f622c719b711 236:c982febb7588
19 19
20 20
21 void 21 void
22 ngx_event_accept(ngx_event_t *ev) 22 ngx_event_accept(ngx_event_t *ev)
23 { 23 {
24 socklen_t sl; 24 socklen_t socklen;
25 ngx_err_t err; 25 ngx_err_t err;
26 ngx_log_t *log; 26 ngx_log_t *log;
27 ngx_socket_t s; 27 ngx_socket_t s;
28 ngx_event_t *rev, *wev; 28 ngx_event_t *rev, *wev;
29 ngx_listening_t *ls; 29 ngx_listening_t *ls;
46 46
47 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, 47 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
48 "accept on %V, ready: %d", &ls->addr_text, ev->available); 48 "accept on %V, ready: %d", &ls->addr_text, ev->available);
49 49
50 do { 50 do {
51 sl = NGX_SOCKLEN; 51 socklen = NGX_SOCKLEN;
52 52
53 s = accept(lc->fd, (struct sockaddr *) sa, &sl); 53 s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
54 54
55 if (s == -1) { 55 if (s == -1) {
56 err = ngx_socket_errno; 56 err = ngx_socket_errno;
57 57
58 if (err == NGX_EAGAIN) { 58 if (err == NGX_EAGAIN) {
59 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err,
60 "accept() not ready");
59 return; 61 return;
60 } 62 }
61 63
62 ngx_log_error((err == NGX_ECONNABORTED) ? NGX_LOG_ERR: 64 ngx_log_error((err == NGX_ECONNABORTED) ? NGX_LOG_ERR:
63 NGX_LOG_ALERT, 65 NGX_LOG_ALERT,
102 if (c->pool == NULL) { 104 if (c->pool == NULL) {
103 ngx_close_accepted_connection(c); 105 ngx_close_accepted_connection(c);
104 return; 106 return;
105 } 107 }
106 108
107 c->sockaddr = ngx_palloc(c->pool, sl); 109 c->sockaddr = ngx_palloc(c->pool, socklen);
108 if (c->sockaddr == NULL) { 110 if (c->sockaddr == NULL) {
109 ngx_close_accepted_connection(c); 111 ngx_close_accepted_connection(c);
110 return; 112 return;
111 } 113 }
112 114
113 ngx_memcpy(c->sockaddr, sa, sl); 115 ngx_memcpy(c->sockaddr, sa, socklen);
114 116
115 log = ngx_palloc(c->pool, sizeof(ngx_log_t)); 117 log = ngx_palloc(c->pool, sizeof(ngx_log_t));
116 if (log == NULL) { 118 if (log == NULL) {
117 ngx_close_accepted_connection(c); 119 ngx_close_accepted_connection(c);
118 return; 120 return;
150 152
151 c->log = log; 153 c->log = log;
152 c->pool->log = log; 154 c->pool->log = log;
153 155
154 c->listening = ls; 156 c->listening = ls;
155 c->socklen = sl; 157 c->socklen = socklen;
156 158
157 c->unexpected_eof = 1; 159 c->unexpected_eof = 1;
158 160
159 rev = c->read; 161 rev = c->read;
160 wev = c->write; 162 wev = c->write;
262 if (ngx_shmtx_trylock(&ngx_accept_mutex)) { 264 if (ngx_shmtx_trylock(&ngx_accept_mutex)) {
263 265
264 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 266 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
265 "accept mutex locked"); 267 "accept mutex locked");
266 268
267 if (ngx_accept_mutex_held && !(ngx_event_flags & NGX_USE_RTSIG_EVENT)) { 269 if (ngx_accept_mutex_held
270 && ngx_accept_events == 0
271 && !(ngx_event_flags & NGX_USE_RTSIG_EVENT))
272 {
268 return NGX_OK; 273 return NGX_OK;
269 } 274 }
270 275
271 if (ngx_enable_accept_events(cycle) == NGX_ERROR) { 276 if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
272 ngx_shmtx_unlock(&ngx_accept_mutex); 277 ngx_shmtx_unlock(&ngx_accept_mutex);
273 return NGX_ERROR; 278 return NGX_ERROR;
274 } 279 }
275 280
281 ngx_accept_events = 0;
276 ngx_accept_mutex_held = 1; 282 ngx_accept_mutex_held = 1;
277 283
278 return NGX_OK; 284 return NGX_OK;
279 } 285 }
286
287 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
288 "accept mutex lock failed: %ui", ngx_accept_mutex_held);
280 289
281 if (ngx_accept_mutex_held) { 290 if (ngx_accept_mutex_held) {
282 if (ngx_disable_accept_events(cycle) == NGX_ERROR) { 291 if (ngx_disable_accept_events(cycle) == NGX_ERROR) {
283 return NGX_ERROR; 292 return NGX_ERROR;
284 } 293 }