Override glibc's printf for vcore context
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Oct 2015 21:55:39 +0000 (17:55 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Oct 2015 16:05:13 +0000 (12:05 -0400)
Our printf is safe from vcore context.  Otherwise, glibc's printf may
run off the end of the vcore stack, depending on whether or not the
output stream is in buffered mode.

This only overrides printf, not functions like fprintf, vprintf, or any
of the other printf functions.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/debug.c
user/parlib/include/common.h
user/parlib/include/ros_debug.h
user/parlib/include/stdio.h [new file with mode: 0644]

index 8ea471f..671e130 100644 (file)
@@ -58,6 +58,20 @@ int ros_debug(const char *fmt, ...)
        return cnt;
 }
 
+int akaros_printf(const char *format, ...)
+{
+       va_list ap;
+       int ret;
+
+       va_start(ap, format);
+       if (in_vcore_context())
+               ret = ros_vdebug(format, ap);
+       else
+               ret = vprintf(format, ap);
+       va_end(ap);
+       return ret;
+}
+
 /* Poor man's Ftrace, won't work well with concurrency. */
 static const char *blacklist[] = {
        "whatever",
index 4b1d42a..df4ec19 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <ros/common.h>
 #include <parlib/assert.h>
+#include <parlib/stdio.h>
 
 #define IS_PWR2(x) ((x) && !((x) & (x - 1)))
 
index 6bd0637..2f09f11 100644 (file)
@@ -4,24 +4,9 @@
 #include <parlib/common.h>
 #include <parlib/parlib.h>
 #include <parlib/vcore.h>
-#include <stdio.h>
-#include <stdarg.h>
 
 __BEGIN_DECLS
 
-void ros_debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, ...);
-void ros_vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list);
-
-int    ros_debug(const char *fmt, ...);
-int    ros_vdebug(const char *fmt, va_list);
-
-//#define PRINTD_DEBUG
-#ifdef PRINTD_DEBUG
-#define printd(args...) printf(args)
-#else
-#define printd(args...) {}
-#endif
-
 #define I_AM_HERE printf("Vcore %d is in %s() at %s:%d\n", vcore_id(), \
                          __FUNCTION__, __FILE__, __LINE__);
 
diff --git a/user/parlib/include/stdio.h b/user/parlib/include/stdio.h
new file mode 100644 (file)
index 0000000..c799b43
--- /dev/null
@@ -0,0 +1,40 @@
+/* Copyright (c) 2015 Google Inc.
+ * Barret Rhoden <brho@cs.berkeley.edu>
+ * See LICENSE for details.
+ *
+ * Print routines for Akaros user programs. */
+
+#ifndef PARLIB_STDIO_H
+#define PARLIB_STDIO_H
+
+#ifdef BUILDING_PARLIB
+# include_next "stdio.h"
+#else
+# include <stdio.h>
+#endif
+#include <stdarg.h>
+
+__BEGIN_DECLS
+
+void ros_debugfmt(void (*putch)(int, void**), void **putdat, const char *fmt,
+                  ...);
+void ros_vdebugfmt(void (*putch)(int, void**), void **putdat, const char *fmt,
+                   va_list);
+int    ros_debug(const char *fmt, ...);
+int    ros_vdebug(const char *fmt, va_list);
+
+#ifdef PRINTD_DEBUG
+#define printd(args...) printf(args)
+#else
+#define printd(args...) {}
+#endif
+
+/* Override glibc's printf; ours will be safe from VC context, and uses glibc's
+ * otherwise. */
+int akaros_printf(const char *format, ...);
+#undef printf
+#define printf akaros_printf
+
+__END_DECLS
+
+#endif /* PARLIB_STDIO_H */