mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 04:33:37 +00:00
Fix a deadlock that can occur when using scope() on ComputeTaskPool from within a system. (#892)
This commit is contained in:
parent
bd5bd3bc07
commit
cf75c22c9a
1 changed files with 12 additions and 1 deletions
|
@ -194,7 +194,18 @@ impl TaskPool {
|
|||
let fut: Pin<&'static mut (dyn Future<Output = Vec<T>> + Send + 'static)> =
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue