diff options
author | Pedro Alves <palves@redhat.com> | 2014-10-15 20:18:30 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-10-15 20:18:30 +0100 |
commit | 0cbcdb96eaba80fe8e94ccc2b6f1f382a467a04e (patch) | |
tree | a8f4f1973e983a529178017050a32169a138d23f /gdb/infrun.c | |
parent | 963f9c80cb3f12fb779cf3189072ac48946da96c (diff) | |
download | gdb-0cbcdb96eaba80fe8e94ccc2b6f1f382a467a04e.zip gdb-0cbcdb96eaba80fe8e94ccc2b6f1f382a467a04e.tar.gz gdb-0cbcdb96eaba80fe8e94ccc2b6f1f382a467a04e.tar.bz2 |
infrun.c: add for_each_just_stopped_thread
This is a preparatory/cleanup patch that does two things:
- Renames 'delete_step_thread_step_resume_breakpoint'. The
"step_resume" part is misnomer these days, as the function deletes
other kinds of breakpoints, not just the step-resume breakpoint. A
following patch will want to make it delete yet another kind of
breakpoint, even.
- Splits out the logic of which threads get those breakpoints deleted
to a separate "for_each"-style function, so that the same following
patch may use it with a different callback.
Tested on x86_64 Fedora 20.
gdb/
2014-10-15 Pedro Alves <palves@redhat.com>
* infrun.c (delete_step_resume_breakpoint_callback): Delete.
(delete_thread_infrun_breakpoints): New function, with parts
salvaged from delete_step_resume_breakpoint_callback.
(delete_step_thread_step_resume_breakpoint): Delete.
(for_each_just_stopped_thread_callback_func): New typedef.
(for_each_just_stopped_thread): New function.
(delete_just_stopped_threads_infrun_breakpoints): New function.
(delete_step_thread_step_resume_breakpoint_cleanup): Rename to ...
(delete_just_stopped_threads_infrun_breakpoints_cleanup):
... this. Adjust.
(wait_for_inferior, fetch_inferior_event): Adjust to renames.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r-- | gdb/infrun.c | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c index d0431df..aa36dbc 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2846,54 +2846,61 @@ infrun_thread_thread_exit (struct thread_info *tp, int silent) nullify_last_target_wait_ptid (); } -/* Callback for iterate_over_threads. */ +/* Delete the step resume, single-step and longjmp/exception resume + breakpoints of TP. */ -static int -delete_step_resume_breakpoint_callback (struct thread_info *info, void *data) +static void +delete_thread_infrun_breakpoints (struct thread_info *tp) { - if (is_exited (info->ptid)) - return 0; - - delete_step_resume_breakpoint (info); - delete_exception_resume_breakpoint (info); - return 0; + delete_step_resume_breakpoint (tp); + delete_exception_resume_breakpoint (tp); } -/* In all-stop, delete the step resume breakpoint of any thread that - had one. In non-stop, delete the step resume breakpoint of the - thread that just stopped. */ +/* If the target still has execution, call FUNC for each thread that + just stopped. In all-stop, that's all the non-exited threads; in + non-stop, that's the current thread, only. */ + +typedef void (*for_each_just_stopped_thread_callback_func) + (struct thread_info *tp); static void -delete_step_thread_step_resume_breakpoint (void) +for_each_just_stopped_thread (for_each_just_stopped_thread_callback_func func) { - if (!target_has_execution - || ptid_equal (inferior_ptid, null_ptid)) - /* If the inferior has exited, we have already deleted the step - resume breakpoints out of GDB's lists. */ + if (!target_has_execution || ptid_equal (inferior_ptid, null_ptid)) return; if (non_stop) { - /* If in non-stop mode, only delete the step-resume or - longjmp-resume breakpoint of the thread that just stopped - stepping. */ - struct thread_info *tp = inferior_thread (); - - delete_step_resume_breakpoint (tp); - delete_exception_resume_breakpoint (tp); + /* If in non-stop mode, only the current thread stopped. */ + func (inferior_thread ()); } else - /* In all-stop mode, delete all step-resume and longjmp-resume - breakpoints of any thread that had them. */ - iterate_over_threads (delete_step_resume_breakpoint_callback, NULL); + { + struct thread_info *tp; + + /* In all-stop mode, all threads have stopped. */ + ALL_NON_EXITED_THREADS (tp) + { + func (tp); + } + } +} + +/* Delete the step resume and longjmp/exception resume breakpoints of + the threads that just stopped. */ + +static void +delete_just_stopped_threads_infrun_breakpoints (void) +{ + for_each_just_stopped_thread (delete_thread_infrun_breakpoints); } /* A cleanup wrapper. */ static void -delete_step_thread_step_resume_breakpoint_cleanup (void *arg) +delete_just_stopped_threads_infrun_breakpoints_cleanup (void *arg) { - delete_step_thread_step_resume_breakpoint (); + delete_just_stopped_threads_infrun_breakpoints (); } /* Pretty print the results of target_wait, for debugging purposes. */ @@ -3028,8 +3035,9 @@ wait_for_inferior (void) fprintf_unfiltered (gdb_stdlog, "infrun: wait_for_inferior ()\n"); - old_cleanups = - make_cleanup (delete_step_thread_step_resume_breakpoint_cleanup, NULL); + old_cleanups + = make_cleanup (delete_just_stopped_threads_infrun_breakpoints_cleanup, + NULL); while (1) { @@ -3151,7 +3159,7 @@ fetch_inferior_event (void *client_data) { struct inferior *inf = find_inferior_pid (ptid_get_pid (ecs->ptid)); - delete_step_thread_step_resume_breakpoint (); + delete_just_stopped_threads_infrun_breakpoints (); /* We may not find an inferior if this was a process exit. */ if (inf == NULL || inf->control.stop_soon == NO_STOP_QUIETLY) |