… | |
… | |
533 | { |
533 | { |
534 | int fd = fdchanges [i]; |
534 | int fd = fdchanges [i]; |
535 | ANFD *anfd = anfds + fd; |
535 | ANFD *anfd = anfds + fd; |
536 | ev_io *w; |
536 | ev_io *w; |
537 | |
537 | |
538 | int events = 0; |
538 | unsigned char events = 0; |
539 | |
539 | |
540 | for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) |
540 | for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next) |
541 | events |= w->events; |
541 | events |= (unsigned char)w->events; |
542 | |
542 | |
543 | #if EV_SELECT_IS_WINSOCKET |
543 | #if EV_SELECT_IS_WINSOCKET |
544 | if (events) |
544 | if (events) |
545 | { |
545 | { |
546 | unsigned long argp; |
546 | unsigned long argp; |
547 | anfd->handle = _get_osfhandle (fd); |
547 | anfd->handle = _get_osfhandle (fd); |
548 | assert (("libev only supports socket fds in this configuration", ioctlsocket (anfd->handle, FIONREAD, &argp) == 0)); |
548 | assert (("libev only supports socket fds in this configuration", ioctlsocket (anfd->handle, FIONREAD, &argp) == 0)); |
549 | } |
549 | } |
550 | #endif |
550 | #endif |
551 | |
551 | |
|
|
552 | { |
|
|
553 | unsigned char o_events = anfd->events; |
|
|
554 | unsigned char o_reify = anfd->reify; |
|
|
555 | |
552 | anfd->reify = 0; |
556 | anfd->reify = 0; |
553 | |
|
|
554 | backend_modify (EV_A_ fd, anfd->events, events); |
|
|
555 | anfd->events = events; |
557 | anfd->events = events; |
|
|
558 | |
|
|
559 | if (o_events != events || o_reify & EV_IOFDSET) |
|
|
560 | backend_modify (EV_A_ fd, o_events, events); |
|
|
561 | } |
556 | } |
562 | } |
557 | |
563 | |
558 | fdchangecnt = 0; |
564 | fdchangecnt = 0; |
559 | } |
565 | } |
560 | |
566 | |
561 | void inline_size |
567 | void inline_size |
562 | fd_change (EV_P_ int fd) |
568 | fd_change (EV_P_ int fd, int flags) |
563 | { |
569 | { |
564 | if (expect_false (anfds [fd].reify)) |
570 | unsigned char reify = anfds [fd].reify; |
565 | return; |
|
|
566 | |
|
|
567 | anfds [fd].reify = 1; |
571 | anfds [fd].reify |= flags; |
568 | |
572 | |
|
|
573 | if (expect_true (!reify)) |
|
|
574 | { |
569 | ++fdchangecnt; |
575 | ++fdchangecnt; |
570 | array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2); |
576 | array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2); |
571 | fdchanges [fdchangecnt - 1] = fd; |
577 | fdchanges [fdchangecnt - 1] = fd; |
|
|
578 | } |
572 | } |
579 | } |
573 | |
580 | |
574 | void inline_speed |
581 | void inline_speed |
575 | fd_kill (EV_P_ int fd) |
582 | fd_kill (EV_P_ int fd) |
576 | { |
583 | { |
… | |
… | |
627 | |
634 | |
628 | for (fd = 0; fd < anfdmax; ++fd) |
635 | for (fd = 0; fd < anfdmax; ++fd) |
629 | if (anfds [fd].events) |
636 | if (anfds [fd].events) |
630 | { |
637 | { |
631 | anfds [fd].events = 0; |
638 | anfds [fd].events = 0; |
632 | fd_change (EV_A_ fd); |
639 | fd_change (EV_A_ fd, EV_IOFDSET | 1); |
633 | } |
640 | } |
634 | } |
641 | } |
635 | |
642 | |
636 | /*****************************************************************************/ |
643 | /*****************************************************************************/ |
637 | |
644 | |
… | |
… | |
1599 | |
1606 | |
1600 | ev_start (EV_A_ (W)w, 1); |
1607 | ev_start (EV_A_ (W)w, 1); |
1601 | array_needsize (ANFD, anfds, anfdmax, fd + 1, anfds_init); |
1608 | array_needsize (ANFD, anfds, anfdmax, fd + 1, anfds_init); |
1602 | wlist_add (&anfds[fd].head, (WL)w); |
1609 | wlist_add (&anfds[fd].head, (WL)w); |
1603 | |
1610 | |
1604 | fd_change (EV_A_ fd); |
1611 | fd_change (EV_A_ fd, w->events & EV_IOFDSET | 1); |
|
|
1612 | w->events &= ~EV_IOFDSET; |
1605 | } |
1613 | } |
1606 | |
1614 | |
1607 | void noinline |
1615 | void noinline |
1608 | ev_io_stop (EV_P_ ev_io *w) |
1616 | ev_io_stop (EV_P_ ev_io *w) |
1609 | { |
1617 | { |
… | |
… | |
1614 | assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); |
1622 | assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); |
1615 | |
1623 | |
1616 | wlist_del (&anfds[w->fd].head, (WL)w); |
1624 | wlist_del (&anfds[w->fd].head, (WL)w); |
1617 | ev_stop (EV_A_ (W)w); |
1625 | ev_stop (EV_A_ (W)w); |
1618 | |
1626 | |
1619 | fd_change (EV_A_ w->fd); |
1627 | fd_change (EV_A_ w->fd, 1); |
1620 | } |
1628 | } |
1621 | |
1629 | |
1622 | void noinline |
1630 | void noinline |
1623 | ev_timer_start (EV_P_ ev_timer *w) |
1631 | ev_timer_start (EV_P_ ev_timer *w) |
1624 | { |
1632 | { |