1 /* POSIX compatible signal blocking for threads.
2 Copyright (C) 2011-2012 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program 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
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #if PTHREAD_SIGMASK_UNBLOCK_BUG
30 pthread_sigmask (int how
, const sigset_t
*new_mask
, sigset_t
*old_mask
)
31 #undef pthread_sigmask
33 #if HAVE_PTHREAD_SIGMASK
34 int ret
= pthread_sigmask (how
, new_mask
, old_mask
);
35 # if PTHREAD_SIGMASK_INEFFECTIVE
38 /* Detect whether pthread_sigmask is currently ineffective.
39 Don't cache the information: libpthread.so could be dynamically
40 loaded after the program started and after pthread_sigmask was
41 called for the first time. */
42 if (pthread_sigmask (1729, NULL
, NULL
) == 0)
44 /* pthread_sigmask is currently ineffective. The program is not
45 linked to -lpthread. So use sigprocmask instead. */
46 return (sigprocmask (how
, new_mask
, old_mask
) < 0 ? errno
: 0);
50 # if PTHREAD_SIGMASK_FAILS_WITH_ERRNO
54 # if PTHREAD_SIGMASK_UNBLOCK_BUG
57 && (how
== SIG_UNBLOCK
|| how
== SIG_SETMASK
))
59 /* Give the OS the opportunity to raise signals that were pending before
60 the pthread_sigmask call and have now been unblocked. */
66 int ret
= sigprocmask (how
, new_mask
, old_mask
);
67 return (ret
< 0 ? errno
: 0);