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