diff options
author | Pedro Alves <palves@redhat.com> | 2009-12-28 16:09:27 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2009-12-28 16:09:27 +0000 |
commit | ca5c370d27dbe4f384787370fbb2195a0237897c (patch) | |
tree | 4fc71283706990a21ac26b0a46f2569dc08527d4 /gdb/gdbserver/thread-db.c | |
parent | 9e0544c1f9db518bab94c7014cf2b6758a3fc287 (diff) | |
download | binutils-ca5c370d27dbe4f384787370fbb2195a0237897c.zip binutils-ca5c370d27dbe4f384787370fbb2195a0237897c.tar.gz binutils-ca5c370d27dbe4f384787370fbb2195a0237897c.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/gdbserver/thread-db.c')
-rw-r--r-- | gdb/gdbserver/thread-db.c | 20 |
1 files changed, 20 insertions, 0 deletions
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; } } |