Increase timeout in watch-bitfields.exp for software watchpoint

Message ID 86618xu4xr.fsf@gmail.com
State New, archived
Headers

Commit Message

Yao Qi April 15, 2015, 9:16 a.m. UTC
  Pedro Alves <palves@redhat.com> writes:

> gdb_test etc. always take the max of local, global and board
> timeouts.  In your current patch, the factor is applied after
> selecting the max of global and board timeouts.  So I think that it
> should be simplest to say that the the factor is applied after determining
> the maximum between local, global and board timeouts.

OK, I see.  You suggested we should do more than what Maciej's patch
does.  In Maciej's patch, local timeout variable isn't considered, and
we don't have to.  After moving code to a proc, and in order to be align
with gdb_expect, we need to consider local timeout variable
additionally.  How about the patch below?
  

Comments

Pedro Alves April 15, 2015, 11 a.m. UTC | #1
On 04/15/2015 10:16 AM, Yao Qi wrote:
> Pedro Alves <palves@redhat.com> writes:
> 
>> gdb_test etc. always take the max of local, global and board
>> timeouts.  In your current patch, the factor is applied after
>> selecting the max of global and board timeouts.  So I think that it
>> should be simplest to say that the the factor is applied after determining
>> the maximum between local, global and board timeouts.
> 
> OK, I see.  You suggested we should do more than what Maciej's patch
> does.  In Maciej's patch, local timeout variable isn't considered, and
> we don't have to.

Right, Maciej's patch only applied the factor in code at global
scope, with no local timeout in scope, so it didn't need to consider
it.

>  After moving code to a proc, and in order to be align
> with gdb_expect, we need to consider local timeout variable
> additionally.  How about the patch below?

Looks good.  Thanks!

> +# - the board variable "gdb,timeout",

Probably period instead of comma at the end.
  
Yao Qi April 15, 2015, 11:48 a.m. UTC | #2
On 15/04/15 12:00, Pedro Alves wrote:
> Looks good.  Thanks!
>
>> >+# - the board variable "gdb,timeout",
> Probably period instead of comma at the end.

Patch is pushed in with it being fixed.
  

Patch

diff --git a/gdb/testsuite/gdb.base/watch-bitfields.exp b/gdb/testsuite/gdb.base/watch-bitfields.exp
index 9d5293b..4f97043 100644
--- a/gdb/testsuite/gdb.base/watch-bitfields.exp
+++ b/gdb/testsuite/gdb.base/watch-bitfields.exp
@@ -54,7 +54,14 @@  proc test_watch_location {} {
 	expect_watchpoint "q.e" 0 5
 	expect_watchpoint "q.a" 1 0
 	expect_watchpoint "q.e" 5 4
-	gdb_continue_to_end
+
+	# It'll execute a large amount of code with software watchpoint
+	# enabled, which means GDB will single stepping all the way
+	# through til the inferior exits.  Increase the timeout by a
+	# factor of 4.
+	with_timeout_factor 4 {
+	    gdb_continue_to_end
+	}
     }
 }
 
@@ -73,7 +80,14 @@  proc test_regular_watch {} {
 	expect_watchpoint "q.d + q.f + q.g" 3 2
 	expect_watchpoint "q.d + q.f + q.g" 2 1
 	expect_watchpoint "q.d + q.f + q.g" 1 0
-	gdb_continue_to_end
+
+	# It'll execute a large amount of code with software watchpoint
+	# enabled, which means GDB will single stepping all the way
+	# through til the inferior exits.  Increase the timeout by a
+	# factor of 4.
+	with_timeout_factor 4 {
+	    gdb_continue_to_end
+	}
     }
 }
 
diff --git a/gdb/testsuite/gdb.base/watchpoint-solib.exp b/gdb/testsuite/gdb.base/watchpoint-solib.exp
index 85e83f7..9475b37 100644
--- a/gdb/testsuite/gdb.base/watchpoint-solib.exp
+++ b/gdb/testsuite/gdb.base/watchpoint-solib.exp
@@ -75,17 +75,8 @@  gdb_test "watch g" "atchpoint 3: g" "set watchpoint on g"
 gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit"
 rerun_to_main
 
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 30 {
+    gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again"
 }
-set timeout [expr $oldtimeout * 30]
-
-gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again"
-
-set timeout $savedtimeout
 
 gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit again"
diff --git a/gdb/testsuite/gdb.reverse/sigall-reverse.exp b/gdb/testsuite/gdb.reverse/sigall-reverse.exp
index 69152d4..065eea7 100644
--- a/gdb/testsuite/gdb.reverse/sigall-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/sigall-reverse.exp
@@ -251,18 +251,11 @@  gdb_test "continue" \
     "get signal TERM"
 gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM"
 
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 2 {
+    gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \
+	"The next instruction is syscall exit_group.* program...y. or n. " \
+	"yes"
 }
-set timeout [expr $oldtimeout * 2]
-gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \
-    "The next instruction is syscall exit_group.* program...y. or n. " \
-    "yes"
-set timeout $savedtimeout
 
 foreach sig [lreverse $signals] {
     test_one_sig_reverse $sig
diff --git a/gdb/testsuite/gdb.reverse/until-precsave.exp b/gdb/testsuite/gdb.reverse/until-precsave.exp
index 1684645..640839f 100644
--- a/gdb/testsuite/gdb.reverse/until-precsave.exp
+++ b/gdb/testsuite/gdb.reverse/until-precsave.exp
@@ -49,22 +49,17 @@  gdb_test "break $end_of_main" \
     "BP at end of main"
 
 # This can take awhile.
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 15 {
+    gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
 }
-set timeout [expr $oldtimeout * 15]
-gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
 
 # So can this, against gdbserver, for example.
-set timeout [expr $oldtimeout * 3]
-gdb_test "record save $precsave" \
-    "Saved core file $precsave with execution log\."  \
-    "save process recfile"
-set timeout $savedtimeout
+
+with_timeout_factor 3 {
+    gdb_test "record save $precsave" \
+	"Saved core file $precsave with execution log\."  \
+	"save process recfile"
+}
 
 gdb_test "kill" "" "Kill process, prepare to debug log file" \
     "Kill the program being debugged\\? \\(y or n\\) " "y"
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 1448fba..25fcae3 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -1919,6 +1919,54 @@  proc with_target_charset { target_charset body } {
     }
 }
 
+# Select the largest timeout from all the timeouts:
+# - the local "timeout" variable of the scope two levels above,
+# - the global "timeout" variable,
+# - the board variable "gdb,timeout",
+
+proc get_largest_timeout {} {
+    upvar #0 timeout gtimeout
+    upvar 2 timeout timeout
+
+    set tmt 0
+    if [info exists timeout] {
+      set tmt $timeout
+    }
+    if { [info exists gtimeout] && $gtimeout > $tmt } {
+	set tmt $gtimeout
+    }
+    if { [target_info exists gdb,timeout]
+	 && [target_info gdb,timeout] > $tmt } {
+	set tmt [target_info gdb,timeout]
+    }
+    if { $tmt == 0 } {
+	# Eeeeew.
+	set tmt 60
+    }
+
+    return $tmt
+}
+
+# Run tests in BODY with timeout increased by factor of FACTOR.  When
+# BODY is finished, restore timeout.
+
+proc with_timeout_factor { factor body } {
+    global timeout
+
+    set savedtimeout $timeout
+
+    set timeout [expr [get_largest_timeout] * $factor]
+    set code [catch {uplevel 1 $body} result]
+
+    set timeout $savedtimeout
+    if {$code == 1} {
+	global errorInfo errorCode
+	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
+    } else {
+	return -code $code $result
+    }
+}
+
 # Return 1 if _Complex types are supported, otherwise, return 0.
 
 gdb_caching_proc support_complex_tests {
@@ -3291,26 +3339,10 @@  proc gdb_expect { args } {
 
     # A timeout argument takes precedence, otherwise of all the timeouts
     # select the largest.
-    upvar #0 timeout gtimeout
-    upvar timeout timeout
     if [info exists atimeout] {
 	set tmt $atimeout
     } else {
-	set tmt 0
-	if [info exists timeout] {
-	    set tmt $timeout
-	}
-	if { [info exists gtimeout] && $gtimeout > $tmt } {
-	    set tmt $gtimeout
-	}
-	if { [target_info exists gdb,timeout]
-	     && [target_info gdb,timeout] > $tmt } {
-	    set tmt [target_info gdb,timeout]
-	}
-	if { $tmt == 0 } {
-	    # Eeeeew.
-	    set tmt 60
-	}
+	set tmt [get_largest_timeout]
     }
 
     global suppress_flag