]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Recalculate events' debug logging state after replacing event filters
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 31 Mar 2021 10:11:16 +0000 (13:11 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 4 May 2021 07:02:35 +0000 (07:02 +0000)
src/lib/event-log.c
src/lib/event-log.h
src/lib/lib-event-private.h
src/lib/lib-event.c

index 8564497a81dc8f8142c5bff4bf71d1c48d9f5940..d0bcc69fc4afa01e05ca1d5f9330f6e218597c58 100644 (file)
@@ -5,6 +5,8 @@
 #include "event-filter.h"
 #include "lib-event-private.h"
 
+unsigned int event_filter_replace_counter = 1;
+
 static struct event_filter *global_debug_log_filter = NULL;
 static struct event_filter *global_debug_send_filter = NULL;
 static struct event_filter *global_core_log_filter = NULL;
@@ -246,9 +248,10 @@ bool event_want_log_level(struct event *event, enum log_type level,
        if (event->min_log_level <= level)
                return TRUE;
 
-       if (event->debug_level_checked)
+       if (event->debug_level_checked_filter_counter == event_filter_replace_counter)
                return event->sending_debug_log;
-       event->debug_level_checked = TRUE;
+       event->debug_level_checked_filter_counter =
+               event_filter_replace_counter;
 
        if (event->forced_debug)
                event->sending_debug_log = TRUE;
@@ -373,14 +376,14 @@ struct event *event_set_forced_debug(struct event *event, bool force)
 {
        if (force)
                event->forced_debug = TRUE;
-       event->debug_level_checked = FALSE;
+       event_recalculate_debug_level(event);
        return event;
 }
 
 struct event *event_unset_forced_debug(struct event *event)
 {
        event->forced_debug = FALSE;
-       event->debug_level_checked = FALSE;
+       event_recalculate_debug_level(event);
        return event;
 }
 
@@ -389,6 +392,7 @@ void event_set_global_debug_log_filter(struct event_filter *filter)
        event_unset_global_debug_log_filter();
        global_debug_log_filter = filter;
        event_filter_ref(global_debug_log_filter);
+       event_filter_replace_counter++;
 }
 
 struct event_filter *event_get_global_debug_log_filter(void)
@@ -399,6 +403,7 @@ struct event_filter *event_get_global_debug_log_filter(void)
 void event_unset_global_debug_log_filter(void)
 {
        event_filter_unref(&global_debug_log_filter);
+       event_filter_replace_counter++;
 }
 
 void event_set_global_debug_send_filter(struct event_filter *filter)
@@ -406,6 +411,7 @@ void event_set_global_debug_send_filter(struct event_filter *filter)
        event_unset_global_debug_send_filter();
        global_debug_send_filter = filter;
        event_filter_ref(global_debug_send_filter);
+       event_filter_replace_counter++;
 }
 
 struct event_filter *event_get_global_debug_send_filter(void)
@@ -416,6 +422,7 @@ struct event_filter *event_get_global_debug_send_filter(void)
 void event_unset_global_debug_send_filter(void)
 {
        event_filter_unref(&global_debug_send_filter);
+       event_filter_replace_counter++;
 }
 
 void event_set_global_core_log_filter(struct event_filter *filter)
@@ -423,6 +430,7 @@ void event_set_global_core_log_filter(struct event_filter *filter)
        event_unset_global_core_log_filter();
        global_core_log_filter = filter;
        event_filter_ref(global_core_log_filter);
+       event_filter_replace_counter++;
 }
 
 struct event_filter *event_get_global_core_log_filter(void)
@@ -433,4 +441,5 @@ struct event_filter *event_get_global_core_log_filter(void)
 void event_unset_global_core_log_filter(void)
 {
        event_filter_unref(&global_core_log_filter);
+       event_filter_replace_counter++;
 }
index 4dfb18c4d52c6d69c63f117a641f54e6ae2b2575..01600bc049fd7b4b48b834d53bbb3a554f1a2bfc 100644 (file)
@@ -33,6 +33,9 @@ struct event_log_params {
        bool no_send:1;
 };
 
+/* Increased every time global event filters have changed. */
+extern unsigned int event_filter_replace_counter;
+
 void e_error(struct event *event,
             const char *source_filename, unsigned int source_linenum,
             const char *fmt, ...) ATTR_FORMAT(4, 5);
index 835fc7e7a9b5a087a2feaef1278dabf984040035..d5cde14a87bc7b6c6788054a9215c1575fbc533b 100644 (file)
@@ -29,6 +29,9 @@ struct event {
 
        char *log_prefix;
        unsigned int log_prefixes_dropped;
+       /* sending_debug_log can be used if this value matches
+          event_filter_replace_counter. */
+       unsigned int debug_level_checked_filter_counter;
        event_log_prefix_callback_t *log_prefix_callback;
        void *log_prefix_callback_context;
        event_log_message_callback_t *log_message_callback;
@@ -41,7 +44,6 @@ struct event {
        bool forced_debug:1;
        bool always_log_source:1;
        bool sending_debug_log:1;
-       bool debug_level_checked:1;
 
 /* Fields that are exported & imported: */
        struct timeval tv_created_ioloop;
@@ -101,4 +103,10 @@ void event_unregister_callback(event_callback_t *callback);
 void event_category_register_callback(event_category_callback_t *callback);
 void event_category_unregister_callback(event_category_callback_t *callback);
 
+static inline void event_recalculate_debug_level(struct event *event)
+{
+       event->debug_level_checked_filter_counter =
+               event_filter_replace_counter - 1;
+}
+
 #endif
index 35e7398c7ec325e72cd3e47efd2d7d95de82ce87..4088c066dd060aa5bd4cebd3c5bac371cfa9d55a 100644 (file)
@@ -601,7 +601,7 @@ struct event *event_set_always_log_source(struct event *event)
 struct event *event_set_min_log_level(struct event *event, enum log_type level)
 {
        event->min_log_level = level;
-       event->debug_level_checked = FALSE;
+       event_recalculate_debug_level(event);
        return event;
 }
 
@@ -789,7 +789,7 @@ event_add_categories(struct event *event,
                        array_push_back(&event->categories, &representative);
        }
        event_set_changed(event);
-       event->debug_level_checked = FALSE;
+       event_recalculate_debug_level(event);
        return event;
 }