This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFA] Implement thread death notification.
- From: Vladimir Prus <vladimir at codesourcery dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Sat, 26 Apr 2008 20:21:50 +0300
- Subject: [RFA] Implement thread death notification.
We now have the 'thread-created' MI notification. This patch adds a
'thread-exited' notification to match. Are non-MI bits of this
patch OK?
- Volodya
2008-03-29 Pedro Alves <pedro@codesourcery.com>
gdb/doc/
* observer.texi (thread_exit): New.
gdb/
* linux-nat.c: Include observer.h.
(exit_lwp): Call observer_notify_thread_exit.
* Makefile.in (linux-nat.o): Update.
* mi/mi-interp.c (mi_interpreter_init): Register mi_thread_exit as
thread_exit observer.
(mi_thread_exit): New.
---
gdb/Makefile.in | 3 ++-
gdb/doc/observer.texi | 4 ++++
gdb/linux-nat.c | 6 +++++-
gdb/mi/mi-interp.c | 16 +++++++++++++++-
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 9304bc2..9d72168 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -2375,7 +2375,8 @@ linux-nat.o: linux-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdb_string_h) \
$(gdb_wait_h) $(gdb_assert_h) $(linux_nat_h) $(gdbthread_h) \
$(gdbcmd_h) $(regcache_h) $(regset_h) $(inf_ptrace_h) $(auxv_h) \
$(elf_bfd_h) $(gregset_h) $(gdbcore_h) $(gdbthread_h) $(gdb_stat_h) \
- $(linux_fork_h) $(inf_loop_h) $(event_loop_h) $(event_top_h)
+ $(linux_fork_h) $(inf_loop_h) $(event_loop_h) $(event_top_h) \
+ $(observer_h)
linux-thread-db.o: linux-thread-db.c $(defs_h) $(gdb_assert_h) \
$(gdb_proc_service_h) $(gdb_thread_db_h) $(bfd_h) $(exceptions_h) \
$(gdbthread_h) $(inferior_h) $(symfile_h) $(objfiles_h) $(target_h) \
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
index 5bcc76c..af3835b 100644
--- a/gdb/doc/observer.texi
+++ b/gdb/doc/observer.texi
@@ -133,3 +133,7 @@ previously loaded symbol table data has now been invalidated.
The thread specified by @var{t} has been created.
@end deftypefun
+@deftypefun void thread_exit (struct thread_info *@var{t})
+The thread specified by @var{t} has exited.
+@end deftypefun
+
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 9511815..a97ad0f 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -49,6 +49,7 @@
#include "inf-loop.h"
#include "event-loop.h"
#include "event-top.h"
+#include "observer.h"
#ifndef O_LARGEFILE
#define O_LARGEFILE 0
@@ -995,10 +996,13 @@ prune_lwps (void)
static void
exit_lwp (struct lwp_info *lp)
{
- if (in_thread_list (lp->ptid))
+ struct thread_info *th = find_thread_pid (lp->ptid);
+
+ if (th)
{
if (print_thread_events)
printf_unfiltered (_("[%s exited]\n"), target_pid_to_str (lp->ptid));
+ observer_notify_thread_exit (th);
/* Core GDB cannot deal with us deleting the current thread. */
if (!ptid_equal (lp->ptid, inferior_ptid))
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index 8dfd3ee..da7a717 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -67,6 +67,7 @@ static void mi_insert_notify_hooks (void);
static void mi_remove_notify_hooks (void);
static void mi_new_thread (struct thread_info *t);
+static void mi_thread_exit (struct thread_info *t);
static void *
mi_interpreter_init (int top_level)
@@ -88,7 +89,10 @@ mi_interpreter_init (int top_level)
mi->event_channel = mi_console_file_new (raw_stdout, "=", 0);
if (top_level)
- observer_attach_new_thread (mi_new_thread);
+ {
+ observer_attach_new_thread (mi_new_thread);
+ observer_attach_thread_exit (mi_thread_exit);
+ }
return mi;
}
@@ -317,6 +321,16 @@ mi_new_thread (struct thread_info *t)
gdb_flush (mi->event_channel);
}
+static void
+mi_thread_exit (struct thread_info *t)
+{
+ struct mi_interp *mi = top_level_interpreter_data ();
+
+ target_terminal_ours ();
+ fprintf_unfiltered (mi->event_channel, "thread-exited,id=\"%d\"", t->num);
+ gdb_flush (mi->event_channel);
+}
+
extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */
void
--
1.5.3.5