diff --git a/orbis-kernel/include/orbis/thread/Process.hpp b/orbis-kernel/include/orbis/thread/Process.hpp index b824e2929..48db5892c 100644 --- a/orbis-kernel/include/orbis/thread/Process.hpp +++ b/orbis-kernel/include/orbis/thread/Process.hpp @@ -65,6 +65,7 @@ struct Process final { sint budgetId{1}; bool isInSandbox = false; EventEmitter event; + std::optional exitStatus; std::uint32_t sdkVersion = -1; std::uint64_t nextTlsSlot = 1; diff --git a/orbis-kernel/src/sys/sys_event.cpp b/orbis-kernel/src/sys/sys_event.cpp index c69475a3a..60497c555 100644 --- a/orbis-kernel/src/sys/sys_event.cpp +++ b/orbis-kernel/src/sys/sys_event.cpp @@ -96,6 +96,11 @@ static SysResult keventChange(KQueue *kq, KEvent &change, Thread *thread) { std::unique_lock lock(process->event.mutex); process->event.notes.insert(&*nodeIt); nodeIt->linked = process; + if ((change.fflags & orbis::kNoteExit) != 0 && process->exitStatus.has_value()) { + note.event.data = *process->exitStatus; + note.triggered = true; + kq->cv.notify_all(kq->mtx); + } } else if (change.filter == kEvFiltRead || change.filter == kEvFiltWrite) { auto fd = thread->tproc->fileDescriptors.get(change.ident); diff --git a/rpcsx-os/ops.cpp b/rpcsx-os/ops.cpp index 13eb3ab5b..fa35f0773 100644 --- a/rpcsx-os/ops.cpp +++ b/rpcsx-os/ops.cpp @@ -702,6 +702,7 @@ orbis::SysResult nmount(orbis::Thread *thread, orbis::ptr iovp, orbis::SysResult exit(orbis::Thread *thread, orbis::sint status) { std::printf("Requested exit with status %d\n", status); + thread->tproc->exitStatus = status; thread->tproc->event.emit(orbis::kEvFiltProc, orbis::kNoteExit, status); std::exit(status); }