X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/088403ac98acf7991507715d29a282dcba222053..d342435e493c415e10042cfc8aab45c2b2aa0868:/lunaix-os/kernel/sched.c diff --git a/lunaix-os/kernel/sched.c b/lunaix-os/kernel/sched.c index 442921e..8c43b14 100644 --- a/lunaix-os/kernel/sched.c +++ b/lunaix-os/kernel/sched.c @@ -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);