X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fnat%2Flinux-waitpid.c;h=f50e0c7bcff5575f0f5ed1ac63568efb1ce443d3;hb=1ee1a363454d88a87ad2ade7530b2a7fb670021e;hp=4693120ef7903c07b215870061868dff9007946a;hpb=2fa0369e5127bff4ea68b596b1984314feb68299;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index 4693120ef7..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 "nat/linux-nat.h" -#include "nat/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 "linux-nat.h" +#include "linux-waitpid.h" +#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; }