From 23ea05993b9c17b6b2fa82220df2e98c03200f4e Mon Sep 17 00:00:00 2001 From: Lionel Henry Date: Mon, 15 Dec 2025 22:41:52 +0100 Subject: [PATCH] Take the DAP lock on the R thread to avoid deadlock --- crates/ark/src/dap/dap_server.rs | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/crates/ark/src/dap/dap_server.rs b/crates/ark/src/dap/dap_server.rs index 841c7280f..341b6088b 100644 --- a/crates/ark/src/dap/dap_server.rs +++ b/crates/ark/src/dap/dap_server.rs @@ -446,19 +446,21 @@ impl DapServer { } fn collect_r_variables(&self, variables_reference: i64) -> Vec { - let state = self.state.lock().unwrap(); - let variables_reference_to_r_object = &state.variables_reference_to_r_object; - - let Some(object) = variables_reference_to_r_object.get(&variables_reference) else { - log::error!( - "Failed to locate R object for `variables_reference` {variables_reference}." - ); - return Vec::new(); - }; + // Wait until we're in the `r_task()` to lock + // See https://github.com/posit-dev/positron/issues/5024 + let state = self.state.clone(); + + let variables = r_task(move || { + let state = state.lock().unwrap(); + let variables_reference_to_r_object = &state.variables_reference_to_r_object; + + let Some(object) = variables_reference_to_r_object.get(&variables_reference) else { + log::error!( + "Failed to locate R object for `variables_reference` {variables_reference}." + ); + return Vec::new(); + }; - // Should be safe to run an r-task while paused in the debugger, tasks - // are still run while polling within the read console hook - let variables = r_task(|| { let object = object.get(); object_variables(object.sexp) });