Extended flushing repeat messages in kernel debug output. The repeat message is printed when there has been no repeat for more than 1 second and now also when the first repeat was more than 3 seconds ago. This ensures that repeat messages are sent when the repeated message is constantly output at a frequency of less than a second.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22501 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz 2007-10-10 20:47:16 +00:00
parent f271831fc8
commit 2827e2995b
1 changed files with 15 additions and 8 deletions

View File

@ -74,7 +74,8 @@ static char sLastOutputBuffer[OUTPUT_BUFFER_SIZE];
static void flush_pending_repeats(void);
static void check_pending_repeats(void *data, int iter);
static int64 sMessageRepeatTime = 0;
static int64 sMessageRepeatFirstTime = 0;
static int64 sMessageRepeatLastTime = 0;
static int32 sMessageRepeatCount = 0;
#define LINE_BUFFER_SIZE 1024
@ -665,10 +666,12 @@ debug_puts(const char *string, int32 length)
if (length >= OUTPUT_BUFFER_SIZE)
length = OUTPUT_BUFFER_SIZE - 1;
if (strncmp(string, sLastOutputBuffer, length) == 0
&& length > 1 && string[length - 1] == '\n') {
if (length > 1 && string[length - 1] == '\n'
&& strncmp(string, sLastOutputBuffer, length) == 0) {
sMessageRepeatCount++;
sMessageRepeatTime = system_time();
sMessageRepeatLastTime = system_time();
if (sMessageRepeatFirstTime == 0)
sMessageRepeatFirstTime = sMessageRepeatLastTime;
} else {
flush_pending_repeats();
kputs(string);
@ -949,6 +952,7 @@ flush_pending_repeats(void)
blue_screen_puts(sLastOutputBuffer);
}
sMessageRepeatFirstTime = 0;
sMessageRepeatCount = 0;
}
}
@ -960,7 +964,8 @@ check_pending_repeats(void *data, int iter)
(void)data;
(void)iter;
if (sMessageRepeatCount > 0
&& (system_time() - sMessageRepeatTime) > 1000000) {
&& ((system_time() - sMessageRepeatLastTime) > 1000000
|| (system_time() - sMessageRepeatFirstTime) > 3000000)) {
cpu_status state = disable_interrupts();
acquire_spinlock(&sSpinlock);
@ -990,10 +995,12 @@ dprintf_args(const char *format, va_list args, bool syslogOutput)
if (length >= OUTPUT_BUFFER_SIZE)
length = OUTPUT_BUFFER_SIZE - 1;
if (strncmp(sOutputBuffer, sLastOutputBuffer, length) == 0
&& length > 1 && sOutputBuffer[length - 1] == '\n') {
if (length > 1 && sOutputBuffer[length - 1] == '\n'
&& strncmp(sOutputBuffer, sLastOutputBuffer, length) == 0) {
sMessageRepeatCount++;
sMessageRepeatTime = system_time();
sMessageRepeatLastTime = system_time();
if (sMessageRepeatFirstTime == 0)
sMessageRepeatFirstTime = sMessageRepeatLastTime;
} else {
flush_pending_repeats();