EV
view release on metacpan or search on metacpan
void
ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT
{
clear_pending (EV_A_ (W)w);
if (ecb_expect_false (!ev_is_active (w)))
return;
EV_FREQUENT_CHECK;
{
int active = ev_active (w);
prepares [active - 1] = prepares [--preparecnt];
ev_active (prepares [active - 1]) = active;
}
ev_stop (EV_A_ (W)w);
EV_FREQUENT_CHECK;
}
#endif
#if EV_CHECK_ENABLE
void
ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT
{
if (ecb_expect_false (ev_is_active (w)))
return;
EV_FREQUENT_CHECK;
ev_start (EV_A_ (W)w, ++checkcnt);
array_needsize (ev_check *, checks, checkmax, checkcnt, array_needsize_noinit);
checks [checkcnt - 1] = w;
EV_FREQUENT_CHECK;
}
void
ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT
{
clear_pending (EV_A_ (W)w);
if (ecb_expect_false (!ev_is_active (w)))
return;
EV_FREQUENT_CHECK;
{
int active = ev_active (w);
checks [active - 1] = checks [--checkcnt];
ev_active (checks [active - 1]) = active;
}
ev_stop (EV_A_ (W)w);
EV_FREQUENT_CHECK;
}
#endif
#if EV_EMBED_ENABLE
ecb_noinline
void
ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT
{
ev_run (w->other, EVRUN_NOWAIT);
}
static void
embed_io_cb (EV_P_ ev_io *io, int revents)
{
ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io));
if (ev_cb (w))
ev_feed_event (EV_A_ (W)w, EV_EMBED);
else
ev_run (w->other, EVRUN_NOWAIT);
}
static void
embed_prepare_cb (EV_P_ ev_prepare *prepare, int revents)
{
ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare));
{
EV_P = w->other;
while (fdchangecnt)
{
fd_reify (EV_A);
ev_run (EV_A_ EVRUN_NOWAIT);
}
}
}
#if EV_FORK_ENABLE
static void
embed_fork_cb (EV_P_ ev_fork *fork_w, int revents)
{
ev_embed *w = (ev_embed *)(((char *)fork_w) - offsetof (ev_embed, fork));
ev_embed_stop (EV_A_ w);
{
EV_P = w->other;
ev_loop_fork (EV_A);
ev_run (EV_A_ EVRUN_NOWAIT);
}
ev_embed_start (EV_A_ w);
}
#endif
#if 0
static void
embed_idle_cb (EV_P_ ev_idle *idle, int revents)
{
ev_idle_stop (EV_A_ idle);
}
#endif
void
ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT
{
if (ecb_expect_false (ev_is_active (w)))
return;
{
EV_P = w->other;
assert (("libev: loop to be embedded is not embeddable", backend & ev_embeddable_backends ()));
ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ);
}
EV_FREQUENT_CHECK;
{
void (*cb)(int revents, void *arg) = once->cb;
void *arg = once->arg;
ev_io_stop (EV_A_ &once->io);
ev_timer_stop (EV_A_ &once->to);
ev_free (once);
cb (revents, arg);
}
static void
once_cb_io (EV_P_ ev_io *w, int revents)
{
struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io));
once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to));
}
static void
once_cb_to (EV_P_ ev_timer *w, int revents)
{
struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to));
once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io));
}
void
ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT
{
struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once));
once->cb = cb;
once->arg = arg;
ev_init (&once->io, once_cb_io);
if (fd >= 0)
{
ev_io_set (&once->io, fd, events);
ev_io_start (EV_A_ &once->io);
}
ev_init (&once->to, once_cb_to);
if (timeout >= 0.)
{
ev_timer_set (&once->to, timeout, 0.);
ev_timer_start (EV_A_ &once->to);
}
}
/*****************************************************************************/
#if EV_WALK_ENABLE
ecb_cold
void
ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT
{
int i, j;
ev_watcher_list *wl, *wn;
if (types & (EV_IO | EV_EMBED))
for (i = 0; i < anfdmax; ++i)
for (wl = anfds [i].head; wl; )
{
wn = wl->next;
#if EV_EMBED_ENABLE
if (ev_cb ((ev_io *)wl) == embed_io_cb)
{
if (types & EV_EMBED)
cb (EV_A_ EV_EMBED, ((char *)wl) - offsetof (struct ev_embed, io));
}
else
#endif
#if EV_USE_INOTIFY
if (ev_cb ((ev_io *)wl) == infy_cb)
;
else
#endif
if ((ev_io *)wl != &pipe_w)
if (types & EV_IO)
cb (EV_A_ EV_IO, wl);
wl = wn;
}
if (types & (EV_TIMER | EV_STAT))
for (i = timercnt + HEAP0; i-- > HEAP0; )
#if EV_STAT_ENABLE
/*TODO: timer is not always active*/
if (ev_cb ((ev_timer *)ANHE_w (timers [i])) == stat_timer_cb)
{
if (types & EV_STAT)
cb (EV_A_ EV_STAT, ((char *)ANHE_w (timers [i])) - offsetof (struct ev_stat, timer));
}
else
#endif
if (types & EV_TIMER)
cb (EV_A_ EV_TIMER, ANHE_w (timers [i]));
#if EV_PERIODIC_ENABLE
if (types & EV_PERIODIC)
for (i = periodiccnt + HEAP0; i-- > HEAP0; )
cb (EV_A_ EV_PERIODIC, ANHE_w (periodics [i]));
#endif
#if EV_IDLE_ENABLE
if (types & EV_IDLE)
for (j = NUMPRI; j--; )
for (i = idlecnt [j]; i--; )
cb (EV_A_ EV_IDLE, idles [j][i]);
#endif
#if EV_FORK_ENABLE
if (types & EV_FORK)
for (i = forkcnt; i--; )
if (ev_cb (forks [i]) != embed_fork_cb)
cb (EV_A_ EV_FORK, forks [i]);
#endif
#if EV_ASYNC_ENABLE
if (types & EV_ASYNC)
for (i = asynccnt; i--; )
cb (EV_A_ EV_ASYNC, asyncs [i]);
#endif
#if EV_PREPARE_ENABLE
if (types & EV_PREPARE)
for (i = preparecnt; i--; )
# if EV_EMBED_ENABLE
if (ev_cb (prepares [i]) != embed_prepare_cb)
# endif
cb (EV_A_ EV_PREPARE, prepares [i]);
#endif
#if EV_CHECK_ENABLE
if (types & EV_CHECK)
for (i = checkcnt; i--; )
cb (EV_A_ EV_CHECK, checks [i]);
#endif
#if EV_SIGNAL_ENABLE
if (types & EV_SIGNAL)
for (i = 0; i < EV_NSIG - 1; ++i)
for (wl = signals [i].head; wl; )
{
wn = wl->next;
cb (EV_A_ EV_SIGNAL, wl);
wl = wn;
}
#endif
#if EV_CHILD_ENABLE
if (types & EV_CHILD)
for (i = (EV_PID_HASHSIZE); i--; )
for (wl = childs [i]; wl; )
{
wn = wl->next;
cb (EV_A_ EV_CHILD, wl);
wl = wn;
}
#endif
/* EV_STAT 0x00001000 /* stat data changed */
/* EV_EMBED 0x00010000 /* embedded event loop needs sweep */
}
#endif
#if EV_MULTIPLICITY
#include "ev_wrap.h"
#endif
( run in 0.543 second using v1.01-cache-2.11-cpan-71847e10f99 )