This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 3/5] Linux waitpid/__WALL emulation wrapper: If WNOHANG is set, don't touch sigprocmask.
- From: Pedro Alves <palves at redhat dot com>
- To: gdb-patches at sourceware dot org
- Cc: teawater at gmail dot com, luis_gustavo at mentor dot com
- Date: Thu, 27 Feb 2014 14:47:04 +0000
- Subject: Re: [PATCH 3/5] Linux waitpid/__WALL emulation wrapper: If WNOHANG is set, don't touch sigprocmask.
- Authentication-results: sourceware.org; auth=none
- References: <52E12075 dot 3040601 at redhat dot com> <1390486209-8167-1-git-send-email-palves at redhat dot com> <1390486209-8167-3-git-send-email-palves at redhat dot com>
On 01/23/2014 02:10 PM, Pedro Alves wrote:
> So the caller can use waitpid WNOHANG+sigsuspend. Otherwise,
> my_waitpid lets the SIGCHLD handler run by mistake.
Sorry, that rationale was bogus. I've pushed this in, but
as an optimization.
---
[PATCH] Linux waitpid/__WALL emulation wrapper: If WNOHANG is set,
don't touch sigprocmask.
Just a small optimization. No need to block/unblock signals if we're
not going to call sigsuspend.
gdb/
2014-02-27 Pedro Alves <palves@redhat.com>
* nat/linux-waitpid.c (my_waitpid): Only block signals if WNOHANG
isn't set.
---
gdb/ChangeLog | 5 +++++
gdb/nat/linux-waitpid.c | 21 +++++++++++++--------
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index bb5f5aa..6cfb9c5 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2014-02-27 Pedro Alves <palves@redhat.com>
+ * nat/linux-waitpid.c (my_waitpid): Only block signals if WNOHANG
+ isn't set.
+
+2014-02-27 Pedro Alves <palves@redhat.com>
+
PR 12702
* linux-nat.c (status_to_str): Moved to nat/linux-waitpid.c.
* nat/linux-waitpid.c: Include string.h.
diff --git a/gdb/nat/linux-waitpid.c b/gdb/nat/linux-waitpid.c
index e9e69db..4693120 100644
--- a/gdb/nat/linux-waitpid.c
+++ b/gdb/nat/linux-waitpid.c
@@ -92,15 +92,19 @@ my_waitpid (int pid, int *status, int flags)
wnohang = (flags & WNOHANG) != 0;
flags &= ~(__WALL | __WCLONE);
- flags |= WNOHANG;
- /* Block all signals while here. This avoids knowing about
- LinuxThread's signals. */
- sigfillset (&block_mask);
- sigprocmask (SIG_BLOCK, &block_mask, &org_mask);
+ 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);
+ /* ... except during the sigsuspend below. */
+ sigemptyset (&wake_mask);
+ }
while (1)
{
@@ -129,7 +133,8 @@ my_waitpid (int pid, int *status, int flags)
flags ^= __WCLONE;
}
- sigprocmask (SIG_SETMASK, &org_mask, NULL);
+ if (!wnohang)
+ sigprocmask (SIG_SETMASK, &org_mask, NULL);
}
else
{
--
1.7.11.7