diff options
| -rw-r--r-- | ev++.h | 189 | 
1 files changed, 111 insertions, 78 deletions
| @@ -46,6 +46,18 @@  # include "ev.h"  #endif +#ifndef EV_CXX_EXCEPTIONS +#define EV_CXX_EXCEPTIONS 1 +#endif + +#undef EV_THROW +#if EV_CXX_EXCEPTIONS +#  include <stdexcept> +#  define EV_THROW(exception) throw (exception) +#else +#  define EV_THROW(exception) +#endif +  namespace ev {    typedef ev_tstamp tstamp; @@ -93,6 +105,14 @@ namespace ev {      ALL = EVUNLOOP_ALL    }; +#if EV_CXX_EXCEPTIONS +  struct bad_loop: std::runtime_error +  { +    bad_loop() +      : std::runtime_error("loop can't be initialized") {} +  }; +#endif +  #ifdef EV_AX  #  undef EV_AX  #endif @@ -114,12 +134,16 @@ namespace ev {      loop_ref (EV_P)  #if EV_MULTIPLICITY -      : EV_AX (EV_A) +      EV_THROW (bad_loop) : EV_AX (EV_A)  #endif      { +#if EV_MULTIPLICIY && EV_CXX_EXCEPTIONS +      if (!EV_A) +        throw bad_loop (); +#endif      } -    bool operator== (const loop_ref &other) const +    bool operator== (const loop_ref &other) const EV_THROW ()      {  #if EV_MULTIPLICITY        return this->EV_AX == other.EV_AX; @@ -128,7 +152,7 @@ namespace ev {  #endif      } -    bool operator!= (const loop_ref &other) const +    bool operator!= (const loop_ref &other) const EV_THROW ()      {  #if EV_MULTIPLICITY        return ! (*this == other); @@ -138,37 +162,37 @@ namespace ev {      }  #if EV_MULTIPLICITY -    bool operator== (struct ev_loop *other) const +    bool operator== (struct ev_loop *other) const EV_THROW ()      {        return this->EV_AX == other;      } -    bool operator!= (struct ev_loop *other) const +    bool operator!= (struct ev_loop *other) const EV_THROW ()      {        return ! (*this == other);      } -    bool operator== (const struct ev_loop *other) const +    bool operator== (const struct ev_loop *other) const EV_THROW ()      {        return this->EV_AX == other;      } -    bool operator!= (const struct ev_loop *other) const +    bool operator!= (const struct ev_loop *other) const EV_THROW ()      {        return (*this == other);      } -    operator struct ev_loop * () const +    operator struct ev_loop * () const EV_THROW ()      {        return EV_AX;      } -    operator const struct ev_loop * () const +    operator const struct ev_loop * () const EV_THROW ()      {        return EV_AX;      } -    bool is_default () const +    bool is_default () const EV_THROW ()      {        return EV_AX == ev_default_loop (0);      } @@ -179,12 +203,12 @@ namespace ev {        ev_loop (EV_AX_ flags);      } -    void unloop (how_t how = ONE) +    void unloop (how_t how = ONE) EV_THROW ()      {        ev_unloop (EV_AX_ how);      } -    void post_fork () +    void post_fork () EV_THROW ()      {  #if EV_MULTIPLICITY        ev_loop_fork (EV_AX); @@ -193,50 +217,50 @@ namespace ev {  #endif      } -    unsigned int count () const +    unsigned int count () const EV_THROW ()      {        return ev_loop_count (EV_AX);      } -    unsigned int backend () const +    unsigned int backend () const EV_THROW ()      {        return ev_backend (EV_AX);      } -    tstamp now () const +    tstamp now () const EV_THROW ()      {        return ev_now (EV_AX);      } -    void ref () +    void ref () EV_THROW ()      {        ev_ref (EV_AX);      } -    void unref () +    void unref () EV_THROW ()      {        ev_unref (EV_AX);      } -    void set_io_collect_interval (tstamp interval) +    void set_io_collect_interval (tstamp interval) EV_THROW ()      {        ev_set_io_collect_interval (EV_AX_ interval);      } -    void set_timeout_collect_interval (tstamp interval) +    void set_timeout_collect_interval (tstamp interval) EV_THROW ()      {        ev_set_timeout_collect_interval (EV_AX_ interval);      }      // function callback -    void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void* arg = 0) +    void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void* arg = 0) EV_THROW ()      {        ev_once (EV_AX_ fd, events, timeout, cb, arg);      }      // method callback      template<class K, void (K::*method)(int)> -    void once (int fd, int events, tstamp timeout, K *object) +    void once (int fd, int events, tstamp timeout, K *object) EV_THROW ()      {        once (fd, events, timeout, method_thunk<K, method>, object);      } @@ -250,7 +274,7 @@ namespace ev {      // const method callback      template<class K, void (K::*method)(int) const> -    void once (int fd, int events, tstamp timeout, const K *object) +    void once (int fd, int events, tstamp timeout, const K *object) EV_THROW ()      {        once (fd, events, timeout, const_method_thunk<K, method>, object);      } @@ -264,7 +288,7 @@ namespace ev {      // simple method callback      template<class K, void (K::*method)()> -    void once (int fd, int events, tstamp timeout, K *object) +    void once (int fd, int events, tstamp timeout, K *object) EV_THROW ()      {        once (fd, events, timeout, method_noargs_thunk<K, method>, object);      } @@ -278,7 +302,7 @@ namespace ev {      // simpler function callback      template<void (*cb)(int)> -    void once (int fd, int events, tstamp timeout) +    void once (int fd, int events, tstamp timeout) EV_THROW ()      {        once (fd, events, timeout, simpler_func_thunk<cb>);      } @@ -291,7 +315,7 @@ namespace ev {      // simplest function callback      template<void (*cb)()> -    void once (int fd, int events, tstamp timeout) +    void once (int fd, int events, tstamp timeout) EV_THROW ()      {        once (fd, events, timeout, simplest_func_thunk<cb>);      } @@ -302,12 +326,12 @@ namespace ev {        (*cb) ();      } -    void feed_fd_event (int fd, int revents) +    void feed_fd_event (int fd, int revents) EV_THROW ()      {        ev_feed_fd_event (EV_AX_ fd, revents);      } -    void feed_signal_event (int signum) +    void feed_signal_event (int signum) EV_THROW ()      {        ev_feed_signal_event (EV_AX_ signum);      } @@ -322,12 +346,12 @@ namespace ev {    struct dynamic_loop: loop_ref    { -    dynamic_loop (unsigned int flags = AUTO) +    dynamic_loop (unsigned int flags = AUTO) EV_THROW (bad_loop)        : loop_ref (ev_loop_new (flags))      {      } -    ~dynamic_loop () +    ~dynamic_loop () EV_THROW ()      {        ev_loop_destroy (EV_AX);        EV_AX = 0; @@ -345,18 +369,25 @@ namespace ev {    struct default_loop: loop_ref    { -    default_loop (unsigned int flags = AUTO) +    default_loop (unsigned int flags = AUTO) EV_THROW (bad_loop)  #if EV_MULTIPLICITY        : loop_ref (ev_default_loop (flags))      {      }  #else      { -      ev_default_loop (flags); +    #if EV_CXX_EXCEPTIONS +      int r = +    #endif +          ev_default_loop (flags); +    #if EV_CXX_EXCEPTIONS +      if (!r) +        throw bad_loop (); +    #endif      }  #endif -    ~default_loop () +    ~default_loop () EV_THROW ()      {        ev_default_destroy ();  #if EV_MULTIPLICITY @@ -372,7 +403,7 @@ namespace ev {    }; -  inline loop_ref get_default_loop () +  inline loop_ref get_default_loop () EV_THROW ()    {  #if EV_MULTIPLICITY      return ev_default_loop (0); @@ -400,13 +431,13 @@ namespace ev {      #if EV_MULTIPLICITY        EV_PX; -      void set (EV_PX) +      void set (EV_PX) EV_THROW ()        {          this->EV_A = EV_A;        }      #endif -    base (EV_PX) +    base (EV_PX) EV_THROW ()      #if EV_MULTIPLICITY        : EV_A (EV_A)      #endif @@ -414,7 +445,7 @@ namespace ev {        ev_init (this, 0);      } -    void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) +    void set_ (void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_THROW ()      {        this->data = data;        ev_set_cb (static_cast<ev_watcher *>(this), cb); @@ -422,7 +453,7 @@ namespace ev {      // method callback      template<class K, void (K::*method)(watcher &w, int)> -    void set (K *object) +    void set (K *object) EV_THROW ()      {        set_ (object, method_thunk<K, method>);      } @@ -436,7 +467,7 @@ namespace ev {      // const method callback      template<class K, void (K::*method)(watcher &w, int) const> -    void set (const K *object) +    void set (const K *object) EV_THROW ()      {        set_ (object, const_method_thunk<K, method>);      } @@ -450,7 +481,7 @@ namespace ev {      // function callback      template<void (*function)(watcher &w, int)> -    void set (void *data = 0) +    void set (void *data = 0) EV_THROW ()      {        set_ (data, function_thunk<function>);      } @@ -463,7 +494,7 @@ namespace ev {      // simple callback      template<class K, void (K::*method)()> -    void set (K *object) +    void set (K *object) EV_THROW ()      {        set_ (object, method_noargs_thunk<K, method>);      } @@ -481,76 +512,76 @@ namespace ev {          (static_cast<ev_watcher *>(this), events);      } -    bool is_active () const +    bool is_active () const EV_THROW ()      {        return ev_is_active (static_cast<const ev_watcher *>(this));      } -    bool is_pending () const +    bool is_pending () const EV_THROW ()      {        return ev_is_pending (static_cast<const ev_watcher *>(this));      } -    void feed_event (int revents) +    void feed_event (int revents) EV_THROW ()      {        ev_feed_event (EV_A_ static_cast<const ev_watcher *>(this), revents);      }    }; -  inline tstamp now () +  inline tstamp now () EV_THROW ()    {      return ev_time ();    } -  inline void delay (tstamp interval) +  inline void delay (tstamp interval) EV_THROW ()    {      ev_sleep (interval);    } -  inline int version_major () +  inline int version_major () EV_THROW ()    {      return ev_version_major ();    } -  inline int version_minor () +  inline int version_minor () EV_THROW ()    {      return ev_version_minor ();    } -  inline unsigned int supported_backends () +  inline unsigned int supported_backends () EV_THROW ()    {      return ev_supported_backends ();    } -  inline unsigned int recommended_backends () +  inline unsigned int recommended_backends () EV_THROW ()    {      return ev_recommended_backends ();    } -  inline unsigned int embeddable_backends () +  inline unsigned int embeddable_backends () EV_THROW ()    {      return ev_embeddable_backends ();    } -  inline void set_allocator (void *(*cb)(void *ptr, long size)) +  inline void set_allocator (void *(*cb)(void *ptr, long size)) EV_THROW ()    {      ev_set_allocator (cb);    } -  inline void set_syserr_cb (void (*cb)(const char *msg)) +  inline void set_syserr_cb (void (*cb)(const char *msg)) EV_THROW ()    {      ev_set_syserr_cb (cb);    }    #if EV_MULTIPLICITY      #define EV_CONSTRUCT(cppstem,cstem)	                                                \ -      (EV_PX = get_default_loop ())                                                     \ +      (EV_PX = get_default_loop ()) EV_THROW ()                                         \          : base<ev_ ## cstem, cppstem> (EV_A)                                            \        {                                                                                 \        }    #else      #define EV_CONSTRUCT(cppstem,cstem)                                                 \ -      ()                                                                                \ +      () EV_THROW ()                                                                    \        {                                                                                 \        }    #endif @@ -561,19 +592,19 @@ namespace ev {                                                                                          \    struct cppstem : base<ev_ ## cstem, cppstem>                                          \    {                                                                                     \ -    void start ()                                                                       \ +    void start () EV_THROW ()                                                           \      {                                                                                   \        ev_ ## cstem ## _start (EV_A_ static_cast<ev_ ## cstem *>(this));                 \      }                                                                                   \                                                                                          \ -    void stop ()                                                                        \ +    void stop () EV_THROW ()                                                            \      {                                                                                   \        ev_ ## cstem ## _stop (EV_A_ static_cast<ev_ ## cstem *>(this));                  \      }                                                                                   \                                                                                          \      cppstem EV_CONSTRUCT(cppstem,cstem)                                                 \                                                                                          \ -    ~cppstem ()                                                                         \ +    ~cppstem () EV_THROW ()                                                             \      {                                                                                   \        stop ();                                                                          \      }                                                                                   \ @@ -592,7 +623,7 @@ namespace ev {    };    EV_BEGIN_WATCHER (io, io) -    void set (int fd, int events) +    void set (int fd, int events) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -600,7 +631,7 @@ namespace ev {        if (active) start ();      } -    void set (int events) +    void set (int events) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -608,7 +639,7 @@ namespace ev {        if (active) start ();      } -    void start (int fd, int events) +    void start (int fd, int events) EV_THROW ()      {        set (fd, events);        start (); @@ -616,7 +647,7 @@ namespace ev {    EV_END_WATCHER (io, io)    EV_BEGIN_WATCHER (timer, timer) -    void set (ev_tstamp after, ev_tstamp repeat = 0.) +    void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -624,13 +655,13 @@ namespace ev {        if (active) start ();      } -    void start (ev_tstamp after, ev_tstamp repeat = 0.) +    void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_THROW ()      {        set (after, repeat);        start ();      } -    void again () +    void again () EV_THROW ()      {        ev_timer_again (EV_A_ static_cast<ev_timer *>(this));      } @@ -638,7 +669,7 @@ namespace ev {    #if EV_PERIODIC_ENABLE    EV_BEGIN_WATCHER (periodic, periodic) -    void set (ev_tstamp at, ev_tstamp interval = 0.) +    void set (ev_tstamp at, ev_tstamp interval = 0.) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -646,13 +677,13 @@ namespace ev {        if (active) start ();      } -    void start (ev_tstamp at, ev_tstamp interval = 0.) +    void start (ev_tstamp at, ev_tstamp interval = 0.) EV_THROW ()      {        set (at, interval);        start ();      } -    void again () +    void again () EV_THROW ()      {        ev_periodic_again (EV_A_ static_cast<ev_periodic *>(this));      } @@ -660,7 +691,7 @@ namespace ev {    #endif    EV_BEGIN_WATCHER (sig, signal) -    void set (int signum) +    void set (int signum) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -668,7 +699,7 @@ namespace ev {        if (active) start ();      } -    void start (int signum) +    void start (int signum) EV_THROW ()      {        set (signum);        start (); @@ -676,7 +707,7 @@ namespace ev {    EV_END_WATCHER (sig, signal)    EV_BEGIN_WATCHER (child, child) -    void set (int pid) +    void set (int pid) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -684,7 +715,7 @@ namespace ev {        if (active) start ();      } -    void start (int pid) +    void start (int pid) EV_THROW ()      {        set (pid);        start (); @@ -693,7 +724,7 @@ namespace ev {    #if EV_STAT_ENABLE    EV_BEGIN_WATCHER (stat, stat) -    void set (const char *path, ev_tstamp interval = 0.) +    void set (const char *path, ev_tstamp interval = 0.) EV_THROW ()      {        int active = is_active ();        if (active) stop (); @@ -701,14 +732,14 @@ namespace ev {        if (active) start ();      } -    void start (const char *path, ev_tstamp interval = 0.) +    void start (const char *path, ev_tstamp interval = 0.) EV_THROW ()      {        stop ();        set (path, interval);        start ();      } -    void update () +    void update () EV_THROW ()      {        ev_stat_stat (EV_A_ static_cast<ev_stat *>(this));      } @@ -716,20 +747,20 @@ namespace ev {    #endif    EV_BEGIN_WATCHER (idle, idle) -    void set () { } +    void set () EV_THROW () { }    EV_END_WATCHER (idle, idle)    EV_BEGIN_WATCHER (prepare, prepare) -    void set () { } +    void set () EV_THROW () { }    EV_END_WATCHER (prepare, prepare)    EV_BEGIN_WATCHER (check, check) -    void set () { } +    void set () EV_THROW () { }    EV_END_WATCHER (check, check)    #if EV_EMBED_ENABLE    EV_BEGIN_WATCHER (embed, embed) -    void start (struct ev_loop *embedded_loop) +    void start (struct ev_loop *embedded_loop) EV_THROW ()      {        stop ();        ev_embed_set (static_cast<ev_embed *>(this), embedded_loop); @@ -745,7 +776,7 @@ namespace ev {    #if EV_FORK_ENABLE    EV_BEGIN_WATCHER (fork, fork) -    void set () { } +    void set () EV_THROW () { }    EV_END_WATCHER (fork, fork)    #endif @@ -757,5 +788,7 @@ namespace ev {  } +#undef EV_THROW +  #endif | 
