Bufferize the output for DDB printouts.

In order to CATER this, DDB buffered output can be choosen at compile
time through the option DDB_BUFR_SIZE=nbytes where nbytes choose the size
of the buffer (suggested size is 128 bytes), which should be manually
specified in any interested config file.

Sponsored by:	Nokia
This commit is contained in:
Attilio Rao 2008-08-18 16:48:09 +00:00
parent f8b6bf0448
commit 51b93e474d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=181840
2 changed files with 88 additions and 15 deletions

View File

@ -48,6 +48,7 @@ TWA_FLASH_FIRMWARE opt_twa.h
# Debugging options.
DDB
DDB_BUFR_SIZE opt_ddb.h
DDB_CAPTURE_DEFAULTBUFSIZE opt_ddb.h
DDB_CAPTURE_MAXBUFSIZE opt_ddb.h
DDB_CTF opt_ddb.h

View File

@ -47,6 +47,13 @@ __FBSDID("$FreeBSD$");
#include <ddb/ddb.h>
#include <ddb/db_output.h>
struct dbputchar_arg {
size_t da_nbufr;
size_t da_remain;
char *da_pbufr;
char *da_pnext;
};
/*
* Character output - tracks position in line.
* To do this correctly, we should know how wide
@ -73,6 +80,8 @@ static int ddb_use_printf = 0;
SYSCTL_INT(_debug, OID_AUTO, ddb_use_printf, CTLFLAG_RW, &ddb_use_printf, 0,
"use printf for all ddb output");
static void db_putc(int c);
static void db_puts(const char *str);
static void db_putchar(int c, void *arg);
static void db_pager(void);
@ -107,9 +116,34 @@ db_force_whitespace()
* Output character. Buffer whitespace.
*/
static void
db_putchar(c, arg)
int c; /* character to output */
void * arg;
db_putchar(int c, void *arg)
{
struct dbputchar_arg *dap = arg;
if (dap->da_pbufr == NULL) {
/* No bufferized output is provided. */
db_putc(c);
} else {
*dap->da_pnext++ = c;
dap->da_remain--;
/* Leave always the buffer 0 terminated. */
*dap->da_pnext = '\0';
/* Check if the buffer needs to be flushed. */
if (dap->da_remain < 2 || c == '\n') {
db_puts(dap->da_pbufr);
dap->da_pnext = dap->da_pbufr;
dap->da_remain = dap->da_nbufr;
*dap->da_pnext = '\0';
}
}
}
static void
db_putc(int c)
{
/*
@ -180,6 +214,15 @@ db_putchar(c, arg)
/* other characters are assumed non-printing */
}
static void
db_puts(const char *str)
{
int i;
for (i = 0; str[i] != '\0'; i++)
db_putc(str[i]);
}
/*
* Turn on the pager.
*/
@ -272,30 +315,43 @@ db_print_position()
* Printing
*/
void
#if __STDC__
db_printf(const char *fmt, ...)
#else
db_printf(fmt)
const char *fmt;
#endif
{
#ifdef DDB_BUFR_SIZE
char bufr[DDB_BUFR_SIZE];
#endif
struct dbputchar_arg dca;
va_list listp;
#ifdef DDB_BUFR_SIZE
dca.da_pbufr = bufr;
dca.da_pnext = dca.da_pbufr;
dca.da_nbufr = sizeof(bufr);
dca.da_remain = sizeof(bufr);
*dca.da_pnext = '\0';
#else
dca.da_pbufr = NULL;
#endif
va_start(listp, fmt);
kvprintf (fmt, db_putchar, NULL, db_radix, listp);
kvprintf (fmt, db_putchar, &dca, db_radix, listp);
va_end(listp);
#ifdef DDB_BUFR_SIZE
if (*dca.da_pbufr != '\0')
db_puts(dca.da_pbufr);
#endif
}
int db_indent;
void
#if __STDC__
db_iprintf(const char *fmt,...)
#else
db_iprintf(fmt)
const char *fmt;
#endif
{
#ifdef DDB_BUFR_SIZE
char bufr[DDB_BUFR_SIZE];
#endif
struct dbputchar_arg dca;
register int i;
va_list listp;
@ -303,9 +359,25 @@ db_iprintf(fmt)
db_printf("\t");
while (--i >= 0)
db_printf(" ");
#ifdef DDB_BUFR_SIZE
dca.da_pbufr = bufr;
dca.da_pnext = dca.da_pbufr;
dca.da_nbufr = sizeof(bufr);
dca.da_remain = sizeof(bufr);
*dca.da_pnext = '\0';
#else
dca.da_pbufr = NULL;
#endif
va_start(listp, fmt);
kvprintf (fmt, db_putchar, NULL, db_radix, listp);
kvprintf (fmt, db_putchar, &dca, db_radix, listp);
va_end(listp);
#ifdef DDB_BUFR_SIZE
if (*dca.da_pbufr != '\0')
db_puts(dca.da_pbufr);
#endif
}
/*