# Copyright 2017-2021 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 . # Test "next" bouncing between two breakpoints in two threads running # in different targets. source $srcdir/$subdir/multi-target.exp.tcl if {![multi_target_prepare]} { return } proc test_ping_pong_next {} { global srcfile if {![setup "off"]} { untested "setup failed" return } # Block/unblock inferiors 1 and 2 according to INF1 and INF2. proc block {inf1 inf2} { gdb_test "thread apply 1.1 p wait_for_gdb = $inf1" " = $inf1" gdb_test "thread apply 2.1 p wait_for_gdb = $inf2" " = $inf2" } # We'll use inferiors 1 and 2. Make sure they're really connected # to different targets. gdb_test "thread apply 1.1 maint print target-stack" \ "- native.*" gdb_test "thread apply 2.1 maint print target-stack" \ "- extended-remote.*" # Set two breakpoints, one for each of inferior 1 and 2. Inferior # 1 is running on the native target, and inferior 2 is running on # extended-gdbserver. Run to breakpoint 1 to gets things started. set line1 [gdb_get_line_number "set break 1 here"] set line2 [gdb_get_line_number "set break 2 here"] gdb_test "thread 1.1" "Switching to thread 1.1 .*" gdb_test "break $srcfile:$line1 thread 1.1" \ "Breakpoint .*$srcfile:$line1\\..*" gdb_test "continue" "hit Breakpoint .*" gdb_test "break $srcfile:$line2 thread 2.1" \ "Breakpoint .*$srcfile:$line2\\..*" # Now block inferior 1 and issue "next". We should stop at the # breakpoint for inferior 2, given schedlock off. with_test_prefix "next inf 1" { block 1 0 gdb_test "next" "Thread 2.1 .*hit Breakpoint .*$srcfile:$line2.*" } # Now unblock inferior 2 and block inferior 1. "next" should run # into the breakpoint in inferior 1. with_test_prefix "next inf 2" { block 0 1 gdb_test "next" "Thread 1.1 .*hit Breakpoint .*$srcfile:$line1.*" } # Try nexting inferior 1 again. with_test_prefix "next inf 1 again" { block 1 0 gdb_test "next" "Thread 2.1 .*hit Breakpoint .*$srcfile:$line2.*" } } test_ping_pong_next multi_target_cleanup