1 /* Copyright (C) 1994-2022 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, see 16 <https://www.gnu.org/licenses/>. */ 17 18 #include <hurd/sigpreempt.h> 19 #include <hurd/signal.h> 20 #include <assert.h> 21 22 void hurd_preempt_signals(struct hurd_signal_preemptor * preemptor)23hurd_preempt_signals (struct hurd_signal_preemptor *preemptor) 24 { 25 __mutex_lock (&_hurd_siglock); 26 preemptor->next = _hurdsig_preemptors; 27 _hurdsig_preemptors = preemptor; 28 _hurdsig_preempted_set |= preemptor->signals; 29 __mutex_unlock (&_hurd_siglock); 30 } 31 32 void hurd_unpreempt_signals(struct hurd_signal_preemptor * preemptor)33hurd_unpreempt_signals (struct hurd_signal_preemptor *preemptor) 34 { 35 struct hurd_signal_preemptor **p; 36 sigset_t preempted = 0; 37 38 __mutex_lock (&_hurd_siglock); 39 40 p = &_hurdsig_preemptors; 41 while (*p) 42 if (*p == preemptor) 43 { 44 /* Found it; take it off the chain. */ 45 *p = (*p)->next; 46 if ((preemptor->signals & preempted) != preemptor->signals) 47 { 48 /* This might have been the only preemptor for some 49 of those signals, so we must collect the full mask 50 from the others. */ 51 struct hurd_signal_preemptor *pp; 52 for (pp = *p; pp; pp = pp->next) 53 preempted |= pp->signals; 54 _hurdsig_preempted_set = preempted; 55 } 56 __mutex_unlock (&_hurd_siglock); 57 return; 58 } 59 else 60 { 61 preempted |= (*p)->signals; 62 p = &(*p)->next; 63 } 64 65 __mutex_unlock (&_hurd_siglock); /* Avoid deadlock during death rattle. */ 66 assert (! "removing absent preemptor"); 67 } 68