summaryrefslogtreecommitdiffstats
path: root/sys/ddb
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2008-08-18 16:48:09 +0000
committerattilio <attilio@FreeBSD.org>2008-08-18 16:48:09 +0000
commit93af8fa458ec63ac5a9145de4704c260f0d9b213 (patch)
tree479bdc8c356fbf105020e663aa641d9f150efea6 /sys/ddb
parentfa05df0f2cd260f569336891154ab78f3a107b10 (diff)
downloadFreeBSD-src-93af8fa458ec63ac5a9145de4704c260f0d9b213.zip
FreeBSD-src-93af8fa458ec63ac5a9145de4704c260f0d9b213.tar.gz
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
Diffstat (limited to 'sys/ddb')
-rw-r--r--sys/ddb/db_output.c102
1 files changed, 87 insertions, 15 deletions
diff --git a/sys/ddb/db_output.c b/sys/ddb/db_output.c
index 531fef8..c5e2c61 100644
--- a/sys/ddb/db_output.c
+++ b/sys/ddb/db_output.c
@@ -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
}
/*
OpenPOWER on IntegriCloud