edit readme
[lunaix-os.git] / lunaix-os / kernel / sched.c
index 442921ebccfb444fd13d1374988f5fdbe7cef108..8c43b149d3eb761ec094269a765ba9808ca775ea 100644 (file)
@@ -58,9 +58,9 @@ run(struct proc_info* proc)
 
     apic_done_servicing();
 
-    asm volatile("pushl %0\n"
+    asm volatile("movl %0, %%eax\n"
                  "jmp soft_iret\n" ::"r"(&__current->intr_ctx)
-                 : "memory");
+                 : "eax", "memory");
 }
 
 void
@@ -145,11 +145,12 @@ _wait(pid_t wpid, int* status, int options)
         return -1;
     }
 
+    wpid = wpid ? wpid : -__current->pgid;
     cpu_enable_interrupt();
 repeat:
     llist_for_each(proc, n, &__current->children, siblings)
     {
-        if (!~wpid || proc->pid == wpid) {
+        if (!~wpid || proc->pid == wpid || proc->pgid == -wpid) {
             if (proc->state == PROC_TERMNAT && !options) {
                 status_flags |= PROCTERM;
                 goto done;
@@ -205,8 +206,10 @@ push_process(struct proc_info* process)
 
     process = &sched_ctx._procs[index];
 
-    // make sure the address is in the range of process table
+    // make sure the reference is relative to process table
     llist_init_head(&process->children);
+    llist_init_head(&process->grp_member);
+
     // every process is the child of first process (pid=1)
     if (process->parent) {
         llist_append(&process->parent->children, &process->siblings);