summaryrefslogtreecommitdiff
path: root/lib/libc/signal/pthread_sigmask.c
blob: 1b83e1fe2780bebd7ecf9f87fff2e32e4b73dfa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <errno.h>
#include <asm-generic/signal.h>
#include <libc.h>

int sigdelset(sigset_t *, int);
int sigismember(const sigset_t *, int);
int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict);

int pthread_sigmask(int how, const sigset_t *restrict set,
		    sigset_t *restrict oset)
{
	sigset_t lset;

	if (set != NULL && (unlikely(sigismember(set, SIGRTMIN)) ||
			    unlikely(sigismember(set, SIGRTMIN + 1)))) {
		lset = *set;
		sigdelset(&lset, SIGRTMIN);
		sigdelset(&lset, SIGRTMIN + 1);
		set = &lset;
	}

	return sigprocmask(how, set, oset) == -1 ? errno : 0;
}