diff options
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/linux-waitpid.c | 63 | ||||
-rw-r--r-- | gdb/nat/linux-waitpid.h | 3 |
2 files changed, 6 insertions, 60 deletions
diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c index cbcdd95..2d80e0a 100644 --- a/gdb/nat/linux-waitpid.c +++ b/gdb/nat/linux-waitpid.c @@ -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,64 +83,12 @@ 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, (ret > 0 && status != NULL) ? *status : -1, ret); diff --git a/gdb/nat/linux-waitpid.h b/gdb/nat/linux-waitpid.h index bc5e8d2..1a15fdc 100644 --- a/gdb/nat/linux-waitpid.h +++ b/gdb/nat/linux-waitpid.h @@ -20,8 +20,7 @@ #ifndef LINUX_WAITPID_H #define LINUX_WAITPID_H -/* Wrapper function for waitpid which handles EINTR, and emulates - __WALL for systems where that is not available. */ +/* Wrapper function for waitpid which handles EINTR. */ extern int my_waitpid (int pid, int *status, int flags); /* Convert wait status STATUS to a string. Used for printing debug |