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