aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2024-05-04 10:41:09 +0200
committerTom de Vries <tdevries@suse.de>2024-05-04 10:41:09 +0200
commite82dca2a57b05a95d45be74cb59046c79c9ed7d3 (patch)
tree5e56a35e197c7174e5609ed2a06a27c82e5c30b7 /gdb
parenta0a6e110198c4f7fb4b5baa1f8d158ebf225f7e2 (diff)
downloadbinutils-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.exp47
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.