1# Copyright (C) 1996, 1997, 2002, 2003 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 2 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, write to the Free Software 15# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 17# Please email any bugs, comments, and/or additions to this file to: 18# bug-gdb@prep.ai.mit.edu 19 20# This file was written by Daniel Jacobowitz <drow@mvista.com> 21# (parts based on pthreads.exp by Fred Fish (fnf@cygnus.com). 22# 23# It tests miscellaneous actions with multiple threads, including 24# handling for thread exit. 25 26if $tracelevel then { 27 strace $tracelevel 28} 29 30set prms_id 0 31set bug_id 0 32 33set testfile "print-threads" 34set srcfile ${testfile}.c 35set binfile ${objdir}/${subdir}/${testfile} 36 37# regexp for "horizontal" text (i.e. doesn't include newline or 38# carriage return) 39set horiz "\[^\n\r\]*" 40 41if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } { 42 return -1 43} 44 45# Now we can proceed with the real testing. 46 47# Start with a fresh gdb. 48 49gdb_exit 50gdb_start 51gdb_reinitialize_dir $srcdir/$subdir 52gdb_load ${binfile} 53 54gdb_test "set print sevenbit-strings" "" 55#gdb_test "set print address off" "" 56gdb_test "set width 0" "" 57 58# We'll need this when we send_gdb a ^C to GDB. Need to do it before we 59# run the program and gdb starts saving and restoring tty states. 60# On Ultrix, we don't need it and it is really slow (because shell_escape 61# doesn't use vfork). 62if ![istarget "*-*-ultrix*"] then { 63 gdb_test "shell stty intr '^C'" "" 64} 65 66proc test_all_threads { name kill } { 67 global gdb_prompt 68 69 set i 0 70 set j 0 71 send_gdb "continue\n" 72 gdb_expect { 73 -re "Breakpoint \[0-9\]+, thread_function \\(arg=.*\\) at .*print-threads.c:\[0-9\]+.*$gdb_prompt" { 74 set i [expr $i + 1] 75 pass "Hit thread_function breakpoint, $i ($name)" 76 send_gdb "continue\n" 77 exp_continue 78 } 79 -re "Breakpoint \[0-9\]+, .* kill \\(.*\\) .*$gdb_prompt" { 80 set j [expr $j + 1] 81 if { $kill == 1 } { 82 pass "Hit kill breakpoint, $j ($name)" 83 } else { 84 fail "Hit kill breakpoint, $j ($name) (unexpected)" 85 } 86 send_gdb "continue\n" 87 exp_continue 88 } 89 -re "Program exited normally\\.\[\r\n\]+$gdb_prompt" { 90 pass "program exited normally" 91 if {$i == 5} { 92 pass "all threads ran once ($name)" 93 } else { 94 fail "all threads ran once ($name) (total $i threads ran)" 95 } 96 } 97 -re "Program received signal SIGTRAP.*(Thread \[0-9\]* \\(zombie\\)|0x00000000 in ).*$gdb_prompt $" { 98 if { $kill == 1 } { 99 kfail "gdb/1265" "Running threads ($name) (zombie thread)" 100 } else { 101 fail "Running threads ($name) (unknown output)" 102 } 103 } 104 -re "$gdb_prompt" { 105 fail "Running threads ($name) (unknown output)" 106 } 107 timeout { 108 fail "Running threads ($name) (timeout)" 109 } 110 } 111} 112 113runto_main 114gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." 115gdb_test "set var slow = 0" "" 116test_all_threads "fast" 0 117 118runto_main 119gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (2)" 120gdb_test "set var slow = 1" "" 121test_all_threads "slow" 0 122 123runto_main 124gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (3)" 125gdb_test "set var slow = 1" "" "set var slow = 1 (2)" 126gdb_test "break kill" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+" 127test_all_threads "slow with kill breakpoint" 1 128 129return 0 130