Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* linux thread creation test
@ 2006-11-27 18:07 Nathan Sidwell
  2006-11-28 15:11 ` Daniel Jacobowitz
  0 siblings, 1 reply; 2+ messages in thread
From: Nathan Sidwell @ 2006-11-27 18:07 UTC (permalink / raw)
  To: gdb-patches

[-- 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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: linux thread creation test
  2006-11-27 18:07 linux thread creation test Nathan Sidwell
@ 2006-11-28 15:11 ` Daniel Jacobowitz
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Jacobowitz @ 2006-11-28 15:11 UTC (permalink / raw)
  To: Nathan Sidwell; +Cc: gdb-patches

On Mon, Nov 27, 2006 at 06:08:24PM +0000, Nathan Sidwell wrote:
> 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?

OK.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-11-28 15:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-11-27 18:07 linux thread creation test Nathan Sidwell
2006-11-28 15:11 ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox