Mercurial > hg > nginx
comparison src/event/ngx_event_accept.c @ 97:70d2345a903f
nginx-0.0.1-2003-05-29-17:02:09 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 29 May 2003 13:02:09 +0000 |
parents | a23d010f356d |
children | c9b243802a17 |
comparison
equal
deleted
inserted
replaced
96:a23d010f356d | 97:70d2345a903f |
---|---|
1 | |
2 #include <nginx.h> | |
3 | 1 |
4 #include <ngx_config.h> | 2 #include <ngx_config.h> |
5 #include <ngx_core.h> | 3 #include <ngx_core.h> |
6 #include <ngx_types.h> | 4 |
7 #include <ngx_log.h> | 5 #include <nginx.h> |
8 #include <ngx_connection.h> | 6 |
9 #include <ngx_event.h> | 7 #include <ngx_event.h> |
10 | 8 |
11 | 9 |
12 void ngx_event_accept(ngx_event_t *ev) | 10 void ngx_event_accept(ngx_event_t *ev) |
13 { | 11 { |
17 ngx_err_t err; | 15 ngx_err_t err; |
18 ngx_pool_t *pool; | 16 ngx_pool_t *pool; |
19 ngx_socket_t s; | 17 ngx_socket_t s; |
20 ngx_event_t *rev, *wev; | 18 ngx_event_t *rev, *wev; |
21 ngx_connection_t *c, *ls; | 19 ngx_connection_t *c, *ls; |
22 | 20 ngx_event_conf_t *ecf; |
23 ls = (ngx_connection_t *) ev->data; | 21 |
22 ecf = ngx_event_get_conf(ngx_event_module); | |
23 | |
24 ls = ev->data; | |
24 | 25 |
25 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ | 26 ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ |
26 ev->available); | 27 ev->available); |
27 | 28 |
28 ev->ready = 0; | 29 ev->ready = 0; |
29 | |
30 #if 0 | |
31 /* DEBUG */ ev->available++; | |
32 #endif | |
33 | 30 |
34 do { | 31 do { |
35 | 32 |
36 /* Create the pool before accept() to avoid copy the sockaddr. | 33 /* Create the pool before accept() to avoid copy the sockaddr. |
37 Although accept() can fail it's uncommon case | 34 Although accept() can fail it's uncommon case |
50 len = ls->socklen; | 47 len = ls->socklen; |
51 | 48 |
52 s = accept(ls->fd, sa, &len); | 49 s = accept(ls->fd, sa, &len); |
53 if (s == -1) { | 50 if (s == -1) { |
54 err = ngx_socket_errno; | 51 err = ngx_socket_errno; |
55 ngx_destroy_pool(pool); | |
56 | 52 |
57 if (err == NGX_EAGAIN) { | 53 if (err == NGX_EAGAIN) { |
58 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, | 54 ngx_log_error(NGX_LOG_NOTICE, ev->log, err, |
59 "EAGAIN while accept %s", ls->addr_text.data); | 55 "EAGAIN while accept() %s", ls->addr_text.data); |
60 return; | 56 return; |
61 } | 57 } |
62 | 58 |
63 ngx_log_error(NGX_LOG_ALERT, ev->log, err, | 59 ngx_log_error(NGX_LOG_ALERT, ev->log, err, |
64 "accept %s failed", ls->addr_text.data); | 60 "accept() %s failed", ls->addr_text.data); |
61 | |
62 ngx_destroy_pool(pool); | |
63 return; | |
64 } | |
65 | |
66 if (s >= ecf->connections) { | |
67 | |
68 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, | |
69 "accept() %s returned socket #%d while " | |
70 "only %d connections was configured, " | |
71 "sleeping for 1 second", | |
72 ls->addr_text.data, s, ecf->connections); | |
73 | |
74 if (ngx_close_socket(s) == -1) { | |
75 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | |
76 ngx_close_socket_n " %s failed", | |
77 ls->addr_text.data); | |
78 } | |
79 | |
80 sleep(1); | |
81 | |
82 ngx_destroy_pool(pool); | |
65 return; | 83 return; |
66 } | 84 } |
67 | 85 |
68 /* set a blocking mode for aio and non-blocking mode for others */ | 86 /* set a blocking mode for aio and non-blocking mode for others */ |
69 | 87 |
71 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) { | 89 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) { |
72 if (ngx_blocking(s) == -1) { | 90 if (ngx_blocking(s) == -1) { |
73 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 91 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
74 ngx_blocking_n " %s failed", | 92 ngx_blocking_n " %s failed", |
75 ls->addr_text.data); | 93 ls->addr_text.data); |
94 | |
95 if (ngx_close_socket(s) == -1) { | |
96 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | |
97 ngx_close_socket_n " %s failed", | |
98 ls->addr_text.data); | |
99 } | |
100 | |
101 ngx_destroy_pool(pool); | |
76 return; | 102 return; |
77 } | 103 } |
78 } | 104 } |
79 | 105 |
80 } else { | 106 } else { |
81 if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) { | 107 if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) { |
82 if (ngx_nonblocking(s) == -1) { | 108 if (ngx_nonblocking(s) == -1) { |
83 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | 109 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
84 ngx_nonblocking_n " %s failed", | 110 ngx_nonblocking_n " %s failed", |
85 ls->addr_text.data); | 111 ls->addr_text.data); |
112 | |
113 if (ngx_close_socket(s) == -1) { | |
114 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, | |
115 ngx_close_socket_n " %s failed", | |
116 ls->addr_text.data); | |
117 } | |
118 | |
119 ngx_destroy_pool(pool); | |
86 return; | 120 return; |
87 } | 121 } |
88 } | 122 } |
89 } | 123 } |
90 | 124 |
131 return; | 165 return; |
132 } | 166 } |
133 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t)); | 167 ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t)); |
134 rev->log = wev->log = c->log; | 168 rev->log = wev->log = c->log; |
135 | 169 |
136 /* STUB: x86: SP: xadd ?, MT: lock xadd, MP: lock xadd, shared */ | 170 /* STUB: x86: MT: lock xadd, MP: lock xadd, shared */ |
137 c->number = ngx_connection_counter++; | 171 c->number = ngx_connection_counter++; |
138 | 172 |
139 ngx_log_debug(ev->log, "ngx_event_accept: accept: %d, %d" _ | 173 ngx_log_debug(ev->log, "accept: %d, %d" _ s _ c->number); |
140 s _ c->number); | 174 |
141 | 175 if (ev->deferred_accept) { |
142 #if (HAVE_DEFERRED_ACCEPT) | |
143 if (ev->accept_filter) { | |
144 rev->ready = 1; | 176 rev->ready = 1; |
145 } | 177 } |
146 #endif | 178 |
147 | 179 if (ngx_add_conn) { |
148 #if (HAVE_EDGE_EVENT) /* epoll */ | 180 if (ngx_add_conn(c) == NGX_ERROR) { |
149 | 181 if (ngx_close_socket(s) == -1) { |
150 if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { | 182 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, |
151 if (ngx_edge_add_event(ev) == NGX_ERROR) { | 183 ngx_close_socket_n " %s failed", |
184 ls->addr_text.data); | |
185 } | |
186 | |
187 ngx_destroy_pool(pool); | |
152 return; | 188 return; |
153 } | 189 } |
154 } | 190 } |
155 | |
156 #endif | |
157 | 191 |
158 ls->handler(c); | 192 ls->handler(c); |
159 | 193 |
160 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { | 194 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { |
161 ev->available--; | 195 ev->available--; |