@@ -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