[gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp
authorTom de Vries <tdevries@suse.de>
Fri, 16 Dec 2022 14:28:27 +0000 (15:28 +0100)
committerTom de Vries <tdevries@suse.de>
Fri, 16 Dec 2022 14:28:27 +0000 (15:28 +0100)
Once in a while I run into:
...
FAIL: gdb.threads/detach-step-over.exp: \
  breakpoint-condition-evaluation=host: target-non-stop=off: non-stop=off: \
  displaced=off: iter 1: all threads running
...

In can easily reproduce this by doing:
...
     # Wait a bit, to give time for the threads to hit the
     # breakpoint.
-    sleep 1

     return true
...

Fix this by counting the running threads in a loop, effectively allowing 10
seconds (instead of 1) for the threads to start running, but only sleeping if
needed.

Reduces total execution time from 1m27s to 56s.

Tested on x86_64-linux.

gdb/testsuite/gdb.threads/detach-step-over.exp

index 38d796620cb13d748168ab949a83a288fb086dc0..6c3a74fd16d63b3ca308887c531b215b335cee1b 100644 (file)
@@ -187,10 +187,6 @@ proc prepare_test_iter {testpid non_stop attempt attempts tid_re} {
        }
     }
 
-    # Wait a bit, to give time for the threads to hit the
-    # breakpoint.
-    sleep 1
-
     return true
 }
 
@@ -233,7 +229,8 @@ proc_with_prefix test_detach_command {condition_eval target_non_stop non_stop di
 
            set running_count 0
            set interrupted 0
-           gdb_test_multiple "info threads" "all threads running" {
+           set running_expected [expr ($::n_threads + 1) * 2]
+           gdb_test_multiple "info threads" "threads running" {
                -re "\\(running\\)" {
                    incr running_count
                    exp_continue
@@ -254,10 +251,31 @@ proc_with_prefix test_detach_command {condition_eval target_non_stop non_stop di
                        }
                    }
                }
-               -re "$::gdb_prompt $" {
-                   gdb_assert {$running_count == ($::n_threads + 1) * 2} \
-                       $gdb_test_name
+               -re "$::gdb_prompt " {
+               }
+           }
+
+           if { !$interrupted } {
+               set iterations 0
+               set max_iterations 10
+               while { $running_count < $running_expected } {
+                   sleep 1
+                   set running_count 0
+                   gdb_test_multiple "info threads" "threads running" {
+                       -re "\\(running\\)" {
+                           incr running_count
+                           exp_continue
+                       }
+                       -re "$::gdb_prompt " {
+                       }
+                   }
+                   incr iterations
+                   if { $iterations == $max_iterations } {
+                       break
+                   }
                }
+               gdb_assert {$running_count == $running_expected} \
+                   "all threads running"
            }
 
            gdb_test "detach" "Detaching from.*"