Browse Source

improve event compatibility, make watchers much smaller by union'ising io and sig watchers

master
Marc Alexander Lehmann 14 years ago
parent
commit
5c882b3012
  1. 114
      event.c
  2. 10
      event.h

114
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;
}
/* disable all watchers */
event_del (ev);
ev_timer_set (&ev->to, tv_get (tv), 0.);
ev_timer_start (&ev->to);
if (ev->ev_events & EV_SIGNAL)
{
ev_signal_set (&ev->iosig.sig, ev->ev_fd);
ev_signal_start (&ev->iosig.sig);
++x_actives;
}
if (ev->ev_events & (EV_READ | EV_WRITE))
else 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);
ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE));
ev_io_start (&ev->iosig.io);
++x_actives;
}
if (ev->ev_events & EV_SIGNAL)
if (tv)
{
if (ev_is_active (&ev->sig))
{
ev_signal_stop (&ev->sig);
--x_actives;
}
ev_signal_set (&ev->sig, ev->ev_fd);
ev_signal_start (&ev->sig);
ev_timer_set (&ev->to, tv_get (tv), 0.);
ev_timer_start (&ev->to);
++x_actives;
}
@ -213,21 +207,28 @@ 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;
}
}
if (ev_is_active (&ev->to))
else
{
ev_timer_stop (&ev->to);
--x_actives;
/* io */
if (ev_is_active (&ev->iosig.io))
{
ev_io_stop (&ev->iosig.io);
--x_actives;
}
}
if (ev_is_active (&ev->sig))
if (ev_is_active (&ev->to))
{
ev_signal_stop (&ev->sig);
ev_timer_stop (&ev->to);
--x_actives;
}
@ -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

@ -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…
Cancel
Save