OSDN Git Service

2011-08-26 Pedro Alves <pedro@codesourcery.com>
authorpalves <palves>
Fri, 26 Aug 2011 19:26:40 +0000 (19:26 +0000)
committerpalves <palves>
Fri, 26 Aug 2011 19:26:40 +0000 (19:26 +0000)
gdb/
* linux-nat.c (wait_lwp): Avoid assuming errno is preserved by a
library call.  Avoid reading the `status' local if all waitpid
calls failed.

gdb/ChangeLog
gdb/linux-nat.c

index 140b3c6..f64aca2 100644 (file)
@@ -1,5 +1,11 @@
 2011-08-26  Pedro Alves  <pedro@codesourcery.com>
 
+       * linux-nat.c (wait_lwp): Avoid assuming errno is preserved by a
+       library call.  Avoid reading the `status' local if all waitpid
+       calls failed.
+
+2011-08-26  Pedro Alves  <pedro@codesourcery.com>
+
        * common/linux-osdata.c (get_cores_used_by_process): Don't assume
        opening /proc/PID/task always succeeds.
 
index b146888..d02edb8 100644 (file)
@@ -2377,6 +2377,18 @@ wait_lwp (struct lwp_info *lp)
       pid = my_waitpid (GET_LWP (lp->ptid), &status, WNOHANG);
       if (pid == -1 && errno == ECHILD)
        pid = my_waitpid (GET_LWP (lp->ptid), &status, __WCLONE | WNOHANG);
+      if (pid == -1 && errno == ECHILD)
+       {
+         /* The thread has previously exited.  We need to delete it
+            now because, for some vendor 2.4 kernels with NPTL
+            support backported, there won't be an exit event unless
+            it is the main thread.  2.6 kernels will report an exit
+            event for each thread that exits, as expected.  */
+         thread_dead = 1;
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog, "WL: %s vanished.\n",
+                               target_pid_to_str (lp->ptid));
+       }
       if (pid != 0)
        break;
 
@@ -2418,19 +2430,6 @@ wait_lwp (struct lwp_info *lp)
 
   restore_child_signals_mask (&prev_mask);
 
-  if (pid == -1 && errno == ECHILD)
-    {
-      /* The thread has previously exited.  We need to delete it
-        now because, for some vendor 2.4 kernels with NPTL
-        support backported, there won't be an exit event unless
-        it is the main thread.  2.6 kernels will report an exit
-        event for each thread that exits, as expected.  */
-      thread_dead = 1;
-      if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog, "WL: %s vanished.\n",
-                           target_pid_to_str (lp->ptid));
-    }
-
   if (!thread_dead)
     {
       gdb_assert (pid == GET_LWP (lp->ptid));
@@ -2442,15 +2441,15 @@ wait_lwp (struct lwp_info *lp)
                              target_pid_to_str (lp->ptid),
                              status_to_str (status));
        }
-    }
 
-  /* Check if the thread has exited.  */
-  if (WIFEXITED (status) || WIFSIGNALED (status))
-    {
-      thread_dead = 1;
-      if (debug_linux_nat)
-       fprintf_unfiltered (gdb_stdlog, "WL: %s exited.\n",
-                           target_pid_to_str (lp->ptid));
+      /* Check if the thread has exited.  */
+      if (WIFEXITED (status) || WIFSIGNALED (status))
+       {
+         thread_dead = 1;
+         if (debug_linux_nat)
+           fprintf_unfiltered (gdb_stdlog, "WL: %s exited.\n",
+                               target_pid_to_str (lp->ptid));
+       }
     }
 
   if (thread_dead)