From 89a42941133287392b81c95fca09de34118f1a30 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 24 Oct 2010 18:09:58 +0000 Subject: *** empty log message *** --- Symbols.ev | 4 +--- ev.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ ev.h | 6 ++++-- ev_vars.h | 6 ++++++ ev_wrap.h | 6 ++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/Symbols.ev b/Symbols.ev index 92d03b8..f401b30 100644 --- a/Symbols.ev +++ b/Symbols.ev @@ -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 diff --git a/ev.c b/ev.c index 20a2c9a..12dffb3 100644 --- a/ev.c +++ b/ev.c @@ -1814,6 +1814,9 @@ ev_loop_destroy (EV_P) #endif #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); @@ -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) diff --git a/ev.h b/ev.h index adc038b..f0ffd4f 100644 --- a/ev.h +++ b/ev.h @@ -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 diff --git a/ev_vars.h b/ev_vars.h index 3f8f8ca..16d48ab 100644 --- a/ev_vars.h +++ b/ev_vars.h @@ -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) diff --git a/ev_wrap.h b/ev_wrap.h index a67cca3..9c19fe6 100644 --- a/ev_wrap.h +++ b/ev_wrap.h @@ -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 -- cgit v1.2.3