]> Zhao Yanbai Git Server - minix.git/commitdiff
PM remembers what it should schedule
authorTomas Hruby <tom@minix3.org>
Tue, 13 Apr 2010 10:45:08 +0000 (10:45 +0000)
committerTomas Hruby <tom@minix3.org>
Tue, 13 Apr 2010 10:45:08 +0000 (10:45 +0000)
- while PM implements fork also for RS it needs to remember what to
  schedule and what not. PM_SCHEDULED flag serves this purpose.

- PM only schedules processes that are descendaints of init, i.e. normal
  user processes

- after a process is forked PM schedules for the first time only
  processes that have PM_SCHEDULED set. The others are handled iether
  by kernel or some other scheduler

servers/pm/forkexit.c
servers/pm/main.c
servers/pm/mproc.h
servers/pm/schedule.c

index 3406296c2d8f5fc4bc702d184bd3e2e7940c2137..17a8c9f8d28e16e860f789ad831eb8186e002aa5 100644 (file)
@@ -92,7 +92,7 @@ PUBLIC int do_fork()
        sigemptyset(&rmc->mp_sigtrace);
   }
   /* Inherit only these flags. In normal fork(), PRIV_PROC is not inherited. */
-  rmc->mp_flags &= (IN_USE|DELAY_CALL);
+  rmc->mp_flags &= (IN_USE|DELAY_CALL|PM_SCHEDULED);
   rmc->mp_child_utime = 0;             /* reset administration */
   rmc->mp_child_stime = 0;             /* reset administration */
   rmc->mp_exitstatus = 0;
index 2fdafbb93e567dea4fe248477db51b879509d15c..41d3c4106869a857113111ea2e6bb2938d334d0a 100644 (file)
@@ -505,7 +505,8 @@ PRIVATE void handle_fs_reply()
 
   case PM_FORK_REPLY:
        /* Schedule the newly created process ... */
-       schedule_process(rmp);
+       if (rmp->mp_flags & PM_SCHEDULED)
+               schedule_process(rmp);
        /* ... and wake it up */
        setreply(proc_n, OK);
 
index 358e93e503ed0e8734964226c8e44af390033728..bb4cbf7bb20d2ecedc69f2aa29d7c996c1801a71 100644 (file)
@@ -82,6 +82,7 @@ EXTERN struct mproc {
 #define TRACE_EXIT     0x08000 /* tracer is forcing this process to exit */
 #define TRACE_ZOMBIE   0x10000 /* waiting for tracer to issue WAIT call */
 #define DELAY_CALL     0x20000 /* waiting for call before sending signal */
+#define PM_SCHEDULED   0x40000 /* this process is scheduled by PM */
 
 #define NIL_MPROC ((struct mproc *) 0)
 
index 590ce45d2e045d7591f25fb563232b8ba4291cca..2f6ee3d24a51b457df3508951e9fa5d8e0ec56e3 100644 (file)
@@ -69,6 +69,7 @@ PUBLIC void overtake_scheduling(void)
                        if (sys_schedctl(trmp->mp_endpoint))
                                printf("PM: Error while overtaking scheduling for %s\n",
                                        trmp->mp_name);
+                       trmp->mp_flags |= PM_SCHEDULED;
                }
        }