comparison src/event/modules/ngx_poll_module.c @ 245:e6c005b66b3a

nginx-0.0.1-2004-01-30-00:45:01 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 29 Jan 2004 21:45:01 +0000
parents 1119faf4635a
children 6753e8cdaa2c
comparison
equal deleted inserted replaced
244:187dc0a3197d 245:e6c005b66b3a
1 1
2 /* 2 /*
3 * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru 3 * Copyright (C) 2002-2004 Igor Sysoev, http://sysoev.ru/en/
4 */ 4 */
5 5
6 6
7 #include <ngx_config.h> 7 #include <ngx_config.h>
8 #include <ngx_core.h> 8 #include <ngx_core.h>
144 #if (NGX_WRITE_EVENT != POLLOUT) 144 #if (NGX_WRITE_EVENT != POLLOUT)
145 event = POLLOUT; 145 event = POLLOUT;
146 #endif 146 #endif
147 } 147 }
148 148
149 #if (NGX_DEBUG_EVENT) 149 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
150 ngx_log_debug(ev->log, "add event: %d:%d" _ c->fd _ event); 150 "poll add event: fd:%d ev:%d", c->fd, event);
151 #endif
152 151
153 if (e == NULL || e->index == NGX_INVALID_INDEX) { 152 if (e == NULL || e->index == NGX_INVALID_INDEX) {
154 event_list[nevents].fd = c->fd; 153 event_list[nevents].fd = c->fd;
155 event_list[nevents].events = event; 154 event_list[nevents].events = event;
156 event_list[nevents].revents = 0; 155 event_list[nevents].revents = 0;
190 #if (NGX_WRITE_EVENT != POLLOUT) 189 #if (NGX_WRITE_EVENT != POLLOUT)
191 event = POLLOUT; 190 event = POLLOUT;
192 #endif 191 #endif
193 } 192 }
194 193
195 #if (NGX_DEBUG_EVENT) 194 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
196 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); 195 "poll del event: fd:%d ev:%d", c->fd, event);
197 #endif
198 196
199 if (e == NULL || e->index == NGX_INVALID_INDEX) { 197 if (e == NULL || e->index == NGX_INVALID_INDEX) {
200 if (ev->index < (u_int) --nevents) { 198 if (ev->index < (u_int) --nevents) {
201 event_list[ev->index] = event_list[nevents]; 199 event_list[ev->index] = event_list[nevents];
202 event_index[ev->index] = event_index[nevents]; 200 event_index[ev->index] = event_index[nevents];
219 int i, j, ready, nready, found; 217 int i, j, ready, nready, found;
220 ngx_msec_t timer; 218 ngx_msec_t timer;
221 ngx_err_t err; 219 ngx_err_t err;
222 ngx_cycle_t **cycle; 220 ngx_cycle_t **cycle;
223 ngx_event_t *ev; 221 ngx_event_t *ev;
224 ngx_epoch_msec_t delta; 222 ngx_epoch_msec_t delta;
225 ngx_connection_t *c; 223 ngx_connection_t *c;
226 struct timeval tv; 224 struct timeval tv;
227 225
228 timer = ngx_event_find_timer(); 226 timer = ngx_event_find_timer();
229 227 ngx_old_elapsed_msec = ngx_elapsed_msec;
230 if (timer) { 228
231 ngx_gettimeofday(&tv); 229 if (timer == 0) {
232 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
233
234 } else {
235 timer = (ngx_msec_t) INFTIM; 230 timer = (ngx_msec_t) INFTIM;
236 delta = 0; 231 }
237 } 232
238 233 #if (NGX_DEBUG)
239 #if (NGX_DEBUG_EVENT)
240 for (i = 0; i < nevents; i++) { 234 for (i = 0; i < nevents; i++) {
241 ngx_log_debug(log, "poll: %d, %d" _ 235 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, "poll: fd:%d ev:%04X",
242 event_list[i].fd _ event_list[i].events); 236 event_list[i].fd, event_list[i].events);
243 } 237 }
244 238
245 ngx_log_debug(log, "poll timer: %d" _ timer); 239 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll timer: %d", timer);
246 #endif 240 #endif
247 241
248 ready = poll(event_list, (u_int) nevents, (int) timer); 242 ready = poll(event_list, (u_int) nevents, (int) timer);
249 243
250 if (ready == -1) { 244 if (ready == -1) {
251 err = ngx_errno; 245 err = ngx_errno;
252 } else { 246 } else {
253 err = 0; 247 err = 0;
254 } 248 }
255 249
256 ngx_log_debug(log, "poll ready %d" _ ready); 250 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "poll ready %d", ready);
257 251
258 ngx_gettimeofday(&tv); 252 ngx_gettimeofday(&tv);
259 ngx_time_update(tv.tv_sec); 253 ngx_time_update(tv.tv_sec);
260 254
255 delta = ngx_elapsed_msec;
256 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
257
261 if ((int) timer != INFTIM) { 258 if ((int) timer != INFTIM) {
262 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; 259 delta = ngx_elapsed_msec - delta;
263 260
264 #if (NGX_DEBUG_EVENT) 261 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
265 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta); 262 "poll timer: %d, delta: %d", timer, (int) delta);
266 #endif
267 ngx_event_expire_timers((ngx_msec_t) delta);
268
269 } else { 263 } else {
270 if (ready == 0) { 264 if (ready == 0) {
271 ngx_log_error(NGX_LOG_ALERT, log, 0, 265 ngx_log_error(NGX_LOG_ALERT, log, 0,
272 "poll() returned no events without timeout"); 266 "poll() returned no events without timeout");
273 return NGX_ERROR; 267 return NGX_ERROR;
274 } 268 }
275
276 #if (NGX_DEBUG_EVENT)
277 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta);
278 #endif
279 } 269 }
280 270
281 if (err) { 271 if (err) {
282 ngx_log_error(NGX_LOG_ALERT, log, err, "poll() failed"); 272 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
273 log, err, "poll() failed");
283 return NGX_ERROR; 274 return NGX_ERROR;
284 } 275 }
285 276
286 nready = 0; 277 nready = 0;
287 278
304 if (c->fd == -1) { 295 if (c->fd == -1) {
305 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle"); 296 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle");
306 exit(1); 297 exit(1);
307 } 298 }
308 299
309 #if (NGX_DEBUG_EVENT) 300 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,
310 ngx_log_debug(log, "poll: fd:%d, ev:%d, rev:%d" _ 301 "poll: fd:%d ev:%04X rev:%04X",
311 event_list[i].fd _ 302 event_list[i].fd,
312 event_list[i].events _ event_list[i].revents); 303 event_list[i].events, event_list[i].revents);
313 #endif
314 304
315 found = 0; 305 found = 0;
316 306
317 if (event_list[i].revents & POLLNVAL) { 307 if (event_list[i].revents & POLLNVAL) {
318 ngx_log_error(NGX_LOG_ALERT, log, EBADF, 308 ngx_log_error(NGX_LOG_ALERT, log, EBADF,
341 continue; 331 continue;
342 } 332 }
343 333
344 if (event_list[i].revents & (POLLERR|POLLHUP)) { 334 if (event_list[i].revents & (POLLERR|POLLHUP)) {
345 ngx_log_error(NGX_LOG_ALERT, log, 0, 335 ngx_log_error(NGX_LOG_ALERT, log, 0,
346 "strange poll() error on %d:%d:%d", 336 "strange poll() error on fd:%d ev:%04X rev:%04X",
347 event_list[i].fd, 337 event_list[i].fd,
348 event_list[i].events, event_list[i].revents); 338 event_list[i].events, event_list[i].revents);
349 } 339 }
350 } 340 }
351 341
375 365
376 if (ready != 0) { 366 if (ready != 0) {
377 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events"); 367 ngx_log_error(NGX_LOG_ALERT, log, 0, "poll ready != events");
378 } 368 }
379 369
370 if (timer != (ngx_msec_t) INFTIM && delta) {
371 ngx_event_expire_timers((ngx_msec_t) delta);
372 }
373
380 return NGX_OK; 374 return NGX_OK;
381 } 375 }