diff --git a/kernel-src/sys/syscalls/waitpid.c b/kernel-src/sys/syscalls/waitpid.c index 508227dc..46eb4a1e 100644 --- a/kernel-src/sys/syscalls/waitpid.c +++ b/kernel-src/sys/syscalls/waitpid.c @@ -59,23 +59,23 @@ syscallret_t syscall_waitpid(context_t *context, pid_t pid, int *status, int opt continue; } - if (pid > 0 && iterator->pid == pid) + if ((pid > 0 && iterator->pid == pid) || pid == -1) { desired = iterator; + bool intstatus = interrupt_set(false); + spinlock_acquire(&iterator->signals.lock); + if (iterator->signals.continueunwaited && (options & WCONTINUED)) { + iterator->signals.continueunwaited = false; + continued = true; + } + if (iterator->signals.stopunwaited && (options & WSTOPPED)) { + iterator->signals.stopunwaited = false; + stopped = true; + } + spinlock_release(&iterator->signals.lock); + interrupt_set(intstatus); - bool intstatus = interrupt_set(false); - spinlock_acquire(&iterator->signals.lock); - if (iterator->signals.continueunwaited && (options & WCONTINUED)) { - iterator->signals.continueunwaited = false; - continued = true; + zombie = iterator->state == SCHED_PROC_STATE_ZOMBIE; } - if (iterator->signals.stopunwaited && (options & WSTOPPED)) { - iterator->signals.stopunwaited = false; - stopped = true; - } - spinlock_release(&iterator->signals.lock); - interrupt_set(intstatus); - - zombie = iterator->state == SCHED_PROC_STATE_ZOMBIE; if (zombie || continued || stopped) break;