gdbserver: use std::list for all_threads
authorSimon Marchi <simon.marchi@polymtl.ca>
Sat, 14 Oct 2017 13:11:12 +0000 (09:11 -0400)
committerSimon Marchi <simon.marchi@ericsson.com>
Sat, 14 Oct 2017 13:11:12 +0000 (09:11 -0400)
Remove the usage of inferior_list for the all_threads list in
gdbserver.  The entry field in thread_info is removed, and replaced by a
simple ptid field.

I added some functions to iterate (for_each_thread) and find threads
(find_thread).  However, changing all the users of find_inferior & co to
use these new functions would have made the patch way too big.  So I
opted instead to make find_inferior & co some shims, so that the
existing code only needs to be updated minimally.  We can then update
the existing code to use the new functions incrementally (I've started
to do the work, but I'll post it afterwards, see [1] if you want a peek).

This patch has been built-tested on all relevant platforms, except
lynx.  I also regtested using the native-gdbserver and
native-extended-gdbserver boards on x86.

[1] https://github.com/simark/binutils-gdb/commits/kill-inferior-list-entry

gdb/gdbserver/ChangeLog:

* inferiors.h: (struct inferior_list): Remove.
(struct inferior_list_entry); Remove.
(add_inferior_to_list, clear_inferior_list, one_inferior_p,
A_I_NEXT, ALL_INFERIORS_TYPE, ALL_INFERIORS, remove_inferior,
get_first_inferior): Remove.
(for_each_inferior, for_each_inferior_with_data, find_inferior,
find_inferior_id, find_inferior_in_random): Change signature.
* inferiors.c (all_threads): Change type to
std::list<thread_info *>.
(get_thread): Remove macro.
(find_inferior, find_inferior_id): Change signature, implement
using find_thread.
(find_inferior_in_random): Change signature, implement using
find_thread_in_random.
(for_each_inferior, for_each_inferior_with_data): Change
signature, implement using for_each_thread.
(add_inferior_to_list, remove_inferior): Remove.
(add_thread, get_first_thread, thread_of_pid,
find_any_thread_of_pid, free_one_thread, remove_thread): Update.
(get_first_inferior, one_inferior_p, clear_inferior_list):
Remove.
(clear_inferiors, get_thread_process): Update.
* gdbthread.h: Include <list>.
(struct thread_info) <entry>: Remove field.
<id>: New field.
(all_threads): Change type to std::list<thread_info *>.
(get_first_inferior): Add doc.
(find_thread, for_each_thread, find_thread_in_random): New
functions.
(current_ptid, pid_of, ptid_of, lwpid_of): Update.
* linux-arm-low.c (update_registers_callback): Update.
* linux-low.c (second_thread_of_pid_p): Update.
(kill_one_lwp_callback, linux_detach_lwp_callback,
delete_lwp_callback, status_pending_p_callback, same_lwp,
find_lwp_pid, num_lwps, iterate_over_lwps_filter,
iterate_over_lwps, not_stopped_callback,
resume_stopped_resumed_lwps, count_events_callback,
select_singlestep_lwp_callback, select_event_lwp_callback,
unsuspend_one_lwp, linux_wait_1, send_sigstop_callback,
suspend_and_send_sigstop_callback, wait_for_sigstop,
stuck_in_jump_pad_callback, move_out_of_jump_pad_callback,
lwp_running, linux_set_resume_request, resume_status_pending_p,
need_step_over_p, start_step_over, linux_resume_one_thread,
proceed_one_lwp, unsuspend_and_proceed_one_lwp,
reset_lwp_ptrace_options_callback): Update.
* linux-mips-low.c (update_watch_registers_callback): Update.
* regcache.c (regcache_invalidate_one, regcache_invalidate):
Update.
(free_register_cache_thread_one): Remove.
(regcache_release): Update.
* server.c (handle_btrace_enable_bts, handle_btrace_enable_pt,
handle_qxfer_threads_worker): Update.
(handle_query): Update, use list iterator.
(visit_actioned_threads, handle_pending_status,
queue_stop_reply_callback, gdb_wants_all_threads_stopped,
clear_pending_status_callback, set_pending_status_callback,
find_status_pending_thread_callback, handle_status,
process_serial_event): Update.
* target.c (thread_search_callback): Update.
* thread-db.c (thread_db_get_tls_address): Update.
* tracepoint.c (tracepoint_finished_step, tracepoint_was_hit):
Update.
* win32-i386-low.c (update_debug_registers_callback): Update.
* win32-low.c (delete_thread_info, child_delete_thread,
continue_one_thread, suspend_one_thread,
get_child_debug_event): Adjust.

15 files changed:
gdb/gdbserver/ChangeLog
gdb/gdbserver/gdbthread.h
gdb/gdbserver/inferiors.c
gdb/gdbserver/inferiors.h
gdb/gdbserver/linux-arm-low.c
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-mips-low.c
gdb/gdbserver/lynx-low.c
gdb/gdbserver/regcache.c
gdb/gdbserver/server.c
gdb/gdbserver/target.c
gdb/gdbserver/thread-db.c
gdb/gdbserver/tracepoint.c
gdb/gdbserver/win32-i386-low.c
gdb/gdbserver/win32-low.c

index e661c96d3101ceff013b8c3558c7544374825a16..1b09101419b147ecfdbd0236798c16b5e4658bab 100644 (file)
@@ -1,3 +1,72 @@
+2017-10-14  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * inferiors.h: (struct inferior_list): Remove.
+       (struct inferior_list_entry); Remove.
+       (add_inferior_to_list, clear_inferior_list, one_inferior_p,
+       A_I_NEXT, ALL_INFERIORS_TYPE, ALL_INFERIORS, remove_inferior,
+       get_first_inferior): Remove.
+       (for_each_inferior, for_each_inferior_with_data, find_inferior,
+       find_inferior_id, find_inferior_in_random): Change signature.
+       * inferiors.c (all_threads): Change type to
+       std::list<thread_info *>.
+       (get_thread): Remove macro.
+       (find_inferior, find_inferior_id): Change signature, implement
+       using find_thread.
+       (find_inferior_in_random): Change signature, implement using
+       find_thread_in_random.
+       (for_each_inferior, for_each_inferior_with_data): Change
+       signature, implement using for_each_thread.
+       (add_inferior_to_list, remove_inferior): Remove.
+       (add_thread, get_first_thread, thread_of_pid,
+       find_any_thread_of_pid, free_one_thread, remove_thread): Update.
+       (get_first_inferior, one_inferior_p, clear_inferior_list):
+       Remove.
+       (clear_inferiors, get_thread_process): Update.
+       * gdbthread.h: Include <list>.
+       (struct thread_info) <entry>: Remove field.
+       <id>: New field.
+       (all_threads): Change type to std::list<thread_info *>.
+       (get_first_inferior): Add doc.
+       (find_thread, for_each_thread, find_thread_in_random): New
+       functions.
+       (current_ptid, pid_of, ptid_of, lwpid_of): Update.
+       * linux-arm-low.c (update_registers_callback): Update.
+       * linux-low.c (second_thread_of_pid_p): Update.
+       (kill_one_lwp_callback, linux_detach_lwp_callback,
+       delete_lwp_callback, status_pending_p_callback, same_lwp,
+       find_lwp_pid, num_lwps, iterate_over_lwps_filter,
+       iterate_over_lwps, not_stopped_callback,
+       resume_stopped_resumed_lwps, count_events_callback,
+       select_singlestep_lwp_callback, select_event_lwp_callback,
+       unsuspend_one_lwp, linux_wait_1, send_sigstop_callback,
+       suspend_and_send_sigstop_callback, wait_for_sigstop,
+       stuck_in_jump_pad_callback, move_out_of_jump_pad_callback,
+       lwp_running, linux_set_resume_request, resume_status_pending_p,
+       need_step_over_p, start_step_over, linux_resume_one_thread,
+       proceed_one_lwp, unsuspend_and_proceed_one_lwp,
+       reset_lwp_ptrace_options_callback): Update.
+       * linux-mips-low.c (update_watch_registers_callback): Update.
+       * regcache.c (regcache_invalidate_one, regcache_invalidate):
+       Update.
+       (free_register_cache_thread_one): Remove.
+       (regcache_release): Update.
+       * server.c (handle_btrace_enable_bts, handle_btrace_enable_pt,
+       handle_qxfer_threads_worker): Update.
+       (handle_query): Update, use list iterator.
+       (visit_actioned_threads, handle_pending_status,
+       queue_stop_reply_callback, gdb_wants_all_threads_stopped,
+       clear_pending_status_callback, set_pending_status_callback,
+       find_status_pending_thread_callback, handle_status,
+       process_serial_event): Update.
+       * target.c (thread_search_callback): Update.
+       * thread-db.c (thread_db_get_tls_address): Update.
+       * tracepoint.c (tracepoint_finished_step, tracepoint_was_hit):
+       Update.
+       * win32-i386-low.c (update_debug_registers_callback): Update.
+       * win32-low.c (delete_thread_info, child_delete_thread,
+       continue_one_thread, suspend_one_thread,
+       get_child_debug_event): Adjust.
+
 2017-10-14  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * gdbthread.h (ptid_of, pid_of, lwpid_of): New functions.
index 93688a36e4f80a6d6a73a95b6b82388a9c76607b..8ace051036d4b1e3a3502e110090757bc95fb25d 100644 (file)
 #include "common-gdbthread.h"
 #include "inferiors.h"
 
+#include <list>
+
 struct btrace_target_info;
 struct regcache;
 
 struct thread_info
 {
-  /* This must appear first.  See inferiors.h.
-     The list iterator functions assume it.  */
-  struct inferior_list_entry entry;
+  /* The id of this thread.  */
+  ptid_t id;
 
   void *target_data;
   struct regcache *regcache_data;
@@ -72,11 +73,13 @@ struct thread_info
   struct btrace_target_info *btrace;
 };
 
-extern struct inferior_list all_threads;
+extern std::list<thread_info *> all_threads;
 
 void remove_thread (struct thread_info *thread);
 struct thread_info *add_thread (ptid_t ptid, void *target_data);
 
+/* Return a pointer to the first thread, or NULL if there isn't one.  */
+
 struct thread_info *get_first_thread (void);
 
 struct thread_info *find_thread_ptid (ptid_t ptid);
@@ -85,15 +88,87 @@ struct thread_info *find_thread_ptid (ptid_t ptid);
    found.  */
 struct thread_info *find_any_thread_of_pid (int pid);
 
+/* Find the first thread for which FUNC returns true.  Return NULL if no thread
+   satisfying FUNC is found.  */
+
+template <typename Func>
+static thread_info *
+find_thread (Func func)
+{
+  std::list<thread_info *>::iterator next, cur = all_threads.begin ();
+
+  while (cur != all_threads.end ())
+    {
+      next = cur;
+      next++;
+
+      if (func (*cur))
+       return *cur;
+
+      cur = next;
+    }
+
+  return NULL;
+}
+
+/* Invoke FUNC for each thread.  */
+
+template <typename Func>
+static void
+for_each_thread (Func func)
+{
+  std::list<thread_info *>::iterator next, cur = all_threads.begin ();
+
+  while (cur != all_threads.end ())
+    {
+      next = cur;
+      next++;
+      func (*cur);
+      cur = next;
+    }
+}
+
+/* Find the a random thread for which FUNC (THREAD) returns true.  If
+   no entry is found then return NULL.  */
+
+template <typename Func>
+static thread_info *
+find_thread_in_random (Func func)
+{
+  int count = 0;
+  int random_selector;
+
+  /* First count how many interesting entries we have.  */
+  for_each_thread ([&] (thread_info *thread) {
+    if (func (thread))
+      count++;
+  });
+
+  if (count == 0)
+    return NULL;
+
+  /* Now randomly pick an entry out of those.  */
+  random_selector = (int)
+    ((count * (double) rand ()) / (RAND_MAX + 1.0));
+
+  thread_info *thread = find_thread ([&] (thread_info *thread) {
+    return func (thread) && (random_selector-- == 0);
+  });
+
+  gdb_assert (thread != NULL);
+
+  return thread;
+}
+
 /* Get current thread ID (Linux task ID).  */
-#define current_ptid (current_thread->entry.id)
+#define current_ptid (current_thread->id)
 
 /* Get the ptid of THREAD.  */
 
 static inline ptid_t
 ptid_of (const thread_info *thread)
 {
-  return thread->entry.id;
+  return thread->id;
 }
 
 /* Get the pid of THREAD.  */
@@ -101,7 +176,7 @@ ptid_of (const thread_info *thread)
 static inline int
 pid_of (const thread_info *thread)
 {
-  return thread->entry.id.pid ();
+  return thread->id.pid ();
 }
 
 /* Get the lwp of THREAD.  */
@@ -109,7 +184,7 @@ pid_of (const thread_info *thread)
 static inline long
 lwpid_of (const thread_info *thread)
 {
-  return thread->entry.id.lwp ();
+  return thread->id.lwp ();
 }
 
 /* Create a cleanup to restore current_thread.  */
index 13ee8c97eba50dbd53f9dfa53fc760fc59746857..564121fdd995cbfa29c79db612484fb013474ef1 100644 (file)
 #include "dll.h"
 
 std::list<process_info *> all_processes;
-struct inferior_list all_threads;
+std::list<thread_info *> all_threads;
 
 struct thread_info *current_thread;
 
-#define get_thread(inf) ((struct thread_info *)(inf))
-
 /* The current working directory used to start the inferior.  */
 static const char *current_inferior_cwd = NULL;
 
-void
-add_inferior_to_list (struct inferior_list *list,
-                     struct inferior_list_entry *new_inferior)
+thread_info *
+find_inferior (std::list<thread_info *> *thread_list,
+              int (*func) (thread_info *, void *),
+              void *arg)
 {
-  new_inferior->next = NULL;
-  if (list->tail != NULL)
-    list->tail->next = new_inferior;
-  else
-    list->head = new_inferior;
-  list->tail = new_inferior;
-}
+  gdb_assert (thread_list == &all_threads);
 
-/* Invoke ACTION for each inferior in LIST.  */
+  return find_thread ([&] (thread_info *thread) {
+    return func (thread, arg);
+  });
+}
 
-void
-for_each_inferior (struct inferior_list *list,
-                  void (*action) (struct inferior_list_entry *))
+thread_info *
+find_inferior_id (std::list<thread_info *> *thread_list, ptid_t id)
 {
-  struct inferior_list_entry *cur = list->head, *next;
-
-  while (cur != NULL)
-    {
-      next = cur->next;
-      (*action) (cur);
-      cur = next;
-    }
-}
+  gdb_assert (thread_list == &all_threads);
 
-/* Invoke ACTION for each inferior in LIST, passing DATA to ACTION.  */
+  return find_thread ([&] (thread_info *thread) {
+    return thread->id == id;
+  });
+}
 
-void
-for_each_inferior_with_data (struct inferior_list *list,
-                            void (*action) (struct inferior_list_entry *,
-                                            void *),
-                            void *data)
+thread_info *
+find_inferior_in_random (std::list<thread_info *> *thread_list,
+                        int (*func) (thread_info *, void *),
+                        void *arg)
 {
-  struct inferior_list_entry *cur = list->head, *next;
-
-  while (cur != NULL)
-    {
-      next = cur->next;
-      (*action) (cur, data);
-      cur = next;
-    }
+  gdb_assert (thread_list == &all_threads);
+
+  return find_thread_in_random ([&] (thread_info *thread) {
+    return func (thread, arg);
+  });
 }
 
 void
-remove_inferior (struct inferior_list *list,
-                struct inferior_list_entry *entry)
+for_each_inferior (std::list<thread_info *> *thread_list,
+                  void (*action) (thread_info *))
 {
-  struct inferior_list_entry **cur;
-
-  if (list->head == entry)
-    {
-      list->head = entry->next;
-      if (list->tail == entry)
-       list->tail = list->head;
-      return;
-    }
+  gdb_assert (thread_list == &all_threads);
 
-  cur = &list->head;
-  while (*cur && (*cur)->next != entry)
-    cur = &(*cur)->next;
-
-  if (*cur == NULL)
-    return;
+  for_each_thread ([&] (thread_info *thread) {
+    action (thread);
+  });
+}
 
-  (*cur)->next = entry->next;
+void
+for_each_inferior_with_data (std::list<thread_info *> *thread_list,
+                            void (*action) (thread_info *, void *),
+                            void *data)
+{
+  gdb_assert (thread_list == &all_threads);
 
-  if (list->tail == entry)
-    list->tail = *cur;
+  for_each_thread ([&] (thread_info *thread) {
+    action (thread, data);
+  });
 }
 
 struct thread_info *
@@ -110,11 +92,11 @@ add_thread (ptid_t thread_id, void *target_data)
 {
   struct thread_info *new_thread = XCNEW (struct thread_info);
 
-  new_thread->entry.id = thread_id;
+  new_thread->id = thread_id;
   new_thread->last_resume_kind = resume_continue;
   new_thread->last_status.kind = TARGET_WAITKIND_IGNORE;
 
-  add_inferior_to_list (&all_threads, &new_thread->entry);
+  all_threads.push_back (new_thread);
 
   if (current_thread == NULL)
     current_thread = new_thread;
@@ -124,12 +106,15 @@ add_thread (ptid_t thread_id, void *target_data)
   return new_thread;
 }
 
-/* Wrapper around get_first_inferior to return a struct thread_info *.  */
+/* See gdbthread.h.  */
 
 struct thread_info *
 get_first_thread (void)
 {
-  return (struct thread_info *) get_first_inferior (&all_threads);
+  if (!all_threads.empty ())
+    return all_threads.front ();
+  else
+    return NULL;
 }
 
 struct thread_info *
@@ -151,7 +136,7 @@ find_thread_process (const struct process_info *const process)
    matches a PID.  */
 
 static int
-thread_of_pid (struct inferior_list_entry *entry, void *pid_p)
+thread_of_pid (thread_info *entry, void *pid_p)
 {
   int pid = *(int *) pid_p;
 
@@ -163,17 +148,12 @@ thread_of_pid (struct inferior_list_entry *entry, void *pid_p)
 struct thread_info *
 find_any_thread_of_pid (int pid)
 {
-  struct inferior_list_entry *entry;
-
-  entry = find_inferior (&all_threads, thread_of_pid, &pid);
-
-  return (struct thread_info *) entry;
+  return find_inferior (&all_threads, thread_of_pid, &pid);
 }
 
 static void
-free_one_thread (struct inferior_list_entry *inf)
+free_one_thread (thread_info *thread)
 {
-  struct thread_info *thread = get_thread (inf);
   free_register_cache (thread_regcache_data (thread));
   free (thread);
 }
@@ -185,106 +165,12 @@ remove_thread (struct thread_info *thread)
     target_disable_btrace (thread->btrace);
 
   discard_queued_stop_replies (ptid_of (thread));
-  remove_inferior (&all_threads, (struct inferior_list_entry *) thread);
-  free_one_thread (&thread->entry);
+  all_threads.remove (thread);
+  free_one_thread (thread);
   if (current_thread == thread)
     current_thread = NULL;
 }
 
-/* Return a pointer to the first inferior in LIST, or NULL if there isn't one.
-   This is for cases where the caller needs a thread, but doesn't care
-   which one.  */
-
-struct inferior_list_entry *
-get_first_inferior (struct inferior_list *list)
-{
-  if (list->head != NULL)
-    return list->head;
-  return NULL;
-}
-
-/* Find the first inferior_list_entry E in LIST for which FUNC (E, ARG)
-   returns non-zero.  If no entry is found then return NULL.  */
-
-struct inferior_list_entry *
-find_inferior (struct inferior_list *list,
-              int (*func) (struct inferior_list_entry *, void *), void *arg)
-{
-  struct inferior_list_entry *inf = list->head;
-
-  while (inf != NULL)
-    {
-      struct inferior_list_entry *next;
-
-      next = inf->next;
-      if ((*func) (inf, arg))
-       return inf;
-      inf = next;
-    }
-
-  return NULL;
-}
-
-/* Find the random inferior_list_entry E in LIST for which FUNC (E, ARG)
-   returns non-zero.  If no entry is found then return NULL.  */
-
-struct inferior_list_entry *
-find_inferior_in_random (struct inferior_list *list,
-                        int (*func) (struct inferior_list_entry *, void *),
-                        void *arg)
-{
-  struct inferior_list_entry *inf = list->head;
-  int count = 0;
-  int random_selector;
-
-  /* First count how many interesting entries we have.  */
-  while (inf != NULL)
-    {
-      struct inferior_list_entry *next;
-
-      next = inf->next;
-      if ((*func) (inf, arg))
-       count++;
-      inf = next;
-    }
-
-  if (count == 0)
-    return NULL;
-
-  /* Now randomly pick an entry out of those.  */
-  random_selector = (int)
-    ((count * (double) rand ()) / (RAND_MAX + 1.0));
-
-  inf = list->head;
-  while (inf != NULL)
-    {
-      struct inferior_list_entry *next;
-
-      next = inf->next;
-      if ((*func) (inf, arg) && (random_selector-- == 0))
-       return inf;
-      inf = next;
-    }
-
-  gdb_assert_not_reached ("failed to find an inferior in random.");
-  return NULL;
-}
-
-struct inferior_list_entry *
-find_inferior_id (struct inferior_list *list, ptid_t id)
-{
-  struct inferior_list_entry *inf = list->head;
-
-  while (inf != NULL)
-    {
-      if (ptid_equal (inf->id, id))
-       return inf;
-      inf = inf->next;
-    }
-
-  return NULL;
-}
-
 void *
 thread_target_data (struct thread_info *thread)
 {
@@ -303,28 +189,11 @@ set_thread_regcache_data (struct thread_info *thread, struct regcache *data)
   thread->regcache_data = data;
 }
 
-/* Return true if LIST has exactly one entry.  */
-
-int
-one_inferior_p (struct inferior_list *list)
-{
-  return list->head != NULL && list->head == list->tail;
-}
-
-/* Reset head,tail of LIST, assuming all entries have already been freed.  */
-
-void
-clear_inferior_list (struct inferior_list *list)
-{
-  list->head = NULL;
-  list->tail = NULL;
-}
-
 void
 clear_inferiors (void)
 {
   for_each_inferior (&all_threads, free_one_thread);
-  clear_inferior_list (&all_threads);
+  all_threads.clear ();
 
   clear_dlls ();
 
@@ -402,8 +271,7 @@ have_attached_inferiors_p (void)
 struct process_info *
 get_thread_process (const struct thread_info *thread)
 {
-  int pid = ptid_get_pid (thread->entry.id);
-  return find_process_pid (pid);
+  return find_process_pid (thread->id.pid ());
 }
 
 struct process_info *
index 674b8c6dcb6377937610cdc92f4df7de8225fb32..fb0e2fda81fc634c1ee19b7cf1b03a39f331c580 100644 (file)
 #include "gdb_vecs.h"
 #include <list>
 
-/* Generic information for tracking a list of ``inferiors'' - threads,
-   processes, etc.  */
-struct inferior_list
-{
-  struct inferior_list_entry *head;
-  struct inferior_list_entry *tail;
-};
-struct inferior_list_entry
-{
-  ptid_t id;
-  struct inferior_list_entry *next;
-};
-
 struct thread_info;
 struct regcache;
 struct target_desc;
@@ -96,38 +83,6 @@ struct process_info *get_thread_process (const struct thread_info *);
 
 extern std::list<process_info *> all_processes;
 
-void add_inferior_to_list (struct inferior_list *list,
-                          struct inferior_list_entry *new_inferior);
-void for_each_inferior (struct inferior_list *list,
-                       void (*action) (struct inferior_list_entry *));
-
-void for_each_inferior_with_data
-  (struct inferior_list *list,
-   void (*action) (struct inferior_list_entry *, void *),
-   void *data);
-
-void clear_inferior_list (struct inferior_list *list);
-
-int one_inferior_p (struct inferior_list *list);
-
-/* Helper for ALL_INFERIORS_TYPE.  Gets the next element starting at
-   CUR, if CUR is not NULL.  */
-#define A_I_NEXT(type, list, cur)                                      \
-  ((cur) != NULL                                                       \
-   ? (type *) ((struct inferior_list_entry *) cur)->next               \
-   : NULL)
-
-/* Iterate over all inferiors of type TYPE in LIST, open loop
-   style.  */
-#define ALL_INFERIORS_TYPE(type, list, cur, tmp)                               \
-  for ((cur) = (type *) (list)->head, (tmp) = A_I_NEXT (type, list, cur); \
-       (cur) != NULL;                                                  \
-       (cur) = (tmp), (tmp) = A_I_NEXT (type, list, cur))
-
-/* Iterate over all inferiors in LIST, open loop style.  */
-#define ALL_INFERIORS(list, cur, tmp)                          \
-  ALL_INFERIORS_TYPE (struct inferior_list_entry, list, cur, tmp)
-
 /* Invoke FUNC for each process.  */
 
 template <typename Func>
@@ -169,10 +124,6 @@ find_process (Func func)
 }
 
 extern struct thread_info *current_thread;
-void remove_inferior (struct inferior_list *list,
-                     struct inferior_list_entry *entry);
-
-struct inferior_list_entry *get_first_inferior (struct inferior_list *list);
 
 /* Return the first process in the processes list.  */
 struct process_info *get_first_process (void);
@@ -184,18 +135,19 @@ int have_started_inferiors_p (void);
 int have_attached_inferiors_p (void);
 
 void clear_inferiors (void);
-struct inferior_list_entry *find_inferior
-     (struct inferior_list *,
-      int (*func) (struct inferior_list_entry *,
-                  void *),
-      void *arg);
-struct inferior_list_entry *find_inferior_id (struct inferior_list *list,
-                                             ptid_t id);
-struct inferior_list_entry *
-  find_inferior_in_random (struct inferior_list *,
-                          int (*func) (struct inferior_list_entry *,
-                                       void *),
-                          void *arg);
+
+thread_info *find_inferior (std::list<thread_info *> *thread_list,
+                           int (*func) (thread_info *, void *), void *arg);
+thread_info *find_inferior_id (std::list<thread_info *> *thread_list,
+                              ptid_t id);
+thread_info *find_inferior_in_random (std::list<thread_info *> *thread_list,
+                                     int (*func) (thread_info *, void *),
+                                     void *arg);
+void for_each_inferior (std::list<thread_info *> *thread_list,
+                       void (*action) (thread_info *));
+void for_each_inferior_with_data (std::list<thread_info *> *thread_list,
+                                 void (*action) (thread_info *, void *),
+                                 void *data);
 
 void *thread_target_data (struct thread_info *);
 struct regcache *thread_regcache_data (struct thread_info *);
index 952e0b2300f064e3a81468ab158e4294de11f6cd..3fddec61d1f6edd44559318fef411ee2e06a4b5e 100644 (file)
@@ -467,9 +467,8 @@ struct update_registers_data
 };
 
 static int
-update_registers_callback (struct inferior_list_entry *entry, void *arg)
+update_registers_callback (thread_info *thread, void *arg)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   struct update_registers_data *data = (struct update_registers_data *) arg;
 
index 6dc8b535b938d069feeff1d9a9498bccdb713cf8..0b93fa20c09858d0dce6b3b2434cfcddcbd43688 100644 (file)
@@ -279,7 +279,7 @@ static void enqueue_pending_signal (struct lwp_info *lwp, int signal, siginfo_t
 static void complete_ongoing_step_over (void);
 static int linux_low_ptrace_options (int attached);
 static int check_ptrace_stopped_lwp_gone (struct lwp_info *lp);
-static int proceed_one_lwp (struct inferior_list_entry *entry, void *except);
+static int proceed_one_lwp (thread_info *thread, void *except);
 
 /* When the event-loop is doing a step-over, this points at the thread
    being stepped.  */
@@ -1248,11 +1248,11 @@ struct counter
 };
 
 static int
-second_thread_of_pid_p (struct inferior_list_entry *entry, void *args)
+second_thread_of_pid_p (thread_info *thread, void *args)
 {
   struct counter *counter = (struct counter *) args;
 
-  if (ptid_get_pid (entry->id) == counter->pid)
+  if (thread->id.pid () == counter->pid)
     {
       if (++counter->count > 1)
        return 1;
@@ -1361,13 +1361,12 @@ kill_wait_lwp (struct lwp_info *lwp)
    except the leader.  */
 
 static int
-kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
+kill_one_lwp_callback (thread_info *thread, void *args)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int pid = * (int *) args;
 
-  if (ptid_get_pid (entry->id) != pid)
+  if (thread->id.pid () != pid)
     return 0;
 
   /* We avoid killing the first thread here, because of a Linux kernel (at
@@ -1379,7 +1378,7 @@ kill_one_lwp_callback (struct inferior_list_entry *entry, void *args)
     {
       if (debug_threads)
        debug_printf ("lkop: is last of process %s\n",
-                     target_pid_to_str (entry->id));
+                     target_pid_to_str (thread->id));
       return 0;
     }
 
@@ -1594,21 +1593,20 @@ linux_detach_one_lwp (struct lwp_info *lwp)
    given process.  */
 
 static int
-linux_detach_lwp_callback (struct inferior_list_entry *entry, void *args)
+linux_detach_lwp_callback (thread_info *thread, void *args)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int pid = *(int *) args;
   int lwpid = lwpid_of (thread);
 
   /* Skip other processes.  */
-  if (ptid_get_pid (entry->id) != pid)
+  if (thread->id.pid () != pid)
     return 0;
 
   /* We don't actually detach from the thread group leader just yet.
      If the thread group exits, we must reap the zombie clone lwps
      before we're able to reap the leader.  */
-  if (ptid_get_pid (entry->id) == lwpid)
+  if (thread->id.pid () == lwpid)
     return 0;
 
   linux_detach_one_lwp (lwp);
@@ -1662,9 +1660,8 @@ linux_detach (int pid)
 /* Remove all LWPs that belong to process PROC from the lwp list.  */
 
 static int
-delete_lwp_callback (struct inferior_list_entry *entry, void *proc)
+delete_lwp_callback (thread_info *thread, void *proc)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   struct process_info *process = (struct process_info *) proc;
 
@@ -1814,9 +1811,8 @@ lwp_resumed (struct lwp_info *lwp)
 
 /* Return 1 if this lwp has an interesting status pending.  */
 static int
-status_pending_p_callback (struct inferior_list_entry *entry, void *arg)
+status_pending_p_callback (thread_info *thread, void *arg)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lp = get_thread_lwp (thread);
   ptid_t ptid = * (ptid_t *) arg;
 
@@ -1839,7 +1835,7 @@ status_pending_p_callback (struct inferior_list_entry *entry, void *arg)
 }
 
 static int
-same_lwp (struct inferior_list_entry *entry, void *data)
+same_lwp (thread_info *thread, void *data)
 {
   ptid_t ptid = *(ptid_t *) data;
   int lwp;
@@ -1849,7 +1845,7 @@ same_lwp (struct inferior_list_entry *entry, void *data)
   else
     lwp = ptid_get_pid (ptid);
 
-  if (ptid_get_lwp (entry->id) == lwp)
+  if (thread->id.lwp () == lwp)
     return 1;
 
   return 0;
@@ -1858,13 +1854,12 @@ same_lwp (struct inferior_list_entry *entry, void *data)
 struct lwp_info *
 find_lwp_pid (ptid_t ptid)
 {
-  struct inferior_list_entry *thread
-    = find_inferior (&all_threads, same_lwp, &ptid);
+  thread_info *thread = find_inferior (&all_threads, same_lwp, &ptid);
 
   if (thread == NULL)
     return NULL;
 
-  return get_thread_lwp ((struct thread_info *) thread);
+  return get_thread_lwp (thread);
 }
 
 /* Return the number of known LWPs in the tgid given by PID.  */
@@ -1872,14 +1867,12 @@ find_lwp_pid (ptid_t ptid)
 static int
 num_lwps (int pid)
 {
-  struct inferior_list_entry *inf, *tmp;
   int count = 0;
 
-  ALL_INFERIORS (&all_threads, inf, tmp)
-    {
-      if (ptid_get_pid (inf->id) == pid)
-       count++;
-    }
+  for_each_thread ([&] (thread_info *thread) {
+    if (thread->id.pid () == pid)
+      count++;
+  });
 
   return count;
 }
@@ -1905,15 +1898,14 @@ struct iterate_over_lwps_args
    find_inferiors should continue iterating.  */
 
 static int
-iterate_over_lwps_filter (struct inferior_list_entry *entry, void *args_p)
+iterate_over_lwps_filter (thread_info *thread, void *args_p)
 {
   struct iterate_over_lwps_args *args
     = (struct iterate_over_lwps_args *) args_p;
 
-  if (ptid_match (entry->id, args->filter))
+  if (thread->id.matches (args->filter))
     {
-      struct thread_info *thr = (struct thread_info *) entry;
-      struct lwp_info *lwp = get_thread_lwp (thr);
+      struct lwp_info *lwp = get_thread_lwp (thread);
 
       return (*args->callback) (lwp, args->data);
     }
@@ -1929,13 +1921,13 @@ iterate_over_lwps (ptid_t filter,
                   void *data)
 {
   struct iterate_over_lwps_args args = {filter, callback, data};
-  struct inferior_list_entry *entry;
 
-  entry = find_inferior (&all_threads, iterate_over_lwps_filter, &args);
-  if (entry == NULL)
+  thread_info *thread = find_inferior (&all_threads, iterate_over_lwps_filter,
+                                      &args);
+  if (thread == NULL)
     return NULL;
 
-  return get_thread_lwp ((struct thread_info *) entry);
+  return get_thread_lwp (thread);
 }
 
 /* Detect zombie thread group leaders, and "exit" them.  We can't reap
@@ -2004,16 +1996,15 @@ check_zombie_leaders (void)
    stopped.  ARG is a PTID filter.  */
 
 static int
-not_stopped_callback (struct inferior_list_entry *entry, void *arg)
+not_stopped_callback (thread_info *thread, void *arg)
 {
-  struct thread_info *thr = (struct thread_info *) entry;
   struct lwp_info *lwp;
   ptid_t filter = *(ptid_t *) arg;
 
-  if (!ptid_match (ptid_of (thr), filter))
+  if (!ptid_match (ptid_of (thread), filter))
     return 0;
 
-  lwp = get_thread_lwp (thr);
+  lwp = get_thread_lwp (thread);
   if (!lwp->stopped)
     return 1;
 
@@ -2659,9 +2650,8 @@ maybe_hw_step (struct thread_info *thread)
    to report, but are resumed from the core's perspective.  */
 
 static void
-resume_stopped_resumed_lwps (struct inferior_list_entry *entry)
+resume_stopped_resumed_lwps (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lp = get_thread_lwp (thread);
 
   if (lp->stopped
@@ -2901,9 +2891,8 @@ linux_wait_for_event (ptid_t ptid, int *wstatp, int options)
 /* Count the LWP's that have had events.  */
 
 static int
-count_events_callback (struct inferior_list_entry *entry, void *data)
+count_events_callback (thread_info *thread, void *data)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lp = get_thread_lwp (thread);
   int *count = (int *) data;
 
@@ -2920,9 +2909,8 @@ count_events_callback (struct inferior_list_entry *entry, void *data)
 /* Select the LWP (if any) that is currently being single-stepped.  */
 
 static int
-select_singlestep_lwp_callback (struct inferior_list_entry *entry, void *data)
+select_singlestep_lwp_callback (thread_info *thread, void *data)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lp = get_thread_lwp (thread);
 
   if (thread->last_status.kind == TARGET_WAITKIND_IGNORE
@@ -2936,9 +2924,8 @@ select_singlestep_lwp_callback (struct inferior_list_entry *entry, void *data)
 /* Select the Nth LWP that has had an event.  */
 
 static int
-select_event_lwp_callback (struct inferior_list_entry *entry, void *data)
+select_event_lwp_callback (thread_info *thread, void *data)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lp = get_thread_lwp (thread);
   int *selector = (int *) data;
 
@@ -3019,9 +3006,8 @@ select_event_lwp (struct lwp_info **orig_lp)
 /* Decrement the suspend count of an LWP.  */
 
 static int
-unsuspend_one_lwp (struct inferior_list_entry *entry, void *except)
+unsuspend_one_lwp (thread_info *thread, void *except)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* Ignore EXCEPT.  */
@@ -3041,10 +3027,9 @@ unsuspend_all_lwps (struct lwp_info *except)
   find_inferior (&all_threads, unsuspend_one_lwp, except);
 }
 
-static void move_out_of_jump_pad_callback (struct inferior_list_entry *entry);
-static int stuck_in_jump_pad_callback (struct inferior_list_entry *entry,
-                                      void *data);
-static int lwp_running (struct inferior_list_entry *entry, void *data);
+static void move_out_of_jump_pad_callback (thread_info *thread);
+static int stuck_in_jump_pad_callback (thread_info *thread, void *data);
+static int lwp_running (thread_info *thread, void *data);
 static ptid_t linux_wait_1 (ptid_t ptid,
                            struct target_waitstatus *ourstatus,
                            int target_options);
@@ -3780,18 +3765,16 @@ linux_wait_1 (ptid_t ptid,
        {
          /* In all-stop, a stop reply cancels all previous resume
             requests.  Delete all single-step breakpoints.  */
-         struct inferior_list_entry *inf, *tmp;
 
-         ALL_INFERIORS (&all_threads, inf, tmp)
-           {
-             struct thread_info *thread = (struct thread_info *) inf;
+         find_thread ([&] (thread_info *thread) {
+           if (has_single_step_breakpoints (thread))
+             {
+               remove_single_step_breakpoints_p = 1;
+               return true;
+             }
 
-             if (has_single_step_breakpoints (thread))
-               {
-                 remove_single_step_breakpoints_p = 1;
-                 break;
-               }
-           }
+           return false;
+         });
        }
 
       if (remove_single_step_breakpoints_p)
@@ -3808,15 +3791,10 @@ linux_wait_1 (ptid_t ptid,
            }
          else
            {
-             struct inferior_list_entry *inf, *tmp;
-
-             ALL_INFERIORS (&all_threads, inf, tmp)
-               {
-                 struct thread_info *thread = (struct thread_info *) inf;
-
-                 if (has_single_step_breakpoints (thread))
-                   delete_single_step_breakpoints (thread);
-               }
+             for_each_thread ([] (thread_info *thread){
+               if (has_single_step_breakpoints (thread))
+                 delete_single_step_breakpoints (thread);
+             });
            }
 
          unstop_all_lwps (0, event_child);
@@ -4069,9 +4047,8 @@ send_sigstop (struct lwp_info *lwp)
 }
 
 static int
-send_sigstop_callback (struct inferior_list_entry *entry, void *except)
+send_sigstop_callback (thread_info *thread, void *except)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* Ignore EXCEPT.  */
@@ -4088,10 +4065,8 @@ send_sigstop_callback (struct inferior_list_entry *entry, void *except)
 /* Increment the suspend count of an LWP, and stop it, if not stopped
    yet.  */
 static int
-suspend_and_send_sigstop_callback (struct inferior_list_entry *entry,
-                                  void *except)
+suspend_and_send_sigstop_callback (thread_info *thread, void *except)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* Ignore EXCEPT.  */
@@ -4100,7 +4075,7 @@ suspend_and_send_sigstop_callback (struct inferior_list_entry *entry,
 
   lwp_suspended_inc (lwp);
 
-  return send_sigstop_callback (entry, except);
+  return send_sigstop_callback (thread, except);
 }
 
 static void
@@ -4153,7 +4128,7 @@ wait_for_sigstop (void)
 
   saved_thread = current_thread;
   if (saved_thread != NULL)
-    saved_tid = saved_thread->entry.id;
+    saved_tid = saved_thread->id;
   else
     saved_tid = null_ptid; /* avoid bogus unused warning */
 
@@ -4187,9 +4162,8 @@ wait_for_sigstop (void)
    because she wants to debug it.  */
 
 static int
-stuck_in_jump_pad_callback (struct inferior_list_entry *entry, void *data)
+stuck_in_jump_pad_callback (thread_info *thread, void *data)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   if (lwp->suspended != 0)
@@ -4211,9 +4185,8 @@ stuck_in_jump_pad_callback (struct inferior_list_entry *entry, void *data)
 }
 
 static void
-move_out_of_jump_pad_callback (struct inferior_list_entry *entry)
+move_out_of_jump_pad_callback (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct thread_info *saved_thread;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int *wstat;
@@ -4262,9 +4235,8 @@ move_out_of_jump_pad_callback (struct inferior_list_entry *entry)
 }
 
 static int
-lwp_running (struct inferior_list_entry *entry, void *data)
+lwp_running (thread_info *thread, void *data)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   if (lwp_is_marked_dead (lwp))
@@ -4665,9 +4637,8 @@ struct thread_resume_array
    suspension).  */
 
 static int
-linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
+linux_set_resume_request (thread_info *thread, void *arg)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int ndx;
   struct thread_resume_array *r;
@@ -4678,7 +4649,7 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
     {
       ptid_t ptid = r->resume[ndx].thread;
       if (ptid_equal (ptid, minus_one_ptid)
-         || ptid_equal (ptid, entry->id)
+         || ptid == thread->id
          /* Handle both 'pPID' and 'pPID.-1' as meaning 'all threads
             of PID'.  */
          || (ptid_get_pid (ptid) == pid_of (thread)
@@ -4735,7 +4706,7 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
             reported to GDBserver core, but GDB has not pulled the
             event out of the vStopped queue yet, likewise, ignore the
             (wildcard) resume request.  */
-         if (in_queued_stop_replies (entry->id))
+         if (in_queued_stop_replies (thread->id))
            {
              if (debug_threads)
                debug_printf ("not resuming LWP %ld: has queued stop reply\n",
@@ -4779,9 +4750,8 @@ linux_set_resume_request (struct inferior_list_entry *entry, void *arg)
    Set *FLAG_P if this lwp has an interesting status pending.  */
 
 static int
-resume_status_pending_p (struct inferior_list_entry *entry, void *flag_p)
+resume_status_pending_p (thread_info *thread, void *flag_p)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   /* LWPs which will not be resumed are not interesting, because
@@ -4801,9 +4771,8 @@ resume_status_pending_p (struct inferior_list_entry *entry, void *flag_p)
    inferior's regcache.  */
 
 static int
-need_step_over_p (struct inferior_list_entry *entry, void *dummy)
+need_step_over_p (thread_info *thread, void *dummy)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   struct thread_info *saved_thread;
   CORE_ADDR pc;
@@ -4986,7 +4955,7 @@ start_step_over (struct lwp_info *lwp)
   linux_resume_one_lwp (lwp, step, 0, NULL);
 
   /* Require next event from this LWP.  */
-  step_over_bkpt = thread->entry.id;
+  step_over_bkpt = thread->id;
   return 1;
 }
 
@@ -5079,9 +5048,8 @@ complete_ongoing_step_over (void)
    they should be re-issued if necessary.  */
 
 static int
-linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
+linux_resume_one_thread (thread_info *thread, void *arg)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int leave_all_stopped = * (int *) arg;
   int leave_pending;
@@ -5172,7 +5140,7 @@ linux_resume_one_thread (struct inferior_list_entry *entry, void *arg)
       if (debug_threads)
        debug_printf ("resuming LWP %ld\n", lwpid_of (thread));
 
-      proceed_one_lwp (entry, NULL);
+      proceed_one_lwp (thread, NULL);
     }
   else
     {
@@ -5264,9 +5232,8 @@ linux_resume (struct thread_resume *resume_info, size_t n)
    on that particular thread, and leave all others stopped.  */
 
 static int
-proceed_one_lwp (struct inferior_list_entry *entry, void *except)
+proceed_one_lwp (thread_info *thread, void *except)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int step;
 
@@ -5363,9 +5330,8 @@ proceed_one_lwp (struct inferior_list_entry *entry, void *except)
 }
 
 static int
-unsuspend_and_proceed_one_lwp (struct inferior_list_entry *entry, void *except)
+unsuspend_and_proceed_one_lwp (thread_info *thread, void *except)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   if (lwp == except)
@@ -5373,7 +5339,7 @@ unsuspend_and_proceed_one_lwp (struct inferior_list_entry *entry, void *except)
 
   lwp_suspended_decr (lwp);
 
-  return proceed_one_lwp (entry, except);
+  return proceed_one_lwp (thread, except);
 }
 
 /* When we finish a step-over, set threads running again.  If there's
@@ -6475,10 +6441,8 @@ linux_supports_exec_events (void)
    options for the specified lwp.  */
 
 static int
-reset_lwp_ptrace_options_callback (struct inferior_list_entry *entry,
-                                  void *args)
+reset_lwp_ptrace_options_callback (thread_info *thread, void *args)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
 
   if (!lwp->stopped)
index b30fbba3d798d637798b50121ef7e031140eb1ec..07becd6d842947606c9eb63f632e7f6a42eaa3bd 100644 (file)
@@ -293,10 +293,8 @@ mips_breakpoint_at (CORE_ADDR where)
    if the lwp's process id is *PID_P.  */
 
 static int
-update_watch_registers_callback (struct inferior_list_entry *entry,
-                                void *pid_p)
+update_watch_registers_callback (thread_info *thread, void *pid_p)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct lwp_info *lwp = get_thread_lwp (thread);
   int pid = *(int *) pid_p;
 
index f074dd50b382e5e1c99508a05eaa7ed4749eda3e..ca9adc446b0747061da871510bdfa2d14a9ad7ff 100644 (file)
@@ -559,16 +559,12 @@ lynx_detach (int pid)
    all threads belonging to process PROC.  */
 
 static int
-lynx_delete_thread_callback (struct inferior_list_entry *entry, void *proc)
+lynx_delete_thread_callback (thread_info *thread, void *proc)
 {
   struct process_info *process = (struct process_info *) proc;
 
-  if (ptid_get_pid (entry->id) == pid_of (process))
-    {
-      struct thread_info *thr = find_thread_ptid (entry->id);
-
-      remove_thread (thr);
-    }
+  if (thread->id.pid () == pid_of (process))
+    remove_thread (thread);
 
   return 0;
 }
index 75480912fb451c37717649284a6e7071b0d7cbe7..e45e60e5caaeac6f4eb58d148f3bd26df7f0ea2c 100644 (file)
@@ -94,14 +94,12 @@ regcache_invalidate_thread (struct thread_info *thread)
 }
 
 static int
-regcache_invalidate_one (struct inferior_list_entry *entry,
-                        void *pid_p)
+regcache_invalidate_one (thread_info *thread, void *pid_p)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   int pid = *(int *) pid_p;
 
   /* Only invalidate the regcaches of threads of this process.  */
-  if (ptid_get_pid (entry->id) == pid)
+  if (thread->id.pid () == pid)
     regcache_invalidate_thread (thread);
 
   return 0;
@@ -121,7 +119,7 @@ void
 regcache_invalidate (void)
 {
   /* Only update the threads of the current process.  */
-  int pid = ptid_get_pid (current_thread->entry.id);
+  int pid = current_thread->id.pid ();
 
   regcache_invalidate_pid (pid);
 }
@@ -290,19 +288,11 @@ free_register_cache_thread (struct thread_info *thread)
     }
 }
 
-static void
-free_register_cache_thread_one (struct inferior_list_entry *entry)
-{
-  struct thread_info *thread = (struct thread_info *) entry;
-
-  free_register_cache_thread (thread);
-}
-
 void
 regcache_release (void)
 {
   /* Flush and release all pre-existing register caches.  */
-  for_each_inferior (&all_threads, free_register_cache_thread_one);
+  for_each_inferior (&all_threads, free_register_cache_thread);
 }
 #endif
 
index f0151a3dea5844c614539376a0be6a30609ddbd2..892d76571496a9097fd69839c1f65c334318ca08 100644 (file)
@@ -387,8 +387,7 @@ handle_btrace_enable_bts (struct thread_info *thread)
     return "E.Btrace already enabled.";
 
   current_btrace_conf.format = BTRACE_FORMAT_BTS;
-  thread->btrace = target_enable_btrace (thread->entry.id,
-                                        &current_btrace_conf);
+  thread->btrace = target_enable_btrace (thread->id, &current_btrace_conf);
   if (thread->btrace == NULL)
     return "E.Could not enable btrace.";
 
@@ -404,8 +403,7 @@ handle_btrace_enable_pt (struct thread_info *thread)
     return "E.Btrace already enabled.";
 
   current_btrace_conf.format = BTRACE_FORMAT_PT;
-  thread->btrace = target_enable_btrace (thread->entry.id,
-                                        &current_btrace_conf);
+  thread->btrace = target_enable_btrace (thread->id, &current_btrace_conf);
   if (thread->btrace == NULL)
     return "E.Could not enable btrace.";
 
@@ -1652,9 +1650,8 @@ handle_qxfer_statictrace (const char *annex,
    Emit the XML to describe the thread of INF.  */
 
 static void
-handle_qxfer_threads_worker (struct inferior_list_entry *inf, void *arg)
+handle_qxfer_threads_worker (thread_info *thread, void *arg)
 {
-  struct thread_info *thread = (struct thread_info *) inf;
   struct buffer *buffer = (struct buffer *) arg;
   ptid_t ptid = ptid_of (thread);
   char ptid_s[100];
@@ -2145,7 +2142,7 @@ supported_btrace_packets (char *buf)
 static void
 handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
 {
-  static struct inferior_list_entry *thread_ptr;
+  static std::list<thread_info *>::const_iterator thread_iter;
 
   /* Reply the current thread id.  */
   if (strcmp ("qC", own_buf) == 0 && !disable_packet_qC)
@@ -2157,8 +2154,8 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
        ptid = general_thread;
       else
        {
-         thread_ptr = get_first_inferior (&all_threads);
-         ptid = thread_ptr->id;
+         thread_iter = all_threads.begin ();
+         ptid = (*thread_iter)->id;
        }
 
       sprintf (own_buf, "QC");
@@ -2220,22 +2217,24 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
       if (strcmp ("qfThreadInfo", own_buf) == 0)
        {
          require_running_or_return (own_buf);
-         thread_ptr = get_first_inferior (&all_threads);
+         thread_iter = all_threads.begin ();
 
          *own_buf++ = 'm';
-         write_ptid (own_buf, thread_ptr->id);
-         thread_ptr = thread_ptr->next;
+         ptid_t ptid = (*thread_iter)->id;
+         write_ptid (own_buf, ptid);
+         thread_iter++;
          return;
        }
 
       if (strcmp ("qsThreadInfo", own_buf) == 0)
        {
          require_running_or_return (own_buf);
-         if (thread_ptr != NULL)
+         if (thread_iter != all_threads.end ())
            {
              *own_buf++ = 'm';
-             write_ptid (own_buf, thread_ptr->id);
-             thread_ptr = thread_ptr->next;
+             ptid_t ptid = (*thread_iter)->id;
+             write_ptid (own_buf, ptid);
+             thread_iter++;
              return;
            }
          else
@@ -2693,7 +2692,7 @@ struct visit_actioned_threads_data
    Note: This function is itself a callback for find_inferior.  */
 
 static int
-visit_actioned_threads (struct inferior_list_entry *entry, void *datap)
+visit_actioned_threads (thread_info *thread, void *datap)
 {
   struct visit_actioned_threads_data *data
     = (struct visit_actioned_threads_data *) datap;
@@ -2707,13 +2706,11 @@ visit_actioned_threads (struct inferior_list_entry *entry, void *datap)
       const struct thread_resume *action = &actions[i];
 
       if (ptid_equal (action->thread, minus_one_ptid)
-         || ptid_equal (action->thread, entry->id)
+         || ptid_equal (action->thread, thread->id)
          || ((ptid_get_pid (action->thread)
-              == ptid_get_pid (entry->id))
+              == thread->id.pid ())
              && ptid_get_lwp (action->thread) == -1))
        {
-         struct thread_info *thread = (struct thread_info *) entry;
-
          if ((*callback) (action, thread))
            return 1;
        }
@@ -2734,7 +2731,7 @@ handle_pending_status (const struct thread_resume *resumption,
       thread->status_pending_p = 0;
 
       last_status = thread->last_status;
-      last_ptid = thread->entry.id;
+      last_ptid = thread->id;
       prepare_resume_reply (own_buf, last_ptid, &last_status);
       return 1;
     }
@@ -3234,17 +3231,15 @@ myresume (char *own_buf, int step, int sig)
    stopped thread.  */
 
 static int
-queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
+queue_stop_reply_callback (thread_info *thread, void *arg)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
-
   /* For now, assume targets that don't have this callback also don't
      manage the thread's last_status field.  */
   if (the_target->thread_stopped == NULL)
     {
       struct vstop_notif *new_notif = XNEW (struct vstop_notif);
 
-      new_notif->ptid = entry->id;
+      new_notif->ptid = thread->id;
       new_notif->status = thread->last_status;
       /* Pass the last stop reply back to GDB, but don't notify
         yet.  */
@@ -3261,7 +3256,7 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
                = target_waitstatus_to_string (&thread->last_status);
 
              debug_printf ("Reporting thread %s as already stopped with %s\n",
-                           target_pid_to_str (entry->id),
+                           target_pid_to_str (thread->id),
                            status_string.c_str ());
            }
 
@@ -3269,7 +3264,7 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
 
          /* Pass the last stop reply back to GDB, but don't notify
             yet.  */
-         queue_stop_reply (entry->id, &thread->last_status);
+         queue_stop_reply (thread->id, &thread->last_status);
        }
     }
 
@@ -3281,10 +3276,8 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
    it.  */
 
 static void
-gdb_wants_thread_stopped (struct inferior_list_entry *entry)
+gdb_wants_thread_stopped (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
-
   thread->last_resume_kind = resume_stop;
 
   if (thread->last_status.kind == TARGET_WAITKIND_IGNORE)
@@ -3308,10 +3301,8 @@ gdb_wants_all_threads_stopped (void)
    flag.  */
 
 static void
-clear_pending_status_callback (struct inferior_list_entry *entry)
+clear_pending_status_callback (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
-
   thread->status_pending_p = 0;
 }
 
@@ -3319,10 +3310,8 @@ clear_pending_status_callback (struct inferior_list_entry *entry)
    interesting event, mark it as having a pending event.  */
 
 static void
-set_pending_status_callback (struct inferior_list_entry *entry)
+set_pending_status_callback (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
-
   if (thread->last_status.kind != TARGET_WAITKIND_STOPPED
       || (thread->last_status.value.sig != GDB_SIGNAL_0
          /* A breakpoint, watchpoint or finished step from a previous
@@ -3339,10 +3328,8 @@ set_pending_status_callback (struct inferior_list_entry *entry)
    pending status to report to GDB.  */
 
 static int
-find_status_pending_thread_callback (struct inferior_list_entry *entry, void *data)
+find_status_pending_thread_callback (thread_info *thread, void *data)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
-
   return thread->status_pending_p;
 }
 
@@ -3371,7 +3358,7 @@ handle_status (char *own_buf)
     }
   else
     {
-      struct inferior_list_entry *thread = NULL;
+      thread_info *thread = NULL;
 
       pause_all (0);
       stabilize_threads ();
@@ -3401,7 +3388,7 @@ handle_status (char *own_buf)
       /* If we're still out of luck, simply pick the first thread in
         the thread list.  */
       if (thread == NULL)
-       thread = get_first_inferior (&all_threads);
+       thread = get_first_thread ();
 
       if (thread != NULL)
        {
@@ -3417,7 +3404,7 @@ handle_status (char *own_buf)
          set_desired_thread ();
 
          gdb_assert (tp->last_status.kind != TARGET_WAITKIND_IGNORE);
-         prepare_resume_reply (own_buf, tp->entry.id, &tp->last_status);
+         prepare_resume_reply (own_buf, tp->id, &tp->last_status);
        }
       else
        strcpy (own_buf, "W00");
@@ -4095,7 +4082,7 @@ process_serial_event (void)
                  break;
                }
 
-             thread_id = thread->entry.id;
+             thread_id = thread->id;
            }
          else
            {
@@ -4119,7 +4106,7 @@ process_serial_event (void)
                                                             general_thread);
                  if (thread == NULL)
                    thread = get_first_thread ();
-                 thread_id = thread->entry.id;
+                 thread_id = thread->id;
                }
 
              general_thread = thread_id;
index 94224a8a7ca99c4a8f0610416d0bc741e70144db..8f757c0a5d1dd1907a0c751aae476f45cef20860 100644 (file)
@@ -55,12 +55,11 @@ struct thread_search
    when accessing memory.  */
 
 static int
-thread_search_callback (struct inferior_list_entry *entry, void *args)
+thread_search_callback (thread_info *thread, void *args)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   struct thread_search *s = (struct thread_search *) args;
 
-  if (ptid_get_pid (entry->id) == ptid_get_pid (s->current_gen_ptid)
+  if (thread->id.pid () == ptid_get_pid (s->current_gen_ptid)
       && mythread_alive (ptid_of (thread)))
     {
       if (s->stopped == NULL
@@ -71,7 +70,7 @@ thread_search_callback (struct inferior_list_entry *entry, void *args)
       if (s->first == NULL)
        s->first = thread;
 
-      if (s->current == NULL && ptid_equal (s->current_gen_ptid, entry->id))
+      if (s->current == NULL && s->current_gen_ptid == thread->id)
        s->current = thread;
     }
 
index 638a8337b6ea05aca185d6f41a91de38fbc6d6d8..67970f4ecac46a2d7b0aaea4790b1497f371efa8 100644 (file)
@@ -407,7 +407,7 @@ thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset,
 
   lwp = get_thread_lwp (thread);
   if (!lwp->thread_known)
-    find_one_thread (thread->entry.id);
+    find_one_thread (thread->id);
   if (!lwp->thread_known)
     return TD_NOTHR;
 
@@ -465,7 +465,7 @@ thread_db_thread_handle (ptid_t ptid, gdb_byte **handle, int *handle_len)
 
   lwp = get_thread_lwp (thread);
 
-  if (!lwp->thread_known && !find_one_thread (thread->entry.id))
+  if (!lwp->thread_known && !find_one_thread (thread->id))
     return false;
 
   gdb_assert (lwp->thread_known);
index 8ec8010ac8a51dfadcc687e3791c49adbac9df9c..73090a753d34ea8e60904f7936f9ddb027eae63e 100644 (file)
@@ -4396,7 +4396,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc)
   wstep_link = &tinfo->while_stepping;
 
   trace_debug ("Thread %s finished a single-step for tracepoint %d at 0x%s",
-              target_pid_to_str (tinfo->entry.id),
+              target_pid_to_str (tinfo->id),
               wstep->tp_number, paddress (wstep->tp_address));
 
   ctx.base.type = trap_tracepoint;
@@ -4409,7 +4409,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc)
        {
          trace_debug ("NO TRACEPOINT %d at 0x%s FOR THREAD %s!",
                       wstep->tp_number, paddress (wstep->tp_address),
-                      target_pid_to_str (tinfo->entry.id));
+                      target_pid_to_str (tinfo->id));
 
          /* Unlink.  */
          *wstep_link = wstep->next;
@@ -4429,7 +4429,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc)
        {
          /* The requested numbers of steps have occurred.  */
          trace_debug ("Thread %s done stepping for tracepoint %d at 0x%s",
-                      target_pid_to_str (tinfo->entry.id),
+                      target_pid_to_str (tinfo->id),
                       wstep->tp_number, paddress (wstep->tp_address));
 
          /* Unlink the wstep.  */
@@ -4576,7 +4576,7 @@ tracepoint_was_hit (struct thread_info *tinfo, CORE_ADDR stop_pc)
          && tpoint->type != static_tracepoint)
        {
          trace_debug ("Thread %s at address of tracepoint %d at 0x%s",
-                      target_pid_to_str (tinfo->entry.id),
+                      target_pid_to_str (tinfo->id),
                       tpoint->number, paddress (tpoint->address));
 
          /* Test the condition if present, and collect if true.  */
index 03d6e1779d46c52b8b8d526410ac251063fa04ab..fd99ca9cb6c1d0b6eca167890102aebfa570aaa1 100644 (file)
 static struct x86_debug_reg_state debug_reg_state;
 
 static int
-update_debug_registers_callback (struct inferior_list_entry *entry,
-                                void *pid_p)
+update_debug_registers_callback (thread_info *thr, void *pid_p)
 {
-  struct thread_info *thr = (struct thread_info *) entry;
   win32_thread_info *th = (win32_thread_info *) thread_target_data (thr);
   int pid = *(int *) pid_p;
 
index f9c890f1648ea8121db1c7e417f6e4020c8211b8..66fc52c392d8b41854aefbda366e59f21ebaea33 100644 (file)
@@ -231,9 +231,8 @@ child_add_thread (DWORD pid, DWORD tid, HANDLE h, void *tlb)
 
 /* Delete a thread from the list of threads.  */
 static void
-delete_thread_info (struct inferior_list_entry *entry)
+delete_thread_info (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   win32_thread_info *th = (win32_thread_info *) thread_target_data (thread);
 
   remove_thread (thread);
@@ -245,15 +244,14 @@ delete_thread_info (struct inferior_list_entry *entry)
 static void
 child_delete_thread (DWORD pid, DWORD tid)
 {
-  struct inferior_list_entry *thread;
   ptid_t ptid;
 
   /* If the last thread is exiting, just return.  */
-  if (one_inferior_p (&all_threads))
+  if (all_threads.size () == 1)
     return;
 
   ptid = ptid_build (pid, tid, 0);
-  thread = find_inferior_id (&all_threads, ptid);
+  thread_info *thread = find_inferior_id (&all_threads, ptid);
   if (thread == NULL)
     return;
 
@@ -431,9 +429,8 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
 /* Resume all artificially suspended threads if we are continuing
    execution.  */
 static int
-continue_one_thread (struct inferior_list_entry *this_thread, void *id_ptr)
+continue_one_thread (thread_info *thread, void *id_ptr)
 {
-  struct thread_info *thread = (struct thread_info *) this_thread;
   int thread_id = * (int *) id_ptr;
   win32_thread_info *th = (win32_thread_info *) thread_target_data (thread);
 
@@ -1347,9 +1344,8 @@ handle_exception (struct target_waitstatus *ourstatus)
 
 
 static void
-suspend_one_thread (struct inferior_list_entry *entry)
+suspend_one_thread (thread_info *thread)
 {
-  struct thread_info *thread = (struct thread_info *) entry;
   win32_thread_info *th = (win32_thread_info *) thread_target_data (thread);
 
   if (!th->suspended)
@@ -1488,7 +1484,7 @@ get_child_debug_event (struct target_waitstatus *ourstatus)
       child_delete_thread (current_event.dwProcessId,
                           current_event.dwThreadId);
 
-      current_thread = (struct thread_info *) all_threads.head;
+      current_thread = get_first_thread ();
       return 1;
 
     case CREATE_PROCESS_DEBUG_EVENT: