signals: rename CURSIGNB to CURSIG_NOBLOCK and unify implementation
authorSimon Schubert <corecode@dragonflybsd.org>
Sat, 7 Mar 2009 18:35:10 +0000 (19:35 +0100)
committerSimon Schubert <simon.schubert@epfl.ch>
Mon, 9 Mar 2009 17:00:03 +0000 (18:00 +0100)
CURSIG() is defined as __cursig() and CURSIGNB() as __cursignb().
However both __cursig() and __cursignb() do almost the same thing, so
consolidate the code into one function.

sys/kern/kern_fork.c
sys/sys/signal2.h

index ed60299..bd7fb5c 100644 (file)
@@ -285,7 +285,7 @@ fork1(struct lwp *lp1, int flags, struct proc **procp)
        pgrp = NULL;
        if ((flags & RFPGLOCK) && (pgrp = p1->p_pgrp) != NULL) {
                lockmgr(&pgrp->pg_lock, LK_SHARED);
-               if (CURSIGNB(lp1)) {
+               if (CURSIG_NOBLOCK(lp1)) {
                        error = ERESTART;
                        goto done;
                }
index 3414eda..0266979 100644 (file)
@@ -66,9 +66,9 @@ lwp_delsig(struct lwp *lp, int sig)
        SIGDELSET(lp->lwp_proc->p_siglist, sig);
 }
 
-#define        CURSIG(lp)              __cursig(lp, 0)
-#define        CURSIG_TRACE(lp)        __cursig(lp, 1)
-#define CURSIGNB(lp)   __cursignb(lp)
+#define        CURSIG(lp)              __cursig(lp, 1, 0)
+#define        CURSIG_TRACE(lp)        __cursig(lp, 1, 1)
+#define CURSIG_NOBLOCK(lp)     __cursig(lp, 0, 0)
 
 /*
  * Determine signal that should be delivered to process p, the current
@@ -79,32 +79,32 @@ lwp_delsig(struct lwp *lp, int sig)
  */
 static __inline
 int
-__cursig(struct lwp *lp, int maytrace)
+__cursig(struct lwp *lp, int mayblock, int maytrace)
 {
-       struct proc *p;
+       struct proc *p = lp->lwp_proc;
        sigset_t tmpset;
        int r;
 
-       p = lp->lwp_proc;
        tmpset = lwp_sigpend(lp);
        SIGSETNAND(tmpset, lp->lwp_sigmask);
-       if (!(p->p_flag & P_TRACED) && SIGISEMPTY(tmpset))
-               return(0);
-       r = issignal(lp, maytrace);
-       return(r);
-}
 
-static __inline
-int
-__cursignb(struct lwp *lp)
-{
-       sigset_t tmpset;
+       /* Nothing interesting happening? */
+       if (SIGISEMPTY(tmpset)) {
+               /*
+                * Quit here, unless
+                *  a) we may block and
+                *  b) somebody is tracing us.
+                */
+               if (!(mayblock && (p->p_flag & P_TRACED)))
+                       return (0);
+       }
 
-       tmpset = lwp_sigpend(lp);
-       SIGSETNAND(tmpset, lp->lwp_sigmask);
-       if (SIGISEMPTY(tmpset))
-               return(FALSE);
-       return (TRUE);
+       if (mayblock)
+               r = issignal(lp, maytrace);
+       else
+               r = TRUE;       /* simply state the fact */
+
+       return(r);
 }
 
 #endif