From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2441 invoked by alias); 26 Apr 2008 17:22:20 -0000 Received: (qmail 2136 invoked by uid 22791); 26 Apr 2008 17:22:19 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 26 Apr 2008 17:21:55 +0000 Received: (qmail 6633 invoked from network); 26 Apr 2008 17:21:53 -0000 Received: from unknown (HELO localhost) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 26 Apr 2008 17:21:53 -0000 From: Vladimir Prus Date: Sat, 26 Apr 2008 17:45:00 -0000 Subject: [RFA] Implement thread death notification. To: gdb-patches@sources.redhat.com X-TUID: cba444f22ea01c6a X-Length: 4062 X-UID: 166 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200804262121.51407.vladimir@codesourcery.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-04/txt/msg00601.txt.bz2 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 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