Fix crash when a variable object being deleted
[deliverable/binutils-gdb.git] / gdb / bsd-uthread.c
index 172192e4d22f5e1488315e031074d570d20aeb2f..3c8714ac5d9b2b47ea69ffaf88e41c3c5700b600 100644 (file)
@@ -6,7 +6,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdbcore.h"
@@ -268,7 +266,7 @@ bsd_uthread_mourn_inferior (void)
 static void
 bsd_uthread_fetch_registers (struct regcache *regcache, int regnum)
 {
-  struct gdbarch *gdbarch = current_gdbarch;
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
   CORE_ADDR addr = ptid_get_tid (inferior_ptid);
   CORE_ADDR active_addr;
@@ -294,7 +292,7 @@ bsd_uthread_fetch_registers (struct regcache *regcache, int regnum)
 static void
 bsd_uthread_store_registers (struct regcache *regcache, int regnum)
 {
-  struct gdbarch *gdbarch = current_gdbarch;
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
   struct bsd_uthread_ops *ops = gdbarch_data (gdbarch, bsd_uthread_data);
   CORE_ADDR addr = ptid_get_tid (inferior_ptid);
   CORE_ADDR active_addr;
@@ -337,6 +335,12 @@ bsd_uthread_wait (ptid_t ptid, struct target_waitstatus *status)
   /* Pass the request to the layer beneath.  */
   ptid = find_target_beneath (bsd_uthread_ops_hack)->to_wait (ptid, status);
 
+  /* If the process is no longer alive, there's no point in figuring
+     out the thread ID.  It will fail anyway.  */
+  if (status->kind == TARGET_WAITKIND_SIGNALLED
+      || status->kind == TARGET_WAITKIND_EXITED)
+    return ptid;
+
   /* Fetch the corresponding thread ID, and augment the returned
      process ID with it.  */
   addr = read_memory_typed_address (bsd_uthread_thread_run_addr,
This page took 0.024442 seconds and 4 git commands to generate.