gdb/
* 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:
parent
d729566a19
commit
a07daef34e
6 changed files with 38 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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})
|
||||
|
|
10
gdb/infrun.c
10
gdb/infrun.c
|
@ -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
|
||||
|
|
|
@ -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\"",
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue