Mercurial > hg > nginx
comparison src/event/modules/ngx_select_module.c @ 26:53cb81681040
nginx-0.0.1-2002-12-15-09:25:09 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 15 Dec 2002 06:25:09 +0000 |
parents | f540a63026c9 |
children | c14d7232b11f |
comparison
equal
deleted
inserted
replaced
25:a8b156554dfe | 26:53cb81681040 |
---|---|
6 #include <ngx_time.h> | 6 #include <ngx_time.h> |
7 #include <ngx_connection.h> | 7 #include <ngx_connection.h> |
8 #include <ngx_event.h> | 8 #include <ngx_event.h> |
9 #include <ngx_select_module.h> | 9 #include <ngx_select_module.h> |
10 | 10 |
11 static fd_set master_read_fd_set; | 11 |
12 static fd_set master_write_fd_set; | 12 /* should be per-thread */ |
13 static fd_set work_read_fd_set; | 13 static fd_set master_read_fd_set; |
14 static fd_set work_write_fd_set; | 14 static fd_set master_write_fd_set; |
15 | 15 static fd_set work_read_fd_set; |
16 #if (WIN32) | 16 static fd_set work_write_fd_set; |
17 static int max_read; | 17 |
18 static int max_write; | 18 #if (WIN32) |
19 #else | 19 static int max_read; |
20 static int max_fd; | 20 static int max_write; |
21 #endif | 21 #else |
22 | 22 static int max_fd; |
23 static int nevents; | 23 #endif |
24 | |
25 static int nevents; | |
24 | 26 |
25 static ngx_event_t **event_index; | 27 static ngx_event_t **event_index; |
26 static ngx_event_t **ready_index; | 28 static ngx_event_t **ready_index; |
27 static ngx_event_t timer_queue; | 29 static ngx_event_t timer_queue; |
28 | 30 /* */ |
29 | 31 |
30 static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, | 32 static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, |
31 ngx_log_t *log); | 33 ngx_log_t *log); |
32 | 34 |
33 int ngx_select_init(int max_connections, ngx_log_t *log) | 35 int ngx_select_init(int max_connections, ngx_log_t *log) |
119 nevents++; | 121 nevents++; |
120 | 122 |
121 return NGX_OK; | 123 return NGX_OK; |
122 } | 124 } |
123 | 125 |
124 int ngx_select_del_event(ngx_event_t *ev, int event) | 126 int ngx_select_del_event(ngx_event_t *ev, int event, u_int flags) |
125 { | 127 { |
126 ngx_connection_t *c; | 128 ngx_connection_t *c; |
127 c = (ngx_connection_t *) ev->data; | 129 c = (ngx_connection_t *) ev->data; |
128 | 130 |
129 ngx_log_debug(c->log, "del event: %d" _ c->fd); | 131 if (ev->index == NGX_INVALID_INDEX) |
132 return NGX_OK; | |
133 | |
134 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); | |
130 | 135 |
131 #if (WIN32) | 136 #if (WIN32) |
132 if (event == NGX_READ_EVENT) { | 137 if (event == NGX_READ_EVENT) { |
133 FD_CLR(c->fd, &master_read_fd_set); | 138 FD_CLR(c->fd, &master_read_fd_set); |
134 max_read--; | 139 max_read--; |
146 | 151 |
147 if (max_fd == c->fd) | 152 if (max_fd == c->fd) |
148 max_fd = -1; | 153 max_fd = -1; |
149 #endif | 154 #endif |
150 | 155 |
151 nevents--; | 156 if (ev->index < --nevents) { |
152 | |
153 if (ev->index < nevents) { | |
154 event_index[ev->index] = event_index[nevents]; | 157 event_index[ev->index] = event_index[nevents]; |
155 event_index[ev->index]->index = ev->index; | 158 event_index[ev->index]->index = ev->index; |
156 } | 159 } |
157 | 160 |
161 ev->index = NGX_INVALID_INDEX; | |
162 | |
158 return NGX_OK; | 163 return NGX_OK; |
159 } | 164 } |
160 | 165 |
161 int ngx_select_process_events(ngx_log_t *log) | 166 int ngx_select_process_events(ngx_log_t *log) |
162 { | 167 { |
163 int i, ready, found, nready; | 168 int i, ready, found, nready; |
164 u_int timer, delta; | 169 u_int timer, delta; |
165 ngx_event_t *ev, *nx; | 170 ngx_event_t *ev; |
166 ngx_connection_t *c; | 171 ngx_connection_t *c; |
167 struct timeval tv, *tp; | 172 struct timeval tv, *tp; |
168 | 173 |
169 work_read_fd_set = master_read_fd_set; | 174 work_read_fd_set = master_read_fd_set; |
170 work_write_fd_set = master_write_fd_set; | 175 work_write_fd_set = master_write_fd_set; |
193 | 198 |
194 ngx_log_debug(log, "change max_fd: %d" _ max_fd); | 199 ngx_log_debug(log, "change max_fd: %d" _ max_fd); |
195 } | 200 } |
196 #endif | 201 #endif |
197 | 202 |
203 #if 1 | |
204 /* DEBUG */ | |
205 for (i = 0; i < nevents; i++) { | |
206 ev = event_index[i]; | |
207 c = (ngx_connection_t *) ev->data; | |
208 ngx_log_debug(log, "select: %d" _ c->fd); | |
209 } | |
210 #endif | |
211 | |
198 ngx_log_debug(log, "select timer: %d" _ timer); | 212 ngx_log_debug(log, "select timer: %d" _ timer); |
199 | 213 |
200 #if (WIN32) | 214 #if (WIN32) |
201 if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp)) | 215 if ((ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp)) |
202 #else | 216 #else |
220 | 234 |
221 ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta); | 235 ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta); |
222 | 236 |
223 if (timer) { | 237 if (timer) { |
224 if (delta >= timer) { | 238 if (delta >= timer) { |
225 for (ev = timer_queue.timer_next; | 239 for ( ;; ) { |
226 ev != &timer_queue && delta >= ev->timer_delta; | 240 ev = timer_queue.timer_next; |
227 /* void */) | 241 |
228 { | 242 if (ev == &timer_queue || delta < ev->timer_delta) |
243 break; | |
244 | |
229 delta -= ev->timer_delta; | 245 delta -= ev->timer_delta; |
230 nx = ev->timer_next; | |
231 ngx_del_timer(ev); | 246 ngx_del_timer(ev); |
232 ev->timedout = 1; | 247 ev->timedout = 1; |
233 if (ev->event_handler(ev) == -1) | 248 if (ev->event_handler(ev) == NGX_ERROR) |
234 ev->close_handler(ev); | 249 ev->close_handler(ev); |
235 ev = nx; | |
236 } | 250 } |
237 | 251 |
238 } else { | 252 } else { |
239 timer_queue.timer_next->timer_delta -= delta; | 253 timer_queue.timer_next->timer_delta -= delta; |
240 } | 254 } |
247 c = (ngx_connection_t *) ev->data; | 261 c = (ngx_connection_t *) ev->data; |
248 found = 0; | 262 found = 0; |
249 | 263 |
250 if (ev->write) { | 264 if (ev->write) { |
251 if (FD_ISSET(c->fd, &work_write_fd_set)) { | 265 if (FD_ISSET(c->fd, &work_write_fd_set)) { |
252 ngx_log_debug(log, "select write %d" _ | 266 ngx_log_debug(log, "select write %d" _ c->fd); |
253 c->fd); | |
254 found = 1; | 267 found = 1; |
255 } | 268 } |
256 | 269 |
257 } else { | 270 } else { |
258 if (FD_ISSET(c->fd, &work_read_fd_set)) { | 271 if (FD_ISSET(c->fd, &work_read_fd_set)) { |
259 ngx_log_debug(log, "select read %d" _ | 272 ngx_log_debug(log, "select read %d" _ c->fd); |
260 c->fd); | |
261 found = 1; | 273 found = 1; |
262 } | 274 } |
263 } | 275 } |
264 | 276 |
265 if (found) { | 277 if (found) { |
272 | 284 |
273 ev->ready = 1; | 285 ev->ready = 1; |
274 | 286 |
275 if (ev->oneshot) { | 287 if (ev->oneshot) { |
276 ngx_del_timer(ev); | 288 ngx_del_timer(ev); |
289 | |
277 if (ev->write) | 290 if (ev->write) |
278 ngx_select_del_event(ev, NGX_WRITE_EVENT); | 291 ngx_select_del_event(ev, NGX_WRITE_EVENT, 0); |
279 else | 292 else |
280 ngx_select_del_event(ev, NGX_READ_EVENT); | 293 ngx_select_del_event(ev, NGX_READ_EVENT, 0); |
281 } | 294 } |
282 | 295 |
283 if (ev->event_handler(ev) == -1) | 296 if (ev->event_handler(ev) == NGX_ERROR) |
284 ev->close_handler(ev); | 297 ev->close_handler(ev); |
285 | 298 |
286 ready--; | 299 ready--; |
287 } | 300 } |
288 | 301 |