Attempt to fix #1763 by asking the scheduler to retry choosing an operation.

This commit is contained in:
Vytautas Astrauskas 2021-04-10 20:23:32 +02:00
parent 1ae7bfc6c6
commit 72ca2a7a85

View File

@ -711,7 +711,15 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
fn run_timeout_callback(&mut self) -> InterpResult<'tcx> {
let this = self.eval_context_mut();
let (thread, callback) =
this.machine.threads.get_ready_callback().expect("no callback found");
if let Some((thread, callback)) = this.machine.threads.get_ready_callback() {
(thread, callback)
} else {
// get_ready_callback can return None if the computer's clock was
// shifted after calling the scheduler and before the call
// to get_ready_callback. In this case, just do nothing, which
// effectively just returns to the scheduler.
return Ok(());
};
// This back-and-forth with `set_active_thread` is here because of two
// design decisions:
// 1. Make the caller and not the callback responsible for changing