[04/12] gdb: add inferior_pre_detach observable

Message ID 20221206135729.3937767-5-simon.marchi@efficios.com
State Committed
Commit 9056c917b3e7a7d41c586087bdb8779197254d1e
Headers
Series Initial support for ROCm platform (AMDGPU) debugging |

Commit Message

Simon Marchi Dec. 6, 2022, 1:57 p.m. UTC
  Add an observable notified in target_detach just before calling the
detach method on the inferior's target stack.  This allows observer to
do some work on the inferior while it's still ptrace-attached, in the
case of a native Linux inferior.  Specifically, the amd-dbgapi target
will need it in order to call amd_dbgapi_process_detach before the
process gets ptrace-detached.

Change-Id: I28b6065e251012a4c2db8a600fe13ba31671e3c9
---
 gdb/observable.c | 1 +
 gdb/observable.h | 3 +++
 gdb/target.c     | 2 ++
 3 files changed, 6 insertions(+)
  

Comments

Andrew Burgess Dec. 6, 2022, 4:39 p.m. UTC | #1
Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes:

> Add an observable notified in target_detach just before calling the
> detach method on the inferior's target stack.  This allows observer to
> do some work on the inferior while it's still ptrace-attached, in the
> case of a native Linux inferior.  Specifically, the amd-dbgapi target
> will need it in order to call amd_dbgapi_process_detach before the
> process gets ptrace-detached.

LGTM.

Thanks,
Andrew

>
> Change-Id: I28b6065e251012a4c2db8a600fe13ba31671e3c9
> ---
>  gdb/observable.c | 1 +
>  gdb/observable.h | 3 +++
>  gdb/target.c     | 2 ++
>  3 files changed, 6 insertions(+)
>
> diff --git a/gdb/observable.c b/gdb/observable.c
> index 0bc8697f137..7b23e038b25 100644
> --- a/gdb/observable.c
> +++ b/gdb/observable.c
> @@ -62,6 +62,7 @@ DEFINE_OBSERVABLE (architecture_changed);
>  DEFINE_OBSERVABLE (thread_ptid_changed);
>  DEFINE_OBSERVABLE (inferior_added);
>  DEFINE_OBSERVABLE (inferior_appeared);
> +DEFINE_OBSERVABLE (inferior_pre_detach);
>  DEFINE_OBSERVABLE (inferior_exit);
>  DEFINE_OBSERVABLE (inferior_removed);
>  DEFINE_OBSERVABLE (memory_changed);
> diff --git a/gdb/observable.h b/gdb/observable.h
> index 1103c5c98a6..e8cc2d28a86 100644
> --- a/gdb/observable.h
> +++ b/gdb/observable.h
> @@ -181,6 +181,9 @@ extern observable<struct inferior */* inf */> inferior_added;
>     process.  */
>  extern observable<struct inferior */* inf */> inferior_appeared;
>  
> +/* Inferior INF is about to be detached.  */
> +extern observable<struct inferior */* inf */> inferior_pre_detach;
> +
>  /* Either the inferior associated with INF has been detached from
>     the process, or the process has exited.  */
>  extern observable<struct inferior */* inf */> inferior_exit;
> diff --git a/gdb/target.c b/gdb/target.c
> index 1dd0f42af7d..04a4e1fd877 100644
> --- a/gdb/target.c
> +++ b/gdb/target.c
> @@ -2561,6 +2561,8 @@ target_detach (inferior *inf, int from_tty)
>  
>    prepare_for_detach ();
>  
> +  gdb::observers::inferior_pre_detach.notify (inf);
> +
>    /* Hold a strong reference because detaching may unpush the
>       target.  */
>    auto proc_target_ref = target_ops_ref::new_reference (inf->process_target ());
> -- 
> 2.38.1
  

Patch

diff --git a/gdb/observable.c b/gdb/observable.c
index 0bc8697f137..7b23e038b25 100644
--- a/gdb/observable.c
+++ b/gdb/observable.c
@@ -62,6 +62,7 @@  DEFINE_OBSERVABLE (architecture_changed);
 DEFINE_OBSERVABLE (thread_ptid_changed);
 DEFINE_OBSERVABLE (inferior_added);
 DEFINE_OBSERVABLE (inferior_appeared);
+DEFINE_OBSERVABLE (inferior_pre_detach);
 DEFINE_OBSERVABLE (inferior_exit);
 DEFINE_OBSERVABLE (inferior_removed);
 DEFINE_OBSERVABLE (memory_changed);
diff --git a/gdb/observable.h b/gdb/observable.h
index 1103c5c98a6..e8cc2d28a86 100644
--- a/gdb/observable.h
+++ b/gdb/observable.h
@@ -181,6 +181,9 @@  extern observable<struct inferior */* inf */> inferior_added;
    process.  */
 extern observable<struct inferior */* inf */> inferior_appeared;
 
+/* Inferior INF is about to be detached.  */
+extern observable<struct inferior */* inf */> inferior_pre_detach;
+
 /* Either the inferior associated with INF has been detached from
    the process, or the process has exited.  */
 extern observable<struct inferior */* inf */> inferior_exit;
diff --git a/gdb/target.c b/gdb/target.c
index 1dd0f42af7d..04a4e1fd877 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -2561,6 +2561,8 @@  target_detach (inferior *inf, int from_tty)
 
   prepare_for_detach ();
 
+  gdb::observers::inferior_pre_detach.notify (inf);
+
   /* Hold a strong reference because detaching may unpush the
      target.  */
   auto proc_target_ref = target_ops_ref::new_reference (inf->process_target ());