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:
parent
f8b6bf0448
commit
51b93e474d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=181840
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user