From 76ab7bdcf8b00882b67a39c6566377aee30dd201 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 3 Oct 2007 22:14:53 +0000 Subject: [PATCH] Added function dprintf_no_syslog(). It is basically equivalent to dprintf() with the exception that it doesn't write anything to the syslog. The reason is that syslog_write() releases a semaphore and can therefore not be invoked when the thread spinlock is held. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22428 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/debug.h | 7 ++++-- src/system/kernel/debug/debug.c | 40 +++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/headers/private/kernel/debug.h b/headers/private/kernel/debug.h index ffdcc2cd8f..373fc3fc20 100644 --- a/headers/private/kernel/debug.h +++ b/headers/private/kernel/debug.h @@ -9,7 +9,7 @@ #define _KERNEL_DEBUG_H -#include +#include #define KDEBUG 1 @@ -27,7 +27,7 @@ #define ASSERT_ALWAYS_PRINT(x, format...) \ do { \ if (!(x)) { \ - dprintf(format); \ + dprintf_no_syslog(format); \ panic("ASSERT FAILED (%s:%d): %s\n", __FILE__, __LINE__, #x); \ } \ } while (0) @@ -56,6 +56,9 @@ extern void debug_puts(const char *s, int32 length); extern bool debug_debugger_running(void); extern void debug_stop_screen_debug_output(void); +extern void dprintf_no_syslog(const char *format, ...) + __attribute__ ((format (__printf__, 1, 2))); + extern void _user_debug_output(const char *userString); #ifdef __cplusplus diff --git a/src/system/kernel/debug/debug.c b/src/system/kernel/debug/debug.c index d09b59db1d..4fa622bb81 100644 --- a/src/system/kernel/debug/debug.c +++ b/src/system/kernel/debug/debug.c @@ -972,16 +972,12 @@ check_pending_repeats(void *data, int iter) } -void -dprintf(const char *format, ...) +static void +dprintf_args(const char *format, va_list args, bool syslogOutput) { cpu_status state; - va_list args; int32 length; - if (!sSerialDebugEnabled && !sSyslogOutputEnabled && !sBlueScreenEnabled) - return; - // ToDo: maybe add a non-interrupt buffer and path that only // needs to acquire a semaphore instead of needing to disable // interrupts? @@ -989,9 +985,7 @@ dprintf(const char *format, ...) state = disable_interrupts(); acquire_spinlock(&sSpinlock); - va_start(args, format); length = vsnprintf(sOutputBuffer, OUTPUT_BUFFER_SIZE, format, args); - va_end(args); if (length >= OUTPUT_BUFFER_SIZE) length = OUTPUT_BUFFER_SIZE - 1; @@ -1005,7 +999,7 @@ dprintf(const char *format, ...) if (sSerialDebugEnabled) arch_debug_serial_puts(sOutputBuffer); - if (sSyslogOutputEnabled) + if (syslogOutput) syslog_write(sOutputBuffer, length); if (sBlueScreenEnabled || sDebugScreenEnabled) blue_screen_puts(sOutputBuffer); @@ -1019,6 +1013,34 @@ dprintf(const char *format, ...) } +void +dprintf(const char *format, ...) +{ + va_list args; + + if (!sSerialDebugEnabled && !sSyslogOutputEnabled && !sBlueScreenEnabled) + return; + + va_start(args, format); + dprintf_args(format, args, sSyslogOutputEnabled); + va_end(args); +} + + +void +dprintf_no_syslog(const char *format, ...) +{ + va_list args; + + if (!sSerialDebugEnabled && !sBlueScreenEnabled) + return; + + va_start(args, format); + dprintf_args(format, args, false); + va_end(args); +} + + /** Similar to dprintf() but thought to be used in the kernel * debugger only (it doesn't lock). */