summaryrefslogtreecommitdiffstats
path: root/lib/libthr/thread
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2010-08-20 13:42:48 +0000
committerdavidxu <davidxu@FreeBSD.org>2010-08-20 13:42:48 +0000
commit9d41da2950a1e2f3c88f98ee33d3fdbfba676385 (patch)
tree5e143fbfa98737de8495e09d4dfd5ca47f290a98 /lib/libthr/thread
parent5958e39b3f98528cbe9a8ae8d98a457db9039179 (diff)
downloadFreeBSD-src-9d41da2950a1e2f3c88f98ee33d3fdbfba676385.zip
FreeBSD-src-9d41da2950a1e2f3c88f98ee33d3fdbfba676385.tar.gz
Reduce redundant code.
Submitted by: kib
Diffstat (limited to 'lib/libthr/thread')
-rw-r--r--lib/libthr/thread/thr_sig.c97
1 files changed, 21 insertions, 76 deletions
diff --git a/lib/libthr/thread/thr_sig.c b/lib/libthr/thread/thr_sig.c
index eed6fdb..115aa65 100644
--- a/lib/libthr/thread/thr_sig.c
+++ b/lib/libthr/thread/thr_sig.c
@@ -268,23 +268,26 @@ _pthread_sigmask(int how, const sigset_t *set, sigset_t *oset)
__weak_reference(__sigsuspend, sigsuspend);
-int
-_sigsuspend(const sigset_t * set)
+static const sigset_t *
+thr_remove_thr_signals(const sigset_t *set, sigset_t *newset)
{
- sigset_t newset;
const sigset_t *pset;
- int ret;
if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
+ *newset = *set;
+ SIGDELSET(*newset, SIGCANCEL);
+ pset = newset;
} else
pset = set;
+ return (pset);
+}
- ret = __sys_sigsuspend(pset);
+int
+_sigsuspend(const sigset_t * set)
+{
+ sigset_t newset;
- return (ret);
+ return (__sys_sigsuspend(thr_remove_thr_signals(set, &newset)));
}
int
@@ -292,18 +295,10 @@ __sigsuspend(const sigset_t * set)
{
struct pthread *curthread = _get_curthread();
sigset_t newset;
- const sigset_t *pset;
int ret;
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
-
_thr_cancel_enter(curthread);
- ret = __sys_sigsuspend(pset);
+ ret = __sys_sigsuspend(thr_remove_thr_signals(set, &newset));
_thr_cancel_leave(curthread);
return (ret);
@@ -318,17 +313,9 @@ _sigtimedwait(const sigset_t *set, siginfo_t *info,
const struct timespec * timeout)
{
sigset_t newset;
- const sigset_t *pset;
- int ret;
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
- ret = __sys_sigtimedwait(pset, info, timeout);
- return (ret);
+ return (__sys_sigtimedwait(thr_remove_thr_signals(set, &newset), info,
+ timeout));
}
/*
@@ -342,17 +329,11 @@ __sigtimedwait(const sigset_t *set, siginfo_t *info,
{
struct pthread *curthread = _get_curthread();
sigset_t newset;
- const sigset_t *pset;
int ret;
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
_thr_cancel_enter_defer(curthread, 1);
- ret = __sys_sigtimedwait(pset, info, timeout);
+ ret = __sys_sigtimedwait(thr_remove_thr_signals(set, &newset), info,
+ timeout);
_thr_cancel_leave_defer(curthread, (ret == -1));
return (ret);
}
@@ -361,18 +342,8 @@ int
_sigwaitinfo(const sigset_t *set, siginfo_t *info)
{
sigset_t newset;
- const sigset_t *pset;
- int ret;
-
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
- ret = __sys_sigwaitinfo(pset, info);
- return (ret);
+ return (__sys_sigwaitinfo(thr_remove_thr_signals(set, &newset), info));
}
/*
@@ -385,18 +356,10 @@ __sigwaitinfo(const sigset_t *set, siginfo_t *info)
{
struct pthread *curthread = _get_curthread();
sigset_t newset;
- const sigset_t *pset;
int ret;
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
-
_thr_cancel_enter_defer(curthread, 1);
- ret = __sys_sigwaitinfo(pset, info);
+ ret = __sys_sigwaitinfo(thr_remove_thr_signals(set, &newset), info);
_thr_cancel_leave_defer(curthread, ret == -1);
return (ret);
}
@@ -405,18 +368,8 @@ int
_sigwait(const sigset_t *set, int *sig)
{
sigset_t newset;
- const sigset_t *pset;
- int ret;
-
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
- ret = __sys_sigwait(pset, sig);
- return (ret);
+ return (__sys_sigwait(thr_remove_thr_signals(set, &newset), sig));
}
/*
@@ -429,18 +382,10 @@ __sigwait(const sigset_t *set, int *sig)
{
struct pthread *curthread = _get_curthread();
sigset_t newset;
- const sigset_t *pset;
int ret;
- if (SIGISMEMBER(*set, SIGCANCEL)) {
- newset = *set;
- SIGDELSET(newset, SIGCANCEL);
- pset = &newset;
- } else
- pset = set;
-
_thr_cancel_enter_defer(curthread, 1);
- ret = __sys_sigwait(pset, sig);
+ ret = __sys_sigwait(thr_remove_thr_signals(set, &newset), sig);
_thr_cancel_leave_defer(curthread, (ret != 0));
return (ret);
}
OpenPOWER on IntegriCloud