blob: bdc9f4650a93cfe537a800a8ced07ffdf6f722af [file] [log] [blame]
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00001
2#include <ngx_config.h>
Igor Sysoev0ad17c02002-08-26 15:18:19 +00003#include <ngx_core.h>
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00004#include <ngx_event.h>
Igor Sysoev7578ec92003-06-02 15:24:30 +00005#include <nginx.h>
Igor Sysoev6de5c2c2002-08-06 16:39:45 +00006
7
Igor Sysoev54498db2004-02-11 17:08:49 +00008typedef struct {
Igor Sysoev10a543a2004-03-16 07:10:12 +00009 int flag;
10 u_char *name;
Igor Sysoev54498db2004-02-11 17:08:49 +000011} ngx_accept_log_ctx_t;
12
13
Igor Sysoev160d7742003-11-19 16:26:41 +000014static size_t ngx_accept_log_error(void *data, char *buf, size_t len);
15
16
Igor Sysoevd581fd52003-05-13 16:02:32 +000017void ngx_event_accept(ngx_event_t *ev)
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000018{
Igor Sysoev709405b2004-03-31 15:26:46 +000019 ngx_uint_t instance, rinstance, winstance, accepted;
Igor Sysoev160d7742003-11-19 16:26:41 +000020 socklen_t len;
21 struct sockaddr *sa;
22 ngx_err_t err;
23 ngx_log_t *log;
24 ngx_pool_t *pool;
25 ngx_socket_t s;
26 ngx_event_t *rev, *wev;
27 ngx_connection_t *c, *ls;
28 ngx_event_conf_t *ecf;
Igor Sysoev54498db2004-02-11 17:08:49 +000029 ngx_accept_log_ctx_t *ctx;
Igor Sysoev42feecb2002-12-15 06:25:09 +000030
Igor Sysoev9d639522003-07-07 06:11:50 +000031 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
Igor Sysoev13933252003-05-29 13:02:09 +000032
Igor Sysoev0ab91b92004-06-06 19:49:18 +000033 if (ngx_event_flags & (NGX_USE_EDGE_EVENT|NGX_USE_RTSIG_EVENT)) {
Igor Sysoeva4b16df2004-02-02 21:19:52 +000034 ev->available = 1;
35
36 } else if (!(ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)) {
37 ev->available = ecf->multi_accept;
38 }
39
Igor Sysoev13933252003-05-29 13:02:09 +000040 ls = ev->data;
Igor Sysoev86de4cb2003-01-30 07:28:09 +000041
Igor Sysoev54498db2004-02-11 17:08:49 +000042 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
43 "accept on %s, ready: %d",
44 ls->listening->addr_text.data, ev->available);
Igor Sysoev86de4cb2003-01-30 07:28:09 +000045
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000046 ev->ready = 0;
Igor Sysoev160d7742003-11-19 16:26:41 +000047 accepted = 0;
Igor Sysoeva4b16df2004-02-02 21:19:52 +000048 pool = NULL;
Igor Sysoev86de4cb2003-01-30 07:28:09 +000049
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000050 do {
Igor Sysoev1c13c662003-05-20 15:37:55 +000051
Igor Sysoeva4b16df2004-02-02 21:19:52 +000052 if (pool == NULL) {
Igor Sysoev1c13c662003-05-20 15:37:55 +000053
Igor Sysoeva4b16df2004-02-02 21:19:52 +000054 /*
Igor Sysoev0ab91b92004-06-06 19:49:18 +000055 * Create the pool before accept() to avoid the copying of
56 * the sockaddr. Although accept() can fail it is uncommon
57 * case and besides the pool can be got from the free pool list
Igor Sysoeva4b16df2004-02-02 21:19:52 +000058 */
59
60 if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) {
61 return;
62 }
Igor Sysoevd581fd52003-05-13 16:02:32 +000063 }
Igor Sysoev86de4cb2003-01-30 07:28:09 +000064
Igor Sysoev160d7742003-11-19 16:26:41 +000065 if (!(sa = ngx_palloc(pool, ls->listening->socklen))) {
Igor Sysoeva4b16df2004-02-02 21:19:52 +000066 ngx_destroy_pool(pool);
Igor Sysoevd581fd52003-05-13 16:02:32 +000067 return;
68 }
69
Igor Sysoev160d7742003-11-19 16:26:41 +000070 if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) {
Igor Sysoeva4b16df2004-02-02 21:19:52 +000071 ngx_destroy_pool(pool);
Igor Sysoev160d7742003-11-19 16:26:41 +000072 return;
73 }
Igor Sysoeva4b16df2004-02-02 21:19:52 +000074
Igor Sysoev160d7742003-11-19 16:26:41 +000075 ngx_memcpy(log, ls->log, sizeof(ngx_log_t));
76 pool->log = log;
77
Igor Sysoev54498db2004-02-11 17:08:49 +000078 if (!(ctx = ngx_palloc(pool, sizeof(ngx_accept_log_ctx_t)))) {
79 ngx_destroy_pool(pool);
80 return;
81 }
82
Igor Sysoev0ab91b92004-06-06 19:49:18 +000083 /* -1 disables the connection number logging */
Igor Sysoev54498db2004-02-11 17:08:49 +000084 ctx->flag = -1;
85 ctx->name = ls->listening->addr_text.data;
86
87 log->data = ctx;
Igor Sysoev160d7742003-11-19 16:26:41 +000088 log->handler = ngx_accept_log_error;
89
Igor Sysoev239baac2003-06-11 15:28:34 +000090 len = ls->listening->socklen;
91
Igor Sysoev86de4cb2003-01-30 07:28:09 +000092 s = accept(ls->fd, sa, &len);
93 if (s == -1) {
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000094 err = ngx_socket_errno;
Igor Sysoev86de4cb2003-01-30 07:28:09 +000095
Igor Sysoev6de5c2c2002-08-06 16:39:45 +000096 if (err == NGX_EAGAIN) {
Igor Sysoev9139cd22004-02-17 17:53:12 +000097 if (!(ngx_event_flags
Igor Sysoev0ab91b92004-06-06 19:49:18 +000098 & (NGX_USE_EDGE_EVENT|NGX_USE_RTSIG_EVENT)))
Igor Sysoev9139cd22004-02-17 17:53:12 +000099 {
100 ngx_log_error(NGX_LOG_NOTICE, log, err,
101 "EAGAIN after %d accepted connection(s)",
102 accepted);
103 }
Igor Sysoeva4b16df2004-02-02 21:19:52 +0000104
105 ngx_destroy_pool(pool);
Igor Sysoevd581fd52003-05-13 16:02:32 +0000106 return;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000107 }
Igor Sysoev0ad17c02002-08-26 15:18:19 +0000108
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000109 ngx_log_error(NGX_LOG_ALERT, ev->log, err,
Igor Sysoev160d7742003-11-19 16:26:41 +0000110 "accept() on %s failed",
111 ls->listening->addr_text.data);
Igor Sysoev13933252003-05-29 13:02:09 +0000112
Igor Sysoeva4b16df2004-02-02 21:19:52 +0000113 if (err == NGX_ECONNABORTED) {
114 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
115 ev->available--;
116 }
117
118 if (ev->available) {
119 /* reuse the previously allocated pool */
120 continue;
121 }
122 }
123
Igor Sysoev13933252003-05-29 13:02:09 +0000124 ngx_destroy_pool(pool);
125 return;
126 }
127
Igor Sysoev732a2712004-04-21 18:54:33 +0000128
129 ngx_accept_disabled = (ngx_uint_t) s + NGX_ACCEPT_THRESHOLD
130 - ecf->connections;
131
Igor Sysoev72f2e362003-07-22 19:53:10 +0000132 /* disable warning: Win32 SOCKET is u_int while UNIX socket is int */
Igor Sysoev890fc962003-07-20 21:15:59 +0000133
Igor Sysoev732a2712004-04-21 18:54:33 +0000134 if ((ngx_uint_t) s >= ecf->connections) {
Igor Sysoev13933252003-05-29 13:02:09 +0000135
136 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
Igor Sysoev160d7742003-11-19 16:26:41 +0000137 "accept() on %s returned socket #%d while "
Igor Sysoev13933252003-05-29 13:02:09 +0000138 "only %d connections was configured, "
Igor Sysoevbb6ec8c2003-11-20 07:05:50 +0000139 "closing the connection",
Igor Sysoev239baac2003-06-11 15:28:34 +0000140 ls->listening->addr_text.data, s, ecf->connections);
Igor Sysoev13933252003-05-29 13:02:09 +0000141
142 if (ngx_close_socket(s) == -1) {
Igor Sysoev160d7742003-11-19 16:26:41 +0000143 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
144 ngx_close_socket_n "failed");
Igor Sysoev13933252003-05-29 13:02:09 +0000145 }
146
Igor Sysoev13933252003-05-29 13:02:09 +0000147 ngx_destroy_pool(pool);
Igor Sysoevd581fd52003-05-13 16:02:32 +0000148 return;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000149 }
Igor Sysoev0ad17c02002-08-26 15:18:19 +0000150
Igor Sysoev7b6062a2004-02-12 20:57:10 +0000151 /* set a blocking mode for aio and non-blocking mode for the others */
Igor Sysoev73009772003-02-06 17:21:13 +0000152
Igor Sysoevfa73aac2003-05-21 13:28:21 +0000153 if (ngx_inherited_nonblocking) {
154 if ((ngx_event_flags & NGX_USE_AIO_EVENT)) {
155 if (ngx_blocking(s) == -1) {
Igor Sysoev160d7742003-11-19 16:26:41 +0000156 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
157 ngx_blocking_n " failed");
Igor Sysoev13933252003-05-29 13:02:09 +0000158
159 if (ngx_close_socket(s) == -1) {
Igor Sysoev160d7742003-11-19 16:26:41 +0000160 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
161 ngx_close_socket_n " failed");
Igor Sysoev13933252003-05-29 13:02:09 +0000162 }
163
164 ngx_destroy_pool(pool);
Igor Sysoevfa73aac2003-05-21 13:28:21 +0000165 return;
166 }
167 }
Igor Sysoev73009772003-02-06 17:21:13 +0000168
Igor Sysoevfa73aac2003-05-21 13:28:21 +0000169 } else {
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000170 if (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {
Igor Sysoevfa73aac2003-05-21 13:28:21 +0000171 if (ngx_nonblocking(s) == -1) {
Igor Sysoev160d7742003-11-19 16:26:41 +0000172 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
173 ngx_nonblocking_n " failed");
Igor Sysoev13933252003-05-29 13:02:09 +0000174
175 if (ngx_close_socket(s) == -1) {
Igor Sysoev160d7742003-11-19 16:26:41 +0000176 ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
177 ngx_close_socket_n " failed");
Igor Sysoev13933252003-05-29 13:02:09 +0000178 }
179
180 ngx_destroy_pool(pool);
Igor Sysoevfa73aac2003-05-21 13:28:21 +0000181 return;
182 }
Igor Sysoev73009772003-02-06 17:21:13 +0000183 }
184 }
Igor Sysoev73009772003-02-06 17:21:13 +0000185
Igor Sysoev239baac2003-06-11 15:28:34 +0000186#if (WIN32)
187 /*
188 * Winsock assignes a socket number divisible by 4
189 * so to find a connection we divide a socket number by 4.
190 */
191
192 if (s % 4) {
Igor Sysoev160d7742003-11-19 16:26:41 +0000193 ngx_log_error(NGX_LOG_EMERG, ev->log, 0,
194 "accept() on %s returned socket #%d, "
195 "not divisible by 4",
196 ls->listening->addr_text.data, s);
Igor Sysoev239baac2003-06-11 15:28:34 +0000197 exit(1);
198 }
199
Igor Sysoev9d639522003-07-07 06:11:50 +0000200 c = &ngx_cycle->connections[s / 4];
201 rev = &ngx_cycle->read_events[s / 4];
202 wev = &ngx_cycle->write_events[s / 4];
Igor Sysoev239baac2003-06-11 15:28:34 +0000203#else
Igor Sysoev9d639522003-07-07 06:11:50 +0000204 c = &ngx_cycle->connections[s];
205 rev = &ngx_cycle->read_events[s];
206 wev = &ngx_cycle->write_events[s];
Igor Sysoev239baac2003-06-11 15:28:34 +0000207#endif
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000208
Igor Sysoev6b863e32003-05-12 15:52:24 +0000209 instance = rev->instance;
Igor Sysoev709405b2004-03-31 15:26:46 +0000210 rinstance = rev->returned_instance;
211 winstance = wev->returned_instance;
Igor Sysoev6b863e32003-05-12 15:52:24 +0000212
Igor Sysoev42feecb2002-12-15 06:25:09 +0000213 ngx_memzero(rev, sizeof(ngx_event_t));
214 ngx_memzero(wev, sizeof(ngx_event_t));
215 ngx_memzero(c, sizeof(ngx_connection_t));
Igor Sysoev0ad17c02002-08-26 15:18:19 +0000216
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000217 c->pool = pool;
218
Igor Sysoev239baac2003-06-11 15:28:34 +0000219 c->listening = ls->listening;
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000220 c->sockaddr = sa;
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000221 c->socklen = len;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000222
Igor Sysoev9a864bd2004-04-04 20:32:09 +0000223 if (ngx_event_flags & NGX_HAVE_INSTANCE_EVENT) {
224 rev->use_instance = 1;
225 rev->instance = (u_char) !instance;
226 rev->returned_instance = (u_char) rinstance;
Igor Sysoev709405b2004-03-31 15:26:46 +0000227
Igor Sysoev9a864bd2004-04-04 20:32:09 +0000228 wev->use_instance = 1;
229 wev->instance = (u_char) !instance;
230 wev->returned_instance = (u_char) winstance;
231 }
Igor Sysoev6b863e32003-05-12 15:52:24 +0000232
Igor Sysoev160d7742003-11-19 16:26:41 +0000233 rev->index = NGX_INVALID_INDEX;
234 wev->index = NGX_INVALID_INDEX;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000235
Igor Sysoev160d7742003-11-19 16:26:41 +0000236 rev->data = c;
237 wev->data = c;
238
Igor Sysoev42feecb2002-12-15 06:25:09 +0000239 c->read = rev;
240 c->write = wev;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000241
Igor Sysoev42feecb2002-12-15 06:25:09 +0000242 c->fd = s;
243 c->unexpected_eof = 1;
Igor Sysoev160d7742003-11-19 16:26:41 +0000244
Igor Sysoev42feecb2002-12-15 06:25:09 +0000245 wev->write = 1;
Igor Sysoevb5faed22003-10-29 08:30:44 +0000246 wev->ready = 1;
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000247
Igor Sysoeva4b16df2004-02-02 21:19:52 +0000248 if (ngx_event_flags
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000249 & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT|NGX_USE_RTSIG_EVENT))
Igor Sysoeva4b16df2004-02-02 21:19:52 +0000250 {
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000251 /* epoll, rtsig, aio, iocp */
Igor Sysoevb5faed22003-10-29 08:30:44 +0000252 rev->ready = 1;
Igor Sysoev73009772003-02-06 17:21:13 +0000253 }
Igor Sysoev73009772003-02-06 17:21:13 +0000254
Igor Sysoev10318a22004-01-29 21:45:01 +0000255 if (ev->deferred_accept) {
256 rev->ready = 1;
257 }
258
Igor Sysoev5428ae72004-06-09 20:03:54 +0000259 if (rev->ready) {
260 rev->returned_instance = rev->instance;
261 }
262
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000263 c->ctx = ls->ctx;
264 c->servers = ls->servers;
Igor Sysoev42feecb2002-12-15 06:25:09 +0000265
Igor Sysoev160d7742003-11-19 16:26:41 +0000266 c->log = log;
267 rev->log = log;
268 wev->log = log;
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000269
Igor Sysoev5f800782003-12-08 20:48:12 +0000270 /*
Igor Sysoev54498db2004-02-11 17:08:49 +0000271 * TODO: MT: - atomic increment (x86: lock xadd)
Igor Sysoevb54698b2004-02-23 20:57:12 +0000272 * or protection by critical section or light mutex
Igor Sysoev5f800782003-12-08 20:48:12 +0000273 *
274 * TODO: MP: - allocated in a shared memory
275 * - atomic increment (x86: lock xadd)
Igor Sysoevb54698b2004-02-23 20:57:12 +0000276 * or protection by critical section or light mutex
Igor Sysoev5f800782003-12-08 20:48:12 +0000277 */
Igor Sysoeve89c4582003-12-19 08:15:11 +0000278
Igor Sysoev407b0de2004-04-09 16:03:04 +0000279 c->number = ngx_atomic_inc(ngx_connection_counter);
Igor Sysoev42feecb2002-12-15 06:25:09 +0000280
Igor Sysoevd8e1f072004-01-22 06:47:28 +0000281 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
Igor Sysoevb54698b2004-02-23 20:57:12 +0000282 "accept: fd:%d c:%d", s, c->number);
Igor Sysoev0ad17c02002-08-26 15:18:19 +0000283
Igor Sysoevfff32322004-04-08 15:58:25 +0000284#if (NGX_DEBUG)
285 {
286
287 uint32_t *addr;
288 in_addr_t i;
289 struct sockaddr_in *addr_in;
290
291 addr_in = (struct sockaddr_in *) sa;
292 addr = ecf->debug_connection.elts;
293 for (i = 0; i < ecf->debug_connection.nelts; i++) {
294 if (addr[i] == addr_in->sin_addr.s_addr) {
295 log->log_level = NGX_LOG_DEBUG_CONNECTION|NGX_LOG_DEBUG_ALL;
296 break;
297 }
298 }
299
300 }
301#endif
302
Igor Sysoev13933252003-05-29 13:02:09 +0000303 if (ngx_add_conn) {
304 if (ngx_add_conn(c) == NGX_ERROR) {
305 if (ngx_close_socket(s) == -1) {
306 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
Igor Sysoev160d7742003-11-19 16:26:41 +0000307 ngx_close_socket_n " failed");
Igor Sysoev13933252003-05-29 13:02:09 +0000308 }
Igor Sysoev6a644c62003-03-04 06:33:48 +0000309
Igor Sysoev13933252003-05-29 13:02:09 +0000310 ngx_destroy_pool(pool);
Igor Sysoevd581fd52003-05-13 16:02:32 +0000311 return;
Igor Sysoev6a644c62003-03-04 06:33:48 +0000312 }
313 }
314
Igor Sysoeva4b16df2004-02-02 21:19:52 +0000315 pool = NULL;
316
Igor Sysoev160d7742003-11-19 16:26:41 +0000317 log->data = NULL;
318 log->handler = NULL;
319
Igor Sysoev239baac2003-06-11 15:28:34 +0000320 ls->listening->handler(c);
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000321
Igor Sysoeva9830112003-05-19 16:39:14 +0000322 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000323 ev->available--;
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000324 }
Igor Sysoev160d7742003-11-19 16:26:41 +0000325
326 accepted++;
Igor Sysoev86de4cb2003-01-30 07:28:09 +0000327
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000328 } while (ev->available);
Igor Sysoev6de5c2c2002-08-06 16:39:45 +0000329}
Igor Sysoev160d7742003-11-19 16:26:41 +0000330
331
Igor Sysoev709405b2004-03-31 15:26:46 +0000332ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
333{
Igor Sysoev9a864bd2004-04-04 20:32:09 +0000334 if (*ngx_accept_mutex == 0
335 && ngx_atomic_cmp_set(ngx_accept_mutex, 0, ngx_pid))
336 {
Igor Sysoev709405b2004-03-31 15:26:46 +0000337 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
338 "accept mutex locked");
339
Igor Sysoev205dc142004-04-01 06:21:13 +0000340 if (!ngx_accept_mutex_held) {
Igor Sysoev709405b2004-03-31 15:26:46 +0000341 if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
Igor Sysoev205dc142004-04-01 06:21:13 +0000342 *ngx_accept_mutex = 0;
Igor Sysoev709405b2004-03-31 15:26:46 +0000343 return NGX_ERROR;
344 }
345
Igor Sysoev205dc142004-04-01 06:21:13 +0000346 ngx_accept_mutex_held = 1;
Igor Sysoev709405b2004-03-31 15:26:46 +0000347 }
348
349 return NGX_OK;
350 }
351
Igor Sysoev205dc142004-04-01 06:21:13 +0000352 if (ngx_accept_mutex_held) {
Igor Sysoev709405b2004-03-31 15:26:46 +0000353 if (ngx_disable_accept_events(cycle) == NGX_ERROR) {
354 return NGX_ERROR;
355 }
356
Igor Sysoev205dc142004-04-01 06:21:13 +0000357 ngx_accept_mutex_held = 0;
Igor Sysoev709405b2004-03-31 15:26:46 +0000358 }
359
360 return NGX_OK;
361}
362
363
364ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle)
365{
366 ngx_uint_t i;
367 ngx_listening_t *s;
368
369 s = cycle->listening.elts;
370 for (i = 0; i < cycle->listening.nelts; i++) {
371
372 /*
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000373 * we do not need to handle the Winsock sockets here (divide a socket
Igor Sysoev709405b2004-03-31 15:26:46 +0000374 * number by 4) because this function would never called
375 * in the Winsock environment
376 */
377
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000378 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
Igor Sysoev709405b2004-03-31 15:26:46 +0000379 if (ngx_add_conn(&cycle->connections[s[i].fd]) == NGX_ERROR) {
380 return NGX_ERROR;
381 }
382
383 } else {
384 if (ngx_add_event(&cycle->read_events[s[i].fd], NGX_READ_EVENT, 0)
385 == NGX_ERROR)
386 {
387 return NGX_ERROR;
388 }
389 }
390 }
391
392 return NGX_OK;
393}
394
395
396ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle)
397{
398 ngx_uint_t i;
399 ngx_listening_t *s;
400
401 s = cycle->listening.elts;
402 for (i = 0; i < cycle->listening.nelts; i++) {
403
404 /*
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000405 * we do not need to handle the Winsock sockets here (divide a socket
Igor Sysoev709405b2004-03-31 15:26:46 +0000406 * number by 4) because this function would never called
407 * in the Winsock environment
408 */
409
Igor Sysoev0ab91b92004-06-06 19:49:18 +0000410 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {
Igor Sysoevb3968b32004-04-14 17:44:28 +0000411 if (!cycle->connections[s[i].fd].read->active) {
412 continue;
413 }
414
Igor Sysoev709405b2004-03-31 15:26:46 +0000415 if (ngx_del_conn(&cycle->connections[s[i].fd], NGX_DISABLE_EVENT)
416 == NGX_ERROR)
417 {
418 return NGX_ERROR;
419 }
420
421 } else {
Igor Sysoevb3968b32004-04-14 17:44:28 +0000422 if (!cycle->read_events[s[i].fd].active) {
423 continue;
424 }
425
Igor Sysoev709405b2004-03-31 15:26:46 +0000426 if (ngx_del_event(&cycle->read_events[s[i].fd], NGX_READ_EVENT,
427 NGX_DISABLE_EVENT) == NGX_ERROR)
428 {
429 return NGX_ERROR;
430 }
431 }
432 }
433
434 return NGX_OK;
435}
436
437
Igor Sysoev160d7742003-11-19 16:26:41 +0000438static size_t ngx_accept_log_error(void *data, char *buf, size_t len)
439{
Igor Sysoev54498db2004-02-11 17:08:49 +0000440 ngx_accept_log_ctx_t *ctx = data;
Igor Sysoev160d7742003-11-19 16:26:41 +0000441
Igor Sysoev54498db2004-02-11 17:08:49 +0000442 return ngx_snprintf(buf, len, " while accept() on %s", ctx->name);
Igor Sysoev160d7742003-11-19 16:26:41 +0000443}