int smb_proc_intr(struct proc *p) { sigset_t tmpset; if (p == NULL) return 0; tmpset = p->p_siglist; SIGSETNAND(tmpset, p->p_sigmask); SIGSETNAND(tmpset, p->p_sigignore); if (SIGNOTEMPTY(p->p_siglist) && SMB_SIGMASK(tmpset)) return EINTR; return 0; }
int smb_proc_intr(struct thread *td) { sigset_t tmpset; struct proc *p; struct lwp *lp; if (td == NULL || (p = td->td_proc) == NULL) return 0; lp = td->td_lwp; tmpset = lwp_sigpend(lp); SIGSETNAND(tmpset, lp->lwp_sigmask); SIGSETNAND(tmpset, p->p_sigignore); if (SIGNOTEMPTY(tmpset) && SMB_SIGMASK(tmpset)) return EINTR; return 0; }
int smb_td_intr(struct thread *td) { struct proc *p; sigset_t tmpset; if (td == NULL) return 0; p = td->td_proc; PROC_LOCK(p); tmpset = p->p_siglist; SIGSETOR(tmpset, td->td_siglist); SIGSETNAND(tmpset, td->td_sigmask); mtx_lock(&p->p_sigacts->ps_mtx); SIGSETNAND(tmpset, p->p_sigacts->ps_sigignore); mtx_unlock(&p->p_sigacts->ps_mtx); if (SIGNOTEMPTY(td->td_siglist) && SMB_SIGMASK(tmpset)) { PROC_UNLOCK(p); return EINTR; } PROC_UNLOCK(p); return 0; }