]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Switch current_thread to lwp's thread in install_software_single_step_breakpoints
authorYao Qi <yao.qi@linaro.org>
Thu, 21 Jul 2016 11:12:18 +0000 (12:12 +0100)
committerYao Qi <yao.qi@linaro.org>
Thu, 21 Jul 2016 11:12:18 +0000 (12:12 +0100)
install_software_single_step_breakpoints has parameter lwp, but still
need to switch to current_thread.  In order to simplify its caller,
we do the current_thread save/restore inside install_software_single_step_breakpoints.

gdb/gdbserver:

2016-07-21  Yao Qi  <yao.qi@linaro.org>

* gdbthread.h (make_cleanup_restore_current_thread): Declare.
* inferiors.c (do_restore_current_thread_cleanup): New function.
(make_cleanup_restore_current_thread): Likewise.
* linux-low.c (install_software_single_step_breakpoints): Call
make_cleanup_restore_current_thread.  Switch current_thread to
thread.

gdb/gdbserver/ChangeLog
gdb/gdbserver/gdbthread.h
gdb/gdbserver/inferiors.c
gdb/gdbserver/linux-low.c

index b5e9c9630aec495adc605cff7c5e63960b459b3e..867a5a29f2f2a303d9bab0d702268ac6d30f45e5 100644 (file)
@@ -1,3 +1,12 @@
+2016-07-21  Yao Qi  <yao.qi@linaro.org>
+
+       * gdbthread.h (make_cleanup_restore_current_thread): Declare.
+       * inferiors.c (do_restore_current_thread_cleanup): New function.
+       (make_cleanup_restore_current_thread): Likewise.
+       * linux-low.c (install_software_single_step_breakpoints): Call
+       make_cleanup_restore_current_thread.  Switch current_thread to
+       thread.
+
 2016-07-21  Yao Qi  <yao.qi@linaro.org>
 
        * mem-break.c (struct reinsert_breakpoint) <ptid>: New field.
index 4dcb1b7a4ff08c8790ae937159075447cddf3ff6..d2326fb0590b3602148ced9a8396cb8952d11ba1 100644 (file)
@@ -87,4 +87,7 @@ struct thread_info *find_any_thread_of_pid (int pid);
 /* Get current thread ID (Linux task ID).  */
 #define current_ptid (current_thread->entry.id)
 
+/* Create a cleanup to restore current_thread.  */
+struct cleanup *make_cleanup_restore_current_thread (void);
+
 #endif /* GDB_THREAD_H */
index 1f5149ff4867a49b469b0e67bea6fa7173ce1afa..7888f3c18525682555acda2019361f3c06054122 100644 (file)
@@ -411,3 +411,15 @@ current_process (void)
   gdb_assert (current_thread != NULL);
   return get_thread_process (current_thread);
 }
+
+static void
+do_restore_current_thread_cleanup (void *arg)
+{
+  current_thread = (struct thread_info *) arg;
+}
+
+struct cleanup *
+make_cleanup_restore_current_thread (void)
+{
+  return make_cleanup (do_restore_current_thread_cleanup, current_thread);
+}
index c0b2ac09cdbb1d4507a9fc66fc84ebfeadec1d69..9c675a42611a905f10d2eadca41828c613fd41f2 100644 (file)
@@ -4202,10 +4202,14 @@ install_software_single_step_breakpoints (struct lwp_info *lwp)
 {
   int i;
   CORE_ADDR pc;
-  struct regcache *regcache = get_thread_regcache (current_thread, 1);
+  struct thread_info *thread = get_lwp_thread (lwp);
+  struct regcache *regcache = get_thread_regcache (thread, 1);
   VEC (CORE_ADDR) *next_pcs = NULL;
-  struct cleanup *old_chain = make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
+  struct cleanup *old_chain = make_cleanup_restore_current_thread ();
+
+  make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
 
+  current_thread = thread;
   next_pcs = (*the_low_target.get_next_pcs) (regcache);
 
   for (i = 0; VEC_iterate (CORE_ADDR, next_pcs, i, pc); ++i)