While using lttng-ust with an application that was calling fork()
with pending signals, I found that all signals were getting unmasked
shortly before the underlying call to fork().  After some
investigation, I found that the rcu_bp_before_fork() function was
unmasking all signals.  Based on the comments for this function, it
should be masking all signals.  Inspection of the rest of the code
in urcu-bp.c revealed the same pattern in two other functions.

This patch changes the code to use a filled signal mask to disable
all signals.  The change to rcu_bp_before_fork() addressed the
problem I was seeing while using lttng-ust.  The changes to the
other two functions appear to fix other instances of the same
problem.

Signed-off-by: David Pelton <[email protected]>
---
 urcu-bp.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/urcu-bp.c b/urcu-bp.c
index ef1e687..416a1b9 100644
--- a/urcu-bp.c
+++ b/urcu-bp.c
@@ -213,7 +213,7 @@ void synchronize_rcu(void)
        sigset_t newmask, oldmask;
        int ret;
 
-       ret = sigemptyset(&newmask);
+       ret = sigfillset(&newmask);
        assert(!ret);
        ret = pthread_sigmask(SIG_SETMASK, &newmask, &oldmask);
        assert(!ret);
@@ -385,7 +385,7 @@ void rcu_bp_register(void)
        sigset_t newmask, oldmask;
        int ret;
 
-       ret = sigemptyset(&newmask);
+       ret = sigfillset(&newmask);
        assert(!ret);
        ret = pthread_sigmask(SIG_SETMASK, &newmask, &oldmask);
        assert(!ret);
@@ -420,7 +420,7 @@ void rcu_bp_before_fork(void)
        sigset_t newmask, oldmask;
        int ret;
 
-       ret = sigemptyset(&newmask);
+       ret = sigfillset(&newmask);
        assert(!ret);
        ret = pthread_sigmask(SIG_SETMASK, &newmask, &oldmask);
        assert(!ret);
-- 
1.6.2.5


_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to