summaryrefslogtreecommitdiff
path: root/gdb/thread.c
diff options
context:
space:
mode:
authorPedro Alves <pedro@codesourcery.com>2011-05-30 18:04:31 +0000
committerPedro Alves <pedro@codesourcery.com>2011-05-30 18:04:31 +0000
commit9d5f08d6f93ad091e5b0733c299f7eb1c7a94abd (patch)
tree5455d46ac80fa77aa5efd9d54c0c8d77f58be498 /gdb/thread.c
parent91418c4d96655bf2d620040bab9d4b04eca31683 (diff)
downloadgdb-9d5f08d6f93ad091e5b0733c299f7eb1c7a94abd.tar.gz
2011-05-30 Pedro Alves <pedro@codesourcery.com>
gdb/ * continuations.h (continuation_ftype): Add `err' parameter. Document parameters. (do_all_continuations, do_all_continuations_thread) (do_all_intermediate_continuations) (do_all_intermediate_continuations_thread) (do_all_inferior_continuations): Add `err' parameter. * continuations.c (do_my_continuations_1, do_my_continuations) (do_all_inferior_continuations, do_all_continuations_ptid) (do_all_continuations_thread_callback) (do_all_continuations_thread, do_all_continuations) (do_all_intermediate_continuations_thread_callback) (do_all_intermediate_continuations_thread) (do_all_intermediate_continuations): Add `err' parameter, and pass it down all the way to the continuations proper. * inf-loop.c (inferior_event_handler): If fetching an inferior event throws an error, don't pop the target, and still call the continuations, but with `err' set. Adjust all other continuation calls. * breakpoint.c (until_break_command_continuation): Add `err' parameter. * infcmd.c (step_1_continuation): Add `err' parameter. Don't issue another step if `err' is set. (struct until_next_continuation_args): New. (until_next_continuation): Add `err' parameter. Adjust. (until_next_command): Adjust. (struct finish_command_continuation_args): Add `thread' field. (finish_command_continuation): Add `err' parameter. Handle it. (finish_forward): Adjust. (attach_command_continuation): Add `err' parameter. Handle it. * infrun.c (infrun_thread_stop_requested_callback): Adjust to cancel the continuations. * interps.c (interp_set): Adjust to cancel the continuations. * thread.c (clear_thread_inferior_resources): Adjust to cancel the continuations rather than discarding. (free_thread): Don't clear thread inferior resources here. (delete_thread_1): Do it here instead. And do it before removing the thread from the threads list. Tag the thread as exited before clearing thread inferior resources.
Diffstat (limited to 'gdb/thread.c')
-rw-r--r--gdb/thread.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/gdb/thread.c b/gdb/thread.c
index 3090b692556..5a78ad17025 100644
--- a/gdb/thread.c
+++ b/gdb/thread.c
@@ -125,8 +125,8 @@ clear_thread_inferior_resources (struct thread_info *tp)
bpstat_clear (&tp->control.stop_bpstat);
- discard_all_intermediate_continuations_thread (tp);
- discard_all_continuations_thread (tp);
+ do_all_intermediate_continuations_thread (tp, 1);
+ do_all_continuations_thread (tp, 1);
delete_longjmp_breakpoint (tp->num);
}
@@ -134,8 +134,6 @@ clear_thread_inferior_resources (struct thread_info *tp)
static void
free_thread (struct thread_info *tp)
{
- clear_thread_inferior_resources (tp);
-
if (tp->private)
{
if (tp->private_dtor)
@@ -297,15 +295,19 @@ delete_thread_1 (ptid_t ptid, int silent)
return;
}
+ /* Notify thread exit, but only if we haven't already. */
+ if (tp->state_ != THREAD_EXITED)
+ observer_notify_thread_exit (tp, silent);
+
+ /* Tag it as exited. */
+ tp->state_ = THREAD_EXITED;
+ clear_thread_inferior_resources (tp);
+
if (tpprev)
tpprev->next = tp->next;
else
thread_list = tp->next;
- /* Notify thread exit, but only if we haven't already. */
- if (tp->state_ != THREAD_EXITED)
- observer_notify_thread_exit (tp, silent);
-
free_thread (tp);
}