Mercurial > hg > nginx
comparison src/event/ngx_event.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 | 00bee6e7b485 |
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 #include <ngx_listen.h> | |
5 #include <ngx_connection.h> | |
6 #include <ngx_event.h> | 4 #include <ngx_event.h> |
7 | 5 |
8 | 6 |
9 #define DEF_CONNECTIONS 512 | 7 #define DEF_CONNECTIONS 512 |
10 | 8 |
19 extern ngx_module_t ngx_devpoll_module; | 17 extern ngx_module_t ngx_devpoll_module; |
20 #endif | 18 #endif |
21 | 19 |
22 #if (HAVE_AIO) | 20 #if (HAVE_AIO) |
23 #include <ngx_aio_module.h> | 21 #include <ngx_aio_module.h> |
24 #endif | |
25 | |
26 #if (HAVE_IOCP) | |
27 #include <ngx_event_acceptex.h> | |
28 #include <ngx_iocp_module.h> | |
29 #endif | 22 #endif |
30 | 23 |
31 | 24 |
32 static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | 25 static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); |
33 static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | 26 static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); |
121 | 114 |
122 | 115 |
123 int ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log) | 116 int ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log) |
124 { | 117 { |
125 int m, i, fd; | 118 int m, i, fd; |
126 ngx_listen_t *s; | 119 ngx_event_t *rev, *wev; |
127 ngx_event_t *ev; | 120 ngx_listening_t *s; |
128 ngx_connection_t *c; | 121 ngx_connection_t *c; |
129 ngx_event_conf_t *ecf; | 122 ngx_event_conf_t *ecf; |
130 ngx_event_module_t *module; | 123 ngx_event_module_t *module; |
124 #if (WIN32) | |
125 ngx_iocp_conf_t *iocpcf; | |
126 #endif | |
131 | 127 |
132 ecf = ngx_event_get_conf(ngx_event_module); | 128 ecf = ngx_event_get_conf(ngx_event_module); |
133 | 129 |
134 ngx_log_debug(log, "CONN: %d" _ ecf->connections); | 130 ngx_log_debug(log, "CONN: %d" _ ecf->connections); |
135 ngx_log_debug(log, "TYPE: %d" _ ecf->use); | 131 ngx_log_debug(log, "TYPE: %d" _ ecf->use); |
159 ngx_test_null(ngx_write_events, | 155 ngx_test_null(ngx_write_events, |
160 ngx_alloc(sizeof(ngx_event_t) * ecf->connections, log), | 156 ngx_alloc(sizeof(ngx_event_t) * ecf->connections, log), |
161 NGX_ERROR); | 157 NGX_ERROR); |
162 | 158 |
163 /* for each listening socket */ | 159 /* for each listening socket */ |
164 s = (ngx_listen_t *) ls->elts; | 160 |
165 for (i = 0; i < ls->nelts; i++) { | 161 for (s = ls->elts, i = 0; i < ls->nelts; i++) { |
166 | 162 |
167 fd = s[i].fd; | 163 fd = s[i].fd; |
168 | 164 |
165 #if (WIN32) | |
166 /* | |
167 * Winsock assignes a socket number divisible by 4 | |
168 * so to find a connection we divide a socket number by 4. | |
169 */ | |
170 | |
171 c = &ngx_connections[fd / 4]; | |
172 rev = &ngx_read_events[fd / 4]; | |
173 wev = &ngx_write_events[fd / 4]; | |
174 #else | |
169 c = &ngx_connections[fd]; | 175 c = &ngx_connections[fd]; |
170 ev = &ngx_read_events[fd]; | 176 rev = &ngx_read_events[fd]; |
177 wev = &ngx_write_events[fd]; | |
178 #endif | |
171 | 179 |
172 ngx_memzero(c, sizeof(ngx_connection_t)); | 180 ngx_memzero(c, sizeof(ngx_connection_t)); |
173 ngx_memzero(ev, sizeof(ngx_event_t)); | 181 ngx_memzero(rev, sizeof(ngx_event_t)); |
174 | 182 |
175 c->fd = fd; | 183 c->fd = fd; |
176 c->family = s[i].family; | 184 c->listening = &s[i]; |
177 c->socklen = s[i].socklen; | 185 |
178 c->sockaddr = ngx_palloc(pool, s[i].socklen); | |
179 c->addr = s[i].addr; | |
180 c->addr_text = s[i].addr_text; | |
181 c->addr_text_max_len = s[i].addr_text_max_len; | |
182 c->post_accept_timeout = s[i].post_accept_timeout; | |
183 | |
184 c->handler = s[i].handler; | |
185 c->ctx = s[i].ctx; | 186 c->ctx = s[i].ctx; |
186 c->servers = s[i].servers; | 187 c->servers = s[i].servers; |
187 c->log = s[i].log; | 188 c->log = s[i].log; |
188 c->pool_size = s[i].pool_size; | 189 |
189 | 190 ngx_test_null(rev->log, ngx_palloc(pool, sizeof(ngx_log_t)), NGX_ERROR); |
190 ngx_test_null(ev->log, | 191 |
191 ngx_palloc(pool, sizeof(ngx_log_t)), | 192 ngx_memcpy(rev->log, c->log, sizeof(ngx_log_t)); |
192 NGX_ERROR); | 193 c->read = rev; |
193 | 194 c->write = wev; |
194 ngx_memcpy(ev->log, c->log, sizeof(ngx_log_t)); | 195 rev->data = c; |
195 c->read = ev; | 196 rev->index = NGX_INVALID_INDEX; |
196 ev->data = c; | |
197 ev->index = NGX_INVALID_INDEX; | |
198 #if 0 | 197 #if 0 |
199 ev->listening = 1; | 198 rev->listening = 1; |
200 #endif | 199 #endif |
201 | 200 |
202 ev->available = 0; | 201 rev->available = 0; |
203 | 202 |
204 #if (HAVE_DEFERRED_ACCEPT) | 203 #if (HAVE_DEFERRED_ACCEPT) |
205 ev->deferred_accept = s[i].deferred_accept; | 204 rev->deferred_accept = s[i].deferred_accept; |
206 #endif | 205 #endif |
207 | 206 |
208 #if (HAVE_IOCP) | 207 #if (WIN32) |
209 | 208 |
210 if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) { | 209 if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) { |
211 ev->event_handler = &ngx_event_acceptex; | 210 rev->event_handler = &ngx_event_acceptex; |
212 | 211 |
213 /* LOOK: we call ngx_iocp_add_event() also | 212 if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) { |
214 in ngx_event_post_acceptex() */ | |
215 if (ngx_iocp_add_event(ev) == NGX_ERROR) { | |
216 return NGX_ERROR; | 213 return NGX_ERROR; |
217 } | 214 } |
218 | 215 |
219 ngx_event_post_acceptex(&s[i], 1); | 216 iocpcf = ngx_event_get_conf(ngx_iocp_module); |
217 if (ngx_event_post_acceptex(&s[i], iocpcf->acceptex) == NGX_ERROR) { | |
218 return NGX_ERROR; | |
219 } | |
220 | 220 |
221 } else { | 221 } else { |
222 ev->event_handler = &ngx_event_accept; | 222 rev->event_handler = &ngx_event_accept; |
223 ngx_add_event(rev, NGX_READ_EVENT, 0); | |
223 } | 224 } |
224 | 225 |
225 #else | 226 #else |
226 | 227 |
227 ev->event_handler = &ngx_event_accept; | 228 rev->event_handler = &ngx_event_accept; |
228 ngx_add_event(ev, NGX_READ_EVENT, 0); | 229 ngx_add_event(rev, NGX_READ_EVENT, 0); |
229 | 230 |
230 #endif | 231 #endif |
231 } | 232 } |
232 | 233 |
233 return NGX_OK; | 234 return NGX_OK; |
382 | 383 |
383 ngx_conf_init_value(ecf->use, ngx_select_module.ctx_index); | 384 ngx_conf_init_value(ecf->use, ngx_select_module.ctx_index); |
384 | 385 |
385 #endif | 386 #endif |
386 | 387 |
387 #if (WIN32) | |
388 /* | |
389 * Winsock assignes a socket number according to 4 * N + M, | |
390 * where M is the constant 32 (98SE), 88 (NT) or 100 (W2K). | |
391 * So to find a connection we divide a socket number by 4. | |
392 */ | |
393 #endif | |
394 | |
395 ngx_conf_init_value(ecf->timer_queues, 10); | 388 ngx_conf_init_value(ecf->timer_queues, 10); |
396 | 389 |
397 return NGX_CONF_OK; | 390 return NGX_CONF_OK; |
398 } | 391 } |