From ca5c370d27dbe4f384787370fbb2195a0237897c Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 28 Dec 2009 16:09:27 +0000 Subject: * linux-low.c (linux_remove_process): Remove `detaching' parameter. Don't release/detach from thread_db here. (linux_kill): Release/detach from thread_db here, ... (linux_detach): ... and here, before actually detaching. (linux_wait_1): ... and here, when a process exits. * thread-db.c (any_thread_of): New. (thread_db_free): Switch the current inferior to a thread of the passed in process. --- gdb/gdbserver/thread-db.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'gdb/gdbserver/thread-db.c') diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c index e169a50..a237b6d 100644 --- a/gdb/gdbserver/thread-db.c +++ b/gdb/gdbserver/thread-db.c @@ -755,6 +755,17 @@ thread_db_init (int use_events) return 0; } +static int +any_thread_of (struct inferior_list_entry *entry, void *args) +{ + int *pid_p = args; + + if (ptid_get_pid (entry->id) == *pid_p) + return 1; + + return 0; +} + /* Disconnect from libthread_db and free resources. */ void @@ -763,6 +774,8 @@ thread_db_free (struct process_info *proc, int detaching) struct thread_db *thread_db = proc->private->thread_db; if (thread_db) { + struct thread_info *saved_inferior; + int pid; td_err_e (*td_ta_delete_p) (td_thragent_t *); td_err_e (*td_ta_clear_event_p) (const td_thragent_t *ta, td_thr_events_t *event); @@ -775,6 +788,12 @@ thread_db_free (struct process_info *proc, int detaching) td_ta_clear_event_p = &td_ta_clear_event; #endif + pid = pid_of (proc); + saved_inferior = current_inferior; + current_inferior = + (struct thread_info *) find_inferior (&all_threads, + any_thread_of, &pid); + if (detaching && td_ta_clear_event_p != NULL) { td_thr_events_t events; @@ -794,6 +813,7 @@ thread_db_free (struct process_info *proc, int detaching) free (thread_db); proc->private->thread_db = NULL; + current_inferior = saved_inferior; } } -- cgit v1.1