mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:47:35 +00:00
Implement waitpid() support for getting the waitee's exit code.
This commit is contained in:
parent
5cfeeede7c
commit
ec07761d0f
7 changed files with 33 additions and 10 deletions
|
@ -95,7 +95,7 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3)
|
|||
case Syscall::PosixGetpid:
|
||||
return current->sys$getpid();
|
||||
case Syscall::PosixWaitpid:
|
||||
return current->sys$waitpid((pid_t)arg1);
|
||||
return current->sys$waitpid((pid_t)arg1, (int*)arg2, (int)arg3);
|
||||
case Syscall::PosixMmap:
|
||||
return (dword)current->sys$mmap((void*)arg1, (size_t)arg2);
|
||||
case Syscall::PosixMunmap:
|
||||
|
|
|
@ -450,8 +450,13 @@ void Task::sys$exit(int status)
|
|||
|
||||
s_tasks->remove(this);
|
||||
|
||||
for (auto* task = s_tasks->head(); task; task = task->next()) {
|
||||
if (task->waitee() == m_pid)
|
||||
task->m_waiteeStatus = status << 8;
|
||||
}
|
||||
|
||||
if (!scheduleNewTask()) {
|
||||
kprintf("Task::taskDidCrash: Failed to schedule a new task :(\n");
|
||||
kprintf("Task::sys$exit: Failed to schedule a new task :(\n");
|
||||
HANG;
|
||||
}
|
||||
|
||||
|
@ -752,7 +757,6 @@ int Task::sys$chdir(const char* path)
|
|||
if (!handle->isDirectory())
|
||||
return -ENOTDIR;
|
||||
m_cwd = handle->vnode();
|
||||
kprintf("m_cwd <- %p (%u)\n", m_cwd.ptr(), handle->vnode()->inode.index());
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -844,14 +848,20 @@ pid_t Task::sys$getpid()
|
|||
return m_pid;
|
||||
}
|
||||
|
||||
pid_t Task::sys$waitpid(pid_t waitee)
|
||||
pid_t Task::sys$waitpid(pid_t waitee, int* wstatus, int options)
|
||||
{
|
||||
if (wstatus)
|
||||
VALIDATE_USER_BUFFER(wstatus, sizeof(int));
|
||||
|
||||
InterruptDisabler disabler;
|
||||
if (!Task::fromPID(waitee))
|
||||
return -1;
|
||||
m_waitee = waitee;
|
||||
m_waiteeStatus = 0;
|
||||
block(BlockedWait);
|
||||
yield();
|
||||
if (wstatus)
|
||||
*wstatus = m_waiteeStatus;
|
||||
return m_waitee;
|
||||
}
|
||||
|
||||
|
|
|
@ -95,7 +95,7 @@ public:
|
|||
int sys$geterror() { return m_error; }
|
||||
void sys$exit(int status);
|
||||
int sys$spawn(const char* path, const char** args);
|
||||
pid_t sys$waitpid(pid_t);
|
||||
pid_t sys$waitpid(pid_t, int* wstatus, int options);
|
||||
void* sys$mmap(void*, size_t size);
|
||||
int sys$munmap(void*, size_t size);
|
||||
int sys$get_dir_entries(int fd, void*, size_t);
|
||||
|
@ -160,6 +160,7 @@ private:
|
|||
void* m_kernelStack { nullptr };
|
||||
dword m_timesScheduled { 0 };
|
||||
pid_t m_waitee { -1 };
|
||||
int m_waiteeStatus { 0 };
|
||||
int m_fdBlockedOnRead { -1 };
|
||||
size_t m_maxFileHandles { 16 };
|
||||
|
||||
|
|
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue