(linenum→info "unix/slp.c:2238")

glibc/2.7/hurd/preempt-sig.c

    1: /* Copyright (C) 1994, 1995, 1996 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/sigpreempt.h>
   20: #include <hurd/signal.h>
   21: #include <assert.h>
   22: 
   23: void
   24: hurd_preempt_signals (struct hurd_signal_preemptor *preemptor)
   25: {
   26:   __mutex_lock (&_hurd_siglock);
   27:   preemptor->next = _hurdsig_preemptors;
   28:   _hurdsig_preemptors = preemptor;
   29:   _hurdsig_preempted_set |= preemptor->signals;
   30:   __mutex_unlock (&_hurd_siglock);
   31: }
   32: 
   33: void
   34: hurd_unpreempt_signals (struct hurd_signal_preemptor *preemptor)
   35: {
   36:   struct hurd_signal_preemptor **p;
   37:   sigset_t preempted = 0;
   38: 
   39:   __mutex_lock (&_hurd_siglock);
   40: 
   41:   p = &_hurdsig_preemptors;
   42:   while (*p)
   43:     if (*p == preemptor)
   44:       {
   45:         /* Found it; take it off the chain.  */
   46:         *p = (*p)->next;
   47:         if ((preemptor->signals & preempted) != preemptor->signals)
   48:           {
   49:             /* This might have been the only preemptor for some
   50:                of those signals, so we must collect the full mask
   51:                from the others.  */
   52:             struct hurd_signal_preemptor *pp;
   53:             for (pp = *p; pp; pp = pp->next)
   54:               preempted |= pp->signals;
   55:             _hurdsig_preempted_set = preempted;
   56:           }
   57:         __mutex_unlock (&_hurd_siglock);
   58:         return;
   59:       }
   60:     else
   61:       {
   62:         preempted |= (*p)->signals;
   63:         p = &(*p)->next;
   64:       }
   65: 
   66:   __mutex_unlock (&_hurd_siglock); /* Avoid deadlock during death rattle.  */
   67:   assert (! "removing absent preemptor");
   68: }
Syntax (Markdown)