# Copyright (C) 2022-2023 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Check that the gdb.connect_removed event triggers when we expect it # too. # # Checking this event has wider implications that simply some corner # of the Python API working or not. The connection_removed event # triggers when the reference count of a process_stratum_target # reaches zero. If these events stop triggering when expected then # GDB might be getting the reference counting on target_ops objects # wrong. load_lib gdb-python.exp require !skip_python_tests standard_testfile py-connection.c if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { return -1 } if ![runto_main] then { return 0 } # Register a callback that will trigger when a connection is removed # (deleted) within GDB. gdb_test_multiline "Add connection_removed event" \ "python" "" \ "def connection_removed_handler(event):" "" \ " num = event.connection.num" "" \ " type = event.connection.type" "" \ " print('Connection %d (%s) removed' % (num, type))" "" \ "gdb.events.connection_removed.connect (connection_removed_handler)" "" \ "end" "" if { [target_info exists gdb_protocol] } { if { [target_info gdb_protocol] == "extended-remote" } { set connection_type "extended-remote" } else { set connection_type "remote" } } else { set connection_type "native" } # Add an inferior that shares a connection with inferior 1. gdb_test "add-inferior" "Added inferior 2 on connection 1 \[^\r\n\]+" # Add an inferior with no connection. gdb_test "add-inferior -no-connection" "Added inferior 3" # Kill the first inferior. If we are using the plain 'remote' protocol then # it as this point that the remote target connection is removed. For the # 'extended-remote' and 'native' targets the connection is removed later. if { $connection_type == "remote" } { gdb_test "with confirm off -- kill" \ "Connection 1 \\(remote\\) removed\r\n.*" "kill inferior" } else { gdb_test "with confirm off -- kill" "" "kill inferior" } # Switch to inferior 3 (the one with no connection). gdb_test "inferior 3" # Remove inferior 1, not expecting anything interesting at this point. gdb_test_no_output "remove-inferiors 1" # Now removed inferior 2. For the 'remote' target the connection has # already been removed (see above), but for 'extended-remote' and 'native' # targets, it is at this point that the connection is removed. if { $connection_type == "remote" } { gdb_test_no_output "remove-inferiors 2" } else { gdb_test "remove-inferiors 2" \ "Connection 1 \\(${connection_type}\\) removed" }