|
|
|
@ -141,6 +141,15 @@ fd_event (int fd, int events)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
queue_events (struct ev_watcher **events, int eventcnt, int type)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < eventcnt; ++i)
|
|
|
|
|
event (events [i], type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
static struct ev_timer **atimers;
|
|
|
|
@ -263,6 +272,14 @@ siginit (void)
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
static struct ev_idle **idles;
|
|
|
|
|
static int idlemax, idlecnt;
|
|
|
|
|
|
|
|
|
|
static struct ev_check **checks;
|
|
|
|
|
static int checkmax, checkcnt;
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
#if HAVE_EPOLL
|
|
|
|
|
# include "ev_epoll.c"
|
|
|
|
|
#endif
|
|
|
|
@ -330,27 +347,6 @@ void ev_postfork_child (void)
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
static ev_hook hooks [EVHOOK_NUM];
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
ev_hook_register (int type, ev_hook hook)
|
|
|
|
|
{
|
|
|
|
|
hooks [type] = hook;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
ev_hook_unregister (int type, ev_hook hook)
|
|
|
|
|
{
|
|
|
|
|
hooks [type] = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
hook_call (int type)
|
|
|
|
|
{
|
|
|
|
|
if (hooks [type])
|
|
|
|
|
hooks [type] ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
fd_reify (void)
|
|
|
|
|
{
|
|
|
|
@ -472,15 +468,19 @@ void ev_loop (int flags)
|
|
|
|
|
double block;
|
|
|
|
|
ev_loop_done = flags & EVLOOP_ONESHOT;
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
if (checkcnt)
|
|
|
|
|
{
|
|
|
|
|
hook_call (EVHOOK_PREPOLL);
|
|
|
|
|
queue_events (checks, checkcnt, EV_CHECK);
|
|
|
|
|
call_pending ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
/* update fd-related kernel structures */
|
|
|
|
|
fd_reify ();
|
|
|
|
|
|
|
|
|
|
/* calculate blocking time */
|
|
|
|
|
if (flags & EVLOOP_NONBLOCK)
|
|
|
|
|
if (flags & EVLOOP_NONBLOCK || idlecnt)
|
|
|
|
|
block = 0.;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -506,14 +506,19 @@ void ev_loop (int flags)
|
|
|
|
|
/* update ev_now, do magic */
|
|
|
|
|
time_update ();
|
|
|
|
|
|
|
|
|
|
hook_call (EVHOOK_POSTPOLL);
|
|
|
|
|
|
|
|
|
|
/* put pending timers into pendign queue and reschedule them */
|
|
|
|
|
/* queue pending timers and reschedule them */
|
|
|
|
|
/* absolute timers first */
|
|
|
|
|
timers_reify (atimers, atimercnt, ev_now);
|
|
|
|
|
/* relative timers second */
|
|
|
|
|
timers_reify (rtimers, rtimercnt, now);
|
|
|
|
|
|
|
|
|
|
/* queue idle watchers unless io or timers are pending */
|
|
|
|
|
if (!pendingcnt)
|
|
|
|
|
queue_events (idles, idlecnt, EV_IDLE);
|
|
|
|
|
|
|
|
|
|
/* queue check and possibly idle watchers */
|
|
|
|
|
queue_events (checks, checkcnt, EV_CHECK);
|
|
|
|
|
|
|
|
|
|
call_pending ();
|
|
|
|
|
}
|
|
|
|
|
while (!ev_loop_done);
|
|
|
|
@ -681,6 +686,38 @@ evsignal_stop (struct ev_signal *w)
|
|
|
|
|
signal (w->signum, SIG_DFL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void evidle_start (struct ev_idle *w)
|
|
|
|
|
{
|
|
|
|
|
if (ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
ev_start ((struct ev_watcher *)w, ++idlecnt);
|
|
|
|
|
array_needsize (idles, idlemax, idlecnt, );
|
|
|
|
|
idles [idlecnt - 1] = w;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void evidle_stop (struct ev_idle *w)
|
|
|
|
|
{
|
|
|
|
|
idles [w->active - 1] = idles [--idlecnt];
|
|
|
|
|
ev_stop ((struct ev_watcher *)w);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void evcheck_start (struct ev_check *w)
|
|
|
|
|
{
|
|
|
|
|
if (ev_is_active (w))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
ev_start ((struct ev_watcher *)w, ++checkcnt);
|
|
|
|
|
array_needsize (checks, checkmax, checkcnt, );
|
|
|
|
|
checks [checkcnt - 1] = w;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void evcheck_stop (struct ev_check *w)
|
|
|
|
|
{
|
|
|
|
|
checks [w->active - 1] = checks [--checkcnt];
|
|
|
|
|
ev_stop ((struct ev_watcher *)w);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
#if 1
|
|
|
|
|
|
|
|
|
@ -704,6 +741,12 @@ scb (struct ev_signal *w, int revents)
|
|
|
|
|
fprintf (stderr, "signal %x,%d\n", revents, w->signum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gcb (struct ev_signal *w, int revents)
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr, "generic %x\n", revents);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main (void)
|
|
|
|
|
{
|
|
|
|
|
struct ev_io sin;
|
|
|
|
@ -716,7 +759,7 @@ int main (void)
|
|
|
|
|
|
|
|
|
|
struct ev_timer t[10000];
|
|
|
|
|
|
|
|
|
|
#if 1
|
|
|
|
|
#if 0
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < 10000; ++i)
|
|
|
|
|
{
|
|
|
|
@ -739,6 +782,14 @@ int main (void)
|
|
|
|
|
evsignal_set (&sig, SIGQUIT);
|
|
|
|
|
evsignal_start (&sig);
|
|
|
|
|
|
|
|
|
|
struct ev_check cw;
|
|
|
|
|
evw_init (&cw, gcb, 0);
|
|
|
|
|
evcheck_start (&cw);
|
|
|
|
|
|
|
|
|
|
struct ev_idle iw;
|
|
|
|
|
evw_init (&iw, gcb, 0);
|
|
|
|
|
evidle_start (&iw);
|
|
|
|
|
|
|
|
|
|
ev_loop (0);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|