* 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.
+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
+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.
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})
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
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
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);
}
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\"",
{
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;
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);
}