cprintf_async works with strings greater than 256
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 7 May 2009 08:36:33 +0000 (01:36 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 7 May 2009 18:55:26 +0000 (11:55 -0700)
Had to change all of the vprintf family of functions to pass a **buf
instead of just a *buf, so putch_async could change the buffer in use
when it submitted an async call.

Also turned off deputy in kern/printf.c.  Sorry Zach.

inc/stdio.h
kern/printf.c
lib/printf.c
lib/printfmt.c

index be32bcd..2f6b4c1 100644 (file)
@@ -21,8 +21,9 @@ int   getchar(void);
 int    iscons(int fd);
 
 // lib/printfmt.c
-void   printfmt(void (*putch)(int, void*), void *putdat, const char *NTS fmt, ...);
-void   vprintfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, va_list);
+void   printfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, ...);
+//void vprintfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, va_list);
+void   vprintfmt(void (*putch)(int, void**), void **putdat, const char *NTS fmt, va_list);
 
 // lib/printf.c
 int    cprintf(const char * NTS fmt, ...);
index d1c3efe..8f65906 100644 (file)
@@ -1,6 +1,10 @@
 // Simple implementation of cprintf console output for the kernel,
 // based on printfmt() and the kernel console's cputchar().
 
+#ifdef __DEPUTY__
+#pragma nodeputy
+#endif
+
 #include <inc/types.h>
 #include <inc/stdio.h>
 #include <inc/stdarg.h>
 
 uint32_t output_lock = 0;
 
-static void
-putch(int ch, int *cnt)
+static void putch(int ch, int **cnt)
 {
        cputchar(ch);
-       *cnt = *cnt + 1;
+       **cnt = **cnt + 1;
 }
 
-int
-vcprintf(const char *fmt, va_list ap)
+int vcprintf(const char *fmt, va_list ap)
 {
        int cnt = 0;
+       int *cntp = &cnt;
 
        // lock all output.  this will catch any printfs at line granularity
        spin_lock_irqsave(&output_lock);
-       vprintfmt(putch, &cnt, fmt, ap);
+       vprintfmt((void*)putch, (void**)&cntp, fmt, ap);
        spin_unlock_irqsave(&output_lock);
 
        return cnt;
 }
 
-int
-cprintf(const char *fmt, ...)
+int cprintf(const char *fmt, ...)
 {
        va_list ap;
        int cnt;
@@ -41,4 +43,3 @@ cprintf(const char *fmt, ...)
 
        return cnt;
 }
-
index ada1beb..f4669d8 100644 (file)
 #include <inc/lib.h>
 
 
-// Collect up to 256 characters into a buffer
+// Collect up to BUF_SIZE characters into a buffer
 // and perform ONE system call to print all of them,
 // in order to make the lines output to the console atomic
 // and prevent interrupts from causing context switches
 // in the middle of a console output line and such.
+#define BUF_SIZE 256
 typedef struct printbuf {
        int idx;        // current buffer index
        int cnt;        // total bytes printed so far
-       char buf[256];
+       char buf[BUF_SIZE];
 } printbuf_t;
 
 
-static void
-putch(int ch, printbuf_t *b)
+static void putch(int ch, printbuf_t **b)
 {
-       b->buf[b->idx++] = ch;
-       if (b->idx == 256-1) {
-               sys_cputs(b->buf, b->idx);
-               b->idx = 0;
+       (*b)->buf[(*b)->idx++] = ch;
+       if ((*b)->idx == BUF_SIZE) {
+               sys_cputs((*b)->buf, (*b)->idx);
+               (*b)->idx = 0;
        }
-       b->cnt++;
+       (*b)->cnt++;
 }
 
-int
-vcprintf(const char *fmt, va_list ap)
+int vcprintf(const char *fmt, va_list ap)
 {
        printbuf_t b;
+       printbuf_t *bp = &b;
 
        b.idx = 0;
        b.cnt = 0;
-       vprintfmt((void*)putch, &b, fmt, ap);
+       vprintfmt((void*)putch, (void**)&bp, fmt, ap);
        sys_cputs(b.buf, b.idx);
 
        return b.cnt;
 }
 
-int
-cprintf(const char *fmt, ...)
+int cprintf(const char *fmt, ...)
 {
        va_list ap;
        int cnt;
@@ -82,19 +81,19 @@ static void cputs_async_cleanup(void* data)
        POOL_PUT(&print_buf_pool, (printbuf_t*)data);
 }
 
-static void putch_async(int ch, printbuf_t *b)
+static void putch_async(int ch, printbuf_t **b)
 {
-       b->buf[b->idx++] = ch;
-       if (b->idx == 256-1) {
+       (*b)->buf[(*b)->idx++] = ch;
+       if ((*b)->idx == BUF_SIZE) {
                // will need some way to track the result of the syscall
-               sys_cputs_async(b->buf, b->idx, get_sys_desc(current_async_desc),
-                               cputs_async_cleanup, b); 
+               sys_cputs_async((*b)->buf, (*b)->idx, get_sys_desc(current_async_desc),
+                               cputs_async_cleanup, *b); 
                // TODO - this isn't getting passed back properly
                // TODO - should check for a return value
-               b = get_free_buffer();
-               b->idx = 0;
+               *b = get_free_buffer();
+               (*b)->idx = 0;
        }
-       b->cnt++; // supposed to be overall number, not just in one buffer
+       (*b)->cnt++; // supposed to be overall number, not just in one buffer
 }
 
 static int vcprintf_async(const char *fmt, va_list ap)
@@ -104,7 +103,7 @@ static int vcprintf_async(const char *fmt, va_list ap)
 
        b->idx = 0;
        b->cnt = 0;
-       vprintfmt((void*)putch_async, b, fmt, ap);
+       vprintfmt((void*)putch_async, (void**)&b, fmt, ap);
        sys_cputs_async(b->buf, b->idx, get_sys_desc(current_async_desc),
                        cputs_async_cleanup, b); 
 
index ab26a77..a21d4bc 100644 (file)
@@ -37,7 +37,7 @@ static const char * const error_string[MAXERROR + 1] =
  * Print a number (base <= 16) in reverse order,
  * using specified putch function and associated pointer putdat.
  */
-static void printnum(void (*putch)(int, void*), void *putdat,
+static void printnum(void (*putch)(int, void**), void **putdat,
                         unsigned long long num, unsigned base, int width, int padc)
 {
        // first recursively print all preceding (more significant) digits
@@ -79,9 +79,9 @@ static long long getint(va_list *ap, int lflag)
 
 
 // Main function to format and print a string.
-void printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...);
+void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
 
-void vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap)
+void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list ap)
 {
        register const char *p;
        register int ch, err;
@@ -243,7 +243,7 @@ void vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list
        }
 }
 
-void printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...)
+void printfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...)
 {
        va_list ap;
 
@@ -258,22 +258,23 @@ typedef struct sprintbuf {
        int cnt;
 } sprintbuf_t;
 
-static void sprintputch(int ch, sprintbuf_t *b)
+static void sprintputch(int ch, sprintbuf_t **b)
 {
-       b->cnt++;
-       if (b->buf < b->ebuf)
-               *b->buf++ = ch;
+       (*b)->cnt++;
+       if ((*b)->buf < (*b)->ebuf)
+               *((*b)->buf++) = ch;
 }
 
 int vsnprintf(char *buf, int n, const char *fmt, va_list ap)
 {
        sprintbuf_t b = {buf, buf+n-1, 0};
+       sprintbuf_t *bp = &b;
 
        if (buf == NULL || n < 1)
                return -E_INVAL;
 
        // print the string to the buffer
-       vprintfmt((void*)sprintputch, &b, fmt, ap);
+       vprintfmt((void*)sprintputch, (void**)&bp, fmt, ap);
 
        // null terminate the buffer
        *b.buf = '\0';