[v2] Clear board_info entry after waiting for process
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Testing passed
|
Commit Message
When certain DAP tests are run in a certain order, dejagnu will throw
an exception during shutdown. After adding many logging statements, I
tracked this down to kill_wait_spawned_process not clearing the
'fileid' board_info entry, causing dejagnu to try to wait for the
process a second time -- and fail.
Tom de Vries then pointed out a second instance of this, which I
tracked down to the same problem occurring when spawning gdbserver.
This version of the patch fixes this by adding a new proc that can be
used to clean up board_info after waiting for a process to exit. I'm
not sure why this problem hasn't affected the test suite in the past.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31435
---
gdb/testsuite/lib/gdb.exp | 15 +++++++++++++++
gdb/testsuite/lib/gdbserver-support.exp | 1 +
2 files changed, 16 insertions(+)
Comments
Tom Tromey <tromey@adacore.com> writes:
> When certain DAP tests are run in a certain order, dejagnu will throw
> an exception during shutdown. After adding many logging statements, I
> tracked this down to kill_wait_spawned_process not clearing the
> 'fileid' board_info entry, causing dejagnu to try to wait for the
> process a second time -- and fail.
>
> Tom de Vries then pointed out a second instance of this, which I
> tracked down to the same problem occurring when spawning gdbserver.
>
> This version of the patch fixes this by adding a new proc that can be
> used to clean up board_info after waiting for a process to exit. I'm
> not sure why this problem hasn't affected the test suite in the past.
>
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31435
I took a look at this and I think this solution seems to make sense.
Approved-By: Andrew Burgess <aburgess@redhat.com>
Thanks,
Andrew
> ---
> gdb/testsuite/lib/gdb.exp | 15 +++++++++++++++
> gdb/testsuite/lib/gdbserver-support.exp | 1 +
> 2 files changed, 16 insertions(+)
>
> diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
> index fe4ac7d2719..4d27b60ef49 100644
> --- a/gdb/testsuite/lib/gdb.exp
> +++ b/gdb/testsuite/lib/gdb.exp
> @@ -3310,6 +3310,20 @@ proc with_spawn_id { spawn_id body } {
> }
> }
>
> +# DejaGNU records spawn ids in a global array and tries to wait for
> +# them when exiting. Sometimes this caused problems if gdb's test
> +# suite has already waited for the particular spawn id. And, dejagnu
> +# only seems to allow a single spawn id per "machine". This proc can
> +# be used to clean up after a spawn id has been closed.
> +proc clean_up_spawn_id {host id} {
> + global board_info
> + set name [board_info $host name]
> + if {[info exists board_info($name,fileid)]
> + && $board_info($name,fileid) == $id} {
> + unset -nocomplain board_info($name,fileid)
> + }
> +}
> +
> # Select the largest timeout from all the timeouts:
> # - the local "timeout" variable of the scope two levels above,
> # - the global "timeout" variable,
> @@ -6194,6 +6208,7 @@ proc kill_wait_spawned_process { proc_spawn_id } {
> # wait for the PID in the background. That's fine because we
> # don't care about the exit status. */
> wait -nowait -i $proc_spawn_id
> + clean_up_spawn_id target $proc_spawn_id
> }
>
> # Returns the process id corresponding to the given spawn id.
> diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp
> index 8bcf4fbbb01..e8ab057647d 100644
> --- a/gdb/testsuite/lib/gdbserver-support.exp
> +++ b/gdb/testsuite/lib/gdbserver-support.exp
> @@ -433,6 +433,7 @@ proc close_gdbserver {} {
> # -nowait makes expect tell Tcl to wait for the process in the
> # background.
> catch "wait -nowait -i $server_spawn_id"
> + clean_up_spawn_id target $server_spawn_id
> unset server_spawn_id
> }
>
> --
> 2.43.0
@@ -3310,6 +3310,20 @@ proc with_spawn_id { spawn_id body } {
}
}
+# DejaGNU records spawn ids in a global array and tries to wait for
+# them when exiting. Sometimes this caused problems if gdb's test
+# suite has already waited for the particular spawn id. And, dejagnu
+# only seems to allow a single spawn id per "machine". This proc can
+# be used to clean up after a spawn id has been closed.
+proc clean_up_spawn_id {host id} {
+ global board_info
+ set name [board_info $host name]
+ if {[info exists board_info($name,fileid)]
+ && $board_info($name,fileid) == $id} {
+ unset -nocomplain board_info($name,fileid)
+ }
+}
+
# Select the largest timeout from all the timeouts:
# - the local "timeout" variable of the scope two levels above,
# - the global "timeout" variable,
@@ -6194,6 +6208,7 @@ proc kill_wait_spawned_process { proc_spawn_id } {
# wait for the PID in the background. That's fine because we
# don't care about the exit status. */
wait -nowait -i $proc_spawn_id
+ clean_up_spawn_id target $proc_spawn_id
}
# Returns the process id corresponding to the given spawn id.
@@ -433,6 +433,7 @@ proc close_gdbserver {} {
# -nowait makes expect tell Tcl to wait for the process in the
# background.
catch "wait -nowait -i $server_spawn_id"
+ clean_up_spawn_id target $server_spawn_id
unset server_spawn_id
}