X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fnat%2Flinux-waitpid.c;h=f50e0c7bcff5575f0f5ed1ac63568efb1ce443d3;hb=1ee1a363454d88a87ad2ade7530b2a7fb670021e;hp=5159f03ded4938ead0010880c509ecfb1361de0c;hpb=125f8a3ddedd413a2290dae011f0bed9ffc78278;p=deliverable%2Fbinutils-gdb.git
diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c
index 5159f03ded..f50e0c7bcf 100644
--- a/gdb/nat/linux-waitpid.c
+++ b/gdb/nat/linux-waitpid.c
@@ -1,6 +1,6 @@
/* Wrapper implementation for waitpid for GNU/Linux (LWP layer).
- Copyright (C) 2001-2014 Free Software Foundation, Inc.
+ Copyright (C) 2001-2020 Free Software Foundation, Inc.
This file is part of GDB.
@@ -17,37 +17,11 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
-#ifdef GDBSERVER
-#include "server.h"
-#else
-#include "defs.h"
-#include "signal.h"
-#endif
+#include "gdbsupport/common-defs.h"
#include "linux-nat.h"
#include "linux-waitpid.h"
-#include "gdb_wait.h"
-
-#include
-
-/* 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);
- }
-#else
- /* GDB-specific debugging output. */
-#endif
-}
+#include "gdbsupport/gdb_wait.h"
/* Convert wait status STATUS to a string. Used for printing debug
messages only. */
@@ -75,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;
}