|
|
|
@ -3,6 +3,7 @@
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
@ -127,10 +128,13 @@ static int pendingmax, pendingcnt;
|
|
|
|
|
static void
|
|
|
|
|
event (W w, int events)
|
|
|
|
|
{
|
|
|
|
|
w->pending = ++pendingcnt;
|
|
|
|
|
array_needsize (pendings, pendingmax, pendingcnt, );
|
|
|
|
|
pendings [pendingcnt - 1].w = w;
|
|
|
|
|
pendings [pendingcnt - 1].events = events;
|
|
|
|
|
if (w->active)
|
|
|
|
|
{
|
|
|
|
|
w->pending = ++pendingcnt;
|
|
|
|
|
array_needsize (pendings, pendingmax, pendingcnt, );
|
|
|
|
|
pendings [pendingcnt - 1].w = w;
|
|
|
|
|
pendings [pendingcnt - 1].events = events;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
@ -408,6 +412,8 @@ timers_reify ()
|
|
|
|
|
{
|
|
|
|
|
struct ev_timer *w = timers [0];
|
|
|
|
|
|
|
|
|
|
event ((W)w, EV_TIMEOUT);
|
|
|
|
|
|
|
|
|
|
/* first reschedule or stop timer */
|
|
|
|
|
if (w->repeat)
|
|
|
|
|
{
|
|
|
|
@ -417,8 +423,6 @@ timers_reify ()
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
evtimer_stop (w); /* nonrepeating: stop timer */
|
|
|
|
|
|
|
|
|
|
event ((W)w, EV_TIMEOUT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -600,19 +604,25 @@ wlist_del (WL *head, WL elem)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
ev_clear (W w)
|
|
|
|
|
{
|
|
|
|
|
if (w->pending)
|
|
|
|
|
{
|
|
|
|
|
pendings [w->pending - 1].w = 0;
|
|
|
|
|
w->pending = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
ev_start (W w, int active)
|
|
|
|
|
{
|
|
|
|
|
w->pending = 0;
|
|
|
|
|
w->active = active;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
ev_stop (W w)
|
|
|
|
|
{
|
|
|
|
|
if (w->pending)
|
|
|
|
|
pendings [w->pending - 1].w = 0;
|
|
|
|
|
|
|
|
|
|
w->active = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -638,6 +648,7 @@ evio_start (struct ev_io *w)
|
|
|
|
|
void
|
|
|
|
|
evio_stop (struct ev_io *w)
|
|
|
|
|
{
|
|
|
|
|
ev_clear ((W)w);
|
|
|
|
|
if (!ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
@ -649,7 +660,6 @@ evio_stop (struct ev_io *w)
|
|
|
|
|
fdchanges [fdchangecnt - 1] = w->fd;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
evtimer_start (struct ev_timer *w)
|
|
|
|
|
{
|
|
|
|
@ -669,6 +679,7 @@ evtimer_start (struct ev_timer *w)
|
|
|
|
|
void
|
|
|
|
|
evtimer_stop (struct ev_timer *w)
|
|
|
|
|
{
|
|
|
|
|
ev_clear ((W)w);
|
|
|
|
|
if (!ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
@ -721,6 +732,7 @@ evperiodic_start (struct ev_periodic *w)
|
|
|
|
|
void
|
|
|
|
|
evperiodic_stop (struct ev_periodic *w)
|
|
|
|
|
{
|
|
|
|
|
ev_clear ((W)w);
|
|
|
|
|
if (!ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
@ -756,6 +768,7 @@ evsignal_start (struct ev_signal *w)
|
|
|
|
|
void
|
|
|
|
|
evsignal_stop (struct ev_signal *w)
|
|
|
|
|
{
|
|
|
|
|
ev_clear ((W)w);
|
|
|
|
|
if (!ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
@ -778,6 +791,10 @@ void evidle_start (struct ev_idle *w)
|
|
|
|
|
|
|
|
|
|
void evidle_stop (struct ev_idle *w)
|
|
|
|
|
{
|
|
|
|
|
ev_clear ((W)w);
|
|
|
|
|
if (ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
idles [w->active - 1] = idles [--idlecnt];
|
|
|
|
|
ev_stop ((W)w);
|
|
|
|
|
}
|
|
|
|
@ -794,12 +811,81 @@ void evcheck_start (struct ev_check *w)
|
|
|
|
|
|
|
|
|
|
void evcheck_stop (struct ev_check *w)
|
|
|
|
|
{
|
|
|
|
|
ev_clear ((W)w);
|
|
|
|
|
if (ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
checks [w->active - 1] = checks [--checkcnt];
|
|
|
|
|
ev_stop ((W)w);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
struct ev_once
|
|
|
|
|
{
|
|
|
|
|
struct ev_io io;
|
|
|
|
|
struct ev_timer to;
|
|
|
|
|
void (*cb)(int revents, void *arg);
|
|
|
|
|
void *arg;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
once_cb (struct ev_once *once, int revents)
|
|
|
|
|
{
|
|
|
|
|
void (*cb)(int revents, void *arg) = once->cb;
|
|
|
|
|
void *arg = once->arg;
|
|
|
|
|
|
|
|
|
|
evio_stop (&once->io);
|
|
|
|
|
evtimer_stop (&once->to);
|
|
|
|
|
free (once);
|
|
|
|
|
|
|
|
|
|
cb (revents, arg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
once_cb_io (struct ev_io *w, int revents)
|
|
|
|
|
{
|
|
|
|
|
once_cb ((struct ev_once *)(((char *)w) - offsetof (struct ev_once, io)), revents);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
once_cb_to (struct ev_timer *w, int revents)
|
|
|
|
|
{
|
|
|
|
|
once_cb ((struct ev_once *)(((char *)w) - offsetof (struct ev_once, to)), revents);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
ev_once (int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg)
|
|
|
|
|
{
|
|
|
|
|
struct ev_once *once = malloc (sizeof (struct ev_once));
|
|
|
|
|
|
|
|
|
|
if (!once)
|
|
|
|
|
cb (EV_ERROR, arg);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
once->cb = cb;
|
|
|
|
|
once->arg = arg;
|
|
|
|
|
|
|
|
|
|
evw_init (&once->io, once_cb_io);
|
|
|
|
|
|
|
|
|
|
if (fd >= 0)
|
|
|
|
|
{
|
|
|
|
|
evio_set (&once->io, fd, events);
|
|
|
|
|
evio_start (&once->io);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
evw_init (&once->to, once_cb_to);
|
|
|
|
|
|
|
|
|
|
if (timeout >= 0.)
|
|
|
|
|
{
|
|
|
|
|
evtimer_set (&once->to, timeout, 0.);
|
|
|
|
|
evtimer_start (&once->to);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
|
|
struct ev_io wio;
|
|
|
|
|