Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_select_module.c @ 17:8dd06e2844f5
nginx-0.0.1-2002-09-27-19:05:29 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 27 Sep 2002 15:05:29 +0000 |
parents | 2aba961a1d34 |
children | f540a63026c9 |
comparison
equal
deleted
inserted
replaced
16:6ce4755737b4 | 17:8dd06e2844f5 |
---|---|
18 static int max_write; | 18 static int max_write; |
19 #else | 19 #else |
20 static int max_fd; | 20 static int max_fd; |
21 #endif | 21 #endif |
22 | 22 |
23 static ngx_event_t event_queue; | 23 static int nevents; |
24 static ngx_event_t timer_queue; | 24 |
25 static ngx_event_t **event_index; | |
26 static ngx_event_t **ready_index; | |
27 static ngx_event_t timer_queue; | |
25 | 28 |
26 | 29 |
27 static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, | 30 static fd_set *ngx_select_get_fd_set(ngx_socket_t fd, int event, |
28 ngx_log_t *log); | 31 ngx_log_t *log); |
29 | 32 |
30 void ngx_select_init(int max_connections, ngx_log_t *log) | 33 int ngx_select_init(int max_connections, ngx_log_t *log) |
31 { | 34 { |
32 if (max_connections > FD_SETSIZE) { | 35 if (max_connections > FD_SETSIZE) { |
33 ngx_log_error(NGX_LOG_EMERG, log, 0, | 36 ngx_log_error(NGX_LOG_EMERG, log, 0, |
34 #if (WIN32) | 37 #if (WIN32) |
35 "maximum number of descriptors " | 38 "maximum number of descriptors " |
42 } | 45 } |
43 | 46 |
44 FD_ZERO(&master_read_fd_set); | 47 FD_ZERO(&master_read_fd_set); |
45 FD_ZERO(&master_write_fd_set); | 48 FD_ZERO(&master_write_fd_set); |
46 | 49 |
47 event_queue.prev = &event_queue; | 50 ngx_test_null(event_index, |
48 event_queue.next = &event_queue; | 51 ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), |
52 NGX_ERROR); | |
53 | |
54 ngx_test_null(ready_index, | |
55 ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log), | |
56 NGX_ERROR); | |
57 | |
58 nevents = 0; | |
49 | 59 |
50 timer_queue.timer_prev = &timer_queue; | 60 timer_queue.timer_prev = &timer_queue; |
51 timer_queue.timer_next = &timer_queue; | 61 timer_queue.timer_next = &timer_queue; |
52 | 62 |
53 ngx_event_actions.add = ngx_select_add_event; | 63 ngx_event_actions.add = ngx_select_add_event; |
58 #if (WIN32) | 68 #if (WIN32) |
59 max_read = max_write = 0; | 69 max_read = max_write = 0; |
60 #else | 70 #else |
61 max_fd = -1; | 71 max_fd = -1; |
62 #endif | 72 #endif |
73 | |
74 return NGX_OK; | |
63 } | 75 } |
64 | 76 |
65 int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) | 77 int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags) |
66 { | 78 { |
67 ngx_connection_t *c; | 79 ngx_connection_t *c; |
100 | 112 |
101 #endif | 113 #endif |
102 | 114 |
103 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; | 115 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0; |
104 | 116 |
105 ev->prev = &event_queue; | 117 event_index[nevents] = ev; |
106 ev->next = event_queue.next; | 118 ev->index = nevents; |
107 event_queue.next->prev = ev; | 119 nevents++; |
108 event_queue.next = ev; | |
109 | 120 |
110 return NGX_OK; | 121 return NGX_OK; |
111 } | 122 } |
112 | 123 |
113 int ngx_select_del_event(ngx_event_t *ev, int event) | 124 int ngx_select_del_event(ngx_event_t *ev, int event) |
133 | 144 |
134 if (max_fd == c->fd) | 145 if (max_fd == c->fd) |
135 max_fd = -1; | 146 max_fd = -1; |
136 #endif | 147 #endif |
137 | 148 |
138 if (ev->prev) | 149 if (ev->index < nevents) { |
139 ev->prev->next = ev->next; | 150 event_index[ev->index] = event_index[nevents]; |
140 | 151 event_index[ev->index]->index = ev->index; |
141 if (ev->next) { | 152 } |
142 ev->next->prev = ev->prev; | 153 |
143 ev->prev = NULL; | 154 nevents--; |
144 } | |
145 | |
146 if (ev->prev) | |
147 ev->next = NULL; | |
148 | 155 |
149 return NGX_OK; | 156 return NGX_OK; |
150 } | 157 } |
151 | 158 |
152 int ngx_select_process_events(ngx_log_t *log) | 159 int ngx_select_process_events(ngx_log_t *log) |
153 { | 160 { |
154 int ready, found; | 161 int i, ready, found, nready; |
155 u_int timer, delta; | 162 u_int timer, delta; |
156 ngx_event_t *ev, *nx; | 163 ngx_event_t *ev, *nx; |
157 ngx_connection_t *c; | 164 ngx_connection_t *c; |
158 struct timeval tv, *tp; | 165 struct timeval tv, *tp; |
159 | 166 |
174 delta = 0; | 181 delta = 0; |
175 } | 182 } |
176 | 183 |
177 #if !(WIN32) | 184 #if !(WIN32) |
178 if (max_fd == -1) { | 185 if (max_fd == -1) { |
179 for (ev = event_queue.next; ev != &event_queue; ev = ev->next) { | 186 for (i = 0; i < nevents; i++) { |
180 c = (ngx_connection_t *) ev->data; | 187 c = (ngx_connection_t *) event_index[i]->data; |
181 if (max_fd < c->fd) | 188 if (max_fd < c->fd) |
182 max_fd = c->fd; | 189 max_fd = c->fd; |
183 } | 190 } |
184 | 191 |
185 ngx_log_debug(log, "change max_fd: %d" _ max_fd); | 192 ngx_log_debug(log, "change max_fd: %d" _ max_fd); |
229 } else { | 236 } else { |
230 timer_queue.timer_next->timer_delta -= delta; | 237 timer_queue.timer_next->timer_delta -= delta; |
231 } | 238 } |
232 } | 239 } |
233 | 240 |
234 for (ev = event_queue.next; ev != &event_queue; /* void */) { | 241 nready = 0; |
242 | |
243 for (i = 0; i < nevents; i++) { | |
244 ev = event_index[i]; | |
235 c = (ngx_connection_t *) ev->data; | 245 c = (ngx_connection_t *) ev->data; |
236 found = 0; | 246 found = 0; |
237 | 247 |
238 if (ev->write) { | 248 if (ev->write) { |
239 if (FD_ISSET(c->fd, &work_write_fd_set)) { | 249 if (FD_ISSET(c->fd, &work_write_fd_set)) { |
248 c->fd); | 258 c->fd); |
249 found = 1; | 259 found = 1; |
250 } | 260 } |
251 } | 261 } |
252 | 262 |
253 nx = ev->next; | |
254 | |
255 if (found) { | 263 if (found) { |
256 ev->ready = 1; | 264 ready_index[nready++] = ev; |
257 | 265 } |
258 if (ev->oneshot) { | 266 } |
259 ngx_del_timer(ev); | 267 |
260 if (ev->write) | 268 for (i = 0; i < nready; i++) { |
261 ngx_select_del_event(ev, NGX_WRITE_EVENT); | 269 ev = ready_index[i]; |
262 else | 270 |
263 ngx_select_del_event(ev, NGX_READ_EVENT); | 271 ev->ready = 1; |
264 } | 272 |
265 | 273 if (ev->oneshot) { |
266 if (ev->event_handler(ev) == -1) | 274 ngx_del_timer(ev); |
267 ev->close_handler(ev); | 275 if (ev->write) |
268 | 276 ngx_select_del_event(ev, NGX_WRITE_EVENT); |
269 ready--; | 277 else |
270 } | 278 ngx_select_del_event(ev, NGX_READ_EVENT); |
271 | 279 } |
272 ev = nx; | 280 |
281 if (ev->event_handler(ev) == -1) | |
282 ev->close_handler(ev); | |
283 | |
284 ready--; | |
273 } | 285 } |
274 | 286 |
275 ngx_assert((ready == 0), /* void */ ; , log, "select ready != events"); | 287 ngx_assert((ready == 0), /* void */ ; , log, "select ready != events"); |
276 | 288 |
277 return NGX_OK; | 289 return NGX_OK; |