From c2b20abc03f21ddd7cd37ab5251385974b6104fb Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 27 Apr 2026 01:54:43 +0700 Subject: [PATCH] Avoid locking current context on capture_inner --- src/scheme/user.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 0d3da35333..325a5f4c52 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -485,15 +485,19 @@ impl UserInner { }); } - let cur_space_lock = AddrSpace::current()?; - let dst_space_lock = { - Arc::clone( - context_weak - .upgrade() - .ok_or(Error::new(ESRCH))? - .read(token.token()) - .addr_space()?, - ) + let (cur_space_lock, dst_space_lock) = { + match context_weak.upgrade() { + Some(ctx) if context::is_current(&ctx) => { + let cur_space_lock = AddrSpace::current()?; + // Will bail below this code + (cur_space_lock, Arc::clone(&cur_space_lock)) + } + Some(ctx) => ( + AddrSpace::current()?, + Arc::clone(ctx.read(token.token()).addr_space()?), + ), + None => return Err(Error::new(ESRCH)), + } }; if Arc::ptr_eq(&dst_space_lock, &cur_space_lock) {