From b05d99b6306ee569338012819e6754e943a5f312 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 4 Jun 2026 11:23:36 -0300 Subject: [PATCH] poll: fix deadlock and only record first event --- kernel-src/io/poll.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/kernel-src/io/poll.c b/kernel-src/io/poll.c index b56b261b..1775fe08 100644 --- a/kernel-src/io/poll.c +++ b/kernel-src/io/poll.c @@ -138,15 +138,24 @@ void poll_event(pollheader_t *header, int events) { polldata_t *next = iterator->next; spinlock_acquire(&desc->eventlock); int revents = (iterator->events | POLLHUP | POLLERR) & events; - - if (revents == 0 || spinlock_try(&desc->lock) == false || spinlock_try(&desc->wakeuplock) == false) { - removefromlist(&pending, iterator); - insertinheader(header, iterator); - } + bool wake = false; if (desc->event == NULL && revents) { iterator->revents = revents; desc->event = iterator; + + if (spinlock_try(&desc->lock)) { + if (spinlock_try(&desc->wakeuplock)) { + wake = true; + } else { + spinlock_release(&desc->lock); + } + } + } + + if (wake == false) { + removefromlist(&pending, iterator); + insertinheader(header, iterator); } spinlock_release(&desc->eventlock);