Don't write to inferior_ptid in go32-nat.c
[deliverable/binutils-gdb.git] / gdb / nat / linux-waitpid.c
index 97149bd144c019beb50cea0c5e5b2d9753b2c407..f50e0c7bcff5575f0f5ed1ac63568efb1ce443d3 100644 (file)
@@ -1,6 +1,6 @@
 /* Wrapper implementation for waitpid for GNU/Linux (LWP layer).
 
-   Copyright (C) 2001-2015 Free Software Foundation, Inc.
+   Copyright (C) 2001-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include "common-defs.h"
-
-#ifdef GDBSERVER
-/* FIXME: server.h is required for the definition of debug_threads
-   which is used in the gdbserver-specific debug printing in
-   linux_debug.  This code should be made available to GDB also,
-   but the lack of a suitable flag to enable it prevents this.  */
-#include "server.h"
-#endif
+#include "gdbsupport/common-defs.h"
 
 #include "linux-nat.h"
 #include "linux-waitpid.h"
-#include "gdb_wait.h"
-
-/* Print debugging output based on the format string FORMAT and
-   its parameters.  */
-
-static inline void
-linux_debug (const char *format, ...)
-{
-#ifdef GDBSERVER
-  if (debug_threads)
-    {
-      va_list args;
-      va_start (args, format);
-      vfprintf (stderr, format, args);
-      va_end (args);
-    }
-#endif
-}
+#include "gdbsupport/gdb_wait.h"
 
 /* Convert wait status STATUS to a string.  Used for printing debug
    messages only.  */
@@ -74,78 +49,18 @@ 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)
 {
-  int ret, out_errno;
-
-  linux_debug ("my_waitpid (%d, 0x%x)\n", pid, flags);
-
-  if (flags & __WALL)
-    {
-      sigset_t block_mask, org_mask, wake_mask;
-      int wnohang;
-
-      wnohang = (flags & WNOHANG) != 0;
-      flags &= ~(__WALL | __WCLONE);
+  int ret;
 
-      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
     {
-      do
-       ret = waitpid (pid, status, flags);
-      while (ret == -1 && errno == EINTR);
-      out_errno = errno;
+      ret = waitpid (pid, status, flags);
     }
+  while (ret == -1 && errno == EINTR);
 
-  linux_debug ("my_waitpid (%d, 0x%x): status(%x), %d\n",
-              pid, flags, status ? *status : -1, ret);
-
-  errno = out_errno;
   return ret;
 }
This page took 0.025337 seconds and 4 git commands to generate.