diff options
author | Pedro Alves <palves@redhat.com> | 2011-05-30 18:04:32 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2011-05-30 18:04:32 +0000 |
commit | fa4cd53f7d2a4d6981bc4e09d5233f0df2c7f1cd (patch) | |
tree | fbf033c82d112b48b3a47155cf5223e737eb3a88 /gdb/continuations.c | |
parent | c2949be03bf333bd3de59dc3260762d3201f6b79 (diff) | |
download | gdb-fa4cd53f7d2a4d6981bc4e09d5233f0df2c7f1cd.zip gdb-fa4cd53f7d2a4d6981bc4e09d5233f0df2c7f1cd.tar.gz gdb-fa4cd53f7d2a4d6981bc4e09d5233f0df2c7f1cd.tar.bz2 |
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/continuations.c')
-rw-r--r-- | gdb/continuations.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/gdb/continuations.c b/gdb/continuations.c index c6f45a2..0ad3184 100644 --- a/gdb/continuations.c +++ b/gdb/continuations.c @@ -51,14 +51,14 @@ make_continuation (struct continuation **pmy_chain, } static void -do_my_continuations_1 (struct continuation **pmy_chain) +do_my_continuations_1 (struct continuation **pmy_chain, int err) { struct continuation *ptr; while ((ptr = *pmy_chain) != NULL) { *pmy_chain = ptr->next; /* Do this first in case of recursion. */ - (*ptr->function) (ptr->arg); + (*ptr->function) (ptr->arg, err); if (ptr->free_arg) (*ptr->free_arg) (ptr->arg); xfree (ptr); @@ -66,7 +66,7 @@ do_my_continuations_1 (struct continuation **pmy_chain) } static void -do_my_continuations (struct continuation **list) +do_my_continuations (struct continuation **list, int err) { struct continuation *continuations; @@ -82,7 +82,7 @@ do_my_continuations (struct continuation **list) *list = NULL; /* Work now on the list we have set aside. */ - do_my_continuations_1 (&continuations); + do_my_continuations_1 (&continuations, err); } static void @@ -123,10 +123,10 @@ add_inferior_continuation (continuation_ftype *hook, void *args, /* Do all continuations of the current inferior. */ void -do_all_inferior_continuations (void) +do_all_inferior_continuations (int err) { struct inferior *inf = current_inferior (); - do_my_continuations (&inf->continuations); + do_my_continuations (&inf->continuations, err); } /* Get rid of all the inferior-wide continuations of INF. */ @@ -167,7 +167,8 @@ restore_thread_cleanup (void *arg) static void do_all_continuations_ptid (ptid_t ptid, - struct continuation **continuations_p) + struct continuation **continuations_p, + int err) { struct cleanup *old_chain; ptid_t current_thread; @@ -191,7 +192,7 @@ do_all_continuations_ptid (ptid_t ptid, /* Let the continuation see this thread as selected. */ switch_to_thread (ptid); - do_my_continuations (continuations_p); + do_my_continuations (continuations_p, err); do_cleanups (old_chain); } @@ -201,24 +202,25 @@ do_all_continuations_ptid (ptid_t ptid, static int do_all_continuations_thread_callback (struct thread_info *thread, void *data) { - do_all_continuations_ptid (thread->ptid, &thread->continuations); + int err = * (int *) data; + do_all_continuations_ptid (thread->ptid, &thread->continuations, err); return 0; } /* Do all continuations of thread THREAD. */ void -do_all_continuations_thread (struct thread_info *thread) +do_all_continuations_thread (struct thread_info *thread, int err) { - do_all_continuations_thread_callback (thread, NULL); + do_all_continuations_thread_callback (thread, &err); } /* Do all continuations of all threads. */ void -do_all_continuations (void) +do_all_continuations (int err) { - iterate_over_threads (do_all_continuations_thread_callback, NULL); + iterate_over_threads (do_all_continuations_thread_callback, &err); } /* Callback for iterate over threads. */ @@ -274,26 +276,28 @@ static int do_all_intermediate_continuations_thread_callback (struct thread_info *thread, void *data) { + int err = * (int *) data; + do_all_continuations_ptid (thread->ptid, - &thread->intermediate_continuations); + &thread->intermediate_continuations, err); return 0; } /* Do all intermediate continuations of thread THREAD. */ void -do_all_intermediate_continuations_thread (struct thread_info *thread) +do_all_intermediate_continuations_thread (struct thread_info *thread, int err) { - do_all_intermediate_continuations_thread_callback (thread, NULL); + do_all_intermediate_continuations_thread_callback (thread, &err); } /* Do all intermediate continuations of all threads. */ void -do_all_intermediate_continuations (void) +do_all_intermediate_continuations (int err) { iterate_over_threads (do_all_intermediate_continuations_thread_callback, - NULL); + &err); } /* Callback for iterate over threads. */ |