2001-06-01 Michael Snyder <msnyder@redhat.com>
authorMichael Snyder <msnyder@vmware.com>
Sat, 2 Jun 2001 00:36:20 +0000 (00:36 +0000)
committerMichael Snyder <msnyder@vmware.com>
Sat, 2 Jun 2001 00:36:20 +0000 (00:36 +0000)
* 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.

gdb/ChangeLog
gdb/breakpoint.c
gdb/gdbthread.h
gdb/infrun.c
gdb/thread.c

index c213315d4a2cb05e6c724e393c13fe7320e16f13..a737322f75f7ab3e21e7f5cf1a6d303f93912da3 100644 (file)
@@ -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.
index 4fffa53260ded8f8e300136652992c60b9c1f3d9..cb51a5559f536f1281950ec92ade1dfeab7aed9b 100644 (file)
@@ -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;
     }
 
index 7483a53eb4b4e50a20a216f240730a0030ca940e..0c6fb84b8cdcf28852ca37d6b593fd9f8845471e 100644 (file)
@@ -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);
index aa93cf56a02e0d76b36b3ea675210676624e2b5a..09cf494142d78992a9eca9d4899b5929b30228b3 100644 (file)
@@ -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:
index 70dcb3705b39ac1a8ed9c848c0bf15e59e7af392..7a942769134f37082fcefee121f01f0a2cb40fe1 100644 (file)
@@ -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)
 {
This page took 0.040257 seconds and 4 git commands to generate.