From 7d54706a8edbf6786650a33acdf9beff5e87bf72 Mon Sep 17 00:00:00 2001 From: "Hui, Chunyang" Date: Thu, 22 Jul 2021 11:21:54 +0000 Subject: [PATCH] Add signal check before sigtimedwait return with timeout --- src/libos/src/signal/do_sigtimedwait.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libos/src/signal/do_sigtimedwait.rs b/src/libos/src/signal/do_sigtimedwait.rs index d6df166c..ac959734 100644 --- a/src/libos/src/signal/do_sigtimedwait.rs +++ b/src/libos/src/signal/do_sigtimedwait.rs @@ -75,6 +75,14 @@ impl PendingSigWaiter { let waiter = Waiter::new(); loop { if *timeout == Duration::new(0, 0) { + // When timeout is reached, it is possible that there is actually an interesting + // signal in the queue, but timeout happens slightly before being interrupted. + // So here we attempt to dequeue again before returning with timeout. + if let Some(signal) = + dequeue_pending_signal(&self.interest, &self.thread, &self.process) + { + return Ok(signal); + } return_errno!(ETIMEDOUT, "timeout"); }