Mercurial > hg > nginx
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); |