
1: /* Copyright (C) 1994,95,96,97,99 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, write to the Free 16: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17: 02111-1307 USA. */ 18: 19: #include <hurd.h> 20: #include <hurd/signal.h> 21: #include <hurd/msg.h> 22: #include <setjmp.h> 23: 24: /* Handle signal SIGNO in the calling thread. 25: If SS is not NULL it is the sigstate for the calling thread; 26: SS->lock is held on entry and released before return. */ 27: 28: void 29: _hurd_raise_signal (struct hurd_sigstate *ss, 30: int signo, const struct hurd_signal_detail *detail) 31: { 32: if (ss == NULL) 33: { 34: ss = _hurd_self_sigstate (); 35: __spin_lock (&ss->lock); 36: } 37: 38: /* Mark SIGNO as pending to be delivered. */ 39: __sigaddset (&ss->pending, signo); 40: ss->pending_data[signo] = *detail; 41: 42: __spin_unlock (&ss->lock); 43: 44: /* Send a message to the signal thread so it will wake up and check for 45: pending signals. This is a generic "poll request" message (SIGNO==0) 46: rather than delivering this signal and its detail, because we have 47: already marked the signal as pending for the particular thread we 48: want. Generating the signal with an RPC might deliver it to some 49: other thread. */ 50: __msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ()); 51: }