From: Vsevolod Stakhov Date: Wed, 10 Jun 2015 17:11:31 +0000 (-0400) Subject: Extend watchers functionality. X-Git-Tag: 1.0.0~553 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fef4d3d8361893b6d49bafa7e0e524dcb110fdab;p=thirdparty%2Frspamd.git Extend watchers functionality. It is now possible to add fake watcher events that delays guarded events untill it is really completed. --- diff --git a/src/libserver/events.c b/src/libserver/events.c index bd46f16862..571347288e 100644 --- a/src/libserver/events.c +++ b/src/libserver/events.c @@ -291,3 +291,34 @@ rspamd_session_events_pending (struct rspamd_async_session *session) return g_hash_table_size (session->events); } + +void +rspamd_session_watcher_push (struct rspamd_async_session *s) +{ + g_assert (s != NULL); + + if (s->cur_watcher) { + s->cur_watcher->remain ++; + } +} + +void +rspamd_session_watcher_pop (struct rspamd_async_session *s, + struct rspamd_async_watcher *w) +{ + g_assert (s != NULL); + + if (w) { + if (--w->remain == 0) { + w->cb (s->user_data, w->ud); + } + } +} + +struct rspamd_async_watcher* +rspamd_session_get_watcher (struct rspamd_async_session *s) +{ + g_assert (s != NULL); + + return s->cur_watcher; +} diff --git a/src/libserver/events.h b/src/libserver/events.h index fa4e0cbc73..eb5614af34 100644 --- a/src/libserver/events.h +++ b/src/libserver/events.h @@ -30,6 +30,7 @@ struct rspamd_async_event; struct rspamd_async_session; +struct rspamd_async_watcher; typedef void (*event_finalizer_t)(gpointer ud); typedef void (*event_watcher_t)(gpointer session_data, gpointer ud); @@ -107,4 +108,25 @@ void rspamd_session_watch_start (struct rspamd_async_session *s, */ guint rspamd_session_watch_stop (struct rspamd_async_session *s); +/** + * Create a fake event just for event watcher + * @param s + */ +void rspamd_session_watcher_push (struct rspamd_async_session *s); + +/** + * Remove a fake event from a watcher + * @param s + */ +void rspamd_session_watcher_pop (struct rspamd_async_session *s, + struct rspamd_async_watcher *w); + +/** + * Returns the current watcher for events session + * @param s + * @return + */ +struct rspamd_async_watcher* rspamd_session_get_watcher ( + struct rspamd_async_session *s); + #endif /* RSPAMD_EVENTS_H */