diff options
| -rw-r--r-- | Symbols.ev | 4 | ||||
| -rw-r--r-- | ev.c | 46 | ||||
| -rw-r--r-- | ev.h | 6 | ||||
| -rw-r--r-- | ev_vars.h | 6 | ||||
| -rw-r--r-- | ev_wrap.h | 6 | 
5 files changed, 63 insertions, 5 deletions
| @@ -8,9 +8,7 @@ ev_check_stop  ev_child_start  ev_child_stop  ev_clear_pending -ev_default_destroy -ev_default_fork -ev_default_loop_init +ev_default_loop  ev_default_loop_ptr  ev_depth  ev_embed_start @@ -1815,6 +1815,9 @@ ev_loop_destroy (EV_P)  #if EV_FORK_ENABLE    array_free (fork, EMPTY);  #endif +#if EV_CLEANUP_ENABLE +  array_free (cleanup, EMPTY); +#endif    array_free (prepare, EMPTY);    array_free (check, EMPTY);  #if EV_ASYNC_ENABLE @@ -1987,6 +1990,11 @@ ev_verify (EV_P)    array_verify (EV_A_ (W *)forks, forkcnt);  #endif +#if EV_CLEANUP_ENABLE +  assert (cleanupmax >= cleanupcnt); +  array_verify (EV_A_ (W *)cleanups, cleanupcnt); +#endif +  #if EV_ASYNC_ENABLE    assert (asyncmax >= asynccnt);    array_verify (EV_A_ (W *)asyncs, asynccnt); @@ -3564,6 +3572,44 @@ ev_fork_stop (EV_P_ ev_fork *w)  }  #endif +#if EV_CLEANUP_ENABLE +void +ev_cleanup_start (EV_P_ ev_cleanup *w) +{ +  if (expect_false (ev_is_active (w))) +    return; + +  EV_FREQUENT_CHECK; + +  ev_start (EV_A_ (W)w, ++cleanupcnt); +  array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt, EMPTY2); +  cleanups [cleanupcnt - 1] = w; + +  EV_FREQUENT_CHECK; +} + +void +ev_cleanup_stop (EV_P_ ev_cleanup *w) +{ +  clear_pending (EV_A_ (W)w); +  if (expect_false (!ev_is_active (w))) +    return; + +  EV_FREQUENT_CHECK; + +  { +    int active = ev_active (w); + +    cleanups [active - 1] = cleanups [--cleanupcnt]; +    ev_active (cleanups [active - 1]) = active; +  } + +  ev_stop (EV_A_ (W)w); + +  EV_FREQUENT_CHECK; +} +#endif +  #if EV_ASYNC_ENABLE  void  ev_async_start (EV_P_ ev_async *w) @@ -100,11 +100,11 @@ EV_CPP(extern "C" {)  #endif  #ifndef EV_FORK_ENABLE -# define EV_FORK_ENABLE 0 /* not implemented */ +# define EV_FORK_ENABLE EV_FEATURE_WATCHERS  #endif  #ifndef EV_CLEANUP_ENABLE -# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS +# define EV_CLEANUP_ENABLE 0 /* not implemented */  #endif  #ifndef EV_SIGNAL_ENABLE @@ -427,7 +427,9 @@ typedef struct ev_embed    ev_periodic periodic;  /* unused */    ev_idle idle;          /* unused */    ev_fork fork;          /* private */ +#if EV_CLEANUP_ENABLE    ev_cleanup cleanup;    /* unused */ +#endif  } ev_embed;  #endif @@ -156,6 +156,12 @@ VARx(int, forkmax)  VARx(int, forkcnt)  #endif +#if EV_CLEANUP_ENABLE || EV_GENWRAP +VARx(struct ev_cleanup **, cleanups) +VARx(int, cleanupmax) +VARx(int, cleanupcnt) +#endif +  #if EV_ASYNC_ENABLE || EV_GENWRAP  VARx(EV_ATOMIC_T, async_pending)  VARx(struct ev_async **, asyncs) @@ -70,6 +70,9 @@  #define forks ((loop)->forks)  #define forkmax ((loop)->forkmax)  #define forkcnt ((loop)->forkcnt) +#define cleanups ((loop)->cleanups) +#define cleanupmax ((loop)->cleanupmax) +#define cleanupcnt ((loop)->cleanupcnt)  #define async_pending ((loop)->async_pending)  #define asyncs ((loop)->asyncs)  #define asyncmax ((loop)->asyncmax) @@ -159,6 +162,9 @@  #undef forks  #undef forkmax  #undef forkcnt +#undef cleanups +#undef cleanupmax +#undef cleanupcnt  #undef async_pending  #undef asyncs  #undef asyncmax | 
