| 441 | } |
| 442 | |
| 443 | int event_process(EVENT *ev, int timeout) |
| 444 | { |
| 445 | int processed = 0, numevents, j; |
| 446 | int mask, fd, rfired; |
| 447 | FILE_EVENT *fe; |
| 448 | #ifdef DEL_DELAY |
| 449 | int ndefer; |
| 450 | #endif |
| 451 | |
| 452 | if (ev->timeout < 0) { |
| 453 | if (timeout < 0) |
| 454 | timeout = 100; |
| 455 | } else if (timeout < 0) |
| 456 | timeout = ev->timeout; |
| 457 | else if (timeout > ev->timeout) |
| 458 | timeout = ev->timeout; |
| 459 | |
| 460 | /* limit the event wait time just for fiber schedule exiting |
| 461 | * quickly when no tasks left |
| 462 | */ |
| 463 | if (timeout > 1000 || timeout <= 0) |
| 464 | timeout = 100; |
| 465 | |
| 466 | #ifdef DEL_DELAY |
| 467 | ndefer = ev->r_ndefer; |
| 468 | |
| 469 | for (j = 0; j < ndefer; j++) { |
| 470 | __event_del(ev, ev->r_defers[j].fd, ev->r_defers[j].mask); |
| 471 | ev->events[ev->r_defers[j].fd].r_defer = NULL; |
| 472 | ev->r_defers[j].fd = -1; |
| 473 | ev->r_ndefer--; |
| 474 | } |
| 475 | ASSERT(ev->r_ndefer == 0); |
| 476 | |
| 477 | ndefer = ev->w_ndefer; |
| 478 | for (j = 0; j < ndefer; j++) { |
| 479 | __event_del(ev, ev->w_defers[j].fd, ev->w_defers[j].mask); |
| 480 | ev->events[ev->w_defers[j].fd].w_defer = NULL; |
| 481 | ev->w_defers[j].fd = -1; |
| 482 | ev->w_ndefer--; |
| 483 | } |
| 484 | ASSERT(ev->w_ndefer == 0); |
| 485 | #endif |
| 486 | |
| 487 | numevents = ev->loop(ev, timeout); |
| 488 | |
| 489 | for (j = 0; j < numevents; j++) { |
| 490 | fd = ev->fired[j].fd; |
| 491 | mask = ev->fired[j].mask; |
| 492 | fe = &ev->events[fd]; |
| 493 | fe->mask_fired = mask; |
| 494 | |
| 495 | /* note the fe->mask & mask & ... code: maybe an already |
| 496 | * processed event removed an element that fired and we |
| 497 | * still didn't processed, so we check if the event is |
| 498 | * still valid. |
| 499 | */ |
| 500 | if (fe->mask & mask & EVENT_READABLE) { |
no test coverage detected
searching dependent graphs…