aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/inferiors.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@polymtl.ca>2017-10-14 09:11:12 -0400
committerSimon Marchi <simon.marchi@ericsson.com>2017-10-14 09:11:12 -0400
commit9c80ecd646a604fadcc290fca23b34c9454f5feb (patch)
treeceef0c74d101d2dc12a83b6487b96f417ea22046 /gdb/gdbserver/inferiors.c
parent9179355e655d78cf44ffdfb432e134eabceaebab (diff)
downloadgdb-9c80ecd646a604fadcc290fca23b34c9454f5feb.zip
gdb-9c80ecd646a604fadcc290fca23b34c9454f5feb.tar.gz
gdb-9c80ecd646a604fadcc290fca23b34c9454f5feb.tar.bz2
gdbserver: use std::list for all_threads
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.
Diffstat (limited to 'gdb/gdbserver/inferiors.c')
-rw-r--r--gdb/gdbserver/inferiors.c244
1 files changed, 56 insertions, 188 deletions
diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c
index 13ee8c9..564121f 100644
--- a/gdb/gdbserver/inferiors.c
+++ b/gdb/gdbserver/inferiors.c
@@ -23,86 +23,68 @@
#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 *