| 95 | |
| 96 | impl Executor { |
| 97 | fn run_ready_tasks(&mut self) { |
| 98 | // destructure `self` to avoid borrow checker errors |
| 99 | let Self { |
| 100 | tasks, |
| 101 | task_queue, |
| 102 | waker_cache, |
| 103 | spawn_queue, |
| 104 | } = self; |
| 105 | |
| 106 | while let Some(task_id) = task_queue.pop() { |
| 107 | let task = match tasks.get_mut(&task_id) { |
| 108 | Some(task) => task, |
| 109 | None => continue, // task no longer exists |
| 110 | }; |
| 111 | let waker = waker_cache |
| 112 | .entry(task_id) |
| 113 | .or_insert_with(|| TaskWaker::new(task_id, task_queue.clone())); |
| 114 | let mut context = Context::from_waker(waker); |
| 115 | match task.poll(&mut context) { |
| 116 | Poll::Ready(()) => { |
| 117 | // task done -> remove it and its cached waker |
| 118 | tasks.remove(&task_id); |
| 119 | waker_cache.remove(&task_id); |
| 120 | } |
| 121 | Poll::Pending => {} |
| 122 | } |
| 123 | } |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | impl Executor { |