diff --git a/sys/i386/fork.c b/sys/i386/fork.c index 93b2d89..7e0e4bd 100644 --- a/sys/i386/fork.c +++ b/sys/i386/fork.c @@ -105,6 +105,9 @@ while (newProcess->state == FORK) sched_yield(); + newProcess->parent = _current; + _current->children++; + /* Return Id of Proccess */ kprintf("Returning! [%i][0x%X]\n", _current->id, newProcess->tss.cr3); td->td_retval[0] = newProcess->id; diff --git a/sys/i386/sched.c b/sys/i386/sched.c index 81e8ffb..f5a0bae 100644 --- a/sys/i386/sched.c +++ b/sys/i386/sched.c @@ -105,6 +105,10 @@ } else if (tmpTask->state == DEAD) { delTask = tmpTask; + if (delTask->parent != 0x0) { + delTask->parent->children -= 1; + delTask->parent->last_exit = delTask->id; + } tmpTask = tmpTask->next; sched_deleteTask(delTask->id); sched_addDelTask(delTask); diff --git a/sys/include/ubixos/sched.h b/sys/include/ubixos/sched.h index 3c1b18f..cdc11e9 100644 --- a/sys/include/ubixos/sched.h +++ b/sys/include/ubixos/sched.h @@ -80,6 +80,9 @@ uint16_t groups[NR_GROUPS]; pidType ppid; uint32_t pgrp; + uint32_t children; // Hack for WAIT + uint32_t last_exit; // Hack For WAIT + struct taskStruct *parent; } kTask_t; int sched_init(); diff --git a/sys/kernel/gen_calls.c b/sys/kernel/gen_calls.c index 72de34f..5362f03 100644 --- a/sys/kernel/gen_calls.c +++ b/sys/kernel/gen_calls.c @@ -144,7 +144,16 @@ int sys_wait4(struct thread *td, struct sys_wait4_args *args) { int error = 0; kprintf("wait4: %i", args->pid); - //kprintf("DUMMY FUNC FIX ME! sys_wait4"); + + if (args->pid == -1) { + int children = _current->children; + + while (_current->children == children) + sched_yeild(); + + td->td_retval[0] = _current->last_exit; + } else { + kTask_t *tmpTask = schedFindTask(args->pid); if (tmpTask != 0x0) { @@ -157,6 +166,7 @@ td->td_retval[0] = -1; error = -1; } + } return (error); }