#include "signal.h"
#include "sched.h"
#include "proc.h"
#include "proc_struct.h"
#include <condition.h>
#include <consts.h>
void status_init(struct proc_struct *proc)
{
proc->status_available = 0;
condition_init(&proc->child_status_available_condition);
}
static void notify_parent()
{
condition_signal(¤t->parent->child_status_available_condition);
signal(current->parent, SIGCHLD);
}
void set_status(int status)
{
current->status = status;
current->status_available = 1;
if (!is_orphan(current))
notify_parent();
}
int wait_child_status()
{
return condition_wait_interruptible(¤t->child_status_available_condition);
}
int report_status(struct proc_struct *child, int *status)
{
if (!child->status_available)
return 0;
if (status)
*status = child->status;
child->status_available = 0;
return 1;
}