From: Nathan Sidwell <nathan@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: linux thread creation test
Date: Mon, 27 Nov 2006 18:07:00 -0000 [thread overview]
Message-ID: <456B2998.9040309@codesourcery.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 472 bytes --]
This patch robustifies gdb.thread/linux-dp.exp. gdbserver cannot report thread
creation events, rather than mark such non-appearances as unresolved, this marks
them as unsupported. It also checks the thread table before and after thread
creation to make sure the expected threads show up there.
ok?
nathan
--
Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery
nathan@codesourcery.com :: http://www.planetfall.pwp.blueyonder.co.uk
[-- Attachment #2: thread.patch --]
[-- Type: text/x-patch, Size: 4152 bytes --]
2006-11-27 Nathan Sidwell <nathan@codesourcery.com>
gdb/testsuite/
* gdb.threads/linux-dp.exp: Read thread table before and after
creating each philosopher and verify it.
Index: gdb/testsuite/gdb.threads/linux-dp.exp
===================================================================
--- gdb/testsuite/gdb.threads/linux-dp.exp (revision 155657)
+++ gdb/testsuite/gdb.threads/linux-dp.exp (working copy)
@@ -67,21 +67,37 @@ gdb_breakpoint [gdb_get_line_number "lin
set expect_manager -1
for {set i 0} {$i < 5} {incr i} {
gdb_continue_to_breakpoint "about to create philosopher: $i"
+ send_gdb "info threads\n"
+ set threads_before {}
+ gdb_expect {
+ -re "info threads\r\n" {
+ exp_continue
+ }
+ -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 "\\\[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 "^next\r\n" {
+ exp_continue
}
- -re "\\\[New .*\\\].*$gdb_prompt $" {
- if {$i == 0} {
- set expect_manager 0
- }
- pass "create philosopher: $i"
+ -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
next reply other threads:[~2006-11-27 18:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-27 18:07 Nathan Sidwell [this message]
2006-11-28 15:11 ` Daniel Jacobowitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=456B2998.9040309@codesourcery.com \
--to=nathan@codesourcery.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox