thr_sig.c (0ad70ba98ee085920278919358d55d7c4f365280) thr_sig.c (4cd18a22d554e7205ddf0408badbda02411ed51e)
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:

--- 79 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}
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:

--- 79 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}