comparison src/event/ngx_event_accept.c @ 301:744965ec6275

nginx-0.0.3-2004-03-31-19:26:46 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 31 Mar 2004 15:26:46 +0000
parents 87e73f067470
children 1526e7686b20
comparison
equal deleted inserted replaced
300:502b03d9d2a3 301:744965ec6275
12 12
13 13
14 static size_t ngx_accept_log_error(void *data, char *buf, size_t len); 14 static size_t ngx_accept_log_error(void *data, char *buf, size_t len);
15 15
16 16
17 ngx_atomic_t *ngx_accept_mutex;
18 ngx_uint_t ngx_accept_token;
19
20
17 void ngx_event_accept(ngx_event_t *ev) 21 void ngx_event_accept(ngx_event_t *ev)
18 { 22 {
19 ngx_uint_t instance, accepted; 23 ngx_uint_t instance, rinstance, winstance, accepted;
20 socklen_t len; 24 socklen_t len;
21 struct sockaddr *sa; 25 struct sockaddr *sa;
22 ngx_err_t err; 26 ngx_err_t err;
23 ngx_log_t *log; 27 ngx_log_t *log;
24 ngx_pool_t *pool; 28 ngx_pool_t *pool;
203 rev = &ngx_cycle->read_events[s]; 207 rev = &ngx_cycle->read_events[s];
204 wev = &ngx_cycle->write_events[s]; 208 wev = &ngx_cycle->write_events[s];
205 #endif 209 #endif
206 210
207 instance = rev->instance; 211 instance = rev->instance;
212 rinstance = rev->returned_instance;
213 winstance = wev->returned_instance;
208 214
209 ngx_memzero(rev, sizeof(ngx_event_t)); 215 ngx_memzero(rev, sizeof(ngx_event_t));
210 ngx_memzero(wev, sizeof(ngx_event_t)); 216 ngx_memzero(wev, sizeof(ngx_event_t));
211 ngx_memzero(c, sizeof(ngx_connection_t)); 217 ngx_memzero(c, sizeof(ngx_connection_t));
212 218
215 c->listening = ls->listening; 221 c->listening = ls->listening;
216 c->sockaddr = sa; 222 c->sockaddr = sa;
217 c->socklen = len; 223 c->socklen = len;
218 224
219 rev->instance = (u_char) !instance; 225 rev->instance = (u_char) !instance;
226 rev->returned_instance = (u_char) rinstance;
227
220 wev->instance = (u_char) !instance; 228 wev->instance = (u_char) !instance;
229 wev->returned_instance = (u_char) winstance;
221 230
222 rev->index = NGX_INVALID_INDEX; 231 rev->index = NGX_INVALID_INDEX;
223 wev->index = NGX_INVALID_INDEX; 232 wev->index = NGX_INVALID_INDEX;
224 233
225 rev->data = c; 234 rev->data = c;
293 302
294 } while (ev->available); 303 } while (ev->available);
295 } 304 }
296 305
297 306
307 ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle)
308 {
309 if (*ngx_accept_mutex == 0 && ngx_atomic_cmp_set(ngx_accept_mutex, 0, 1)) {
310
311 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
312 "accept mutex locked");
313
314 if (!ngx_accept_token) {
315 if (ngx_enable_accept_events(cycle) == NGX_ERROR) {
316 return NGX_ERROR;
317 }
318
319 ngx_accept_token = 1;
320 }
321
322 return NGX_OK;
323 }
324
325 if (ngx_accept_token) {
326 if (ngx_disable_accept_events(cycle) == NGX_ERROR) {
327 return NGX_ERROR;
328 }
329
330 ngx_accept_token = 0;
331 }
332
333 return NGX_OK;
334 }
335
336
337 ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle)
338 {
339 ngx_uint_t i;
340 ngx_listening_t *s;
341
342 s = cycle->listening.elts;
343 for (i = 0; i < cycle->listening.nelts; i++) {
344
345 /*
346 * we do not need to handle the Winsock sockets here (divde a socket
347 * number by 4) because this function would never called
348 * in the Winsock environment
349 */
350
351 if (ngx_event_flags & NGX_USE_SIGIO_EVENT) {
352 if (ngx_add_conn(&cycle->connections[s[i].fd]) == NGX_ERROR) {
353 return NGX_ERROR;
354 }
355
356 } else {
357 if (ngx_add_event(&cycle->read_events[s[i].fd], NGX_READ_EVENT, 0)
358 == NGX_ERROR)
359 {
360 return NGX_ERROR;
361 }
362 }
363 }
364
365 return NGX_OK;
366 }
367
368
369 ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle)
370 {
371 ngx_uint_t i;
372 ngx_listening_t *s;
373
374 s = cycle->listening.elts;
375 for (i = 0; i < cycle->listening.nelts; i++) {
376
377 /*
378 * we do not need to handle the Winsock sockets here (divde a socket
379 * number by 4) because this function would never called
380 * in the Winsock environment
381 */
382
383 if (ngx_event_flags & NGX_USE_SIGIO_EVENT) {
384 if (ngx_del_conn(&cycle->connections[s[i].fd], NGX_DISABLE_EVENT)
385 == NGX_ERROR)
386 {
387 return NGX_ERROR;
388 }
389
390 } else {
391 if (ngx_del_event(&cycle->read_events[s[i].fd], NGX_READ_EVENT,
392 NGX_DISABLE_EVENT) == NGX_ERROR)
393 {
394 return NGX_ERROR;
395 }
396 }
397 }
398
399 return NGX_OK;
400 }
401
402
298 static size_t ngx_accept_log_error(void *data, char *buf, size_t len) 403 static size_t ngx_accept_log_error(void *data, char *buf, size_t len)
299 { 404 {
300 ngx_accept_log_ctx_t *ctx = data; 405 ngx_accept_log_ctx_t *ctx = data;
301 406
302 return ngx_snprintf(buf, len, " while accept() on %s", ctx->name); 407 return ngx_snprintf(buf, len, " while accept() on %s", ctx->name);