Mercurial > hg > nginx
comparison src/event/ngx_event_acceptex.c @ 102:7e86d028d8f0
nginx-0.0.1-2003-06-06-18:59:20 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 06 Jun 2003 14:59:20 +0000 |
parents | 7ebc8b7fb816 |
children | 6dfda4cf5200 |
comparison
equal
deleted
inserted
replaced
101:2e069b6e6920 | 102:7e86d028d8f0 |
---|---|
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 | 4 |
5 #include <ngx_listen.h> | 5 #include <ngx_listen.h> |
6 | 6 |
7 #include <ngx_event.h> | 7 #include <ngx_event.h> |
8 #if 0 | |
8 #include <ngx_event_close.h> | 9 #include <ngx_event_close.h> |
9 #include <ngx_iocp_module.h> | 10 #include <ngx_iocp_module.h> |
10 | 11 #endif |
11 #include <ngx_event_acceptex.h> | |
12 | 12 |
13 | 13 |
14 | 14 void ngx_event_acceptex(ngx_event_t *rev) |
15 void ngx_event_acceptex(ngx_event_t *ev) | |
16 { | 15 { |
17 ngx_connection_t *c; | 16 ngx_connection_t *c; |
18 | 17 |
19 c = (ngx_connection_t *) ev->data; | 18 c = (ngx_connection_t *) rev->data; |
20 | 19 |
21 if (ev->ovlp.error) { | 20 ngx_log_debug(rev->log, "ADDR: %s" _ c->addr_text.data); |
22 ngx_log_error(NGX_LOG_CRIT, ev->log, ev->ovlp.error, | 21 |
23 "AcceptEx() falied for %s", c->addr_text.data); | 22 if (rev->ovlp.error) { |
23 ngx_log_error(NGX_LOG_CRIT, rev->log, rev->ovlp.error, | |
24 "AcceptEx() failed for %s", c->addr_text.data); | |
24 return; | 25 return; |
25 } | 26 } |
26 | 27 |
27 /* TODO: can we do SO_UPDATE_ACCEPT_CONTEXT just before shutdown() ??? | 28 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ |
28 or AcceptEx's context will be lost ??? */ | |
29 | 29 |
30 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ | |
31 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, | 30 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, |
32 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) | 31 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) |
33 { | 32 { |
34 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_socket_errno, | 33 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_socket_errno, |
35 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", | 34 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", |
36 c->addr_text.data); | 35 c->addr_text.data); |
37 | 36 } else { |
38 /* non fatal - we can not only do lingering close */ | 37 accept_context_updated = 1; |
39 } | 38 } |
40 | 39 |
41 getacceptexsockaddrs(c->data, 0, | 40 getacceptexsockaddrs(c->data, 0, |
42 c->socklen + 16, c->socklen + 16, | 41 c->socklen + 16, c->socklen + 16, |
43 &c->local_sockaddr, &c->local_socklen, | 42 &c->local_sockaddr, &c->local_socklen, |
73 | 72 |
74 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); | 73 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); |
75 | 74 |
76 if (s == -1) { | 75 if (s == -1) { |
77 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, | 76 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, |
78 ngx_socket_n " for AcceptEx(%s) falied", | 77 ngx_socket_n " for AcceptEx() post failed"); |
79 ls->addr_text.data); | |
80 | 78 |
81 return NGX_ERROR; | 79 return NGX_ERROR; |
82 } | 80 } |
83 | 81 |
84 ngx_test_null(pool, ngx_create_pool(ls->pool_size, ls->log), NGX_ERROR); | 82 ngx_test_null(pool, ngx_create_pool(ls->pool_size, ls->log), NGX_ERROR); |
130 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), | 128 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), |
131 NGX_ERROR); | 129 NGX_ERROR); |
132 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); | 130 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); |
133 rev->log = wev->log = c->log; | 131 rev->log = wev->log = c->log; |
134 | 132 |
135 if (ngx_iocp_add_event(rev) == NGX_ERROR) { | 133 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { |
136 return NGX_ERROR; | 134 return NGX_ERROR; |
137 } | 135 } |
138 | 136 |
139 if (acceptex(ls->fd, s, c->data, 0, | 137 if (acceptex(ls->fd, s, c->data, 0, |
140 c->socklen + 16, c->socklen + 16, | 138 c->socklen + 16, c->socklen + 16, |