dLOOPbase;
#if EV_MULTIPLICITY
- if (ev_default_loop (EVMETHOD_AUTO) != loop)
+ if (ev_default_loop (EVFLAG_AUTO) != loop)
ev_loop_destroy (loop);
#endif
}
{
struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.io));
- if (revents & EV_ERROR)
+ if ((revents & EV_ERROR) || !(ev->ev_events & EV_PERSIST))
event_del (ev);
- else if (!(ev->ev_events & EV_PERSIST) && ev_is_active (w))
- {
- ev_io_stop (EV_A_ w);
- ev->ev_flags &= ~EVLIST_INSERTED;
- }
x_cb (ev, revents);
}
{
dLOOPev;
- /* disable all watchers */
- event_del (ev);
-
if (ev->ev_events & EV_SIGNAL)
{
- ev_signal_set (&ev->iosig.sig, ev->ev_fd);
- ev_signal_start (EV_A_ &ev->iosig.sig);
+ if (!ev_is_active (&ev->iosig.sig))
+ {
+ ev_signal_set (&ev->iosig.sig, ev->ev_fd);
+ ev_signal_start (EV_A_ &ev->iosig.sig);
- ev->ev_flags |= EVLIST_SIGNAL;
+ ev->ev_flags |= EVLIST_SIGNAL;
+ }
}
else if (ev->ev_events & (EV_READ | EV_WRITE))
{
- ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE));
- ev_io_start (EV_A_ &ev->iosig.io);
+ if (!ev_is_active (&ev->iosig.io))
+ {
+ ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE));
+ ev_io_start (EV_A_ &ev->iosig.io);
- ev->ev_flags |= EVLIST_INSERTED;
+ ev->ev_flags |= EVLIST_INSERTED;
+ }
}
if (tv)
{
- ev_timer_set (&ev->to, tv_get (tv), 0.);
- ev_timer_start (EV_A_ &ev->to);
-
+ ev->to.repeat = tv_get (tv);
+ ev_timer_again (EV_A_ &ev->to);
ev->ev_flags |= EVLIST_TIMEOUT;
}
+ else
+ {
+ ev_timer_stop (EV_A_ &ev->to);
+ ev->ev_flags &= ~EVLIST_TIMEOUT;
+ }
ev->ev_flags |= EVLIST_ACTIVE;
dLOOPev;
if (ev->ev_events & EV_SIGNAL)
- {
- /* sig */
- if (ev_is_active (&ev->iosig.sig))
- ev_signal_stop (EV_A_ &ev->iosig.sig);
- }
+ ev_signal_stop (EV_A_ &ev->iosig.sig);
else if (ev->ev_events & (EV_READ | EV_WRITE))
- {
- /* io */
- if (ev_is_active (&ev->iosig.io))
- ev_io_stop (EV_A_ &ev->iosig.io);
- }
+ ev_io_stop (EV_A_ &ev->iosig.io);
if (ev_is_active (&ev->to))
ev_timer_stop (EV_A_ &ev->to);
{
dLOOPbase;
- ev_unloop (EV_A_ EVUNLOOP_ONCE);
+ ev_unloop (EV_A_ EVUNLOOP_ONE);
}
int event_base_loopexit (struct event_base *base, struct timeval *tv)