(CENABLE, CDISABLE): For librt, append @PLT.
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / unix / sysv / linux / pt-sigsuspend.c
1 /* Internal sigsuspend system call for LinuxThreads.  Generic Linux version.
2    Copyright (C) 2003 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <errno.h>
21 #include <signal.h>
22 #include <unistd.h>
23
24 #include <sysdep.h>
25 #include <sys/syscall.h>
26 #include <linuxthreads/internals.h>
27
28 #include "kernel-features.h"
29
30 void
31 __pthread_sigsuspend (const sigset_t *set)
32 {
33   INTERNAL_SYSCALL_DECL (err);
34 #if !__ASSUME_REALTIME_SIGNALS
35   static int __pthread_missing_rt_sigs;
36
37 # ifdef __NR_rt_sigsuspend
38   /* First try the RT signals.  */
39   if (!__pthread_missing_rt_sigs)
40     {
41       /* XXX The size argument hopefully will have to be changed to the
42          real size of the user-level sigset_t.  */
43       int r;
44       r = INTERNAL_SYSCALL (rt_sigsuspend, err, 2, set, _NSIG / 8);
45       if (INTERNAL_SYSCALL_ERRNO (r, err) != ENOSYS)
46         return;
47
48       __pthread_missing_rt_sigs = 1;
49     }
50 # endif
51
52   INTERNAL_SYSCALL (sigsuspend, err, 3, 0, 0, set->__val[0]);
53 #else
54   INTERNAL_SYSCALL (rt_sigsuspend, err, 2, set, _NSIG / 8);
55 #endif
56 }