Mercurial > hg > nginx-mail
comparison src/event/ngx_event_accept.c @ 665:0b460e61bdcd default tip
Merge with nginx 1.0.0.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 25 Apr 2011 04:22:17 +0400 |
parents | 3036c1836a24 |
children |
comparison
equal
deleted
inserted
replaced
572:06419a2298a9 | 665:0b460e61bdcd |
---|---|
24 ngx_event_t *rev, *wev; | 24 ngx_event_t *rev, *wev; |
25 ngx_listening_t *ls; | 25 ngx_listening_t *ls; |
26 ngx_connection_t *c, *lc; | 26 ngx_connection_t *c, *lc; |
27 ngx_event_conf_t *ecf; | 27 ngx_event_conf_t *ecf; |
28 u_char sa[NGX_SOCKADDRLEN]; | 28 u_char sa[NGX_SOCKADDRLEN]; |
29 #if (NGX_HAVE_ACCEPT4) | |
30 static ngx_uint_t use_accept4 = 1; | |
31 #endif | |
29 | 32 |
30 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); | 33 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); |
31 | 34 |
32 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { | 35 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { |
33 ev->available = 1; | 36 ev->available = 1; |
44 "accept on %V, ready: %d", &ls->addr_text, ev->available); | 47 "accept on %V, ready: %d", &ls->addr_text, ev->available); |
45 | 48 |
46 do { | 49 do { |
47 socklen = NGX_SOCKADDRLEN; | 50 socklen = NGX_SOCKADDRLEN; |
48 | 51 |
52 #if (NGX_HAVE_ACCEPT4) | |
53 if (use_accept4) { | |
54 s = accept4(lc->fd, (struct sockaddr *) sa, &socklen, | |
55 SOCK_NONBLOCK); | |
56 } else { | |
57 s = accept(lc->fd, (struct sockaddr *) sa, &socklen); | |
58 } | |
59 #else | |
49 s = accept(lc->fd, (struct sockaddr *) sa, &socklen); | 60 s = accept(lc->fd, (struct sockaddr *) sa, &socklen); |
61 #endif | |
50 | 62 |
51 if (s == -1) { | 63 if (s == -1) { |
52 err = ngx_socket_errno; | 64 err = ngx_socket_errno; |
53 | 65 |
54 if (err == NGX_EAGAIN) { | 66 if (err == NGX_EAGAIN) { |
55 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err, | 67 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ev->log, err, |
56 "accept() not ready"); | 68 "accept() not ready"); |
57 return; | 69 return; |
58 } | 70 } |
59 | 71 |
72 #if (NGX_HAVE_ACCEPT4) | |
73 ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ? | |
74 NGX_LOG_ERR : NGX_LOG_ALERT), | |
75 ev->log, err, | |
76 use_accept4 ? "accept4() failed" : "accept() failed"); | |
77 | |
78 if (use_accept4 && err == NGX_ENOSYS) { | |
79 use_accept4 = 0; | |
80 ngx_inherited_nonblocking = 0; | |
81 continue; | |
82 } | |
83 #else | |
60 ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ? | 84 ngx_log_error((ngx_uint_t) ((err == NGX_ECONNABORTED) ? |
61 NGX_LOG_ERR : NGX_LOG_ALERT), | 85 NGX_LOG_ERR : NGX_LOG_ALERT), |
62 ev->log, err, "accept() failed"); | 86 ev->log, err, "accept() failed"); |
87 #endif | |
63 | 88 |
64 if (err == NGX_ECONNABORTED) { | 89 if (err == NGX_ECONNABORTED) { |
65 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { | 90 if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { |
66 ev->available--; | 91 ev->available--; |
67 } | 92 } |
150 c->pool->log = log; | 175 c->pool->log = log; |
151 | 176 |
152 c->socklen = socklen; | 177 c->socklen = socklen; |
153 c->listening = ls; | 178 c->listening = ls; |
154 c->local_sockaddr = ls->sockaddr; | 179 c->local_sockaddr = ls->sockaddr; |
155 c->local_socklen = ls->socklen; | |
156 | 180 |
157 c->unexpected_eof = 1; | 181 c->unexpected_eof = 1; |
182 | |
183 #if (NGX_HAVE_UNIX_DOMAIN) | |
184 if (c->sockaddr->sa_family == AF_UNIX) { | |
185 c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; | |
186 c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED; | |
187 #if (NGX_SOLARIS) | |
188 /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */ | |
189 c->sendfile = 0; | |
190 #endif | |
191 } | |
192 #endif | |
158 | 193 |
159 rev = c->read; | 194 rev = c->read; |
160 wev = c->write; | 195 wev = c->write; |
161 | 196 |
162 wev->ready = 1; | 197 wev->ready = 1; |