X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Finferiors.c;h=3c171a179ec66a1eb0003aafefc8a3e454410a66;hb=6afd337d1a1a789b71d77b157529c08250eb9093;hp=95f3ad03ab08f4d91af07379548063350e9b8314;hpb=34c6591498f4363ef2c71d683cdaaa33d6a6ad64;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c index 95f3ad03ab..3c171a179e 100644 --- a/gdb/gdbserver/inferiors.c +++ b/gdb/gdbserver/inferiors.c @@ -1,5 +1,5 @@ /* 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. @@ -197,7 +197,7 @@ 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_register_cache (thread_regcache_data (thread)); free (thread); } @@ -248,6 +248,51 @@ find_inferior (struct inferior_list *list, 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) { @@ -264,27 +309,21 @@ 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. */ @@ -339,6 +378,7 @@ remove_process (struct process_info *process) 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); } @@ -398,7 +438,7 @@ have_attached_inferiors_p (void) } 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); @@ -410,3 +450,24 @@ current_process (void) 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); +}