* dwarf2loc.c (dwarf_expr_frame_base): Error out on missing
[deliverable/binutils-gdb.git] / gdb / linux-thread-db.c
index 460e044c26ee379685c132378646064c843a21df..83632d060c543e147dcba236335a02aa633e84b6 100644 (file)
@@ -1,13 +1,13 @@
 /* libthread_db assisted debugging support, generic parts.
 
 /* libthread_db assisted debugging support, generic parts.
 
-   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007
+   Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2006, 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
    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,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    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 "defs.h"
 
 #define LIBTHREAD_DB_SO "libthread_db.so.1"
 #endif
 
 #define LIBTHREAD_DB_SO "libthread_db.so.1"
 #endif
 
+/* GNU/Linux libthread_db support.
+
+   libthread_db is a library, provided along with libpthread.so, which
+   exposes the internals of the thread library to a debugger.  It
+   allows GDB to find existing threads, new threads as they are
+   created, thread IDs (usually, the result of pthread_self), and
+   thread-local variables.
+
+   The libthread_db interface originates on Solaris, where it is
+   both more powerful and more complicated.  This implementation
+   only works for LinuxThreads and NPTL, the two glibc threading
+   libraries.  It assumes that each thread is permanently assigned
+   to a single light-weight process (LWP).
+
+   libthread_db-specific information is stored in the "private" field
+   of struct thread_info.  When the field is NULL we do not yet have
+   information about the new thread; this could be temporary (created,
+   but the thread library's data structures do not reflect it yet)
+   or permanent (created using clone instead of pthread_create).
+
+   Process IDs managed by linux-thread-db.c match those used by
+   linux-nat.c: a common PID for all processes, an LWP ID for each
+   thread, and no TID.  We save the TID in private.  Keeping it out
+   of the ptid_t prevents thread IDs changing when libpthread is
+   loaded or unloaded.  */
+
 /* If we're running on GNU/Linux, we must explicitly attach to any new
    threads.  */
 
 /* If we're running on GNU/Linux, we must explicitly attach to any new
    threads.  */
 
@@ -120,20 +144,8 @@ static CORE_ADDR td_death_bp_addr;
 /* Prototypes for local functions.  */
 static void thread_db_find_new_threads (void);
 static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
 /* Prototypes for local functions.  */
 static void thread_db_find_new_threads (void);
 static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
-                          const td_thrinfo_t *ti_p, int verbose);
-static void detach_thread (ptid_t ptid, int verbose);
-\f
-
-/* Building process ids.  */
-
-#define GET_PID(ptid)          ptid_get_pid (ptid)
-#define GET_LWP(ptid)          ptid_get_lwp (ptid)
-#define GET_THREAD(ptid)       ptid_get_tid (ptid)
-
-#define is_lwp(ptid)           (GET_LWP (ptid) != 0)
-#define is_thread(ptid)                (GET_THREAD (ptid) != 0)
-
-#define BUILD_LWP(lwp, pid)    ptid_build (pid, lwp, 0)
+                          const td_thrinfo_t *ti_p);
+static void detach_thread (ptid_t ptid);
 \f
 
 /* Use "struct private_thread_info" to cache thread state.  This is
 \f
 
 /* Use "struct private_thread_info" to cache thread state.  This is
@@ -145,11 +157,8 @@ struct private_thread_info
   unsigned int dying:1;
 
   /* Cached thread state.  */
   unsigned int dying:1;
 
   /* Cached thread state.  */
-  unsigned int th_valid:1;
-  unsigned int ti_valid:1;
-
   td_thrhandle_t th;
   td_thrhandle_t th;
-  td_thrinfo_t ti;
+  thread_t tid;
 };
 \f
 
 };
 \f
 
@@ -226,7 +235,7 @@ thread_db_err_str (td_err_e err)
 static int
 have_threads_callback (struct thread_info *thread, void *dummy)
 {
 static int
 have_threads_callback (struct thread_info *thread, void *dummy)
 {
-  return 1;
+  return thread->private != NULL;
 }
 
 static int
 }
 
 static int
@@ -259,7 +268,7 @@ thread_get_info_callback (const td_thrhandle_t *thp, void *infop)
           thread_db_err_str (err));
 
   /* Fill the cache.  */
           thread_db_err_str (err));
 
   /* Fill the cache.  */
-  thread_ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);
+  thread_ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, 0);
   thread_info = find_thread_pid (thread_ptid);
 
   /* In the case of a zombie thread, don't continue.  We don't want to
   thread_info = find_thread_pid (thread_ptid);
 
   /* In the case of a zombie thread, don't continue.  We don't want to
@@ -268,57 +277,22 @@ thread_get_info_callback (const td_thrhandle_t *thp, void *infop)
     {
       if (infop != NULL)
         *(struct thread_info **) infop = thread_info;
     {
       if (infop != NULL)
         *(struct thread_info **) infop = thread_info;
-      if (thread_info != NULL)
-       {
-         memcpy (&thread_info->private->th, thp, sizeof (*thp));
-         thread_info->private->th_valid = 1;
-         memcpy (&thread_info->private->ti, &ti, sizeof (ti));
-         thread_info->private->ti_valid = 1;
-       }
       return TD_THR_ZOMBIE;
     }
 
   if (thread_info == NULL)
     {
       /* New thread.  Attach to it now (why wait?).  */
       return TD_THR_ZOMBIE;
     }
 
   if (thread_info == NULL)
     {
       /* New thread.  Attach to it now (why wait?).  */
-      attach_thread (thread_ptid, thp, &ti, 1);
+      attach_thread (thread_ptid, thp, &ti);
       thread_info = find_thread_pid (thread_ptid);
       gdb_assert (thread_info != NULL);
     }
 
       thread_info = find_thread_pid (thread_ptid);
       gdb_assert (thread_info != NULL);
     }
 
-  memcpy (&thread_info->private->th, thp, sizeof (*thp));
-  thread_info->private->th_valid = 1;
-  memcpy (&thread_info->private->ti, &ti, sizeof (ti));
-  thread_info->private->ti_valid = 1;
-
   if (infop != NULL)
     *(struct thread_info **) infop = thread_info;
 
   return 0;
 }
   if (infop != NULL)
     *(struct thread_info **) infop = thread_info;
 
   return 0;
 }
-
-/* Accessor functions for the thread_db information, with caching.  */
-
-static void
-thread_db_map_id2thr (struct thread_info *thread_info, int fatal)
-{
-  td_err_e err;
-
-  if (thread_info->private->th_valid)
-    return;
-
-  err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (thread_info->ptid),
-                           &thread_info->private->th);
-  if (err != TD_OK)
-    {
-      if (fatal)
-       error (_("Cannot find thread %ld: %s"),
-              (long) GET_THREAD (thread_info->ptid),
-              thread_db_err_str (err));
-    }
-  else
-    thread_info->private->th_valid = 1;
-}
 \f
 /* Convert between user-level thread ids and LWP ids.  */
 
 \f
 /* Convert between user-level thread ids and LWP ids.  */
 
@@ -330,10 +304,9 @@ thread_from_lwp (ptid_t ptid)
   struct thread_info *thread_info;
   ptid_t thread_ptid;
 
   struct thread_info *thread_info;
   ptid_t thread_ptid;
 
-  if (GET_LWP (ptid) == 0)
-    ptid = BUILD_LWP (GET_PID (ptid), GET_PID (ptid));
-
-  gdb_assert (is_lwp (ptid));
+  /* This ptid comes from linux-nat.c, which should always fill in the
+     LWP.  */
+  gdb_assert (GET_LWP (ptid) != 0);
 
   err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
   if (err != TD_OK)
 
   err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
   if (err != TD_OK)
@@ -354,16 +327,8 @@ thread_from_lwp (ptid_t ptid)
       && thread_info == NULL)
     return pid_to_ptid (-1);
 
       && thread_info == NULL)
     return pid_to_ptid (-1);
 
-  gdb_assert (thread_info && thread_info->private->ti_valid);
-
-  return ptid_build (GET_PID (ptid), GET_LWP (ptid),
-                    thread_info->private->ti.ti_tid);
-}
-
-static ptid_t
-lwp_from_thread (ptid_t ptid)
-{
-  return BUILD_LWP (GET_LWP (ptid), GET_PID (ptid));
+  gdb_assert (ptid_get_tid (ptid) == 0);
+  return ptid;
 }
 \f
 
 }
 \f
 
@@ -610,8 +575,9 @@ check_for_thread_db (void)
        /* Paranoid - don't let a NULL path slip through.  */
        library = LIBTHREAD_DB_SO;
 
        /* Paranoid - don't let a NULL path slip through.  */
        library = LIBTHREAD_DB_SO;
 
-      printf_unfiltered (_("Using host libthread_db library \"%s\".\n"),
-                        library);
+      if (info_verbose)
+       printf_unfiltered (_("Using host libthread_db library \"%s\".\n"),
+                          library);
       already_loaded = 1;
     }
 
       already_loaded = 1;
     }
 
@@ -671,9 +637,10 @@ thread_db_new_objfile (struct objfile *objfile)
 
 static void
 attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
 
 static void
 attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
-              const td_thrinfo_t *ti_p, int verbose)
+              const td_thrinfo_t *ti_p)
 {
 {
-  struct thread_info *tp;
+  struct private_thread_info *private;
+  struct thread_info *tp = NULL;
   td_err_e err;
 
   /* If we're being called after a TD_CREATE event, we may already
   td_err_e err;
 
   /* If we're being called after a TD_CREATE event, we may already
@@ -691,10 +658,21 @@ attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
       tp = find_thread_pid (ptid);
       gdb_assert (tp != NULL);
 
       tp = find_thread_pid (ptid);
       gdb_assert (tp != NULL);
 
-      if (!tp->private->dying)
-        return;
+      /* If tp->private is NULL, then GDB is already attached to this
+        thread, but we do not know anything about it.  We can learn
+        about it here.  This can only happen if we have some other
+        way besides libthread_db to notice new threads (i.e.
+        PTRACE_EVENT_CLONE); assume the same mechanism notices thread
+        exit, so this can not be a stale thread recreated with the
+        same ID.  */
+      if (tp->private != NULL)
+       {
+         if (!tp->private->dying)
+           return;
 
 
-      delete_thread (ptid);
+         delete_thread (ptid);
+         tp = NULL;
+       }
     }
 
   check_thread_signals ();
     }
 
   check_thread_signals ();
@@ -703,16 +681,28 @@ attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
     return;                    /* A zombie thread -- do not attach.  */
 
   /* Under GNU/Linux, we have to attach to each and every thread.  */
     return;                    /* A zombie thread -- do not attach.  */
 
   /* Under GNU/Linux, we have to attach to each and every thread.  */
-  if (lin_lwp_attach_lwp (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0) < 0)
+  if (tp == NULL
+      && lin_lwp_attach_lwp (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid))) < 0)
     return;
 
     return;
 
-  /* Add the thread to GDB's thread list.  */
-  tp = add_thread (ptid);
-  tp->private = xmalloc (sizeof (struct private_thread_info));
-  memset (tp->private, 0, sizeof (struct private_thread_info));
+  /* Construct the thread's private data.  */
+  private = xmalloc (sizeof (struct private_thread_info));
+  memset (private, 0, sizeof (struct private_thread_info));
 
 
-  if (verbose)
-    printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid));
+  /* A thread ID of zero may mean the thread library has not initialized
+     yet.  But we shouldn't even get here if that's the case.  FIXME:
+     if we change GDB to always have at least one thread in the thread
+     list this will have to go somewhere else; maybe private == NULL
+     until the thread_db target claims it.  */
+  gdb_assert (ti_p->ti_tid != 0);
+  private->th = *th_p;
+  private->tid = ti_p->ti_tid;
+
+  /* Add the thread to GDB's thread list.  */
+  if (tp == NULL)
+    tp = add_thread_with_info (ptid, private);
+  else
+    tp->private = private;
 
   /* Enable thread event reporting for this thread.  */
   err = td_thr_event_enable_p (th_p, 1);
 
   /* Enable thread event reporting for this thread.  */
   err = td_thr_event_enable_p (th_p, 1);
@@ -722,22 +712,20 @@ attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
 }
 
 static void
 }
 
 static void
-detach_thread (ptid_t ptid, int verbose)
+detach_thread (ptid_t ptid)
 {
   struct thread_info *thread_info;
 
 {
   struct thread_info *thread_info;
 
-  if (verbose)
-    printf_unfiltered (_("[%s exited]\n"), target_pid_to_str (ptid));
-
   /* Don't delete the thread now, because it still reports as active
      until it has executed a few instructions after the event
      breakpoint - if we deleted it now, "info threads" would cause us
      to re-attach to it.  Just mark it as having had a TD_DEATH
      event.  This means that we won't delete it from our thread list
      until we notice that it's dead (via prune_threads), or until
   /* Don't delete the thread now, because it still reports as active
      until it has executed a few instructions after the event
      breakpoint - if we deleted it now, "info threads" would cause us
      to re-attach to it.  Just mark it as having had a TD_DEATH
      event.  This means that we won't delete it from our thread list
      until we notice that it's dead (via prune_threads), or until
-     something re-uses its thread ID.  */
+     something re-uses its thread ID.  We'll report the thread exit
+     when the underlying LWP dies.  */
   thread_info = find_thread_pid (ptid);
   thread_info = find_thread_pid (ptid);
-  gdb_assert (thread_info != NULL);
+  gdb_assert (thread_info != NULL && thread_info->private != NULL);
   thread_info->private->dying = 1;
 }
 
   thread_info->private->dying = 1;
 }
 
@@ -746,47 +734,12 @@ thread_db_detach (char *args, int from_tty)
 {
   disable_thread_event_reporting ();
 
 {
   disable_thread_event_reporting ();
 
-  /* There's no need to save & restore inferior_ptid here, since the
-     inferior is not supposed to survive this function call.  */
-  inferior_ptid = lwp_from_thread (inferior_ptid);
-
   target_beneath->to_detach (args, from_tty);
 
   /* Should this be done by detach_command?  */
   target_mourn_inferior ();
 }
 
   target_beneath->to_detach (args, from_tty);
 
   /* Should this be done by detach_command?  */
   target_mourn_inferior ();
 }
 
-static int
-clear_lwpid_callback (struct thread_info *thread, void *dummy)
-{
-  /* If we know that our thread implementation is 1-to-1, we could save
-     a certain amount of information; it's not clear how much, so we
-     are always conservative.  */
-
-  thread->private->th_valid = 0;
-  thread->private->ti_valid = 0;
-
-  return 0;
-}
-
-static void
-thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
-{
-  struct cleanup *old_chain = save_inferior_ptid ();
-
-  if (GET_PID (ptid) == -1)
-    inferior_ptid = lwp_from_thread (inferior_ptid);
-  else if (is_thread (ptid))
-    ptid = lwp_from_thread (ptid);
-
-  /* Clear cached data which may not be valid after the resume.  */
-  iterate_over_threads (clear_lwpid_callback, NULL);
-
-  target_beneath->to_resume (ptid, step, signo);
-
-  do_cleanups (old_chain);
-}
-
 /* Check if PID is currently stopped at the location of a thread event
    breakpoint location.  If it is, read the event message and act upon
    the event.  */
 /* Check if PID is currently stopped at the location of a thread event
    breakpoint location.  If it is, read the event message and act upon
    the event.  */
@@ -837,14 +790,14 @@ check_event (ptid_t ptid)
       if (err != TD_OK)
        error (_("Cannot get thread info: %s"), thread_db_err_str (err));
 
       if (err != TD_OK)
        error (_("Cannot get thread info: %s"), thread_db_err_str (err));
 
-      ptid = ptid_build (GET_PID (ptid), ti.ti_lid, ti.ti_tid);
+      ptid = ptid_build (GET_PID (ptid), ti.ti_lid, 0);
 
       switch (msg.event)
        {
        case TD_CREATE:
          /* Call attach_thread whether or not we already know about a
             thread with this thread ID.  */
 
       switch (msg.event)
        {
        case TD_CREATE:
          /* Call attach_thread whether or not we already know about a
             thread with this thread ID.  */
-         attach_thread (ptid, msg.th_p, &ti, 1);
+         attach_thread (ptid, msg.th_p, &ti);
 
          break;
 
 
          break;
 
@@ -853,7 +806,7 @@ check_event (ptid_t ptid)
          if (!in_thread_list (ptid))
            error (_("Spurious thread death event."));
 
          if (!in_thread_list (ptid))
            error (_("Spurious thread death event."));
 
-         detach_thread (ptid, 1);
+         detach_thread (ptid);
 
          break;
 
 
          break;
 
@@ -869,11 +822,11 @@ thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
 {
   extern ptid_t trap_ptid;
 
 {
   extern ptid_t trap_ptid;
 
-  if (GET_PID (ptid) != -1 && is_thread (ptid))
-    ptid = lwp_from_thread (ptid);
-
   ptid = target_beneath->to_wait (ptid, ourstatus);
 
   ptid = target_beneath->to_wait (ptid, ourstatus);
 
+  if (ourstatus->kind == TARGET_WAITKIND_IGNORE)
+    return ptid;
+
   if (ourstatus->kind == TARGET_WAITKIND_EXITED
     || ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
     return pid_to_ptid (-1);
   if (ourstatus->kind == TARGET_WAITKIND_EXITED
     || ourstatus->kind == TARGET_WAITKIND_SIGNALLED)
     return pid_to_ptid (-1);
@@ -916,15 +869,6 @@ thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
   return ptid;
 }
 
   return ptid;
 }
 
-static void
-thread_db_kill (void)
-{
-  /* There's no need to save & restore inferior_ptid here, since the
-     inferior isn't supposed to survive this function call.  */
-  inferior_ptid = lwp_from_thread (inferior_ptid);
-  target_beneath->to_kill ();
-}
-
 static void
 thread_db_mourn_inferior (void)
 {
 static void
 thread_db_mourn_inferior (void)
 {
@@ -943,12 +887,38 @@ thread_db_mourn_inferior (void)
   using_thread_db = 0;
 }
 
   using_thread_db = 0;
 }
 
+static int
+thread_db_can_async_p (void)
+{
+  return target_beneath->to_can_async_p ();
+}
+
+static int
+thread_db_is_async_p (void)
+{
+  return target_beneath->to_is_async_p ();
+}
+
+static void
+thread_db_async (void (*callback) (enum inferior_event_type event_type,
+                                  void *context), void *context)
+{
+  return target_beneath->to_async (callback, context);
+}
+
+static int
+thread_db_async_mask (int mask)
+{
+  return target_beneath->to_async_mask (mask);
+}
+
 static int
 find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
 {
   td_thrinfo_t ti;
   td_err_e err;
   ptid_t ptid;
 static int
 find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
 {
   td_thrinfo_t ti;
   td_err_e err;
   ptid_t ptid;
+  struct thread_info *tp;
 
   err = td_thr_get_info_p (th_p, &ti);
   if (err != TD_OK)
 
   err = td_thr_get_info_p (th_p, &ti);
   if (err != TD_OK)
@@ -958,7 +928,7 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
   if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
     return 0;                  /* A zombie -- ignore.  */
 
   if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
     return 0;                  /* A zombie -- ignore.  */
 
-  ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);
+  ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, 0);
 
   if (ti.ti_tid == 0)
     {
 
   if (ti.ti_tid == 0)
     {
@@ -976,8 +946,9 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
       return 0;
     }
 
       return 0;
     }
 
-  if (!in_thread_list (ptid))
-    attach_thread (ptid, th_p, &ti, 1);
+  tp = find_thread_pid (ptid);
+  if (tp == NULL || tp->private == NULL)
+    attach_thread (ptid, th_p, &ti);
 
   return 0;
 }
 
   return 0;
 }
@@ -998,18 +969,17 @@ thread_db_find_new_threads (void)
 static char *
 thread_db_pid_to_str (ptid_t ptid)
 {
 static char *
 thread_db_pid_to_str (ptid_t ptid)
 {
-  if (is_thread (ptid))
+  struct thread_info *thread_info = find_thread_pid (ptid);
+
+  if (thread_info != NULL && thread_info->private != NULL)
     {
       static char buf[64];
     {
       static char buf[64];
-      struct thread_info *thread_info;
+      thread_t tid;
 
 
+      tid = thread_info->private->tid;
       thread_info = find_thread_pid (ptid);
       thread_info = find_thread_pid (ptid);
-      if (thread_info == NULL)
-       snprintf (buf, sizeof (buf), "Thread 0x%lx (LWP %ld) (Missing)",
-                 GET_THREAD (ptid), GET_LWP (ptid));
-      else
-       snprintf (buf, sizeof (buf), "Thread 0x%lx (LWP %ld)",
-                 GET_THREAD (ptid), GET_LWP (ptid));
+      snprintf (buf, sizeof (buf), "Thread 0x%lx (LWP %ld)",
+               tid, GET_LWP (ptid));
 
       return buf;
     }
 
       return buf;
     }
@@ -1026,22 +996,15 @@ thread_db_pid_to_str (ptid_t ptid)
 static char *
 thread_db_extra_thread_info (struct thread_info *info)
 {
 static char *
 thread_db_extra_thread_info (struct thread_info *info)
 {
+  if (info->private == NULL)
+    return NULL;
+
   if (info->private->dying)
     return "Exiting";
 
   return NULL;
 }
 
   if (info->private->dying)
     return "Exiting";
 
   return NULL;
 }
 
-/* Return 1 if this thread has the same LWP as the passed PTID.  */
-
-static int
-same_ptid_callback (struct thread_info *thread, void *arg)
-{
-  ptid_t *ptid_p = arg;
-
-  return GET_LWP (thread->ptid) == GET_LWP (*ptid_p);
-}
-
 /* Get the address of the thread local variable in load module LM which
    is stored at OFFSET within the thread local storage for thread PTID.  */
 
 /* Get the address of the thread local variable in load module LM which
    is stored at OFFSET within the thread local storage for thread PTID.  */
 
@@ -1050,26 +1013,19 @@ thread_db_get_thread_local_address (ptid_t ptid,
                                    CORE_ADDR lm,
                                    CORE_ADDR offset)
 {
                                    CORE_ADDR lm,
                                    CORE_ADDR offset)
 {
+  struct thread_info *thread_info;
+
   /* If we have not discovered any threads yet, check now.  */
   /* If we have not discovered any threads yet, check now.  */
-  if (!is_thread (ptid) && !have_threads ())
+  if (!have_threads ())
     thread_db_find_new_threads ();
 
     thread_db_find_new_threads ();
 
-  /* Try to find a matching thread if we still have the LWP ID instead
-     of the thread ID.  */
-  if (!is_thread (ptid))
-    {
-      struct thread_info *thread;
-
-      thread = iterate_over_threads (same_ptid_callback, &ptid);
-      if (thread != NULL)
-       ptid = thread->ptid;
-    }
+  /* Find the matching thread.  */
+  thread_info = find_thread_pid (ptid);
 
 
-  if (is_thread (ptid))
+  if (thread_info != NULL && thread_info->private != NULL)
     {
       td_err_e err;
       void *address;
     {
       td_err_e err;
       void *address;
-      struct thread_info *thread_info;
 
       /* glibc doesn't provide the needed interface.  */
       if (!td_thr_tls_get_addr_p)
 
       /* glibc doesn't provide the needed interface.  */
       if (!td_thr_tls_get_addr_p)
@@ -1079,10 +1035,6 @@ thread_db_get_thread_local_address (ptid_t ptid,
       /* Caller should have verified that lm != 0.  */
       gdb_assert (lm != 0);
 
       /* Caller should have verified that lm != 0.  */
       gdb_assert (lm != 0);
 
-      /* Get info about the thread.  */
-      thread_info = find_thread_pid (ptid);
-      thread_db_map_id2thr (thread_info, 1);
-
       /* Finally, get the address of the variable.  */
       err = td_thr_tls_get_addr_p (&thread_info->private->th,
                                   (void *)(size_t) lm,
       /* Finally, get the address of the variable.  */
       err = td_thr_tls_get_addr_p (&thread_info->private->th,
                                   (void *)(size_t) lm,
@@ -1125,9 +1077,7 @@ init_thread_db_ops (void)
   thread_db_ops.to_longname = "multi-threaded child process.";
   thread_db_ops.to_doc = "Threads and pthreads support.";
   thread_db_ops.to_detach = thread_db_detach;
   thread_db_ops.to_longname = "multi-threaded child process.";
   thread_db_ops.to_doc = "Threads and pthreads support.";
   thread_db_ops.to_detach = thread_db_detach;
-  thread_db_ops.to_resume = thread_db_resume;
   thread_db_ops.to_wait = thread_db_wait;
   thread_db_ops.to_wait = thread_db_wait;
-  thread_db_ops.to_kill = thread_db_kill;
   thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
   thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
   thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
   thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
   thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
   thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
@@ -1136,6 +1086,10 @@ init_thread_db_ops (void)
   thread_db_ops.to_get_thread_local_address
     = thread_db_get_thread_local_address;
   thread_db_ops.to_extra_thread_info = thread_db_extra_thread_info;
   thread_db_ops.to_get_thread_local_address
     = thread_db_get_thread_local_address;
   thread_db_ops.to_extra_thread_info = thread_db_extra_thread_info;
+  thread_db_ops.to_can_async_p = thread_db_can_async_p;
+  thread_db_ops.to_is_async_p = thread_db_is_async_p;
+  thread_db_ops.to_async = thread_db_async;
+  thread_db_ops.to_async_mask = thread_db_async_mask;
   thread_db_ops.to_magic = OPS_MAGIC;
 }
 
   thread_db_ops.to_magic = OPS_MAGIC;
 }
 
This page took 0.116268 seconds and 4 git commands to generate.