mirror of /home/gitosis/repositories/libev.git
improve event compatibility, make watchers much smaller by union'ising io and sig watchers
This commit is contained in:
parent
c60fb9fef5
commit
5c882b3012
122
event.c
122
event.c
|
@ -108,16 +108,23 @@ int event_loopexit (struct timeval *tv)
|
|||
static void
|
||||
x_cb (struct event *ev, int revents)
|
||||
{
|
||||
if (ev_is_active (&ev->sig))
|
||||
if (ev->ev_events & EV_SIGNAL)
|
||||
{
|
||||
ev_signal_stop (&ev->sig);
|
||||
--x_actives;
|
||||
/* sig */
|
||||
if (ev_is_active (&ev->iosig.sig))
|
||||
{
|
||||
ev_signal_stop (&ev->iosig.sig);
|
||||
--x_actives;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(ev->ev_events & EV_PERSIST) && ev_is_active (&ev->io))
|
||||
else
|
||||
{
|
||||
ev_io_stop (&ev->io);
|
||||
--x_actives;
|
||||
/* io */
|
||||
if (!(ev->ev_events & EV_PERSIST) && ev_is_active (&ev->iosig.io))
|
||||
{
|
||||
ev_io_stop (&ev->iosig.io);
|
||||
--x_actives;
|
||||
}
|
||||
}
|
||||
|
||||
revents &= EV_READ | EV_WRITE | EV_TIMEOUT | EV_SIGNAL;
|
||||
|
@ -132,7 +139,7 @@ x_cb (struct event *ev, int revents)
|
|||
static void
|
||||
x_cb_io (struct ev_io *w, int revents)
|
||||
{
|
||||
x_cb ((struct event *)(((char *)w) - offsetof (struct event, io)), revents);
|
||||
x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.io)), revents);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -144,14 +151,17 @@ x_cb_to (struct ev_timer *w, int revents)
|
|||
static void
|
||||
x_cb_sig (struct ev_signal *w, int revents)
|
||||
{
|
||||
x_cb ((struct event *)(((char *)w) - offsetof (struct event, sig)), revents);
|
||||
x_cb ((struct event *)(((char *)w) - offsetof (struct event, iosig.sig)), revents);
|
||||
}
|
||||
|
||||
void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg)
|
||||
{
|
||||
ev_watcher_init (&ev->io, x_cb_io);
|
||||
if (events & EV_SIGNAL)
|
||||
ev_watcher_init (&ev->iosig.sig, x_cb_sig);
|
||||
else
|
||||
ev_watcher_init (&ev->iosig.io, x_cb_io);
|
||||
|
||||
ev_watcher_init (&ev->to, x_cb_to);
|
||||
ev_watcher_init (&ev->sig, x_cb_sig);
|
||||
|
||||
ev->ev_base = x_cur;
|
||||
ev->ev_fd = fd;
|
||||
|
@ -169,42 +179,26 @@ int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg,
|
|||
|
||||
int event_add (struct event *ev, struct timeval *tv)
|
||||
{
|
||||
if (tv)
|
||||
{
|
||||
if (ev_is_active (&ev->to))
|
||||
{
|
||||
ev_timer_stop (&ev->to);
|
||||
--x_actives;
|
||||
}
|
||||
|
||||
ev_timer_set (&ev->to, tv_get (tv), 0.);
|
||||
ev_timer_start (&ev->to);
|
||||
++x_actives;
|
||||
}
|
||||
|
||||
if (ev->ev_events & (EV_READ | EV_WRITE))
|
||||
{
|
||||
if (ev_is_active (&ev->io))
|
||||
{
|
||||
ev_io_stop (&ev->io);
|
||||
--x_actives;
|
||||
}
|
||||
|
||||
ev_io_set (&ev->io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE));
|
||||
ev_io_start (&ev->io);
|
||||
++x_actives;
|
||||
}
|
||||
/* disable all watchers */
|
||||
event_del (ev);
|
||||
|
||||
if (ev->ev_events & EV_SIGNAL)
|
||||
{
|
||||
if (ev_is_active (&ev->sig))
|
||||
{
|
||||
ev_signal_stop (&ev->sig);
|
||||
--x_actives;
|
||||
}
|
||||
ev_signal_set (&ev->iosig.sig, ev->ev_fd);
|
||||
ev_signal_start (&ev->iosig.sig);
|
||||
++x_actives;
|
||||
}
|
||||
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->iosig.io);
|
||||
++x_actives;
|
||||
}
|
||||
|
||||
ev_signal_set (&ev->sig, ev->ev_fd);
|
||||
ev_signal_start (&ev->sig);
|
||||
if (tv)
|
||||
{
|
||||
ev_timer_set (&ev->to, tv_get (tv), 0.);
|
||||
ev_timer_start (&ev->to);
|
||||
++x_actives;
|
||||
}
|
||||
|
||||
|
@ -213,10 +207,23 @@ int event_add (struct event *ev, struct timeval *tv)
|
|||
|
||||
int event_del (struct event *ev)
|
||||
{
|
||||
if (ev_is_active (&ev->io))
|
||||
if (ev->ev_events & EV_SIGNAL)
|
||||
{
|
||||
ev_io_stop (&ev->io);
|
||||
--x_actives;
|
||||
/* sig */
|
||||
if (ev_is_active (&ev->iosig.sig))
|
||||
{
|
||||
ev_signal_stop (&ev->iosig.sig);
|
||||
--x_actives;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* io */
|
||||
if (ev_is_active (&ev->iosig.io))
|
||||
{
|
||||
ev_io_stop (&ev->iosig.io);
|
||||
--x_actives;
|
||||
}
|
||||
}
|
||||
|
||||
if (ev_is_active (&ev->to))
|
||||
|
@ -225,12 +232,6 @@ int event_del (struct event *ev)
|
|||
--x_actives;
|
||||
}
|
||||
|
||||
if (ev_is_active (&ev->sig))
|
||||
{
|
||||
ev_signal_stop (&ev->sig);
|
||||
--x_actives;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -238,8 +239,18 @@ int event_pending (struct event *ev, short events, struct timeval *tv)
|
|||
{
|
||||
short revents;
|
||||
|
||||
if (ev->io.pending)
|
||||
revents |= ev->ev_events & (EV_READ | EV_WRITE);
|
||||
if (ev->ev_events & EV_SIGNAL)
|
||||
{
|
||||
/* sig */
|
||||
if (ev->iosig.sig.pending)
|
||||
revents |= EV_SIGNAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* io */
|
||||
if (ev->iosig.io.pending)
|
||||
revents |= ev->ev_events & (EV_READ | EV_WRITE);
|
||||
}
|
||||
|
||||
if (ev->to.pending)
|
||||
{
|
||||
|
@ -249,9 +260,6 @@ int event_pending (struct event *ev, short events, struct timeval *tv)
|
|||
tv_set (tv, ev_now); /* not sure if this is right :) */
|
||||
}
|
||||
|
||||
if (ev->sig.pending)
|
||||
revents |= EV_SIGNAL;
|
||||
|
||||
return events & revents;
|
||||
}
|
||||
|
||||
|
|
10
event.h
10
event.h
|
@ -38,11 +38,15 @@ extern "C" {
|
|||
#include "ev.h"
|
||||
|
||||
struct event
|
||||
{
|
||||
struct ev_io io;
|
||||
{
|
||||
/* lib watchers we map to */
|
||||
union {
|
||||
struct ev_io io;
|
||||
struct ev_signal sig;
|
||||
} iosig;
|
||||
struct ev_timer to;
|
||||
struct ev_signal sig;
|
||||
|
||||
/* compatibility slots */
|
||||
struct event_base *ev_base;
|
||||
void (*ev_callback)(int, short, void *arg);
|
||||
void *ev_arg;
|
||||
|
|
Loading…
Reference in New Issue