From fab5adc17c9d24738299d8a7896cc2091fd10088 Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Mon, 12 Jun 2023 13:45:08 -0700 Subject: [PATCH] fix another issue --- .../runtime/scheduler/multi_thread/worker.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tokio/src/runtime/scheduler/multi_thread/worker.rs b/tokio/src/runtime/scheduler/multi_thread/worker.rs index e46332cd6..c988a0c9a 100644 --- a/tokio/src/runtime/scheduler/multi_thread/worker.rs +++ b/tokio/src/runtime/scheduler/multi_thread/worker.rs @@ -541,11 +541,15 @@ impl Worker { } } + debug_assert!(cx.defer.borrow().is_empty()); + self.pre_shutdown(cx, &mut core); // Signal shutdown self.shutdown_core(cx, core); + debug_assert!(cx.defer.borrow().is_empty()); + Err(()) } @@ -577,6 +581,7 @@ impl Worker { // If shutting down, abort if cx.shared().inject.is_closed(&synced.inject) { + self.shutdown_clear_defer(cx); return Err(()); } @@ -654,6 +659,9 @@ impl Worker { } } + // Shutting down, drop any deferred tasks + self.shutdown_clear_defer(cx); + Ok((None, core)) } @@ -1051,6 +1059,7 @@ impl Worker { cx.shared().driver.set(driver); if cx.shared().inject.is_closed(&mut synced.inject) { + self.shutdown_clear_defer(cx); self.shutdown_finalize(cx, synced); return Err(()); } @@ -1167,6 +1176,14 @@ impl Worker { core.global_queue_interval = next; } } + + fn shutdown_clear_defer(&self, cx: &Context) { + let mut defer = cx.defer.borrow_mut(); + + for task in defer.drain(..) { + drop(task); + } + } } impl Context {