diff options
author | attilio <attilio@FreeBSD.org> | 2008-08-18 16:48:09 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2008-08-18 16:48:09 +0000 |
commit | 93af8fa458ec63ac5a9145de4704c260f0d9b213 (patch) | |
tree | 479bdc8c356fbf105020e663aa641d9f150efea6 /sys/ddb | |
parent | fa05df0f2cd260f569336891154ab78f3a107b10 (diff) | |
download | FreeBSD-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.c | 102 |
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 } /* |