| Commit | Line | Data |
|---|---|---|
| b1b4e5a6 SS |
1 | /* |
| 2 | * Copyright (c) 1991, 1993 | |
| 3 | * The Regents of the University of California. All rights reserved. | |
| 4 | * | |
| 5 | * Redistribution and use in source and binary forms, with or without | |
| 6 | * modification, are permitted provided that the following conditions | |
| 7 | * are met: | |
| 8 | * 1. Redistributions of source code must retain the above copyright | |
| 9 | * notice, this list of conditions and the following disclaimer. | |
| 10 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 11 | * notice, this list of conditions and the following disclaimer in the | |
| 12 | * documentation and/or other materials provided with the distribution. | |
| 13 | * 3. All advertising materials mentioning features or use of this software | |
| 14 | * must display the following acknowledgement: | |
| 15 | * This product includes software developed by the University of | |
| 16 | * California, Berkeley and its contributors. | |
| 17 | * 4. Neither the name of the University nor the names of its contributors | |
| 18 | * may be used to endorse or promote products derived from this software | |
| 19 | * without specific prior written permission. | |
| 20 | * | |
| 21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
| 22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
| 25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 31 | * SUCH DAMAGE. | |
| 32 | * | |
| 33 | * @(#)signalvar.h 8.6 (Berkeley) 2/19/95 | |
| 34 | * $FreeBSD: src/sys/sys/signalvar.h,v 1.34.2.1 2000/05/16 06:58:05 dillon Exp $ | |
| d1a7b618 | 35 | * $DragonFly: src/sys/sys/signal2.h,v 1.3 2008/10/14 21:25:14 swildner Exp $ |
| b1b4e5a6 SS |
36 | */ |
| 37 | ||
| 38 | #ifndef _SYS_SIGNAL2_H | |
| 39 | #define _SYS_SIGNAL2_H | |
| 40 | ||
| 41 | #include <sys/proc.h> | |
| 42 | ||
| 43 | /* | |
| 44 | * Inline functions: | |
| 45 | */ | |
| 46 | /* | |
| 47 | * Determine which signals are pending for a lwp. | |
| 48 | */ | |
| 49 | static __inline sigset_t | |
| 50 | lwp_sigpend(struct lwp *lp) | |
| 51 | { | |
| 52 | sigset_t set; | |
| 53 | ||
| 54 | set = lp->lwp_proc->p_siglist; | |
| 55 | SIGSETOR(set, lp->lwp_siglist); | |
| 56 | return (set); | |
| 57 | } | |
| 58 | ||
| 59 | /* | |
| 60 | * Mark a signal as handled by the lwp. | |
| 61 | */ | |
| 62 | static __inline void | |
| 63 | lwp_delsig(struct lwp *lp, int sig) | |
| 64 | { | |
| 65 | SIGDELSET(lp->lwp_siglist, sig); | |
| 66 | SIGDELSET(lp->lwp_proc->p_siglist, sig); | |
| 67 | } | |
| 68 | ||
| f6e73860 SS |
69 | #define CURSIG(lp) __cursig(lp, 1, 0) |
| 70 | #define CURSIG_TRACE(lp) __cursig(lp, 1, 1) | |
| 71 | #define CURSIG_NOBLOCK(lp) __cursig(lp, 0, 0) | |
| b1b4e5a6 SS |
72 | |
| 73 | /* | |
| 74 | * Determine signal that should be delivered to process p, the current | |
| 75 | * process, 0 if none. If there is a pending stop signal with default | |
| 76 | * action, the process stops in issignal(). | |
| 77 | * | |
| 5686ec5a MD |
78 | * This function does not interlock pending signals. If the caller needs |
| 79 | * to interlock the caller must acquire the per-proc token. | |
| 80 | * | |
| 81 | * MPSAFE | |
| b1b4e5a6 SS |
82 | */ |
| 83 | static __inline | |
| 84 | int | |
| f6e73860 | 85 | __cursig(struct lwp *lp, int mayblock, int maytrace) |
| b1b4e5a6 | 86 | { |
| f6e73860 | 87 | struct proc *p = lp->lwp_proc; |
| b1b4e5a6 SS |
88 | sigset_t tmpset; |
| 89 | int r; | |
| 90 | ||
| b1b4e5a6 SS |
91 | tmpset = lwp_sigpend(lp); |
| 92 | SIGSETNAND(tmpset, lp->lwp_sigmask); | |
| b1b4e5a6 | 93 | |
| f6e73860 SS |
94 | /* Nothing interesting happening? */ |
| 95 | if (SIGISEMPTY(tmpset)) { | |
| 96 | /* | |
| 97 | * Quit here, unless | |
| 98 | * a) we may block and | |
| 99 | * b) somebody is tracing us. | |
| 100 | */ | |
| 101 | if (!(mayblock && (p->p_flag & P_TRACED))) | |
| 102 | return (0); | |
| 103 | } | |
| b1b4e5a6 | 104 | |
| f6e73860 SS |
105 | if (mayblock) |
| 106 | r = issignal(lp, maytrace); | |
| 107 | else | |
| 108 | r = TRUE; /* simply state the fact */ | |
| 109 | ||
| 110 | return(r); | |
| b1b4e5a6 SS |
111 | } |
| 112 | ||
| 113 | #endif |