1# Copyright 2008-2019 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16if { ![support_displaced_stepping] } { 17 unsupported "displaced stepping" 18 return -1 19} 20 21load_lib mi-support.exp 22set MIFLAGS "-i=mi" 23 24gdb_exit 25if {[mi_gdb_start]} { 26 continue 27} 28 29# 30# Start here 31# 32standard_testfile nsintrall.c 33 34set options [list debug] 35if {[gdb_compile_pthreads "$srcdir/$subdir/$srcfile" $binfile executable $options] != "" } { 36 return -1 37} 38 39mi_gdb_reinitialize_dir $srcdir/$subdir 40mi_gdb_load $binfile 41 42mi_gdb_test "-gdb-set non-stop 1" ".*" 43mi_gdb_test "-gdb-set mi-async 1" ".*" 44mi_detect_async 45 46if { [mi_run_to_main] < 0 } { 47 continue 48} 49 50mi_create_breakpoint thread_function \ 51 "breakpoint at thread_function" \ 52 -number 2 -func thread_function 53 54mi_send_resuming_command "exec-continue --all" "resume all" 55for {set i 0} {$i < 6} {incr i} { 56 mi_expect_stop "breakpoint-hit" "thread_function" "\[^\n\]*" "$srcfile" \ 57 "\[0-9\]*" {"" "disp=\"keep\""} "stop $i" 58} 59 60mi_check_thread_states \ 61 {"stopped" "stopped" "stopped" "stopped" "stopped" "stopped"} \ 62 "thread state, all stopped" 63 64# now that we know about all the threads, we can get rid of the breakpoints 65mi_delete_breakpoints 66 67# Here we create a response string. Note we don't want \r\n at the end, 68# since mi_gdb_test will append this itself. 69set running_re "" 70for {set i 1} {$i < 6} {incr i} { 71 set running_re "$running_re\\*running,thread-id=\"$i\"\r\n" 72} 73set running_re "$running_re\\*running,thread-id=\"6\"" 74 75mi_gdb_test "-exec-continue --all" "\[^\n\]*\r\n$running_re" \ 76 "resume all, no breakpoint" 77 78mi_check_thread_states \ 79 {"running" "running" "running" "running" "running" "running"} \ 80 "thread state, resume all" 81 82mi_gdb_test "200-exec-interrupt --all" "200\\^done" "interrupt all threads" 83 84for {set i 0} {$i < 6} {incr i} { 85 mi_expect_interrupt "interrupt $i" 86} 87mi_check_thread_states \ 88 {"stopped" "stopped" "stopped" "stopped" "stopped" "stopped"} \ 89 "thread state, all interrupted" 90 91# resume all threads, and check that no thread is spuriously left interrupted 92mi_gdb_test "-exec-continue --all" "\[^\n\]*\r\n$running_re" \ 93 "resume all after interrupting" 94 95sleep 1 96mi_check_thread_states \ 97 {"running" "running" "running" "running" "running" "running"} \ 98 "thread state, resume all after interrupting" 99 100mi_gdb_exit 101