From ea83d905fe35742999abe919c87a8438a2b70ed1 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 28 Feb 2020 19:08:31 +0100 Subject: [PATCH] Fix wrong calculation of task ID Pin implements Deref too, so by dereferencing only once we get a `&Box` reference. Since Box also implements Future, the type of `future_ref` was still correct. To avoid this error in the future, we added an assertion to catch duplicate task IDson `pending_tasks.insert()`. --- src/task/executor.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/task/executor.rs b/src/task/executor.rs index d35f370b..2a2fb91d 100644 --- a/src/task/executor.rs +++ b/src/task/executor.rs @@ -58,7 +58,9 @@ impl Executor { Poll::Pending => { // add task to pending_tasks list and wait for wakeup let task_id = Self::task_id(&task); - self.pending_tasks.insert(task_id, task); + if self.pending_tasks.insert(task_id, task).is_some() { + panic!("Task with same ID already in pending_tasks queue"); + } } } } @@ -75,7 +77,7 @@ impl Executor { } fn task_id(task: &Task) -> TaskId { - let future_ref: &dyn Future = &*task; + let future_ref: &dyn Future = &**task; future_ref as *const _ as *const () as usize }