From 7aff7110136e51674f31adff0c39f0afc622f8be Mon Sep 17 00:00:00 2001 From: tiif Date: Sun, 25 Aug 2024 01:05:20 +0800 Subject: [PATCH] Check if the thread is blocked before waking them up --- src/tools/miri/src/concurrency/thread.rs | 10 ++++++++++ src/tools/miri/src/shims/unix/linux/epoll.rs | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/tools/miri/src/concurrency/thread.rs b/src/tools/miri/src/concurrency/thread.rs index 1b119ae71924..246e480a6f8d 100644 --- a/src/tools/miri/src/concurrency/thread.rs +++ b/src/tools/miri/src/concurrency/thread.rs @@ -578,6 +578,10 @@ impl<'tcx> ThreadManager<'tcx> { self.threads[thread_id].state.is_terminated() } + fn has_blocked_on_epoll(&self, thread_id: ThreadId) -> bool { + self.threads[thread_id].state.is_blocked_on(BlockReason::Epoll) + } + /// Have all threads terminated? fn have_all_terminated(&self) -> bool { self.threads.iter().all(|thread| thread.state.is_terminated()) @@ -1137,6 +1141,12 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { this.machine.threads.enable_thread(thread_id); } + #[inline] + fn has_blocked_on_epoll(&self, thread_id: ThreadId) -> bool { + let this = self.eval_context_ref(); + this.machine.threads.has_blocked_on_epoll(thread_id) + } + #[inline] fn active_thread_stack<'a>(&'a self) -> &'a [Frame<'tcx, Provenance, FrameExtra<'tcx>>] { let this = self.eval_context_ref(); diff --git a/src/tools/miri/src/shims/unix/linux/epoll.rs b/src/tools/miri/src/shims/unix/linux/epoll.rs index ade1ca73378d..57731d746a9b 100644 --- a/src/tools/miri/src/shims/unix/linux/epoll.rs +++ b/src/tools/miri/src/shims/unix/linux/epoll.rs @@ -600,7 +600,9 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { waiter.sort(); waiter.dedup(); for thread_id in waiter { - this.unblock_thread(thread_id, BlockReason::Epoll)?; + if this.has_blocked_on_epoll(thread_id) { + this.unblock_thread(thread_id, BlockReason::Epoll)?; + } } Ok(()) }