* rs6000-tdep.c (BL_MASK, BL_INSTRUCTION, BL_DISPLACEMENT_MASK):
[deliverable/binutils-gdb.git] / gdb / bsd-uthread.c
index 28d3d25de4d0e75b6c2ce8247b7802cdcbcc0135..a15c78f2158239c598ab15ea7b39af4dbe208a77 100644 (file)
@@ -1,12 +1,12 @@
 /* BSD user-level threads support.
 
-   Copyright 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdbcore.h"
@@ -266,15 +264,15 @@ bsd_uthread_mourn_inferior (void)
 }
 
 static void
-bsd_uthread_fetch_registers (int regnum)
+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;
 
   /* Always fetch the appropriate registers from the layer beneath.  */
-  find_target_beneath (bsd_uthread_ops_hack)->to_fetch_registers (regnum);
+  find_target_beneath (bsd_uthread_ops_hack)->to_fetch_registers (regcache, regnum);
 
   /* FIXME: That might have gotten us more than we asked for.  Make
      sure we overwrite all relevant registers with values from the
@@ -286,15 +284,15 @@ bsd_uthread_fetch_registers (int regnum)
   if (addr != 0 && addr != active_addr)
     {
       bsd_uthread_check_magic (addr);
-      ops->supply_uthread (current_regcache, regnum,
+      ops->supply_uthread (regcache, regnum,
                           addr + bsd_uthread_thread_ctx_offset);
     }
 }
 
 static void
-bsd_uthread_store_registers (int regnum)
+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;
@@ -304,14 +302,14 @@ bsd_uthread_store_registers (int regnum)
   if (addr != 0 && addr != active_addr)
     {
       bsd_uthread_check_magic (addr);
-      ops->collect_uthread (current_regcache, regnum,
+      ops->collect_uthread (regcache, regnum,
                            addr + bsd_uthread_thread_ctx_offset);
     }
   else
     {
       /* Updating the thread that is currently running; pass the
          request to the layer beneath.  */
-      find_target_beneath (bsd_uthread_ops_hack)->to_store_registers (regnum);
+      find_target_beneath (bsd_uthread_ops_hack)->to_store_registers (regcache, regnum);
     }
 }
 
@@ -320,8 +318,9 @@ bsd_uthread_store_registers (int regnum)
 
 static LONGEST
 bsd_uthread_xfer_partial (struct target_ops *ops, enum target_object object,
-                         const char *annex, void *readbuf,
-                         const void *writebuf, ULONGEST offset, LONGEST len)
+                         const char *annex, gdb_byte *readbuf,
+                         const gdb_byte *writebuf,
+                         ULONGEST offset, LONGEST len)
 {
   gdb_assert (ops->beneath->to_xfer_partial);
   return ops->beneath->to_xfer_partial (ops->beneath, object, annex, readbuf,
@@ -336,13 +335,19 @@ 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,
                                    builtin_type_void_data_ptr);
   if (addr != 0)
     {
-      char buf[4];
+      gdb_byte buf[4];
 
       /* FIXME: For executables linked statically with the threads
          library, we end up here before the program has actually been
@@ -361,7 +366,7 @@ bsd_uthread_wait (ptid_t ptid, struct target_waitstatus *status)
   if (ptid_get_tid (ptid) != 0 && !in_thread_list (ptid)
       && ptid_get_tid (inferior_ptid) == 0)
     {
-      add_thread (ptid);
+      add_thread_silent (ptid);
       inferior_ptid = ptid;
     }
 
@@ -468,11 +473,9 @@ bsd_uthread_pid_to_str (ptid_t ptid)
   if (ptid_get_tid (ptid) != 0)
     {
       static char buf[64];
-      int size;
 
-      size = snprintf (buf, sizeof buf, "process %d, thread 0x%lx",
-                      ptid_get_pid (ptid), ptid_get_tid (ptid));
-      gdb_assert (size < sizeof buf);
+      xsnprintf (buf, sizeof buf, "process %d, thread 0x%lx",
+                ptid_get_pid (ptid), ptid_get_tid (ptid));
       return buf;
     }
 
This page took 0.024484 seconds and 4 git commands to generate.