summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.threads/print-threads.exp
blob: 09c3f8ada808e9610a6e61dbe7d92088f945ed65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Copyright (C) 1996, 1997, 2002 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Daniel Jacobowitz <drow@mvista.com>
# (parts based on pthreads.exp by Fred Fish (fnf@cygnus.com).
#
# It tests miscellaneous actions with multiple threads, including
# handling for thread exit.

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile "print-threads"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

# regexp for "horizontal" text (i.e. doesn't include newline or
# carriage return)
set horiz "\[^\n\r\]*"

set built_binfile 0

# Default to the usual (only?) -lpthread on GNU/Linux to quiet noise
if [istarget "*-*-linux*"] then {
    set possible_libs "-lpthread -lpthreads -lthread"
} else {
    set possible_libs "-lpthreads -lpthread -lthread"
}

set why_msg "unrecognized error"
foreach lib $possible_libs {
    set options "debug"
    lappend options "incdir=${objdir}/${subdir}"
    lappend options "libs=$lib"
    set ccout [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options]
    switch -regexp -- $ccout {
	".*no posix threads support.*" {
	    set why_msg "missing threads include file"
	    break
	}
	".*cannot open -lpthread.*" {
	    set why_msg "missing runtime threads library"
	}
	".*Can't find library for -lpthread.*" {
	    set why_msg "missing runtime threads library"
	}
	{^$} {
	    pass "successfully compiled posix threads test case"
	    set built_binfile 1
	    break
	}
    }
}
if {$built_binfile == "0"} {
    unsupported "Couldn't compile ${srcfile}, ${why_msg}"
    return -1
}

# Now we can proceed with the real testing.

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

gdb_test "set print sevenbit-strings" ""
#gdb_test "set print address off" ""
gdb_test "set width 0" ""

# We'll need this when we send_gdb a ^C to GDB.  Need to do it before we
# run the program and gdb starts saving and restoring tty states.
# On Ultrix, we don't need it and it is really slow (because shell_escape
# doesn't use vfork).
if ![istarget "*-*-ultrix*"] then {
    gdb_test "shell stty intr '^C'" ""
}

proc test_all_threads { name kill } {
    global gdb_prompt

    set i 0
    set j 0
    send_gdb "continue\n"
    gdb_expect {
	-re "Breakpoint \[0-9\]+, thread_function \\(arg=.*\\) at .*print-threads.c:\[0-9\]+.*$gdb_prompt" {
	    set i [expr $i + 1]
	    pass "Hit thread_function breakpoint, $i ($name)"
	    send_gdb "continue\n"
	    exp_continue
	}
	-re "Breakpoint \[0-9\]+, .* kill \\(.*\\) .*$gdb_prompt" {
	    set j [expr $j + 1]
	    if { $kill == 1 } {
		pass "Hit kill breakpoint, $j ($name)"
	    } else {
		fail "Hit kill breakpoint, $j ($name) (unexpected)"
	    }
	    send_gdb "continue\n"
	    exp_continue
	}
	-re "Program exited normally\\.\[\r\n\]+$gdb_prompt" {
	    pass "program exited normally"
	    if {$i == 5} {
		pass "all threads ran once ($name)"
	    } else {
		fail "all threads ran once ($name) (total $i threads ran)"
	    }
	}
	-re "$gdb_prompt" {
	    fail "Running threads ($name) (unknown output)"
	}
	timeout {
	    fail "Running threads ($name) (timeout)"
	}
    }
}

runto_main
gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\."
gdb_test "set var slow = 0" ""
test_all_threads "fast" 0

runto_main
gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (2)"
gdb_test "set var slow = 1" ""
test_all_threads "slow" 0

runto_main
gdb_test "break thread_function" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file .*print-threads.c, line \[0-9\]*\\." "break thread_function (3)"
gdb_test "set var slow = 1" "" "set var slow = 1 (2)"
gdb_test "break kill" "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+"
test_all_threads "slow with kill breakpoint" 1

return 0