diff options
author | Michael Snyder <msnyder@vmware.com> | 2001-06-02 00:36:20 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 2001-06-02 00:36:20 +0000 |
commit | 8601f500c85902a5ea5134cd9de8adf8bcd27c6b (patch) | |
tree | a209fbc25af500fb811ff25618eae29b1e789f51 | |
parent | c6ad9598d052bb904008464632ecb3f81b1c3094 (diff) | |
download | gdb-8601f500c85902a5ea5134cd9de8adf8bcd27c6b.zip gdb-8601f500c85902a5ea5134cd9de8adf8bcd27c6b.tar.gz gdb-8601f500c85902a5ea5134cd9de8adf8bcd27c6b.tar.bz2 |
2001-06-01 Michael Snyder <msnyder@redhat.com>
* thread.c (delete_step_resume_breakpoint): New function.
Maintain internal consistency of the thread list while deleting
a step_resume_breakpoint.
* gdbthread.h (delete_step_resume_breakpoint): Export.
* breakpoint.c (bpstat_find_step_resume_breakpoint):
Make thread-aware: don't return a step_resume_breakpoint
for the wrong thread.
* infrun.c (wait_for_inferior): Call delete_step_resume_breakpoint
instead of delete_breakpoint_current_contents.
(fetch_inferior_event): Ditto.
(handle_inferior_event): Call delete_step_resume_breakpoint
instead of delete_breakpoint.
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/breakpoint.c | 8 | ||||
-rw-r--r-- | gdb/gdbthread.h | 3 | ||||
-rw-r--r-- | gdb/infrun.c | 10 | ||||
-rw-r--r-- | gdb/thread.c | 17 |
5 files changed, 43 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c213315..a737322 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2001-06-01 Michael Snyder <msnyder@redhat.com> + * thread.c (delete_step_resume_breakpoint): New function. + Maintain internal consistency of the thread list while deleting + a step_resume_breakpoint. + * gdbthread.h (delete_step_resume_breakpoint): Export. + * breakpoint.c (bpstat_find_step_resume_breakpoint): + Make thread-aware: don't return a step_resume_breakpoint + for the wrong thread. + * infrun.c (wait_for_inferior): Call delete_step_resume_breakpoint + instead of delete_breakpoint_current_contents. + (fetch_inferior_event): Ditto. + (handle_inferior_event): Call delete_step_resume_breakpoint + instead of delete_breakpoint. * infrun.c (handle_inferior_event): After singlestepping over a thread-specific breakpoint, use currently_stepping() to decide whether to step or continue. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 4fffa53..cb51a55 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1719,13 +1719,19 @@ bpstat_find_breakpoint (bpstat bsp, struct breakpoint *breakpoint) struct breakpoint * bpstat_find_step_resume_breakpoint (bpstat bsp) { + int current_thread; + if (bsp == NULL) error ("Internal error (bpstat_find_step_resume_breakpoint)"); + current_thread = pid_to_thread_id (inferior_ptid); + for (; bsp != NULL; bsp = bsp->next) { if ((bsp->breakpoint_at != NULL) && - (bsp->breakpoint_at->type == bp_step_resume)) + (bsp->breakpoint_at->type == bp_step_resume) && + (bsp->breakpoint_at->thread == current_thread || + bsp->breakpoint_at->thread == -1)) return bsp->breakpoint_at; } diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h index 7483a53..0c6fb84 100644 --- a/gdb/gdbthread.h +++ b/gdb/gdbthread.h @@ -78,6 +78,9 @@ extern struct thread_info *add_thread (ptid_t ptid); /* Delete an existing thread list entry. */ extern void delete_thread (ptid_t); +/* Delete a step_resume_breakpoint from the thread database. */ +extern void delete_step_resume_breakpoint (void *); + /* Translate the integer thread id (GDB's homegrown id, not the system's) into a "pid" (which may be overloaded with extra thread information). */ extern ptid_t thread_id_to_pid (int); diff --git a/gdb/infrun.c b/gdb/infrun.c index aa93cf5..09cf494 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1277,7 +1277,7 @@ wait_for_inferior (void) struct execution_control_state ecss; struct execution_control_state *ecs; - old_cleanups = make_cleanup (delete_breakpoint_current_contents, + old_cleanups = make_cleanup (delete_step_resume_breakpoint, &step_resume_breakpoint); make_cleanup (delete_breakpoint_current_contents, &through_sigtramp_breakpoint); @@ -1341,7 +1341,7 @@ fetch_inferior_event (void *client_data) if (!async_ecs->wait_some_more) { - old_cleanups = make_exec_cleanup (delete_breakpoint_current_contents, + old_cleanups = make_exec_cleanup (delete_step_resume_breakpoint, &step_resume_breakpoint); make_exec_cleanup (delete_breakpoint_current_contents, &through_sigtramp_breakpoint); @@ -2362,8 +2362,7 @@ handle_inferior_event (struct execution_control_state *ecs) interferes with us */ if (step_resume_breakpoint != NULL) { - delete_breakpoint (step_resume_breakpoint); - step_resume_breakpoint = NULL; + delete_step_resume_breakpoint (&step_resume_breakpoint); } /* Not sure whether we need to blow this away too, but probably it is like the step-resume breakpoint. */ @@ -2461,8 +2460,7 @@ handle_inferior_event (struct execution_control_state *ecs) step_resume_breakpoint = bpstat_find_step_resume_breakpoint (stop_bpstat); } - delete_breakpoint (step_resume_breakpoint); - step_resume_breakpoint = NULL; + delete_step_resume_breakpoint (&step_resume_breakpoint); break; case BPSTAT_WHAT_THROUGH_SIGTRAMP: diff --git a/gdb/thread.c b/gdb/thread.c index 70dcb370..7a94276 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -65,6 +65,23 @@ static void restore_current_thread (ptid_t); static void switch_to_thread (ptid_t ptid); static void prune_threads (void); +void +delete_step_resume_breakpoint (void *arg) +{ + struct breakpoint **breakpointp = (struct breakpoint **) arg; + struct thread_info *tp; + + if (*breakpointp != NULL) + { + delete_breakpoint (*breakpointp); + for (tp = thread_list; tp; tp = tp->next) + if (tp->step_resume_breakpoint == *breakpointp) + tp->step_resume_breakpoint = NULL; + + *breakpointp = NULL; + } +} + static void free_thread (struct thread_info *tp) { |