Mercurial > hg > nginx-vendor-current
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 } |