Per-process data structures needed to suspend the execution of threads
are since recently protected by the SCHED_LOCK().  So the KERNEL_LOCK()
dance inside issignal() is no longer necessary and can be removed, ok?

Note that CURSIG() is currently always called with the KERNEL_LOCK()
held so the code below is redundant.

This is a step towards getting signal handling out of ze big lock.

Index: kern/kern_sig.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.260
diff -u -p -r1.260 kern_sig.c
--- kern/kern_sig.c     26 Aug 2020 03:16:53 -0000      1.260
+++ kern/kern_sig.c     8 Sep 2020 05:48:51 -0000
@@ -1203,11 +1203,7 @@ issignal(struct proc *p)
                    signum != SIGKILL) {
                        pr->ps_xsig = signum;
 
-                       if (dolock)
-                               KERNEL_LOCK();
                        single_thread_set(p, SINGLE_PTRACE, 0);
-                       if (dolock)
-                               KERNEL_UNLOCK();
 
                        if (dolock)
                                SCHED_LOCK(s);
@@ -1215,11 +1211,7 @@ issignal(struct proc *p)
                        if (dolock)
                                SCHED_UNLOCK(s);
 
-                       if (dolock)
-                               KERNEL_LOCK();
                        single_thread_clear(p, 0);
-                       if (dolock)
-                               KERNEL_UNLOCK();
 
                        /*
                         * If we are no longer being traced, or the parent
@@ -1484,6 +1476,22 @@ sigexit(struct proc *p, int signum)
        }
        exit1(p, 0, signum, EXIT_NORMAL);
        /* NOTREACHED */
+}
+
+/*
+ * Return 1 if `sig', a given signal, is ignored or masked for `p', a given
+ * thread, and 0 otherwise.
+ */
+int
+sigismasked(struct proc *p, int sig)
+{
+       struct process *pr = p->p_p;
+
+       if ((pr->ps_sigacts->ps_sigignore & sigmask(sig)) ||
+           (p->p_sigmask & sigmask(sig)))
+               return 1;
+
+       return 0;
 }
 
 int nosuidcoredump = 1;

Reply via email to