From: Josef 'Jeff' Sipek Date: Thu, 14 May 2020 17:03:52 +0000 (-0400) Subject: lib: Add event_filter_create_fragment() X-Git-Tag: 2.3.13~500 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fdff11be6c5c38f4e44cbac973fe2cce3b92e681;p=thirdparty%2Fdovecot%2Fcore.git lib: Add event_filter_create_fragment() --- diff --git a/src/lib/event-filter.c b/src/lib/event-filter.c index d2678b21f9..0e5724448a 100644 --- a/src/lib/event-filter.c +++ b/src/lib/event-filter.c @@ -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 diff --git a/src/lib/event-filter.h b/src/lib/event-filter.h index 4acf83265b..9a3e9f4460 100644 --- a/src/lib/event-filter.h +++ b/src/lib/event-filter.h @@ -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);