aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/thread-db.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/gdbserver/thread-db.c')
-rw-r--r--gdb/gdbserver/thread-db.c69
1 files changed, 33 insertions, 36 deletions
diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c
index adafb2c..936bb0f 100644
--- a/gdb/gdbserver/thread-db.c
+++ b/gdb/gdbserver/thread-db.c
@@ -35,14 +35,7 @@ static int thread_db_use_events;
#include <stdint.h>
-/* Structure that identifies the child process for the
- <proc_service.h> interface. */
-static struct ps_prochandle proc_handle;
-
-/* Connection to the libthread_db library. */
-static td_thragent_t *thread_agent;
-
-static int find_one_thread (int);
+static int find_one_thread (ptid_t);
static int find_new_threads_callback (const td_thrhandle_t *th_p, void *data);
static const char *
@@ -137,6 +130,7 @@ thread_db_create_event (CORE_ADDR where)
td_event_msg_t msg;
td_err_e err;
struct lwp_info *lwp;
+ struct process_info_private *proc = current_process()->private;
if (debug_threads)
fprintf (stderr, "Thread creation event.\n");
@@ -145,7 +139,7 @@ thread_db_create_event (CORE_ADDR where)
In the LinuxThreads implementation, this is safe,
because all events come from the manager thread
(except for its own creation, of course). */
- err = td_ta_event_getmsg (thread_agent, &msg);
+ err = td_ta_event_getmsg (proc->thread_agent, &msg);
if (err != TD_OK)
fprintf (stderr, "thread getmsg err: %s\n",
thread_db_err_str (err));
@@ -155,7 +149,7 @@ thread_db_create_event (CORE_ADDR where)
created threads. */
lwp = get_thread_lwp (current_inferior);
if (lwp->thread_known == 0)
- find_one_thread (lwpid_of (lwp));
+ find_one_thread (lwp->head.id);
/* msg.event == TD_EVENT_CREATE */
@@ -181,6 +175,7 @@ thread_db_enable_reporting ()
td_thr_events_t events;
td_notify_t notify;
td_err_e err;
+ struct process_info_private *proc = current_process()->private;
/* Set the process wide mask saying which events we're interested in. */
td_event_emptyset (&events);
@@ -192,7 +187,7 @@ thread_db_enable_reporting ()
td_event_addset (&events, TD_DEATH);
#endif
- err = td_ta_set_event (thread_agent, &events);
+ err = td_ta_set_event (proc->thread_agent, &events);
if (err != TD_OK)
{
warning ("Unable to set global thread event mask: %s",
@@ -201,7 +196,7 @@ thread_db_enable_reporting ()
}
/* Get address for thread creation breakpoint. */
- err = td_ta_event_addr (thread_agent, TD_CREATE, &notify);
+ err = td_ta_event_addr (proc->thread_agent, TD_CREATE, &notify);
if (err != TD_OK)
{
warning ("Unable to get location for thread creation breakpoint: %s",
@@ -216,7 +211,7 @@ thread_db_enable_reporting ()
with actual thread deaths (via wait). */
/* Get address for thread death breakpoint. */
- err = td_ta_event_addr (thread_agent, TD_DEATH, &notify);
+ err = td_ta_event_addr (proc->thread_agent, TD_DEATH, &notify);
if (err != TD_OK)
{
warning ("Unable to get location for thread death breakpoint: %s",
@@ -231,21 +226,23 @@ thread_db_enable_reporting ()
}
static int
-find_one_thread (int lwpid)
+find_one_thread (ptid_t ptid)
{
td_thrhandle_t th;
td_thrinfo_t ti;
td_err_e err;
struct thread_info *inferior;
struct lwp_info *lwp;
+ struct process_info_private *proc = current_process()->private;
+ int lwpid = ptid_get_lwp (ptid);
- inferior = (struct thread_info *) find_inferior_id (&all_threads, lwpid);
+ inferior = (struct thread_info *) find_inferior_id (&all_threads, ptid);
lwp = get_thread_lwp (inferior);
if (lwp->thread_known)
return 1;
/* Get information about this thread. */
- err = td_ta_map_lwp2thr (thread_agent, lwpid_of (lwp), &th);
+ err = td_ta_map_lwp2thr (proc->thread_agent, lwpid, &th);
if (err != TD_OK)
error ("Cannot get thread handle for LWP %d: %s",
lwpid, thread_db_err_str (err));
@@ -259,10 +256,10 @@ find_one_thread (int lwpid)
fprintf (stderr, "Found thread %ld (LWP %d)\n",
ti.ti_tid, ti.ti_lid);
- if (lwpid_of (lwp) != ti.ti_lid)
+ if (lwpid != ti.ti_lid)
{
warning ("PID mismatch! Expected %ld, got %ld",
- (long) lwpid_of (lwp), (long) ti.ti_lid);
+ (long) lwpid, (long) ti.ti_lid);
return 0;
}
@@ -289,29 +286,24 @@ static void
maybe_attach_thread (const td_thrhandle_t *th_p, td_thrinfo_t *ti_p)
{
td_err_e err;
- struct thread_info *inferior;
struct lwp_info *lwp;
- inferior = (struct thread_info *) find_inferior_id (&all_threads,
- ti_p->ti_lid);
- if (inferior != NULL)
+ lwp = find_lwp_pid (pid_to_ptid (ti_p->ti_lid));
+ if (lwp != NULL)
return;
if (debug_threads)
fprintf (stderr, "Attaching to thread %ld (LWP %d)\n",
ti_p->ti_tid, ti_p->ti_lid);
linux_attach_lwp (ti_p->ti_lid);
- inferior = (struct thread_info *) find_inferior_id (&all_threads,
- ti_p->ti_lid);
- if (inferior == NULL)
+ lwp = find_lwp_pid (pid_to_ptid (ti_p->ti_lid));
+ if (lwp == NULL)
{
warning ("Could not attach to thread %ld (LWP %d)\n",
ti_p->ti_tid, ti_p->ti_lid);
return;
}
- lwp = inferior_target_data (inferior);
-
lwp->thread_known = 1;
lwp->th = *th_p;
@@ -347,15 +339,18 @@ static void
thread_db_find_new_threads (void)
{
td_err_e err;
+ ptid_t ptid = ((struct inferior_list_entry *) current_inferior)->id;
+ struct process_info_private *proc = current_process()->private;
/* This function is only called when we first initialize thread_db.
First locate the initial thread. If it is not ready for
debugging yet, then stop. */
- if (find_one_thread (all_threads.head->id) == 0)
+ if (find_one_thread (ptid) == 0)
return;
/* Iterate over all user-space threads to discover new threads. */
- err = td_ta_thr_iter (thread_agent, find_new_threads_callback, NULL,
+ err = td_ta_thr_iter (proc->thread_agent,
+ find_new_threads_callback, NULL,
TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
if (err != TD_OK)
@@ -385,18 +380,22 @@ thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset,
psaddr_t addr;
td_err_e err;
struct lwp_info *lwp;
+ struct thread_info *saved_inferior;
lwp = get_thread_lwp (thread);
if (!lwp->thread_known)
- find_one_thread (lwpid_of (lwp));
+ find_one_thread (lwp->head.id);
if (!lwp->thread_known)
return TD_NOTHR;
+ saved_inferior = current_inferior;
+ current_inferior = thread;
/* Note the cast through uintptr_t: this interface only works if
a target address fits in a psaddr_t, which is a host pointer.
So a 32-bit debugger can not access 64-bit TLS through this. */
err = td_thr_tls_get_addr (&lwp->th, (psaddr_t) (uintptr_t) load_module,
offset, &addr);
+ current_inferior = saved_inferior;
if (err == TD_OK)
{
*address = (CORE_ADDR) (uintptr_t) addr;
@@ -413,6 +412,8 @@ int
thread_db_init (int use_events)
{
int err;
+ struct process_info *proc = current_process ();
+ struct process_info_private *priv = proc->private;
/* FIXME drow/2004-10-16: This is the "overall process ID", which
GNU/Linux calls tgid, "thread group ID". When we support
@@ -424,14 +425,10 @@ thread_db_init (int use_events)
This isn't the only place in gdbserver that assumes that the first
process in the list is the thread group leader. */
- proc_handle.pid = ((struct inferior_list_entry *)current_inferior)->id;
-
- /* Allow new symbol lookups. */
- all_symbols_looked_up = 0;
thread_db_use_events = use_events;
- err = td_ta_new (&proc_handle, &thread_agent);
+ err = td_ta_new (&priv->proc_handle, &priv->thread_agent);
switch (err)
{
case TD_NOLIBTHREAD:
@@ -445,7 +442,7 @@ thread_db_init (int use_events)
return 0;
thread_db_find_new_threads ();
thread_db_look_up_symbols ();
- all_symbols_looked_up = 1;
+ proc->all_symbols_looked_up = 1;
return 1;
default: