Mercurial > hg > nginx
comparison src/event/ngx_event_acceptex.c @ 103:6dfda4cf5200
nginx-0.0.1-2003-06-11-19:28:34 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 11 Jun 2003 15:28:34 +0000 |
parents | 7e86d028d8f0 |
children | ac69ab96328d |
comparison
equal
deleted
inserted
replaced
102:7e86d028d8f0 | 103:6dfda4cf5200 |
---|---|
1 | 1 |
2 #include <ngx_config.h> | 2 #include <ngx_config.h> |
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 | |
5 #include <ngx_listen.h> | |
6 | |
7 #include <ngx_event.h> | 4 #include <ngx_event.h> |
8 #if 0 | 5 #include <nginx.h> |
9 #include <ngx_event_close.h> | |
10 #include <ngx_iocp_module.h> | |
11 #endif | |
12 | 6 |
13 | 7 |
14 void ngx_event_acceptex(ngx_event_t *rev) | 8 void ngx_event_acceptex(ngx_event_t *rev) |
15 { | 9 { |
16 ngx_connection_t *c; | 10 ngx_connection_t *c; |
17 | 11 |
18 c = (ngx_connection_t *) rev->data; | 12 c = (ngx_connection_t *) rev->data; |
19 | 13 |
20 ngx_log_debug(rev->log, "ADDR: %s" _ c->addr_text.data); | |
21 | |
22 if (rev->ovlp.error) { | 14 if (rev->ovlp.error) { |
23 ngx_log_error(NGX_LOG_CRIT, rev->log, rev->ovlp.error, | 15 ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error, |
24 "AcceptEx() failed for %s", c->addr_text.data); | 16 "AcceptEx() %s failed", c->listening->addr_text.data); |
25 return; | 17 return; |
26 } | 18 } |
27 | 19 |
28 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ | 20 /* SO_UPDATE_ACCEPT_CONTEXT is required for shutdown() to work */ |
29 | 21 |
30 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, | 22 if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, |
31 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) | 23 (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1) |
32 { | 24 { |
33 ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_socket_errno, | 25 ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno, |
34 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", | 26 "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s", |
35 c->addr_text.data); | 27 c->addr_text.data); |
36 } else { | 28 } else { |
37 accept_context_updated = 1; | 29 c->accept_context_updated = 1; |
38 } | 30 } |
39 | 31 |
40 getacceptexsockaddrs(c->data, 0, | 32 getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size, |
41 c->socklen + 16, c->socklen + 16, | 33 c->listening->socklen + 16, |
34 c->listening->socklen + 16, | |
42 &c->local_sockaddr, &c->local_socklen, | 35 &c->local_sockaddr, &c->local_socklen, |
43 &c->sockaddr, &c->socklen); | 36 &c->sockaddr, &c->socklen); |
44 | 37 |
38 if (c->listening->post_accept_buffer_size) { | |
39 c->buffer->last += rev->available; | |
40 c->buffer->end = c->buffer->start | |
41 + c->listening->post_accept_buffer_size; | |
42 | |
43 } else { | |
44 c->buffer = NULL; | |
45 } | |
46 | |
45 ngx_event_post_acceptex(c->listening, 1); | 47 ngx_event_post_acceptex(c->listening, 1); |
46 | 48 |
47 /* STUB: InterlockedInc() */ | 49 /* TODO: MT */ |
48 c->number = ngx_connection_counter++; | 50 c->number = ngx_connection_counter++; |
49 | 51 |
50 c->handler(c); | 52 c->listening->handler(c); |
51 | 53 |
52 return; | 54 return; |
53 | 55 |
54 } | 56 } |
55 | 57 |
56 | 58 |
57 int ngx_event_post_acceptex(ngx_listen_t *ls, int n) | 59 int ngx_event_post_acceptex(ngx_listening_t *ls, int n) |
58 { | 60 { |
59 int i; | 61 int i; |
60 u_int rcvd; | 62 u_int rcvd; |
61 ngx_err_t err; | 63 ngx_err_t err; |
62 ngx_pool_t *pool; | |
63 ngx_event_t *rev, *wev; | 64 ngx_event_t *rev, *wev; |
64 ngx_socket_t s; | 65 ngx_socket_t s; |
65 ngx_connection_t *c; | 66 ngx_connection_t *c; |
66 | 67 |
67 for (i = 0; i < n; i++) { | 68 for (i = 0; i < n; i++) { |
68 | 69 |
69 /* TODO: look up reused sockets */ | 70 /* TODO: look up reused sockets */ |
70 | 71 |
71 ngx_log_debug(ls->log, "socket: %x" _ ls->flags); | |
72 | |
73 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); | 72 s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags); |
73 ngx_log_debug(ls->log, ngx_socket_n ": %d:%d" _ s _ ls->flags); | |
74 | 74 |
75 if (s == -1) { | 75 if (s == -1) { |
76 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, | 76 ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno, |
77 ngx_socket_n " for AcceptEx() post failed"); | 77 ngx_socket_n " for AcceptEx() %s post failed", |
78 ls->addr_text.data); | |
78 | 79 |
79 return NGX_ERROR; | 80 return NGX_ERROR; |
80 } | 81 } |
81 | 82 |
82 ngx_test_null(pool, ngx_create_pool(ls->pool_size, ls->log), NGX_ERROR); | 83 /* |
84 * Winsock assignes a socket number divisible by 4 | |
85 * so to find a connection we divide a socket number by 4. | |
86 */ | |
83 | 87 |
84 rev = &ngx_read_events[s]; | 88 if (s % 4) { |
85 wev = &ngx_write_events[s]; | 89 ngx_log_error(NGX_LOG_EMERG, ls->log, 0, |
86 c = &ngx_connections[s]; | 90 ngx_socket_n " created socket %d", s); |
91 exit(1); | |
92 } | |
93 | |
94 rev = &ngx_read_events[s / 4]; | |
95 wev = &ngx_write_events[s / 4]; | |
96 c = &ngx_connections[s / 4]; | |
87 | 97 |
88 ngx_memzero(rev, sizeof(ngx_event_t)); | 98 ngx_memzero(rev, sizeof(ngx_event_t)); |
89 ngx_memzero(wev, sizeof(ngx_event_t)); | 99 ngx_memzero(wev, sizeof(ngx_event_t)); |
90 ngx_memzero(c, sizeof(ngx_connection_t)); | 100 ngx_memzero(c, sizeof(ngx_connection_t)); |
91 | |
92 c->pool = pool; | |
93 | 101 |
94 rev->index = wev->index = NGX_INVALID_INDEX; | 102 rev->index = wev->index = NGX_INVALID_INDEX; |
95 | 103 |
96 rev->ovlp.event = rev; | 104 rev->ovlp.event = rev; |
97 wev->ovlp.event = wev; | 105 wev->ovlp.event = wev; |
98 | 106 |
99 rev->data = wev->data = c; | 107 rev->data = wev->data = c; |
100 c->read = rev; | 108 c->read = rev; |
101 c->write = wev; | 109 c->write = wev; |
102 | 110 |
103 c->family = ls->family; | |
104 c->socklen = ls->socklen; | |
105 c->addr = ls->addr; | |
106 c->addr_text_max_len = ls->addr_text_max_len; | |
107 c->post_accept_timeout = ls->post_accept_timeout; | |
108 | |
109 c->listening = ls; | 111 c->listening = ls; |
110 c->fd = s; | 112 c->fd = s; |
111 | |
112 c->unexpected_eof = 1; | |
113 wev->write = 1; | |
114 | |
115 c->handler = ls->handler; | |
116 rev->event_handler = ngx_event_acceptex; | |
117 | 113 |
118 c->ctx = ls->ctx; | 114 c->ctx = ls->ctx; |
119 c->servers = ls->servers; | 115 c->servers = ls->servers; |
120 | 116 |
121 ngx_test_null(c->data, ngx_palloc(pool, 2 * (c->socklen + 16)), | 117 c->unexpected_eof = 1; |
118 wev->write = 1; | |
119 rev->event_handler = ngx_event_acceptex; | |
120 | |
121 ngx_test_null(c->pool, | |
122 ngx_create_pool(ls->pool_size, ls->log), | |
122 NGX_ERROR); | 123 NGX_ERROR); |
123 ngx_test_null(c->local_sockaddr, ngx_palloc(pool, c->socklen), | 124 |
125 ngx_test_null(c->buffer, | |
126 ngx_create_temp_hunk(c->pool, | |
127 ls->post_accept_buffer_size | |
128 + 2 * (c->listening->socklen + 16), | |
129 0, 0), | |
124 NGX_ERROR); | 130 NGX_ERROR); |
125 ngx_test_null(c->sockaddr, ngx_palloc(pool, c->socklen), | 131 |
132 ngx_test_null(c->local_sockaddr, ngx_palloc(c->pool, ls->socklen), | |
133 NGX_ERROR); | |
134 | |
135 ngx_test_null(c->sockaddr, ngx_palloc(c->pool, ls->socklen), | |
126 NGX_ERROR); | 136 NGX_ERROR); |
127 | 137 |
128 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), | 138 ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)), |
129 NGX_ERROR); | 139 NGX_ERROR); |
140 | |
130 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); | 141 ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); |
131 rev->log = wev->log = c->log; | 142 c->read->log = c->write->log = c->log; |
132 | 143 |
133 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { | 144 if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) { |
134 return NGX_ERROR; | 145 return NGX_ERROR; |
135 } | 146 } |
136 | 147 |
137 if (acceptex(ls->fd, s, c->data, 0, | 148 if (acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size, |
138 c->socklen + 16, c->socklen + 16, | 149 ls->socklen + 16, ls->socklen + 16, |
139 &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0) { | 150 &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0) |
151 { | |
140 | 152 |
141 err = ngx_socket_errno; | 153 err = ngx_socket_errno; |
142 if (err == WSA_IO_PENDING) { | 154 if (err != WSA_IO_PENDING) { |
143 return NGX_OK; | 155 ngx_log_error(NGX_LOG_ALERT, ls->log, err, |
156 "AcceptEx() %s falied", ls->addr_text.data); | |
157 | |
158 return NGX_ERROR; | |
144 } | 159 } |
145 | |
146 ngx_log_error(NGX_LOG_ALERT, ls->log, err, | |
147 "AcceptEx(%s) falied", ls->addr_text.data); | |
148 | |
149 return NGX_ERROR; | |
150 } | 160 } |
151 } | 161 } |
152 | 162 |
153 return NGX_OK; | 163 return NGX_OK; |
154 } | 164 } |