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

#include <errno.h>
#include <stddef.h>
#include <sys/cdefs.h>

typedef __UINT64_TYPE__ sigset_t;

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 &&
	    (__predict_true(sigismember(set, SIGRTMIN)) || __predict_true(sigismember(set, SIGRTMIN + 1)))) {
		lset = *set;
		sigdelset(&lset, SIGRTMIN);
		sigdelset(&lset, SIGRTMIN + 1);
		set = &lset;
	}

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