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(()) }