diff options
author | Tom de Vries <tdevries@suse.de> | 2024-05-04 10:41:09 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2024-05-04 10:41:09 +0200 |
commit | e82dca2a57b05a95d45be74cb59046c79c9ed7d3 (patch) | |
tree | 5e56a35e197c7174e5609ed2a06a27c82e5c30b7 /gdb | |
parent | a0a6e110198c4f7fb4b5baa1f8d158ebf225f7e2 (diff) | |
download | binutils-e82dca2a57b05a95d45be74cb59046c79c9ed7d3.zip binutils-e82dca2a57b05a95d45be74cb59046c79c9ed7d3.tar.gz binutils-e82dca2a57b05a95d45be74cb59046c79c9ed7d3.tar.bz2 |
[gdb/testsuite] Use unique portnum in parallel testing
When instrumenting get_portnum using:
...
puts "PORTNUM: $res"
...
and running:
...
$ cd build/gdb
$ make check-parallel -j2 TESTS=gdb.server/*.exp
...
we run into:
...
Running gdb.server/abspath.exp ...
PORTNUM: 2345
...
and:
...
Running gdb.server/bkpt-other-inferior.exp ...
PORTNUM: 2345
...
This is because the test-cases are run in independent runtest invocations.
Fix this by handling the parallel case in get_portnum using:
- a file $objdir/cache/portnum to keep the portnum variable, and
- a file $objdir/cache/portnum.lock to serialize access to it.
Tested on aarch64-linux.
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/testsuite/lib/gdbserver-support.exp | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp index 0f97ce9..41ad5e6 100644 --- a/gdb/testsuite/lib/gdbserver-support.exp +++ b/gdb/testsuite/lib/gdbserver-support.exp @@ -141,18 +141,47 @@ proc get_portnum {} { # starting at $initial_portnum, to avoid conflicts with hung ports. set initial_portnum 2345 - # Currently available port number. - gdb_persistent_global portnum + if { ![info exists ::GDB_PARALLEL] } { + # Sequential case. - # Initialize, if necessary. - if { ![info exists portnum] } { - set portnum $initial_portnum + # Currently available port number. + gdb_persistent_global portnum + + # Initialize, if necessary. + if { ![info exists portnum] } { + set portnum $initial_portnum + } + + # Return currently available port number, and update it. + set res $portnum + incr portnum + return $res + } + + # Parallel case. + with_lock portnum.lock { + # Keep portnum file alongside the lock that guards it. + set portnum_file [lock_dir]/portnum + + if { [file exists $portnum_file] } { + set fd [open $portnum_file r] + set portnum [read $fd] + close $fd + + set portnum [string trim $portnum] + } else { + # Initialize. + set portnum $initial_portnum + } + + set next_portnum [expr $portnum + 1] + + set fd [open $portnum_file w] + puts $fd $next_portnum + close $fd } - # Return currently available port number, and update it. - set res $portnum - incr portnum - return $res + return $portnum } # Locate the gdbserver binary. Returns "" if gdbserver could not be found. |