summaryrefslogtreecommitdiff
path: root/libc/signal/allocrtsig.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-01-02 12:18:50 +0000
committerEric Andersen <andersen@codepoet.org>2002-01-02 12:18:50 +0000
commitb88ff80f703931b368d27ebd898accdae5b31e60 (patch)
tree79aa8e4d9b249e165973423a04fb3b4889308aa3 /libc/signal/allocrtsig.c
parentcac4a2ef934d7ac5314c874b88b62e922fc70690 (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.c92
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