diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-01-02 12:18:50 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-01-02 12:18:50 +0000 |
commit | b88ff80f703931b368d27ebd898accdae5b31e60 (patch) | |
tree | 79aa8e4d9b249e165973423a04fb3b4889308aa3 /libc/signal/allocrtsig.c | |
parent | cac4a2ef934d7ac5314c874b88b62e922fc70690 (diff) |
Once again, rework the signal handling to be even more correct. We no
longer segfault when running test/signal/sigchld.c, which exposed a bit
of a rats nest. The problem ended up being a erroneous syscall
defination, but in the process of finding that out, I scrubbed things
up nicely and adapted things to use the rt_ signals if they are
available. This now passes all the signal tests.
-Erik
Diffstat (limited to 'libc/signal/allocrtsig.c')
-rw-r--r-- | libc/signal/allocrtsig.c | 92 |
1 files changed, 69 insertions, 23 deletions
diff --git a/libc/signal/allocrtsig.c b/libc/signal/allocrtsig.c index 0822999c8..d648f691f 100644 --- a/libc/signal/allocrtsig.c +++ b/libc/signal/allocrtsig.c @@ -1,36 +1,82 @@ -/* - * Ignore/stub out real-time signal allocation. - * - * Copyright (C) 2001 by Lineo, inc. and Erik Andersen - * Copyright (C) 2001 by Erik Andersen <andersen@uclibc.org> - * Written by Erik Andersen <andersen@uclibc.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Library General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License - * for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ +/* Handle real-time signal allocation. + Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <signal.h> +#include <sys/types.h> +#include <sys/syscall.h> + + +/* Only enable rt signals when it is supported at compile time */ +#ifdef __NR_rt_sigaction +/* In these variables we keep track of the used variables. If the + platform does not support any real-time signals we will define the + values to some unreasonable value which will signal failing of all + the functions below. */ + +static int current_rtmin = __SIGRTMIN; +static int current_rtmax = __SIGRTMAX; + + +#ifdef _POSIX_THREADS +/* Allocate real-time signal with highest/lowest available + priority. Please note that we don't use a lock since we assume + this function to be called at program start. */ +int __libc_allocate_rtsig (int high) +{ + if (current_rtmin > current_rtmax) + /* We don't have anymore signals available. */ + return -1; + + return high ? current_rtmin++ : current_rtmax--; +} +#endif + +/* Return number of available real-time signal with highest priority. */ int __libc_current_sigrtmin (void) { - return -1; + return current_rtmin; } +/* Return number of available real-time signal with lowest priority. */ int __libc_current_sigrtmax (void) { + return current_rtmax; +} + +#else + +#ifdef _POSIX_THREADS +int __libc_allocate_rtsig (int high) +{ + return -1; +} +#endif + +int __libc_current_sigrtmin (void) +{ return -1; } +int __libc_current_sigrtmax (void) +{ + return -1; +} +#endif |