tevent: introduce tevent_set_max_debug_level() (default TEVENT_DEBUG_WARNING)
authorStefan Metzmacher <metze@samba.org>
Fri, 11 Nov 2022 14:05:53 +0000 (15:05 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 19 Jul 2023 08:02:33 +0000 (08:02 +0000)
Allow an application to decide which log levels it wants to get
in the callback function passed to tevent_set_debug().

By default TEVENT_DEBUG_WARNING is the maximal reported level
and TEVENT_DEBUG_TRACE message no longer reach the callback function
by default.

It seems Samba is the only consumer of tevent_set_debug(), so it
should not be a huge problem, as Samba only reports TEVENT_DEBUG_TRACE
message with log level 50 anyway. And future Samba versions will
call tevent_set_max_debug_level() if needed.

Note the change to tevent-0.14.1.sigs will be reverted
with the release of tevent 0.15.0.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
lib/tevent/ABI/tevent-0.14.1.sigs
lib/tevent/tevent.h
lib/tevent/tevent_debug.c
lib/tevent/tevent_internal.h

index 3daa4385d1a28c1c881ca78540b278b1d2e4bcfc..f7eba5775df3407473727b1176e060aa01e24565 100644 (file)
@@ -128,6 +128,7 @@ tevent_set_abort_fn: void (void (*)(const char *))
 tevent_set_debug: int (struct tevent_context *, void (*)(void *, enum tevent_debug_level, const char *, va_list), void *)
 tevent_set_debug_stderr: int (struct tevent_context *)
 tevent_set_default_backend: void (const char *)
+tevent_set_max_debug_level: enum tevent_debug_level (struct tevent_context *, enum tevent_debug_level)
 tevent_set_trace_callback: void (struct tevent_context *, tevent_trace_callback_t, void *)
 tevent_set_trace_fd_callback: void (struct tevent_context *, tevent_trace_fd_callback_t, void *)
 tevent_set_trace_immediate_callback: void (struct tevent_context *, tevent_trace_immediate_callback_t, void *)
index fb6c4d475390040221abb82cab6fc0919f6729e6..fec8c2a17449e551151a7c9a9b347f0b7af1f532 100644 (file)
@@ -624,6 +624,18 @@ typedef void (*tevent_debug_fn)(void *context,
 /**
  * Set destination for tevent debug messages
  *
+ * As of version 0.15.0 the invocation of
+ * the debug function for indiviual messages
+ * is limited by the current max_debug_level,
+ * which means TEVENT_DEBUG_TRACE messages
+ * are not passed by default:
+ *
+ * - tevent_set_debug() with debug == NULL implies
+ *   tevent_set_max_debug_level(ev, TEVENT_DEBUG_FATAL).
+ *
+ * - tevent_set_debug() with debug != NULL implies
+ *   tevent_set_max_debug_level(ev, TEVENT_DEBUG_WARNING).
+ *
  * @param[in] ev        Event context to debug
  * @param[in] debug     Function to handle output printing
  * @param[in] context   The context to pass to the debug function.
@@ -631,11 +643,29 @@ typedef void (*tevent_debug_fn)(void *context,
  * @return Always returns 0 as of version 0.9.8
  *
  * @note Default is to emit no debug messages
+ *
+ * @see tevent_set_max_debug_level()
  */
 int tevent_set_debug(struct tevent_context *ev,
                     tevent_debug_fn debug,
                     void *context);
 
+/**
+ * Set maximum debug level for tevent debug messages
+ *
+ * @param[in] ev         Event context to debug
+ * @param[in] max_level  Function to handle output printing
+ *
+ * @return The former max level is returned.
+ *
+ * @see tevent_set_debug()
+ *
+ * @note Available as of tevent 0.15.0
+ */
+enum tevent_debug_level
+tevent_set_max_debug_level(struct tevent_context *ev,
+                          enum tevent_debug_level max_level);
+
 /**
  * Designate stderr for debug message output
  *
index eca9d2b9121e125669285dbaa7cdb4ba9cd386cb..c38c58aeb90ac224083d400abd27c5647fcad174 100644 (file)
@@ -50,12 +50,31 @@ int tevent_set_debug(struct tevent_context *ev,
                errno = EINVAL;
                return -1;
        }
-
+       if (debug != NULL) {
+               /*
+                * tevent_set_max_debug_level(ev, TEVENT_DEBUG_TRACE)
+                * can be used to get full tracing, but we can to
+                * avoid overhead by default.
+                */
+               ev->debug_ops.max_level = TEVENT_DEBUG_WARNING;
+       } else {
+               ev->debug_ops.max_level = TEVENT_DEBUG_FATAL;
+       }
        ev->debug_ops.debug = debug;
        ev->debug_ops.context = context;
        return 0;
 }
 
+enum tevent_debug_level
+tevent_set_max_debug_level(struct tevent_context *ev,
+                          enum tevent_debug_level max_level)
+{
+       enum tevent_debug_level old_level;
+       old_level = ev->debug_ops.max_level;
+       ev->debug_ops.max_level = max_level;
+       return old_level;
+}
+
 /*
   debug function for ev_set_debug_stderr
 */
@@ -99,6 +118,9 @@ void tevent_debug(struct tevent_context *ev, enum tevent_debug_level level,
        if (ev->wrapper.glue != NULL) {
                ev = tevent_wrapper_main_ev(ev);
        }
+       if (level > ev->debug_ops.max_level) {
+               return;
+       }
        if (ev->debug_ops.debug == NULL) {
                return;
        }
index 7a11b0206c42589c03fab9bbb371d169e34dc19d..4fdaa6586e614f6ec11e7fa2398ae441dc4d4e61 100644 (file)
@@ -288,6 +288,7 @@ struct tevent_threaded_context {
 };
 
 struct tevent_debug_ops {
+       enum tevent_debug_level max_level;
        void (*debug)(void *context, enum tevent_debug_level level,
                      const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
        void *context;