]> Zhao Yanbai Git Server - minix.git/commitdiff
Fixed a bug in PM: sending of reply messages didn't check if destination
authorJorrit Herder <jnherder@minix3.org>
Fri, 27 May 2005 13:10:58 +0000 (13:10 +0000)
committerJorrit Herder <jnherder@minix3.org>
Fri, 27 May 2005 13:10:58 +0000 (13:10 +0000)
process is still alive. This caused a panic in some situations, e.g., when
all processes are killed on a shutdown.

servers/pm/main.c
servers/pm/misc.c

index 671a97b0cdfb269962155e6c4bc03a4fa93938e8..9f214a4a418961cd49099d29614416723dc51633 100644 (file)
@@ -37,7 +37,7 @@ PUBLIC void main()
 {
 /* Main routine of the process manager. */
 
-  int result, proc_nr;
+  int result, s, proc_nr;
   struct mproc *rmp;
 
   pm_init();                   /* initialize process manager tables */
@@ -74,9 +74,12 @@ PUBLIC void main()
         * the call just made above.  The processes must not be swapped out.
         */
        for (proc_nr=0, rmp=mproc; proc_nr < NR_PROCS; proc_nr++, rmp++) {
-               if ((rmp->mp_flags & (REPLY | ONSWAP)) == REPLY) {
-                       if (send(proc_nr, &rmp->mp_reply) != OK)
+               if ((rmp->mp_flags & IN_USE) &&
+                   (rmp->mp_flags & (REPLY | ONSWAP)) == REPLY) {
+                       if ((s=send(proc_nr, &rmp->mp_reply)) != OK) {
+                               printf("Warning, PM send failed: %d, ", s);
                                panic("PM can't reply to", proc_nr);
+                       }
                        rmp->mp_flags &= ~REPLY;
                }
        }
index 32aa327d594a566b26b556db3f30b07923163c51..fa18427ccdc5ddd848967f47adb7aed5ad024bdf 100644 (file)
@@ -71,8 +71,10 @@ PUBLIC int do_reboot()
   tell_fs(REBOOT,0,0,0);               /* tell FS to prepare for shutdown */
   check_sig(-1, SIGKILL);              /* kill all processes except init */
 
+  /* Ask the kernel to abort. All system services, including the PM, will 
+   * get a HARD_STOP notification. Await the notification in the main loop.
+   */
   sys_abort(m_in.reboot_flag, PM_PROC_NR, monitor_code, m_in.reboot_size);
-  sys_exit(0);
 }
 
 /*=====================================================================*