/* Inferior process information for the remote server for GDB.
- Copyright (C) 2002-2015 Free Software Foundation, Inc.
+ Copyright (C) 2002-2017 Free Software Foundation, Inc.
Contributed by MontaVista Software.
free_one_thread (struct inferior_list_entry *inf)
{
struct thread_info *thread = get_thread (inf);
- free_register_cache (inferior_regcache_data (thread));
+ free_register_cache (thread_regcache_data (thread));
free (thread);
}
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)
{
}
void *
-inferior_target_data (struct thread_info *inferior)
+thread_target_data (struct thread_info *thread)
{
- return inferior->target_data;
-}
-
-void
-set_inferior_target_data (struct thread_info *inferior, void *data)
-{
- inferior->target_data = data;
+ return thread->target_data;
}
struct regcache *
-inferior_regcache_data (struct thread_info *inferior)
+thread_regcache_data (struct thread_info *thread)
{
- return inferior->regcache_data;
+ return thread->regcache_data;
}
void
-set_inferior_regcache_data (struct thread_info *inferior, struct regcache *data)
+set_thread_regcache_data (struct thread_info *thread, struct regcache *data)
{
- inferior->regcache_data = data;
+ thread->regcache_data = data;
}
/* Return true if LIST has exactly one entry. */
free_all_breakpoints (process);
gdb_assert (find_thread_process (process) == NULL);
remove_inferior (&all_processes, &process->entry);
+ VEC_free (int, process->syscalls_to_catch);
free (process);
}
}
struct process_info *
-get_thread_process (struct thread_info *thread)
+get_thread_process (const struct thread_info *thread)
{
int pid = ptid_get_pid (thread->entry.id);
return find_process_pid (pid);
gdb_assert (current_thread != NULL);
return get_thread_process (current_thread);
}
+
+static void
+do_restore_current_thread_cleanup (void *arg)
+{
+ current_thread = (struct thread_info *) arg;
+}
+
+struct cleanup *
+make_cleanup_restore_current_thread (void)
+{
+ return make_cleanup (do_restore_current_thread_cleanup, current_thread);
+}
+
+/* See common/common-gdbthread.h. */
+
+void
+switch_to_thread (ptid_t ptid)
+{
+ if (!ptid_equal (ptid, minus_one_ptid))
+ current_thread = find_thread_ptid (ptid);
+}