This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch] testsuite: Fix multiple runs in parallel on a single host [Re: RFC: parallelize "make check"]
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Tom Tromey <tromey at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Wed, 1 Jul 2009 14:06:26 +0200
- Subject: [patch] testsuite: Fix multiple runs in parallel on a single host [Re: RFC: parallelize "make check"]
- References: <m34ou5ig9e.fsf@fleche.redhat.com> <m3zlbr9ej1.fsf@fleche.redhat.com> <20090629165708.GA30963@caradoc.them.org> <m3ab3qapbd.fsf@fleche.redhat.com> <20090629211657.GA6068@host0.dyn.jankratochvil.net>
On Mon, 29 Jun 2009 23:16:57 +0200, Jan Kratochvil wrote:
> On Mon, 29 Jun 2009 20:05:10 +0200, Tom Tromey wrote:
> > gdb.base/watchpoint.exp
(This is a FSF GDB HEAD problem watchpoints are not distributed across threads.)
> > gdb.mi/mi-file-transfer.exp, gdb.server/file-transfer.exp,
These + others get fixed by the patch below.
> Running ../../../gdb/testsuite/gdb.server/file-transfer.exp ...
> -PASS: gdb.server/file-transfer.exp: put binary file
> -PASS: gdb.server/file-transfer.exp: get binary file
...
> +ERROR: tcl error sourcing ../../../gdb/testsuite/gdb.server/file-transfer.exp.
> +ERROR: : spawn id exp18 not open
> + while executing
> +"expect_background -nobrace -i exp18 full_buffer { } eof {
...
It normally mostly always happens with multiple parallel testsuite runs on the
same host. Now with the parallel check there is also a (low probability) it
would bite even during a single testsuite parallel run.
Regression tested on FSF GDB HEAD on {x86_64,i686}-fedora-linux-gnu.
Thanks,
Jan
gdb/testsuite/
2009-07-01 Jan Kratochvil <jan.kratochvil@redhat.com>
* lib/gdbserver-support.exp (gdbserver_start): Loop spawning
gdbserver increasing $portnum if "Can't bind address" has been seen.
--- a/gdb/testsuite/lib/gdbserver-support.exp
+++ b/gdb/testsuite/lib/gdbserver-support.exp
@@ -209,26 +209,39 @@ proc gdbserver_start { options arguments } {
set gdbserver [find_gdbserver]
- # Export the host:port pair.
- set gdbport $debughost$portnum
-
- # Fire off the debug agent.
- set gdbserver_command "$gdbserver"
- if { $options != "" } {
- append gdbserver_command " $options"
- }
- append gdbserver_command " :$portnum"
- if { $arguments != "" } {
- append gdbserver_command " $arguments"
- }
-
- set server_spawn_id [remote_spawn target $gdbserver_command]
+ # Loop till we find a free port.
+ while 1 {
+ # Export the host:port pair.
+ set gdbport $debughost$portnum
+
+ # Fire off the debug agent.
+ set gdbserver_command "$gdbserver"
+ if { $options != "" } {
+ append gdbserver_command " $options"
+ }
+ append gdbserver_command " :$portnum"
+ if { $arguments != "" } {
+ append gdbserver_command " $arguments"
+ }
- # Wait for the server to open its TCP socket, so that GDB can connect.
- expect {
- -i $server_spawn_id
- -notransfer
- -re "Listening on" { }
+ set server_spawn_id [remote_spawn target $gdbserver_command]
+
+ # Wait for the server to open its TCP socket, so that GDB can connect.
+ expect {
+ -i $server_spawn_id
+ -notransfer
+ -re "Listening on" { }
+ -re "Can't bind address: Address already in use\\.\r\n" {
+ verbose -log "Port $portnum is already in use."
+ if ![target_info exists gdb,socketport] {
+ # Bump the port number to avoid the conflict.
+ wait -i $expect_out(spawn_id)
+ incr portnum
+ continue
+ }
+ }
+ }
+ break
}
# We can't just call close, because if gdbserver is local then that means