* linux-low.c (linux_remove_process): Remove `detaching'
authorPedro Alves <palves@redhat.com>
Mon, 28 Dec 2009 16:09:27 +0000 (16:09 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 28 Dec 2009 16:09:27 +0000 (16:09 +0000)
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/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/thread-db.c

index bd819f0a320b8c332d949f8e50cb4f2b5703986d..3706a4fc2069985ab6de230f8ab245431bb07c2a 100644 (file)
@@ -1,3 +1,14 @@
+2009-12-28  Pedro Alves  <pedro@codesourcery.com>
+
+       * 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.
+
 2009-12-21  Doug Evans  <dje@google.com>
 
        * linux-x86-low.c: Delete outdated comment about Elf32_Phdr.
index 8e91d2b608a940c58c107b2f07c2596bb3abee7a..4c636e1bcf9602c9af89f51b82a9739475c824e1 100644 (file)
@@ -258,14 +258,10 @@ linux_add_process (int pid, int attached)
    also freeing all private data.  */
 
 static void
-linux_remove_process (struct process_info *process, int detaching)
+linux_remove_process (struct process_info *process)
 {
   struct process_info_private *priv = process->private;
 
-#ifdef USE_THREAD_DB
-  thread_db_free (process, detaching);
-#endif
-
   free (priv->arch_private);
   free (priv);
   remove_process (process);
@@ -736,8 +732,11 @@ linux_kill (int pid)
       lwpid = linux_wait_for_event (lwp->head.id, &wstat, __WALL);
     } while (lwpid > 0 && WIFSTOPPED (wstat));
 
+#ifdef USE_THREAD_DB
+  thread_db_free (process, 0);
+#endif
   delete_lwp (lwp);
-  linux_remove_process (process, 0);
+  linux_remove_process (process);
   return 0;
 }
 
@@ -821,12 +820,16 @@ linux_detach (int pid)
   if (process == NULL)
     return -1;
 
+#ifdef USE_THREAD_DB
+  thread_db_free (process, 1);
+#endif
+
   current_inferior =
     (struct thread_info *) find_inferior (&all_threads, any_thread_of, &pid);
 
   delete_all_breakpoints ();
   find_inferior (&all_threads, linux_detach_one_lwp, &pid);
-  linux_remove_process (process, 1);
+  linux_remove_process (process);
   return 0;
 }
 
@@ -1451,8 +1454,11 @@ retry:
          int pid = pid_of (lwp);
          struct process_info *process = find_process_pid (pid);
 
+#ifdef USE_THREAD_DB
+         thread_db_free (process, 0);
+#endif
          delete_lwp (lwp);
-         linux_remove_process (process, 0);
+         linux_remove_process (process);
 
          current_inferior = NULL;
 
index e169a50f3e5517bbe11d08e38ca271a448771ef1..a237b6dbdc44b06c1c5a2a3665334f5bbb0d980f 100644 (file)
@@ -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;
     }
 }