Skip to content

Commit 5afc169

Browse files
committed
Keep closed debugger bridges detached
1 parent 51e8b06 commit 5afc169

1 file changed

Lines changed: 48 additions & 1 deletion

File tree

src/debugger/mod.rs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,14 @@ impl DebugCommandBridge {
365365
.state
366366
.lock()
367367
.expect("debug command bridge lock poisoned");
368-
state.closed = false;
368+
if state.closed {
369+
state.attached = false;
370+
state.current_line = None;
371+
state.pending_request = None;
372+
state.pending_response = None;
373+
self.inner.changed.notify_all();
374+
return true;
375+
}
369376
state.attached = true;
370377
state.current_line = current_line(vm);
371378
state.pending_request = None;
@@ -1031,3 +1038,43 @@ fn resolve_executable_line(info: &DebugInfo, requested_line: u32) -> u32 {
10311038

10321039
next.or(prev).unwrap_or(requested_line)
10331040
}
1041+
1042+
#[cfg(test)]
1043+
mod bridge_close_tests {
1044+
use std::time::Duration;
1045+
1046+
use crate::vm::{Program, Vm, VmStatus};
1047+
1048+
use super::{DebugCommandBridge, DebugCommandBridgeError, Debugger};
1049+
1050+
#[test]
1051+
fn closed_bridge_does_not_reopen_when_debugger_reaches_stop() {
1052+
let program = Program::new(
1053+
vec![],
1054+
vec![crate::vm::OpCode::Nop as u8, crate::vm::OpCode::Ret as u8],
1055+
);
1056+
let bridge = DebugCommandBridge::new();
1057+
bridge.close();
1058+
let thread_bridge = bridge.clone();
1059+
1060+
let join = std::thread::spawn(move || {
1061+
let mut debugger = Debugger::with_command_bridge(thread_bridge);
1062+
debugger.stop_on_entry();
1063+
let mut vm = Vm::new(program);
1064+
vm.run_with_debugger(&mut debugger)
1065+
.expect("closed debugger bridge should detach without blocking")
1066+
});
1067+
1068+
assert_eq!(
1069+
join.join().expect("debugger thread should join"),
1070+
VmStatus::Halted
1071+
);
1072+
assert!(!bridge.status().attached);
1073+
assert_eq!(
1074+
bridge
1075+
.execute("where", Duration::from_millis(5))
1076+
.expect_err("closed bridge should remain closed"),
1077+
DebugCommandBridgeError::Closed
1078+
);
1079+
}
1080+
}

0 commit comments

Comments
 (0)