static void add_child_status(int pid, int status) { Child_Status *st; /* Search for existing record, which will have a signal_fd: */ mzrt_mutex_lock(child_status_lock); for (st = child_statuses; st; st = st->next) { if (st->pid == pid) break; } if (!st) { /* must have terminated before it was registered (and since we detected it, it must not be a group) */ st = malloc(sizeof(Child_Status)); st->pid = pid; st->signal_fd = NULL; st->next = child_statuses; child_statuses = st; st->next_unused = NULL; st->unneeded = 0; st->is_group = 0; } st->status = status; st->done = 1; if (st->signal_fd && st->is_group) remove_group_signal_fd(st->signal_fd); mzrt_mutex_unlock(child_status_lock); if (st->signal_fd) scheme_signal_received_at(st->signal_fd); if (st->unneeded) (void)scheme_get_child_status(st->pid, 0, NULL); }
void centralized_done_with_process_id(int pid, int in_group) { Child_Status *st; int keep_unused = 1; /* assume that any process can be in a new group */ pthread_mutex_lock(&child_wait_lock); /* protects unused_pid_statuses */ pthread_mutex_lock(&child_status_lock); for (st = child_statuses; st; st = st->next) { if (st->pid == pid) { if (!st->done) { if (keep_unused) { st->next_unused = unused_pid_statuses; unused_pid_statuses = st; if (st->signal_fd) remove_group_signal_fd(st->signal_fd); } else st->unneeded = 1; st->signal_fd = NULL; } break; } } if (st && (keep_unused || st->done)) { /* remove it from normal list: */ raw_get_child_status(pid, NULL, 0, 1, st->done); } pthread_mutex_unlock(&child_status_lock); pthread_mutex_unlock(&child_wait_lock); }
void scheme_done_with_process_id(int pid, int is_group) { Child_Status *st; mzrt_mutex_lock(child_wait_lock); /* protects child_group_statuses */ mzrt_mutex_lock(child_status_lock); for (st = child_statuses; st; st = st->next) { if (st->pid == pid) { if (!st->done) { if (is_group) { st->next_group = child_group_statuses; child_group_statuses = st; if (st->signal_fd) remove_group_signal_fd(st->signal_fd); } else st->unneeded = 1; st->signal_fd = NULL; } break; } } if (st && (is_group || st->done)) { /* remove it from normal list: */ raw_get_child_status(pid, NULL, 0, 1, !st->done); } mzrt_mutex_unlock(child_status_lock); mzrt_mutex_unlock(child_wait_lock); }