OSDN Git Service

* inferiors.c (remove_process): Fix memory leak, free process.
authorDoug Evans <dje@google.com>
Thu, 30 Apr 2009 18:35:54 +0000 (18:35 +0000)
committerDoug Evans <dje@google.com>
Thu, 30 Apr 2009 18:35:54 +0000 (18:35 +0000)
* linux-low.c (linux_remove_process): New function.
(linux_kill): Call it instead of remove_process.
(linux_detach, linux_wait_1): Ditto.

gdb/gdbserver/ChangeLog
gdb/gdbserver/inferiors.c
gdb/gdbserver/linux-low.c

index 8d4e2f2..a731bff 100644 (file)
@@ -1,3 +1,10 @@
+2009-04-30  Doug Evans  <dje@google.com>
+
+       * inferiors.c (remove_process): Fix memory leak, free process.
+       * linux-low.c (linux_remove_process): New function.
+       (linux_kill): Call it instead of remove_process.
+       (linux_detach, linux_wait_1): Ditto.
+
 2009-04-19  Danny Backx  <dannybackx@users.sourceforge.net>
 
        * configure.srv: Add x86 Windows CE target.
index f96438e..8d44d01 100644 (file)
@@ -427,12 +427,17 @@ add_process (int pid, int attached)
   return process;
 }
 
+/* Remove a process from the common process list and free the memory
+   allocated for it.
+   The caller is responsible for freeing private data first.  */
+
 void
 remove_process (struct process_info *process)
 {
   clear_symbol_cache (&process->symbol_cache);
   free_all_breakpoints (process);
   remove_inferior (&all_processes, &process->head);
+  free (process);
 }
 
 struct process_info *
index cb6b1b4..a6bad39 100644 (file)
@@ -182,6 +182,16 @@ linux_add_process (int pid, int attached)
   return proc;
 }
 
+/* Remove a process from the common process list,
+   also freeing all private data.  */
+
+static void
+linux_remove_process (struct process_info *process)
+{
+  free (process->private);
+  remove_process (process);
+}
+
 /* Handle a GNU/Linux extended wait response.  If we see a clone
    event, we need to add the new LWP to our list (and not report the
    trap to higher layers).  */
@@ -565,7 +575,7 @@ linux_kill (int pid)
     } while (lwpid > 0 && WIFSTOPPED (wstat));
 
   delete_lwp (lwp);
-  remove_process (process);
+  linux_remove_process (process);
   return 0;
 }
 
@@ -654,7 +664,7 @@ linux_detach (int pid)
 
   delete_all_breakpoints ();
   find_inferior (&all_threads, linux_detach_one_lwp, &pid);
-  remove_process (process);
+  linux_remove_process (process);
   return 0;
 }
 
@@ -1273,7 +1283,7 @@ retry:
          struct process_info *process = find_process_pid (pid);
 
          delete_lwp (lwp);
-         remove_process (process);
+         linux_remove_process (process);
 
          current_inferior = NULL;