Make tests public. Rewrite most tests. Add tests.
[pintos-anon] / src / lib / kernel / console.c
index 14c707a63681129a66463677d6e7916d80199855..865b13b2cd810b0805acead8ec9f4e3e038f609a 100644 (file)
@@ -42,11 +42,21 @@ static struct lock console_lock;
    counter. */
 static int console_lock_depth;
 
+/* Number of characters written to console. */
+static int64_t write_cnt;
+
 /* Initializes the console. */
 void
 console_init (void) 
 {
-  lock_init (&console_lock, "console");
+  lock_init (&console_lock);
+}
+
+/* Prints console statistics. */
+void
+console_print_stats (void) 
+{
+  printf ("Console: %lld characters output\n", write_cnt);
 }
 
 /* Acquires the console lock. */
@@ -75,6 +85,14 @@ release_console (void)
     }
 }
 
+/* Returns true if the current thread has the console lock,
+   false otherwise. */
+static bool
+console_locked_by_current_thread (void) 
+{
+  return intr_context () || lock_held_by_current_thread (&console_lock);
+}
+
 /* The standard vprintf() function,
    which is like printf() but uses a va_list.
    Writes its output to both vga display and serial port. */
@@ -140,6 +158,8 @@ vprintf_helper (char c, void *char_cnt_)
 static void
 putchar_unlocked (uint8_t c) 
 {
+  ASSERT (console_locked_by_current_thread ());
+  write_cnt++;
   serial_putc (c);
   vga_putc (c);
 }