aboutsummaryrefslogtreecommitdiff
path: root/gdb/nat/linux-waitpid.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/nat/linux-waitpid.c')
-rw-r--r--gdb/nat/linux-waitpid.c63
1 files changed, 5 insertions, 58 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);