public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] [gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp
@ 2022-12-13 14:02 Tom de Vries
  2022-12-16 12:41 ` Pedro Alves
  0 siblings, 1 reply; 2+ messages in thread
From: Tom de Vries @ 2022-12-13 14:02 UTC (permalink / raw)
  To: gdb-patches

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.threads/detach-step-over.exp          | 34 ++++++++++++++-----
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/gdb/testsuite/gdb.threads/detach-step-over.exp b/gdb/testsuite/gdb.threads/detach-step-over.exp
index 38d796620cb..225d3ab5313 100644
--- a/gdb/testsuite/gdb.threads/detach-step-over.exp
+++ b/gdb/testsuite/gdb.threads/detach-step-over.exp
@@ -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 == 0 } {
+		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.*"

base-commit: fa59ab98685e4b5431d2be423f449df5069a454e
-- 
2.35.3


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] [gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp
  2022-12-13 14:02 [PATCH] [gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp Tom de Vries
@ 2022-12-16 12:41 ` Pedro Alves
  0 siblings, 0 replies; 2+ messages in thread
From: Pedro Alves @ 2022-12-16 12:41 UTC (permalink / raw)
  To: Tom de Vries, gdb-patches

On 2022-12-13 2:02 p.m., Tom de Vries via Gdb-patches wrote:
> 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.

Cool, thanks.  I've run into this race too once in a while, but never managed to find time
to look into it.

LGTM, with just one nit:

> +	    if { $interrupted == 0 } {

Just a bit below we have:

	    if {!$interrupted} {

I'd rather the same form is used in both places, and I think the second form is better.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-12-16 12:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-13 14:02 [PATCH] [gdb/testsuite] Fix race in gdb.threads/detach-step-over.exp Tom de Vries
2022-12-16 12:41 ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).