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;