* linux-low.c (linux_resume_one_process): Ignore ESRCH.
authorUlrich Weigand <uweigand@de.ibm.com>
Tue, 5 Aug 2008 22:13:23 +0000 (22:13 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Tue, 5 Aug 2008 22:13:23 +0000 (22:13 +0000)
(usr_store_inferior_registers): Likewise.
(regsets_store_inferior_registers): Likewise.

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

index df515934f46d88b029dd18945fc968c3755678e3..715cc9f06955dff001074d3a50d5ad5a5361a923 100644 (file)
@@ -1,3 +1,10 @@
+2008-08-05  Ulrich Weigand  <uweigand@de.ibm.com>
+           Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * linux-low.c (linux_resume_one_process): Ignore ESRCH.
+       (usr_store_inferior_registers): Likewise.
+       (regsets_store_inferior_registers): Likewise.
+
 2008-07-31  Rolf Jansen  <rj@surtec.com>
            Pedro Alves  <pedro@codesourcery.com>
 
index fe4cd97cc8e7a90fe80910ebde0e5d2bcbf8a84f..722953e152977b68e039d0d65bd328a20784889f 100644 (file)
@@ -1193,7 +1193,19 @@ linux_resume_one_process (struct inferior_list_entry *entry,
 
   current_inferior = saved_inferior;
   if (errno)
-    perror_with_name ("ptrace");
+    {
+      /* ESRCH from ptrace either means that the thread was already
+        running (an error) or that it is gone (a race condition).  If
+        it's gone, we will get a notification the next time we wait,
+        so we can ignore the error.  We could differentiate these
+        two, but it's tricky without waiting; the thread still exists
+        as a zombie, so sending it signal 0 would succeed.  So just
+        ignore ESRCH.  */
+      if (errno == ESRCH)
+       return;
+
+      perror_with_name ("ptrace");
+    }
 }
 
 static struct thread_resume *resume_ptr;
@@ -1462,6 +1474,12 @@ usr_store_inferior_registers (int regno)
                  *(PTRACE_XFER_TYPE *) (buf + i));
          if (errno != 0)
            {
+             /* At this point, ESRCH should mean the process is already gone, 
+                in which case we simply ignore attempts to change its registers.
+                See also the related comment in linux_resume_one_process.  */
+             if (errno == ESRCH)
+               return;
+
              if ((*the_low_target.cannot_store_register) (regno) == 0)
                {
                  char *err = strerror (errno);
@@ -1578,6 +1596,13 @@ regsets_store_inferior_registers ()
              disabled_regsets[regset - target_regsets] = 1;
              continue;
            }
+         else if (errno == ESRCH)
+           {
+             /* At this point, ESRCH should mean the process is already gone, 
+                in which case we simply ignore attempts to change its registers.
+                See also the related comment in linux_resume_one_process.  */
+             return 0;
+           }
          else
            {
              perror ("Warning: ptrace(regsets_store_inferior_registers)");