Deleted Added
full compact
thr_sig.c (127570) thr_sig.c (129484)
1/*
2 * Copyright (c) 2003 Jeffrey Roberson <jeff@freebsd.org>
3 * Copyright (c) 2003 Jonathan Mini <mini@freebsd.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 10 unchanged lines hidden (view full) ---

19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
1/*
2 * Copyright (c) 2003 Jeffrey Roberson <jeff@freebsd.org>
3 * Copyright (c) 2003 Jonathan Mini <mini@freebsd.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 10 unchanged lines hidden (view full) ---

19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 * $FreeBSD: head/lib/libthr/thread/thr_sig.c 127570 2004-03-29 13:56:04Z mtm $
27 * $FreeBSD: head/lib/libthr/thread/thr_sig.c 129484 2004-05-20 12:06:16Z mtm $
28 */
29
30#include <sys/param.h>
31#include <sys/types.h>
32#include <sys/signalvar.h>
33#include <signal.h>
34#include <fcntl.h>
35#include <unistd.h>

--- 52 unchanged lines hidden (view full) ---

88 /*
89 * A 0 signal means do error-checking but don't send signal.
90 */
91 if (sig == 0)
92 return (0);
93
94 return (thr_kill(pthread->thr_id, sig));
95}
28 */
29
30#include <sys/param.h>
31#include <sys/types.h>
32#include <sys/signalvar.h>
33#include <signal.h>
34#include <fcntl.h>
35#include <unistd.h>

--- 52 unchanged lines hidden (view full) ---

88 /*
89 * A 0 signal means do error-checking but don't send signal.
90 */
91 if (sig == 0)
92 return (0);
93
94 return (thr_kill(pthread->thr_id, sig));
95}
96
97/*
98 * User thread signal handler wrapper.
99 */
100void
101_thread_sig_wrapper(int sig, siginfo_t *info, void *context)
102{
103 struct pthread_state_data psd;
104 struct sigaction *actp;
105 __siginfohandler_t *handler;
106 struct umtx *up;
107 spinlock_t *sp;
108
109 /*
110 * Do a little cleanup handling for those threads in
111 * queues before calling the signal handler. Signals
112 * for these threads are temporarily blocked until
113 * after cleanup handling.
114 */
115 switch (curthread->state) {
116 case PS_BARRIER_WAIT:
117 /*
118 * XXX - The thread has reached the barrier. We can't
119 * "back it away" from the barrier.
120 */
121 _thread_critical_enter(curthread);
122 break;
123 case PS_COND_WAIT:
124 /*
125 * Cache the address, since it will not be available
126 * after it has been backed out.
127 */
128 up = &curthread->data.cond->c_lock;
129
130 UMTX_LOCK(up);
131 _thread_critical_enter(curthread);
132 _cond_wait_backout(curthread);
133 UMTX_UNLOCK(up);
134 break;
135 case PS_MUTEX_WAIT:
136 /*
137 * Cache the address, since it will not be available
138 * after it has been backed out.
139 */
140 sp = &curthread->data.mutex->lock;
141
142 _SPINLOCK(sp);
143 _thread_critical_enter(curthread);
144 _mutex_lock_backout(curthread);
145 _SPINUNLOCK(sp);
146 break;
147 default:
148 /*
149 * We need to lock the thread to read it's flags.
150 */
151 _thread_critical_enter(curthread);
152 break;
153 }
154
155 /*
156 * We save the flags now so that any modifications done as part
157 * of the backout are reflected when the flags are restored.
158 */
159 psd.psd_flags = curthread->flags;
160
161 PTHREAD_SET_STATE(curthread, PS_RUNNING);
162 _thread_critical_exit(curthread);
163 actp = proc_sigact_sigaction(sig);
164 handler = (__siginfohandler_t *)actp->sa_handler;
165 handler(sig, info, (ucontext_t *)context);
166
167 /* Restore the thread's flags, and make it runnable */
168 _thread_critical_enter(curthread);
169 curthread->flags = psd.psd_flags;
170 PTHREAD_SET_STATE(curthread, PS_RUNNING);
171 _thread_critical_exit(curthread);
172}