diff options
| -rw-r--r-- | event.c | 114 | ||||
| -rw-r--r-- | event.h | 10 | 
2 files changed, 68 insertions, 56 deletions
| @@ -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;  } @@ -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; | 
