X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fnat%2Flinux-waitpid.c;h=f50e0c7bcff5575f0f5ed1ac63568efb1ce443d3;hb=1ee1a363454d88a87ad2ade7530b2a7fb670021e;hp=04cdc3d5cef56ee02f1572a46002f948e20af2c3;hpb=b006a80e5f41125c876a60a143ad421113533efc;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index 04cdc3d5ce..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,36 +17,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#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; }