comparison src/event/modules/ngx_devpoll_module.c @ 305:4b1a3a4acc60

nginx-0.0.3-2004-04-02-19:13:20 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 02 Apr 2004 15:13:20 +0000
parents 008276b9e061
children a0beefedaf94
comparison
equal deleted inserted replaced
304:bcbe876f4262 305:4b1a3a4acc60
34 static int ngx_devpoll_init(ngx_cycle_t *cycle); 34 static int ngx_devpoll_init(ngx_cycle_t *cycle);
35 static void ngx_devpoll_done(ngx_cycle_t *cycle); 35 static void ngx_devpoll_done(ngx_cycle_t *cycle);
36 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags); 36 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags);
37 static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags); 37 static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags);
38 static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags); 38 static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags);
39 static int ngx_devpoll_process_events(ngx_log_t *log); 39 static int ngx_devpoll_process_events(ngx_cycle_t *cycle);
40 40
41 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle); 41 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle);
42 static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf); 42 static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf);
43 43
44 static int dp = -1; 44 static int dp = -1;
306 306
307 return NGX_OK; 307 return NGX_OK;
308 } 308 }
309 309
310 310
311 int ngx_devpoll_process_events(ngx_log_t *log) 311 int ngx_devpoll_process_events(ngx_cycle_t *cycle)
312 { 312 {
313 int events, i, j; 313 int events;
314 ngx_int_t i;
315 ngx_uint_t j;
314 size_t n; 316 size_t n;
315 ngx_msec_t timer; 317 ngx_msec_t timer;
316 ngx_err_t err; 318 ngx_err_t err;
317 ngx_cycle_t **cycle; 319 ngx_cycle_t **old_cycle;
318 ngx_connection_t *c; 320 ngx_connection_t *c;
319 ngx_epoch_msec_t delta; 321 ngx_epoch_msec_t delta;
320 struct dvpoll dvp; 322 struct dvpoll dvp;
321 struct timeval tv; 323 struct timeval tv;
322 324
325 327
326 if (timer == 0) { 328 if (timer == 0) {
327 timer = (ngx_msec_t) INFTIM; 329 timer = (ngx_msec_t) INFTIM;
328 } 330 }
329 331
330 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "devpoll timer: %d", timer); 332 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
333 "devpoll timer: %d", timer);
331 334
332 if (nchanges) { 335 if (nchanges) {
333 n = nchanges * sizeof(struct pollfd); 336 n = nchanges * sizeof(struct pollfd);
334 if (write(dp, change_list, n) != (ssize_t) n) { 337 if (write(dp, change_list, n) != (ssize_t) n) {
335 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, 338 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
336 "write(/dev/poll) failed"); 339 "write(/dev/poll) failed");
337 return NGX_ERROR; 340 return NGX_ERROR;
338 } 341 }
339 } 342 }
340 343
357 delta = ngx_elapsed_msec; 360 delta = ngx_elapsed_msec;
358 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; 361 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
359 362
360 if (err) { 363 if (err) {
361 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, 364 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
362 log, err, "ioctl(DP_POLL) failed"); 365 cycle->log, err, "ioctl(DP_POLL) failed");
363 return NGX_ERROR; 366 return NGX_ERROR;
364 } 367 }
365 368
366 if (timer != (ngx_msec_t) INFTIM) { 369 if (timer != (ngx_msec_t) INFTIM) {
367 delta = ngx_elapsed_msec - delta; 370 delta = ngx_elapsed_msec - delta;
368 371
369 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 372 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
370 "devpoll timer: %d, delta: %d", timer, (int) delta); 373 "devpoll timer: %d, delta: %d", timer, (int) delta);
371 } else { 374 } else {
372 if (events == 0) { 375 if (events == 0) {
373 ngx_log_error(NGX_LOG_ALERT, log, 0, 376 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
374 "ioctl(DP_POLL) returned no events without timeout"); 377 "ioctl(DP_POLL) returned no events without timeout");
375 return NGX_ERROR; 378 return NGX_ERROR;
376 } 379 }
377 } 380 }
378 381
379 for (i = 0; i < events; i++) { 382 for (i = 0; i < events; i++) {
380 c = &ngx_cycle->connections[event_list[i].fd]; 383 c = &ngx_cycle->connections[event_list[i].fd];
381 384
382 if (c->fd == -1) { 385 if (c->fd == -1) {
383 cycle = ngx_old_cycles.elts; 386 old_cycle = ngx_old_cycles.elts;
384 for (j = 0; j < ngx_old_cycles.nelts; j++) { 387 for (j = 0; j < ngx_old_cycles.nelts; j++) {
385 if (cycle[i] == NULL) { 388 if (old_cycle[j] == NULL) {
386 continue; 389 continue;
387 } 390 }
388 c = &cycle[j]->connections[event_list[i].fd]; 391 c = &old_cycle[j]->connections[event_list[i].fd];
389 if (c->fd != -1) { 392 if (c->fd != -1) {
390 break; 393 break;
391 } 394 }
392 } 395 }
393 } 396 }
394 397
395 if (c->fd == -1) { 398 if (c->fd == -1) {
396 ngx_log_error(NGX_LOG_EMERG, log, 0, "unknown cycle"); 399 ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "unknown cycle");
397 exit(1); 400 exit(1);
398 } 401 }
399 402
400 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, 403 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
401 "devpoll: fd:%d, ev:%04X, rev:%04X", 404 "devpoll: fd:%d, ev:%04X, rev:%04X",
402 event_list[i].fd, 405 event_list[i].fd,
403 event_list[i].events, event_list[i].revents); 406 event_list[i].events, event_list[i].revents);
404 407
405 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) { 408 if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) {
406 ngx_log_error(NGX_LOG_ALERT, log, 0, 409 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
407 "ioctl(DP_POLL) error fd:%d ev:%04X rev:%04X", 410 "ioctl(DP_POLL) error fd:%d ev:%04X rev:%04X",
408 event_list[i].fd, 411 event_list[i].fd,
409 event_list[i].events, event_list[i].revents); 412 event_list[i].events, event_list[i].revents);
410 } 413 }
411 414
412 if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL)) 415 if (event_list[i].revents & ~(POLLIN|POLLOUT|POLLERR|POLLHUP|POLLNVAL))
413 { 416 {
414 ngx_log_error(NGX_LOG_ALERT, log, 0, 417 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
415 "strange ioctl(DP_POLL) events " 418 "strange ioctl(DP_POLL) events "
416 "fd:%d ev:%04X rev:%04X", 419 "fd:%d ev:%04X rev:%04X",
417 event_list[i].fd, 420 event_list[i].fd,
418 event_list[i].events, event_list[i].revents); 421 event_list[i].events, event_list[i].revents);
419 } 422 }