Fix a deadlock that can occur when using scope() on ComputeTaskPool from within a system. (#892)

This commit is contained in:
Philip Degarmo 2020-11-25 18:05:55 -08:00 committed by GitHub
parent bd5bd3bc07
commit cf75c22c9a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -194,7 +194,18 @@ impl TaskPool {
let fut: Pin<&'static mut (dyn Future<Output = Vec<T>> + Send + 'static)> = let fut: Pin<&'static mut (dyn Future<Output = Vec<T>> + Send + 'static)> =
unsafe { mem::transmute(fut) }; unsafe { mem::transmute(fut) };
future::block_on(self.executor.spawn(fut)) // The thread that calls scope() will participate in driving tasks in the pool forward
// until the tasks that are spawned by this scope() call complete. (If the caller of scope()
// happens to be a thread in this thread pool, and we only have one thread in the pool, then
// simply calling future::block_on(spawned) would deadlock.)
let mut spawned = self.executor.spawn(fut);
loop {
if let Some(result) = future::block_on(future::poll_once(&mut spawned)) {
break result;
}
self.executor.try_tick();
}
} }
/// Spawns a static future onto the thread pool. The returned Task is a future. It can also be /// Spawns a static future onto the thread pool. The returned Task is a future. It can also be