comparison src/event/modules/ngx_poll_module.c @ 252:84b1c672ec5a

nginx-0.0.2-2004-02-05-19:58:36 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 05 Feb 2004 16:58:36 +0000
parents c31c40540318
children b6793bc5034b
comparison
equal deleted inserted replaced
251:c31c40540318 252:84b1c672ec5a
17 17
18 18
19 static struct pollfd *event_list; 19 static struct pollfd *event_list;
20 static int nevents; 20 static int nevents;
21 21
22 static ngx_event_t **event_index;
23 static ngx_event_t **ready_index; 22 static ngx_event_t **ready_index;
24 23
25 24
26 static ngx_str_t poll_name = ngx_string("poll"); 25 static ngx_str_t poll_name = ngx_string("poll");
27 26
56 55
57 56
58 static int ngx_poll_init(ngx_cycle_t *cycle) 57 static int ngx_poll_init(ngx_cycle_t *cycle)
59 { 58 {
60 struct pollfd *list; 59 struct pollfd *list;
61 ngx_event_t **index;
62 60
63 if (event_list == NULL) { 61 if (event_list == NULL) {
64 nevents = 0; 62 nevents = 0;
65 } 63 }
66 64
77 ngx_free(event_list); 75 ngx_free(event_list);
78 } 76 }
79 77
80 event_list = list; 78 event_list = list;
81 79
82 ngx_test_null(index,
83 ngx_alloc(sizeof(ngx_event_t *) * cycle->connection_n,
84 cycle->log),
85 NGX_ERROR);
86
87 if (event_index) {
88 ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents);
89 ngx_free(event_index);
90 }
91
92 event_index = index;
93
94 if (ready_index) { 80 if (ready_index) {
95 ngx_free(ready_index); 81 ngx_free(ready_index);
96 } 82 }
97 83
98 ngx_test_null(ready_index, 84 ngx_test_null(ready_index,
112 98
113 99
114 static void ngx_poll_done(ngx_cycle_t *cycle) 100 static void ngx_poll_done(ngx_cycle_t *cycle)
115 { 101 {
116 ngx_free(event_list); 102 ngx_free(event_list);
117 ngx_free(event_index);
118 ngx_free(ready_index); 103 ngx_free(ready_index);
119 104
120 event_list = NULL; 105 event_list = NULL;
121 event_index = NULL;
122 ready_index = NULL; 106 ready_index = NULL;
123 } 107 }
124 108
125 109
126 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) 110 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags)
134 ngx_log_error(NGX_LOG_ALERT, ev->log, 0, 118 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
135 "poll event fd:%d ev:%d is already set", c->fd, event); 119 "poll event fd:%d ev:%d is already set", c->fd, event);
136 return NGX_OK; 120 return NGX_OK;
137 } 121 }
138 122
139 ev->active = 1;
140 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
141
142 if (event == NGX_READ_EVENT) { 123 if (event == NGX_READ_EVENT) {
143 e = c->write; 124 e = c->write;
144 #if (NGX_READ_EVENT != POLLIN) 125 #if (NGX_READ_EVENT != POLLIN)
145 event = POLLIN; 126 event = POLLIN;
146 #endif 127 #endif
158 if (e == NULL || e->index == NGX_INVALID_INDEX) { 139 if (e == NULL || e->index == NGX_INVALID_INDEX) {
159 event_list[nevents].fd = c->fd; 140 event_list[nevents].fd = c->fd;
160 event_list[nevents].events = event; 141 event_list[nevents].events = event;
161 event_list[nevents].revents = 0; 142 event_list[nevents].revents = 0;
162 143
163 event_index[nevents] = ev;
164 ev->index = nevents; 144 ev->index = nevents;
165 nevents++; 145 nevents++;
166 146
167 } else { 147 } else {
168 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, 148 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
170 150
171 event_list[e->index].events |= event; 151 event_list[e->index].events |= event;
172 ev->index = e->index; 152 ev->index = e->index;
173 } 153 }
174 154
155 ev->active = 1;
156 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
157
175 return NGX_OK; 158 return NGX_OK;
176 } 159 }
177 160
178 161
179 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags) 162 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags)
180 { 163 {
181 ngx_event_t *e; 164 ngx_int_t i;
182 ngx_connection_t *c; 165 ngx_cycle_t **cycle;
183 166 ngx_event_t *e;
184 c = (ngx_connection_t *) ev->data; 167 ngx_connection_t *c;
168
169 c = ev->data;
185 170
186 if (ev->index == NGX_INVALID_INDEX) { 171 if (ev->index == NGX_INVALID_INDEX) {
172 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
173 "poll event fd:%d ev:%d is already deleted",
174 c->fd, event);
187 return NGX_OK; 175 return NGX_OK;
188 } 176 }
189 177
190 if (event == NGX_READ_EVENT) { 178 if (event == NGX_READ_EVENT) {
191 e = c->write; 179 e = c->write;
206 if (e == NULL || e->index == NGX_INVALID_INDEX) { 194 if (e == NULL || e->index == NGX_INVALID_INDEX) {
207 nevents--; 195 nevents--;
208 196
209 if (ev->index < (u_int) nevents) { 197 if (ev->index < (u_int) nevents) {
210 event_list[ev->index] = event_list[nevents]; 198 event_list[ev->index] = event_list[nevents];
211 event_index[ev->index] = event_index[nevents]; 199
212 event_index[ev->index]->index = ev->index; 200 c = &ngx_cycle->connections[event_list[nevents].fd];
201
202 if (c->fd == -1) {
203 cycle = ngx_old_cycles.elts;
204 for (i = 0; i < ngx_old_cycles.nelts; i++) {
205 if (cycle[i] == NULL) {
206 continue;
207 }
208 c = &cycle[i]->connections[event_list[nevents].fd];
209 if (c->fd != -1) {
210 break;
211 }
212 }
213 }
214
215 if (c->fd == -1) {
216 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
217 "unexpected last event");
218
219 } else {
220 if (c->read->index == (u_int) nevents) {
221 c->read->index = ev->index;
222
223 } else if (c->write->index == (u_int) nevents) {
224 c->write->index = ev->index;
225
226 } else {
227 ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
228 "unexpected last event index");
229 }
230 }
213 } 231 }
214 232
215 } else { 233 } else {
216 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0, 234 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ev->log, 0,
217 "poll index: %d", e->index); 235 "poll index: %d", e->index);
226 } 244 }
227 245
228 246
229 static int ngx_poll_process_events(ngx_log_t *log) 247 static int ngx_poll_process_events(ngx_log_t *log)
230 { 248 {
231 int i, j, ready, nready, found; 249 int ready;
250 ngx_int_t i, j, nready, found;
232 ngx_msec_t timer; 251 ngx_msec_t timer;
233 ngx_err_t err; 252 ngx_err_t err;
234 ngx_cycle_t **cycle; 253 ngx_cycle_t **cycle;
235 ngx_event_t *ev; 254 ngx_event_t *ev;
236 ngx_epoch_msec_t delta; 255 ngx_epoch_msec_t delta;
242 261
243 if (timer == 0) { 262 if (timer == 0) {
244 timer = (ngx_msec_t) INFTIM; 263 timer = (ngx_msec_t) INFTIM;
245 } 264 }
246 265
247 #if (NGX_DEBUG) 266 #if (NGX_DEBUG0)
248 for (i = 0; i < nevents; i++) { 267 for (i = 0; i < nevents; i++) {
249 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X", 268 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "poll: %d: fd:%d ev:%04X",
250 i, event_list[i].fd, event_list[i].events); 269 i, event_list[i].fd, event_list[i].events);
251 } 270 }
252 271
290 309
291 nready = 0; 310 nready = 0;
292 311
293 for (i = 0; i < nevents && ready; i++) { 312 for (i = 0; i < nevents && ready; i++) {
294 313
314 #if 0
295 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0, 315 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
296 "poll: %d: fd:%d ev:%04X rev:%04X", 316 "poll: %d: fd:%d ev:%04X rev:%04X",
297 i, event_list[i].fd, 317 i, event_list[i].fd,
298 event_list[i].events, event_list[i].revents); 318 event_list[i].events, event_list[i].revents);
319 #else
320 if (event_list[i].revents) {
321 ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
322 "poll: %d: fd:%d ev:%04X rev:%04X",
323 i, event_list[i].fd,
324 event_list[i].events, event_list[i].revents);
325 }
326 #endif
299 327
300 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { 328 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) {
301 ngx_log_error(NGX_LOG_ALERT, log, 0, 329 ngx_log_error(NGX_LOG_ALERT, log, 0,
302 "poll() error fd:%d ev:%04X rev:%04X", 330 "poll() error fd:%d ev:%04X rev:%04X",
303 event_list[i].fd, 331 event_list[i].fd,
333 } 361 }
334 } 362 }
335 } 363 }
336 364
337 if (c->fd == -1) { 365 if (c->fd == -1) {
338 ngx_log_error(NGX_LOG_ALERT, log, 0, "unknown cycle"); 366 ngx_log_error(NGX_LOG_ALERT, log, 0, "unexpected event");
339 367
340 /* 368 /*
341 * it is certainly our fault and it should be investigated, 369 * it is certainly our fault and it should be investigated,
342 * in the meantime we disable this event to avoid a CPU spinning 370 * in the meantime we disable this event to avoid a CPU spinning
343 */ 371 */