]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Extend watchers functionality.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 10 Jun 2015 17:11:31 +0000 (13:11 -0400)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 10 Jun 2015 17:11:31 +0000 (13:11 -0400)
It is now possible to add fake watcher events that delays guarded events
untill it is really completed.

src/libserver/events.c
src/libserver/events.h

index bd46f1686276bc8b68d6ea66ddc984e6dc71d35b..571347288ec3f097d7148f21e54ce202d8db6cfa 100644 (file)
@@ -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;
+}
index fa4e0cbc738468aece0e1fb85c5663e01c246d58..eb5614af3487428469c269134af380c81863ceaf 100644 (file)
@@ -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 */