]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Use unique portnum in parallel testing
authorTom de Vries <tdevries@suse.de>
Sat, 4 May 2024 08:41:09 +0000 (10:41 +0200)
committerTom de Vries <tdevries@suse.de>
Sat, 4 May 2024 08:41:09 +0000 (10:41 +0200)
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>
gdb/testsuite/lib/gdbserver-support.exp

index 0f97ce9c0fd384c7ff84fcca09c25bc097bc6330..41ad5e6cbfb137ca2e7bd5bd969f3e6bc8349178 100644 (file)
@@ -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.