From: Stefan Metzmacher Date: Fri, 11 Nov 2022 14:05:53 +0000 (+0100) Subject: tevent: introduce tevent_set_max_debug_level() (default TEVENT_DEBUG_WARNING) X-Git-Tag: tevent-0.15.0~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2c78a4f527eecba89973bfdb5a6d354d31e847d5;p=thirdparty%2Fsamba.git tevent: introduce tevent_set_max_debug_level() (default TEVENT_DEBUG_WARNING) 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 Reviewed-by: Ralph Boehme --- diff --git a/lib/tevent/ABI/tevent-0.14.1.sigs b/lib/tevent/ABI/tevent-0.14.1.sigs index 3daa4385d1a..f7eba5775df 100644 --- a/lib/tevent/ABI/tevent-0.14.1.sigs +++ b/lib/tevent/ABI/tevent-0.14.1.sigs @@ -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 *) diff --git a/lib/tevent/tevent.h b/lib/tevent/tevent.h index fb6c4d47539..fec8c2a1744 100644 --- a/lib/tevent/tevent.h +++ b/lib/tevent/tevent.h @@ -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 * diff --git a/lib/tevent/tevent_debug.c b/lib/tevent/tevent_debug.c index eca9d2b9121..c38c58aeb90 100644 --- a/lib/tevent/tevent_debug.c +++ b/lib/tevent/tevent_debug.c @@ -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; } diff --git a/lib/tevent/tevent_internal.h b/lib/tevent/tevent_internal.h index 7a11b0206c4..4fdaa6586e6 100644 --- a/lib/tevent/tevent_internal.h +++ b/lib/tevent/tevent_internal.h @@ -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;