AArch64: Ensure lwp info is created zeroed
[deliverable/binutils-gdb.git] / gdb / nat / linux-waitpid.c
index 04cdc3d5cef56ee02f1572a46002f948e20af2c3..80303de273ab24e3d1ee5feb7ccfeef4b0eb27cc 100644 (file)
@@ -1,6 +1,6 @@
 /* Wrapper implementation for waitpid for GNU/Linux (LWP layer).
 
-   Copyright (C) 2001-2014 Free Software Foundation, Inc.
+   Copyright (C) 2001-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -34,7 +34,7 @@
 /* Print debugging output based on the format string FORMAT and
    its parameters.  */
 
-static inline void
+static inline void ATTRIBUTE_PRINTF (1,2)
 linux_debug (const char *format, ...)
 {
 #ifdef GDBSERVER
@@ -74,8 +74,7 @@ status_to_str (int status)
   return buf;
 }
 
-/* Wrapper function for waitpid which handles EINTR, and emulates
-   __WALL for systems where that is not available.  */
+/* See linux-waitpid.h.  */
 
 int
 my_waitpid (int pid, int *status, int flags)
@@ -84,67 +83,15 @@ my_waitpid (int pid, int *status, int flags)
 
   linux_debug ("my_waitpid (%d, 0x%x)\n", pid, flags);
 
-  if (flags & __WALL)
+  do
     {
-      sigset_t block_mask, org_mask, wake_mask;
-      int wnohang;
-
-      wnohang = (flags & WNOHANG) != 0;
-      flags &= ~(__WALL | __WCLONE);
-
-      if (!wnohang)
-       {
-         flags |= WNOHANG;
-
-         /* Block all signals while here.  This avoids knowing about
-            LinuxThread's signals.  */
-         sigfillset (&block_mask);
-         sigprocmask (SIG_BLOCK, &block_mask, &org_mask);
-
-         /* ... except during the sigsuspend below.  */
-         sigemptyset (&wake_mask);
-       }
-
-      while (1)
-       {
-         /* Since all signals are blocked, there's no need to check
-            for EINTR here.  */
-         ret = waitpid (pid, status, flags);
-         out_errno = errno;
-
-         if (ret == -1 && out_errno != ECHILD)
-           break;
-         else if (ret > 0)
-           break;
-
-         if (flags & __WCLONE)
-           {
-             /* We've tried both flavors now.  If WNOHANG is set,
-                there's nothing else to do, just bail out.  */
-             if (wnohang)
-               break;
-
-             linux_debug ("blocking\n");
-
-             /* Block waiting for signals.  */
-             sigsuspend (&wake_mask);
-           }
-         flags ^= __WCLONE;
-       }
-
-      if (!wnohang)
-       sigprocmask (SIG_SETMASK, &org_mask, NULL);
-    }
-  else
-    {
-      do
-       ret = waitpid (pid, status, flags);
-      while (ret == -1 && errno == EINTR);
-      out_errno = errno;
+      ret = waitpid (pid, status, flags);
     }
+  while (ret == -1 && errno == EINTR);
+  out_errno = errno;
 
   linux_debug ("my_waitpid (%d, 0x%x): status(%x), %d\n",
-              pid, flags, status ? *status : -1, ret);
+              pid, flags, (ret > 0 && status != NULL) ? *status : -1, ret);
 
   errno = out_errno;
   return ret;
This page took 0.030093 seconds and 4 git commands to generate.