]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add event_filter_create_fragment()
authorJosef 'Jeff' Sipek <jeff.sipek@open-xchange.com>
Thu, 14 May 2020 17:03:52 +0000 (13:03 -0400)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 26 Jun 2020 07:18:18 +0000 (07:18 +0000)
src/lib/event-filter.c
src/lib/event-filter.h

index d2678b21f9862a02fdca53e46a80b874029bcf01..0e5724448aaba8d8195d37c83b7cbc3b1ca7180f 100644 (file)
@@ -69,25 +69,37 @@ struct event_filter {
        int refcount;
        ARRAY(struct event_filter_query_internal) queries;
 
+       bool fragment;
        bool named_queries_only;
 };
 
 static struct event_filter *event_filters = NULL;
 
-struct event_filter *event_filter_create(void)
+static struct event_filter *event_filter_create_real(pool_t pool, bool fragment)
 {
        struct event_filter *filter;
-       pool_t pool = pool_alloconly_create("event filter", 2048);
 
        filter = p_new(pool, struct event_filter, 1);
        filter->pool = pool;
        filter->refcount = 1;
        filter->named_queries_only = TRUE;
+       filter->fragment = fragment;
        p_array_init(&filter->queries, pool, 4);
-       DLLIST_PREPEND(&event_filters, filter);
+       if (!fragment)
+               DLLIST_PREPEND(&event_filters, filter);
        return filter;
 }
 
+struct event_filter *event_filter_create(void)
+{
+       return event_filter_create_real(pool_alloconly_create("event filter", 2048), FALSE);
+}
+
+struct event_filter *event_filter_create_fragment(pool_t pool)
+{
+       return event_filter_create_real(pool, TRUE);
+}
+
 void event_filter_ref(struct event_filter *filter)
 {
        i_assert(filter->refcount > 0);
@@ -106,8 +118,12 @@ void event_filter_unref(struct event_filter **_filter)
        if (--filter->refcount > 0)
                return;
 
-       DLLIST_REMOVE(&event_filters, filter);
-       pool_unref(&filter->pool);
+       if (!filter->fragment) {
+               DLLIST_REMOVE(&event_filters, filter);
+
+               /* fragments' pools are freed by the consumer */
+               pool_unref(&filter->pool);
+       }
 }
 
 static bool
index 4acf83265bbfec17fbc459c9dec73431da1e23ed..9a3e9f446082d56d868a2a6f5f988fcb254d0f2d 100644 (file)
@@ -27,6 +27,7 @@ struct event_filter_query {
 };
 
 struct event_filter *event_filter_create(void);
+struct event_filter *event_filter_create_fragment(pool_t pool);
 void event_filter_ref(struct event_filter *filter);
 void event_filter_unref(struct event_filter **filter);