kevent: fix race on process exit event

This commit is contained in:
DH 2024-08-31 23:59:28 +03:00
parent d0d22529f9
commit b0b0226064
3 changed files with 7 additions and 0 deletions

View file

@ -65,6 +65,7 @@ struct Process final {
sint budgetId{1}; sint budgetId{1};
bool isInSandbox = false; bool isInSandbox = false;
EventEmitter event; EventEmitter event;
std::optional<sint> exitStatus;
std::uint32_t sdkVersion = -1; std::uint32_t sdkVersion = -1;
std::uint64_t nextTlsSlot = 1; std::uint64_t nextTlsSlot = 1;

View file

@ -96,6 +96,11 @@ static SysResult keventChange(KQueue *kq, KEvent &change, Thread *thread) {
std::unique_lock lock(process->event.mutex); std::unique_lock lock(process->event.mutex);
process->event.notes.insert(&*nodeIt); process->event.notes.insert(&*nodeIt);
nodeIt->linked = process; 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 || } else if (change.filter == kEvFiltRead ||
change.filter == kEvFiltWrite) { change.filter == kEvFiltWrite) {
auto fd = thread->tproc->fileDescriptors.get(change.ident); auto fd = thread->tproc->fileDescriptors.get(change.ident);

View file

@ -702,6 +702,7 @@ orbis::SysResult nmount(orbis::Thread *thread, orbis::ptr<orbis::IoVec> iovp,
orbis::SysResult exit(orbis::Thread *thread, orbis::sint status) { orbis::SysResult exit(orbis::Thread *thread, orbis::sint status) {
std::printf("Requested exit with status %d\n", status); std::printf("Requested exit with status %d\n", status);
thread->tproc->exitStatus = status;
thread->tproc->event.emit(orbis::kEvFiltProc, orbis::kNoteExit, status); thread->tproc->event.emit(orbis::kEvFiltProc, orbis::kNoteExit, status);
std::exit(status); std::exit(status);
} }