Get rid of power_off_when_done global variable.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 10 Nov 2008 00:19:48 +0000 (16:19 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 10 Nov 2008 00:19:48 +0000 (16:19 -0800)
This global variable was not named according to the convention that a
global variable name start with its module name.  Furthermore, its usage
was somewhat scattered across the source tree.

This commit introduces new functions shutdown() and shutdown_configure()
to improve the situation.

src/devices/shutdown.c
src/devices/shutdown.h
src/lib/kernel/debug.c
src/threads/init.c
src/threads/init.h

index 4c978f970216169d69b34d061ae7c1c3d746f857..42b67df57bc533b1681d1afb964dc1634e3b0930 100644 (file)
 /* Keyboard control register port. */
 #define CONTROL_REG 0x64
 
+/* How to shut down when shutdown() is called. */
+static enum shutdown_type how = SHUTDOWN_NONE;
+
 static void print_stats (void);
 
+/* Shuts down the machine in the way configured by
+   shutdown_configure().  If the shutdown type is SHUTDOWN_NONE
+   (which is the default), returns without doing anything. */
+void
+shutdown (void)
+{
+  switch (how)
+    {
+    case SHUTDOWN_POWER_OFF:
+      shutdown_power_off ();
+      break;
+
+    case SHUTDOWN_REBOOT:
+      shutdown_reboot ();
+      break;
+
+    default:
+      /* Nothing to do. */
+      break;
+    }
+}
+
+/* Sets TYPE as the way that machine will shut down when Pintos
+   execution is complete. */
+void
+shutdown_configure (enum shutdown_type type)
+{
+  how = type;
+}
+
 /* Reboots the machine via the keyboard controller. */
 void
 shutdown_reboot (void)
index 7bcef19e7759509c7625920785bb1ef1829b22d9..dc4f942384d44f210469b83b4b412799bb86213f 100644 (file)
@@ -3,6 +3,16 @@
 
 #include <debug.h>
 
+/* How to shut down when Pintos has nothing left to do. */
+enum shutdown_type
+  {
+    SHUTDOWN_NONE,              /* Loop forever. */
+    SHUTDOWN_POWER_OFF,         /* Power off the machine (if possible). */
+    SHUTDOWN_REBOOT,            /* Reboot the machine (if possible). */
+  };
+
+void shutdown (void);
+void shutdown_configure (enum shutdown_type);
 void shutdown_reboot (void) NO_RETURN;
 void shutdown_power_off (void) NO_RETURN;
 
index 43d8c1eddedd70e66c6de5e4b3b2586e45dd90ec..b12f4f9aacd343adb593f048892bb5646577461f 100644 (file)
@@ -46,8 +46,7 @@ debug_panic (const char *file, int line, const char *function,
     }
 
   serial_flush ();
-  if (power_off_when_done)
-    shutdown_power_off ();
+  shutdown ();
   for (;;);
 }
 
index 01eec1120c923804083b747367b4e1a621ea5e19..f804b863747ae42636878fe7ad9ec5e901a5fec4 100644 (file)
@@ -48,12 +48,6 @@ uint32_t *init_page_dir;
 static bool format_filesys;
 #endif
 
-/* -q: Power off after kernel tasks complete? */
-bool power_off_when_done;
-
-/* -r: Reboot after kernel tasks complete? */
-static bool reboot_when_done;
-
 /* -ul: Maximum number of pages to put into palloc's user pool. */
 static size_t user_page_limit = SIZE_MAX;
 
@@ -126,11 +120,7 @@ main (void)
   run_actions (argv);
 
   /* Finish up. */
-  if (reboot_when_done)
-    shutdown_reboot ();
-
-  if (power_off_when_done)
-    shutdown_power_off ();
+  shutdown ();
   thread_exit ();
 }
 \f
@@ -169,7 +159,7 @@ paging_init (void)
 
   pd = init_page_dir = palloc_get_page (PAL_ASSERT | PAL_ZERO);
   pt = NULL;
-  for (page = 0; page < ram_pages; page++) 
+  for (page = 0; page < ram_pages; page++)
     {
       uintptr_t paddr = page * PGSIZE;
       char *vaddr = ptov (paddr);
@@ -243,9 +233,9 @@ parse_options (char **argv)
       if (!strcmp (name, "-h"))
         usage ();
       else if (!strcmp (name, "-q"))
-        power_off_when_done = true;
+        shutdown_configure (SHUTDOWN_POWER_OFF);
       else if (!strcmp (name, "-r"))
-        reboot_when_done = true;
+        shutdown_configure (SHUTDOWN_REBOOT);
 #ifdef FILESYS
       else if (!strcmp (name, "-f"))
         format_filesys = true;
index 06cf71e3895ef7c1ee8d1ad8b3069dff142a7cf0..a5c7500ad9776e5a8257b6b97239c6dfa216f8ab 100644 (file)
@@ -12,7 +12,4 @@ extern size_t ram_pages;
 /* Page directory with kernel mappings only. */
 extern uint32_t *init_page_dir;
 
-/* -q: Power off when kernel tasks complete? */
-extern bool power_off_when_done;
-
 #endif /* threads/init.h */