* infrun.c (infrun_thread_thread_exit): New.
	(_initialize_infrun): Attach it to the thread_exit observer.
	* thread.c (delete_thread_1): Always call the observer, passing it
	the silent flag.
	* mi/mi-interp.c (mi_thread_exit): Add "silent" parameter.  If
	SILENT, return immediately.

gdb/doc/
	* observer.texi (thread_exit): Add "silent" parameter.
This commit is contained in:
Pedro Alves 2009-03-25 21:53:11 +00:00
parent d729566a19
commit a07daef34e
6 changed files with 38 additions and 9 deletions

View file

@ -1,3 +1,12 @@
2000-03-25 Pedro Alves <pedro@codesourcery.com>
* infrun.c (infrun_thread_thread_exit): New.
(_initialize_infrun): Attach it to the thread_exit observer.
* thread.c (delete_thread_1): Always call the observer, passing it
the silent flag.
* mi/mi-interp.c (mi_thread_exit): Add "silent" parameter. If
SILENT, return immediately.
2009-03-25 Pedro Alves <pedro@codesourcery.com>
* infrun.c (normal_stop): Use has_stack_frames instead of

View file

@ -1,3 +1,7 @@
2009-03-25 Pedro Alves <pedro@codesourcery.com>
* observer.texi (thread_exit): Add "silent" parameter.
2009-03-22 Pedro Alves <pedro@codesourcery.com>
* observer.texi (about_to_proceed): New.

View file

@ -134,8 +134,10 @@ 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.
@deftypefun void thread_exit (struct thread_info *@var{t}, int @var{silent})
The thread specified by @var{t} has exited. The @var{silent} argument
indicates that @value{GDBN} is removing the thread from its tables
without wanting to notify the user about it.
@end deftypefun
@deftypefun void thread_stop_requested (ptid_t @var{ptid})

View file

@ -1691,6 +1691,15 @@ infrun_thread_stop_requested (ptid_t ptid)
iterate_over_threads (infrun_thread_stop_requested_callback, &ptid);
}
void nullify_last_target_wait_ptid (void);
static void
infrun_thread_thread_exit (struct thread_info *tp, int silent)
{
if (ptid_equal (target_last_wait_ptid, tp->ptid))
nullify_last_target_wait_ptid ();
}
/* Callback for iterate_over_threads. */
static int
@ -5575,6 +5584,7 @@ Options are 'forward' or 'reverse'."),
observer_attach_thread_ptid_changed (infrun_thread_ptid_changed);
observer_attach_thread_stop_requested (infrun_thread_stop_requested);
observer_attach_thread_exit (infrun_thread_thread_exit);
/* Explicitly create without lookup, since that tries to create a
value with a void typed value, and when we get here, gdbarch

View file

@ -55,7 +55,7 @@ static void mi_remove_notify_hooks (void);
static void mi_on_normal_stop (struct bpstats *bs, int print_frame);
static void mi_new_thread (struct thread_info *t);
static void mi_thread_exit (struct thread_info *t);
static void mi_thread_exit (struct thread_info *t, int silent);
static void mi_new_inferior (int pid);
static void mi_inferior_exit (int pid);
static void mi_on_resume (ptid_t ptid);
@ -293,9 +293,14 @@ mi_new_thread (struct thread_info *t)
}
static void
mi_thread_exit (struct thread_info *t)
mi_thread_exit (struct thread_info *t, int silent)
{
struct mi_interp *mi = top_level_interpreter_data ();
struct mi_interp *mi;
if (silent)
return;
mi = top_level_interpreter_data ();
target_terminal_ours ();
fprintf_unfiltered (mi->event_channel,
"thread-exited,id=\"%d\",group-id=\"%d\"",

View file

@ -247,8 +247,7 @@ delete_thread_1 (ptid_t ptid, int silent)
{
if (tp->state_ != THREAD_EXITED)
{
if (!silent)
observer_notify_thread_exit (tp);
observer_notify_thread_exit (tp, silent);
/* Tag it as exited. */
tp->state_ = THREAD_EXITED;
@ -267,8 +266,8 @@ delete_thread_1 (ptid_t ptid, int silent)
thread_list = tp->next;
/* Notify thread exit, but only if we haven't already. */
if (!silent && tp->state_ != THREAD_EXITED)
observer_notify_thread_exit (tp);
if (tp->state_ != THREAD_EXITED)
observer_notify_thread_exit (tp, silent);
free_thread (tp);
}