Index: gdb/gdbserver/thread-db.c |
diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c |
index 795f9267ddb379150300663c192448105f34bb91..e8d3481738f2941a89fcb9a4e5f8ef7f96fce2e5 100644 |
--- a/gdb/gdbserver/thread-db.c |
+++ b/gdb/gdbserver/thread-db.c |
@@ -1,5 +1,5 @@ |
/* Thread management interface, for the remote server for GDB. |
- Copyright (C) 2002, 2004-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2002-2013 Free Software Foundation, Inc. |
Contributed by MontaVista Software. |
@@ -28,6 +28,7 @@ static int thread_db_use_events; |
#include "gdb_proc_service.h" |
#include "gdb_thread_db.h" |
+#include "gdb_vecs.h" |
#ifndef USE_LIBTHREAD_DB_DIRECTLY |
#include <dlfcn.h> |
@@ -405,7 +406,7 @@ static void |
thread_db_find_new_threads (void) |
{ |
td_err_e err; |
- ptid_t ptid = ((struct inferior_list_entry *) current_inferior)->id; |
+ ptid_t ptid = current_ptid; |
struct thread_db *thread_db = current_process ()->private->thread_db; |
int loop, iteration; |
@@ -493,7 +494,7 @@ thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset, |
thread_db = proc->private->thread_db; |
/* If the thread layer is not (yet) initialized, fail. */ |
- if (!thread_db->all_symbols_looked_up) |
+ if (thread_db == NULL || !thread_db->all_symbols_looked_up) |
return TD_ERR; |
if (thread_db->td_thr_tls_get_addr_p == NULL) |
@@ -741,39 +742,31 @@ try_thread_db_load_from_dir (const char *dir, size_t dir_len) |
static int |
thread_db_load_search (void) |
{ |
- const char *search_path; |
- int rc = 0; |
+ VEC (char_ptr) *dir_vec; |
+ char *this_dir; |
+ int i, rc = 0; |
if (libthread_db_search_path == NULL) |
libthread_db_search_path = xstrdup (LIBTHREAD_DB_SEARCH_PATH); |
- search_path = libthread_db_search_path; |
- while (*search_path) |
+ dir_vec = dirnames_to_char_ptr_vec (libthread_db_search_path); |
+ |
+ for (i = 0; VEC_iterate (char_ptr, dir_vec, i, this_dir); ++i) |
{ |
- const char *end = strchr (search_path, ':'); |
- const char *this_dir = search_path; |
+ const int pdir_len = sizeof ("$pdir") - 1; |
size_t this_dir_len; |
- if (end) |
- { |
- this_dir_len = end - search_path; |
- search_path += this_dir_len + 1; |
- } |
- else |
- { |
- this_dir_len = strlen (this_dir); |
- search_path += this_dir_len; |
- } |
+ this_dir_len = strlen (this_dir); |
- if (this_dir_len == sizeof ("$pdir") - 1 |
- && strncmp (this_dir, "$pdir", this_dir_len) == 0) |
+ if (strncmp (this_dir, "$pdir", pdir_len) == 0 |
+ && (this_dir[pdir_len] == '\0' |
+ || this_dir[pdir_len] == '/')) |
{ |
/* We don't maintain a list of loaded libraries so we don't know |
where libpthread lives. We *could* fetch the info, but we don't |
do that yet. Ignore it. */ |
} |
- else if (this_dir_len == sizeof ("$sdir") - 1 |
- && strncmp (this_dir, "$sdir", this_dir_len) == 0) |
+ else if (strcmp (this_dir, "$sdir") == 0) |
{ |
if (try_thread_db_load_from_sdir ()) |
{ |
@@ -791,6 +784,7 @@ thread_db_load_search (void) |
} |
} |
+ free_char_ptr_vec (dir_vec); |
if (debug_threads) |
fprintf (stderr, "thread_db_load_search returning %d\n", rc); |
return rc; |