* gdb.threads/linux-dp.exp: Read thread table before and after

creating each philosopher and verify it.
This commit is contained in:
Nathan Sidwell 2006-11-28 15:16:48 +00:00
parent 71afa71118
commit fcfcc2b53d
2 changed files with 95 additions and 19 deletions

View File

@ -1,3 +1,8 @@
2006-11-28 Nathan Sidwell <nathan@codesourcery.com>
* gdb.threads/linux-dp.exp: Read thread table before and after
creating each philosopher and verify it.
2006-11-27 Nathan Sidwell <nathan@codesourcery.com>
Paul Brook <paul@codesourcery.com>
Daniel Jacobowitz <dan@codesourcery.com>

View File

@ -67,21 +67,37 @@ gdb_breakpoint [gdb_get_line_number "linuxthreads.exp: create philosopher"]
set expect_manager -1
for {set i 0} {$i < 5} {incr i} {
gdb_continue_to_breakpoint "about to create philosopher: $i"
send_gdb "next\n"
send_gdb "info threads\n"
set threads_before {}
gdb_expect {
-re "\\\[New .*\\\].*\\\[New .*\\\].*$gdb_prompt $" {
# Two threads are created the first time in LinuxThreads,
# where the second is the manager thread. In NPTL, there is none.
if {$i == 0} {
set expect_manager 1
}
pass "create philosopher: $i"
-re "info threads\r\n" {
exp_continue
}
-re "\\\[New .*\\\].*$gdb_prompt $" {
if {$i == 0} {
set expect_manager 0
}
pass "create philosopher: $i"
-re "^\\*? +(\[0-9\]+ Thread \[0-9\]+) \[^\n\]*\n" {
verbose -log "found thread $expect_out(1,string)" 2
lappend threads_before $expect_out(1,string)
exp_continue
}
-re "^$gdb_prompt $" {
}
timeout {
fail "(timeout) info threads"
}
}
send_gdb "next\n"
set threads_created 0
gdb_expect {
-re "^next\r\n" {
exp_continue
}
-re "^\\\[New \[^\]\n\]+\\\]\[^\n\]+\n" {
incr threads_created
exp_continue
}
-re "^189\[^\n\]+\n" {
exp_continue
}
-re "^$gdb_prompt $" {
}
-re "Program received signal.*(Unknown signal|SIGUSR|Real-time event).*$gdb_prompt $" {
# It would be nice if we could catch the message that GDB prints
@ -91,17 +107,72 @@ for {set i 0} {$i < 5} {incr i} {
return -1
}
-re "$gdb_prompt $" {
# We used to fail here, but not all targets announce new
# threads as they are created. For example, the GDB
# remote protocol target only finds out about threads when
# they actually report some event like a breakpoint hit,
# or when the user types 'info threads'.
unresolved "create philosopher: $i"
}
timeout {
fail "(timeout) create philosopher: $i"
}
}
if { $threads_created == 0 } {
# Not all targets announce new threads as they are created.
# For example, the GDB
# remote protocol target only finds out about threads when
# they actually report some event like a breakpoint hit,
# or when the user types 'info threads'.
unsupported "create philosopher: $i"
} elseif { $threads_created == 1 } {
if { $expect_manager < 0 } {
set expect_manager 0
}
pass "create philosopher: $i"
} elseif { !$i && $threads_created == 2 } {
# Two threads are created the first time in LinuxThreads,
# where the second is the manager thread. In NPTL, there is none.
set expect_manager 1
pass "create philosopher: $i"
} else {
fail "create philosopher: $i"
}
send_gdb "info threads\n"
set threads_after {}
gdb_expect {
-re "info threads\r\n" {
exp_continue
}
-re "^\\*? +(\[0-9\]+ Thread \[0-9\]+) \[^\n\]+\n" {
set name $expect_out(1,string)
for {set j 0} {$j != [llength $threads_before] } {incr j} {
if {$name == [lindex $threads_before $j]} {
set threads_before [lreplace $threads_before $j $j]
set name ""
break
}
}
if { $name != "" } {
lappend threads_after $name
}
exp_continue
}
-re "^$gdb_prompt $" {
if { [llength $threads_before] != 0 } {
fail "create philosopher: $i"
} elseif { !$i && [llength $threads_after] == 2 } {
set expect_manager 1
pass "create philosopher: $i"
} elseif { [llength $threads_after] == 1 } {
if { $expect_manager < 0 } {
set expect_manager 0
}
pass "create philosopher: $i"
} else {
fail "create philosopher: $i"
}
}
timeout {
fail "(timeout) info threads"
}
}
}
set nthreads 6