gdb/gdbserver/inferiors.c - gdb
Global variables defined
Functions defined
Macros defined
Source code
- #include "server.h"
- #include "gdbthread.h"
- #include "dll.h"
- struct inferior_list all_processes;
- struct inferior_list all_threads;
- struct thread_info *current_thread;
- #define get_thread(inf) ((struct thread_info *)(inf))
- void
- add_inferior_to_list (struct inferior_list *list,
- struct inferior_list_entry *new_inferior)
- {
- new_inferior->next = NULL;
- if (list->tail != NULL)
- list->tail->next = new_inferior;
- else
- list->head = new_inferior;
- list->tail = new_inferior;
- }
- void
- for_each_inferior (struct inferior_list *list,
- void (*action) (struct inferior_list_entry *))
- {
- struct inferior_list_entry *cur = list->head, *next;
- while (cur != NULL)
- {
- next = cur->next;
- (*action) (cur);
- cur = next;
- }
- }
- void
- for_each_inferior_with_data (struct inferior_list *list,
- void (*action) (struct inferior_list_entry *,
- void *),
- void *data)
- {
- struct inferior_list_entry *cur = list->head, *next;
- while (cur != NULL)
- {
- next = cur->next;
- (*action) (cur, data);
- cur = next;
- }
- }
- void
- remove_inferior (struct inferior_list *list,
- struct inferior_list_entry *entry)
- {
- struct inferior_list_entry **cur;
- if (list->head == entry)
- {
- list->head = entry->next;
- if (list->tail == entry)
- list->tail = list->head;
- return;
- }
- cur = &list->head;
- while (*cur && (*cur)->next != entry)
- cur = &(*cur)->next;
- if (*cur == NULL)
- return;
- (*cur)->next = entry->next;
- if (list->tail == entry)
- list->tail = *cur;
- }
- struct thread_info *
- add_thread (ptid_t thread_id, void *target_data)
- {
- struct thread_info *new_thread = xmalloc (sizeof (*new_thread));
- memset (new_thread, 0, sizeof (*new_thread));
- new_thread->entry.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);
- if (current_thread == NULL)
- current_thread = new_thread;
- new_thread->target_data = target_data;
- return new_thread;
- }
- ptid_t
- thread_to_gdb_id (struct thread_info *thread)
- {
- return thread->entry.id;
- }
- struct thread_info *
- get_first_thread (void)
- {
- return (struct thread_info *) get_first_inferior (&all_threads);
- }
- struct thread_info *
- find_thread_ptid (ptid_t ptid)
- {
- return (struct thread_info *) find_inferior_id (&all_threads, ptid);
- }
- ptid_t
- gdb_id_to_thread_id (ptid_t gdb_id)
- {
- struct thread_info *thread = find_thread_ptid (gdb_id);
- return thread ? thread->entry.id : null_ptid;
- }
- static void
- free_one_thread (struct inferior_list_entry *inf)
- {
- struct thread_info *thread = get_thread (inf);
- free_register_cache (inferior_regcache_data (thread));
- free (thread);
- }
- void
- remove_thread (struct thread_info *thread)
- {
- if (thread->btrace != NULL)
- target_disable_btrace (thread->btrace);
- remove_inferior (&all_threads, (struct inferior_list_entry *) thread);
- free_one_thread (&thread->entry);
- }
- struct inferior_list_entry *
- get_first_inferior (struct inferior_list *list)
- {
- if (list->head != NULL)
- return list->head;
- 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;
- }
- 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 *
- inferior_target_data (struct thread_info *inferior)
- {
- return inferior->target_data;
- }
- void
- set_inferior_target_data (struct thread_info *inferior, void *data)
- {
- inferior->target_data = data;
- }
- void *
- inferior_regcache_data (struct thread_info *inferior)
- {
- return inferior->regcache_data;
- }
- void
- set_inferior_regcache_data (struct thread_info *inferior, void *data)
- {
- inferior->regcache_data = data;
- }
- int
- one_inferior_p (struct inferior_list *list)
- {
- return list->head != NULL && list->head == list->tail;
- }
- 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);
- clear_dlls ();
- current_thread = NULL;
- }
- struct process_info *
- add_process (int pid, int attached)
- {
- struct process_info *process;
- process = xcalloc (1, sizeof (*process));
- process->entry.id = pid_to_ptid (pid);
- process->attached = attached;
- add_inferior_to_list (&all_processes, &process->entry);
- return process;
- }
- void
- remove_process (struct process_info *process)
- {
- clear_symbol_cache (&process->symbol_cache);
- free_all_breakpoints (process);
- remove_inferior (&all_processes, &process->entry);
- free (process);
- }
- struct process_info *
- find_process_pid (int pid)
- {
- return (struct process_info *)
- find_inferior_id (&all_processes, pid_to_ptid (pid));
- }
- static int
- started_inferior_callback (struct inferior_list_entry *entry, void *args)
- {
- struct process_info *process = (struct process_info *) entry;
- return ! process->attached;
- }
- int
- have_started_inferiors_p (void)
- {
- return (find_inferior (&all_processes, started_inferior_callback, NULL)
- != NULL);
- }
- static int
- attached_inferior_callback (struct inferior_list_entry *entry, void *args)
- {
- struct process_info *process = (struct process_info *) entry;
- return process->attached;
- }
- int
- have_attached_inferiors_p (void)
- {
- return (find_inferior (&all_processes, attached_inferior_callback, NULL)
- != NULL);
- }
- struct process_info *
- get_thread_process (struct thread_info *thread)
- {
- int pid = ptid_get_pid (thread->entry.id);
- return find_process_pid (pid);
- }
- struct process_info *
- current_process (void)
- {
- gdb_assert (current_thread != NULL);
- return get_thread_process (current_thread);
- }