diff options
author | Roland McGrath <roland@gnu.org> | 1996-01-02 08:57:42 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1996-01-02 08:57:42 +0000 |
commit | 71733723fb421bd54467d1a27096463ed1dcc2ed (patch) | |
tree | f304556d491722c797d876911834dc4afbfa2740 /hurd/preempt-sig.c | |
parent | fc4026d8e43407ba2739e493878d1ce259500059 (diff) | |
download | glibc-71733723fb421bd54467d1a27096463ed1dcc2ed.tar glibc-71733723fb421bd54467d1a27096463ed1dcc2ed.tar.gz glibc-71733723fb421bd54467d1a27096463ed1dcc2ed.tar.bz2 glibc-71733723fb421bd54467d1a27096463ed1dcc2ed.zip |
* hurd/hurd/signal.h (struct hurd_sigstate): New member `preempters'.cvs/libc-960102
(hurd_preempt_signals, hurd_unpreempt_signals): Decls removed.
* hurd/hurd/sigpreempt.h: New file.
* hurd/preempt-sig.c: Rewritten with new interface.
* sysdeps/mach/hurd/jmp-unwind.c (_longjmp_unwind): Remove local signal
preempters being unwound past.
* db: New directory, 4.4 BSD db package incorporated from BSD db-1.85
release.
* sysdeps/unix/sysv/linux/sys/param.h: Several new macros for BSD
compatibility.
Diffstat (limited to 'hurd/preempt-sig.c')
-rw-r--r-- | hurd/preempt-sig.c | 83 |
1 files changed, 42 insertions, 41 deletions
diff --git a/hurd/preempt-sig.c b/hurd/preempt-sig.c index 194b49dbe9..6596089f1b 100644 --- a/hurd/preempt-sig.c +++ b/hurd/preempt-sig.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1994 Free Software Foundation, Inc. +/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,52 +16,53 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include <hurd/sigpreempt.h> #include <hurd/signal.h> +#include <assert.h> -/* Initialize PREEMPTER with the information given and stick it in the - chain of preempters for SIGNO. */ - -int -hurd_preempt_signals (struct hurd_signal_preempt *preempter, - int signo, int first_code, int last_code, - sighandler_t (*handler) (thread_t, int, long int, int)) +void +hurd_preempt_signals (struct hurd_signal_preempter *preempter) { - if (signo <= 0 || signo >= NSIG) - { - errno = EINVAL; - return -1; - } - preempter->first = first_code; - preempter->last = last_code; - preempter->handler = handler; - __mutex_lock (&_hurd_signal_preempt_lock); - preempter->next = _hurd_signal_preempt[signo]; - _hurd_signal_preempt[signo] = preempter; - __mutex_unlock (&_hurd_signal_preempt_lock); - return 0; + __mutex_lock (&_hurd_siglock); + preempter->next = _hurdsig_preempters; + _hurdsig_preempters = preempter; + _hurdsig_preempted_set |= preempter->signals; + __mutex_unlock (&_hurd_siglock); } -/* Remove PREEMPTER from the chain for SIGNO. */ - -int -hurd_unpreempt_signals (struct hurd_signal_preempt *preempter, int signo) +void +hurd_unpreempt_signals (struct hurd_signal_preempter *preempter) { - struct hurd_signal_preempt *p, *lastp; - if (signo <= 0 || signo >= NSIG) - { - errno = EINVAL; - return -1; - } - __mutex_lock (&_hurd_signal_preempt_lock); - for (p = _hurd_signal_preempt[signo], lastp = NULL; - p != NULL; lastp = p, p = p->next) - if (p == preempter) + struct hurd_signal_preempter **p; + sigset_t preempted = 0; + + __mutex_lock (&_hurd_siglock); + + p = &_hurdsig_preempters; + while (*p) + if (*p == preempter) { - (lastp == NULL ? _hurd_signal_preempt[signo] : lastp->next) = p->next; - __mutex_unlock (&_hurd_signal_preempt_lock); - return 0; + /* Found it; take it off the chain. */ + *p = (*p)->next; + if ((preempter->signals & preempted) != preempter->signals) + { + /* This might have been the only preempter for some + of those signals, so we must collect the full mask + from the others. */ + struct hurd_signal_preempter *pp; + for (pp = *p; pp; pp = pp->next) + preempted |= pp->signals; + _hurdsig_preempted_set = preempted; + } + __mutex_unlock (&_hurd_siglock); + return; } - __mutex_unlock (&_hurd_signal_preempt_lock); - errno = ENOENT; - return -1; + else + { + preempted |= (*p)->signals; + p = &(*p)->next; + } + + __mutex_unlock (&_hurd_siglock); /* Avoid deadlock during death rattle. */ + assert (! "removing absent preempter"); } |