summaryrefslogtreecommitdiffstats
path: root/lib/libthr
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2006-11-24 09:57:38 +0000
committerdavidxu <davidxu@FreeBSD.org>2006-11-24 09:57:38 +0000
commitadd205129cf16571a7deae9362723e40c389c06e (patch)
tree70b7566b0ef945730acd1e8a42ffeaebfdaa96af /lib/libthr
parent361abdf198cb3ffbc110373a06f93d4229802ae9 (diff)
downloadFreeBSD-src-add205129cf16571a7deae9362723e40c389c06e.zip
FreeBSD-src-add205129cf16571a7deae9362723e40c389c06e.tar.gz
Eliminate atomic operations in thread cancellation functions, it should
reduce overheads of cancellation points.
Diffstat (limited to 'lib/libthr')
-rw-r--r--lib/libthr/thread/thr_cancel.c128
-rw-r--r--lib/libthr/thread/thr_cond.c5
-rw-r--r--lib/libthr/thread/thr_create.c4
-rw-r--r--lib/libthr/thread/thr_exit.c4
-rw-r--r--lib/libthr/thread/thr_fork.c2
-rw-r--r--lib/libthr/thread/thr_init.c3
-rw-r--r--lib/libthr/thread/thr_join.c5
-rw-r--r--lib/libthr/thread/thr_list.c4
-rw-r--r--lib/libthr/thread/thr_private.h40
-rw-r--r--lib/libthr/thread/thr_sem.c20
-rw-r--r--lib/libthr/thread/thr_sig.c29
-rw-r--r--lib/libthr/thread/thr_syscalls.c145
12 files changed, 176 insertions, 213 deletions
diff --git a/lib/libthr/thread/thr_cancel.c b/lib/libthr/thread/thr_cancel.c
index 1047eb2..8df0304 100644
--- a/lib/libthr/thread/thr_cancel.c
+++ b/lib/libthr/thread/thr_cancel.c
@@ -38,126 +38,120 @@ __weak_reference(_pthread_setcancelstate, pthread_setcancelstate);
__weak_reference(_pthread_setcanceltype, pthread_setcanceltype);
__weak_reference(_pthread_testcancel, pthread_testcancel);
+static inline void
+testcancel(struct pthread *curthread)
+{
+ if (__predict_false(SHOULD_CANCEL(curthread) &&
+ !THR_IN_CRITICAL(curthread)))
+ _pthread_exit(PTHREAD_CANCELED);
+}
+
+void
+_thr_testcancel(struct pthread *curthread)
+{
+ testcancel(curthread);
+}
+
int
_pthread_cancel(pthread_t pthread)
{
struct pthread *curthread = _get_curthread();
- int oldval, newval = 0;
- int oldtype;
int ret;
/*
- * POSIX says _pthread_cancel should be async cancellation safe,
- * so we temporarily disable async cancellation.
+ * POSIX says _pthread_cancel should be async cancellation safe.
+ * _thr_ref_add and _thr_ref_delete will enter and leave critical
+ * region automatically.
*/
- _pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype);
- if ((ret = _thr_ref_add(curthread, pthread, 0)) != 0) {
- _pthread_setcanceltype(oldtype, NULL);
- return (ret);
+ if ((ret = _thr_ref_add(curthread, pthread, 0)) == 0) {
+ THR_THREAD_LOCK(curthread, pthread);
+ if (!pthread->cancel_pending) {
+ pthread->cancel_pending = 1;
+ if (pthread->cancel_enable)
+ _thr_send_sig(pthread, SIGCANCEL);
+ }
+ THR_THREAD_UNLOCK(curthread, pthread);
+ _thr_ref_delete(curthread, pthread);
}
-
- do {
- oldval = pthread->cancelflags;
- if (oldval & THR_CANCEL_NEEDED)
- break;
- newval = oldval | THR_CANCEL_NEEDED;
- } while (!atomic_cmpset_acq_int(&pthread->cancelflags, oldval, newval));
-
- if (!(oldval & THR_CANCEL_NEEDED) && SHOULD_ASYNC_CANCEL(newval))
- _thr_send_sig(pthread, SIGCANCEL);
-
- _thr_ref_delete(curthread, pthread);
- _pthread_setcanceltype(oldtype, NULL);
- return (0);
-}
-
-static inline void
-testcancel(struct pthread *curthread)
-{
- int newval;
-
- newval = curthread->cancelflags;
- if (SHOULD_CANCEL(newval) && !THR_IN_CRITICAL(curthread))
- _pthread_exit(PTHREAD_CANCELED);
+ return (ret);
}
int
_pthread_setcancelstate(int state, int *oldstate)
{
struct pthread *curthread = _get_curthread();
- int oldval, ret;
+ int oldval;
- oldval = curthread->cancelflags;
- if (oldstate != NULL)
- *oldstate = ((oldval & THR_CANCEL_DISABLE) ?
- PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE);
+ oldval = curthread->cancel_enable;
switch (state) {
case PTHREAD_CANCEL_DISABLE:
- atomic_set_int(&curthread->cancelflags, THR_CANCEL_DISABLE);
- ret = 0;
+ THR_LOCK(curthread);
+ curthread->cancel_enable = 0;
+ THR_UNLOCK(curthread);
break;
case PTHREAD_CANCEL_ENABLE:
- atomic_clear_int(&curthread->cancelflags, THR_CANCEL_DISABLE);
- testcancel(curthread);
- ret = 0;
+ THR_LOCK(curthread);
+ curthread->cancel_enable = 1;
+ THR_UNLOCK(curthread);
break;
default:
- ret = EINVAL;
+ return (EINVAL);
}
- return (ret);
+ if (oldstate) {
+ *oldstate = oldval ? PTHREAD_CANCEL_ENABLE :
+ PTHREAD_CANCEL_DISABLE;
+ }
+ return (0);
}
int
_pthread_setcanceltype(int type, int *oldtype)
{
struct pthread *curthread = _get_curthread();
- int oldval, ret;
+ int oldval;
- oldval = curthread->cancelflags;
- if (oldtype != NULL)
- *oldtype = ((oldval & THR_CANCEL_AT_POINT) ?
- PTHREAD_CANCEL_ASYNCHRONOUS :
- PTHREAD_CANCEL_DEFERRED);
+ oldval = curthread->cancel_async;
switch (type) {
case PTHREAD_CANCEL_ASYNCHRONOUS:
- atomic_set_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
+ curthread->cancel_async = 1;
testcancel(curthread);
- ret = 0;
break;
case PTHREAD_CANCEL_DEFERRED:
- atomic_clear_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
- ret = 0;
+ curthread->cancel_async = 0;
break;
default:
- ret = EINVAL;
+ return (EINVAL);
}
- return (ret);
+ if (oldtype) {
+ *oldtype = oldval ? PTHREAD_CANCEL_ASYNCHRONOUS :
+ PTHREAD_CANCEL_DEFERRED;
+ }
+ return (0);
}
void
_pthread_testcancel(void)
{
- testcancel(_get_curthread());
+ struct pthread *curthread = _get_curthread();
+
+ _thr_cancel_enter(curthread);
+ _thr_cancel_leave(curthread);
}
-int
+void
_thr_cancel_enter(struct pthread *curthread)
{
- int oldval;
-
- oldval = curthread->cancelflags;
- if (!(oldval & THR_CANCEL_AT_POINT)) {
- atomic_set_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
+ if (curthread->cancel_enable) {
+ curthread->cancel_point++;
testcancel(curthread);
}
- return (oldval);
}
void
-_thr_cancel_leave(struct pthread *curthread, int previous)
+_thr_cancel_leave(struct pthread *curthread)
{
- if (!(previous & THR_CANCEL_AT_POINT))
- atomic_clear_int(&curthread->cancelflags, THR_CANCEL_AT_POINT);
+ if (curthread->cancel_enable)
+ curthread->cancel_point--;
}
diff --git a/lib/libthr/thread/thr_cond.c b/lib/libthr/thread/thr_cond.c
index d0266d6..e587a6d 100644
--- a/lib/libthr/thread/thr_cond.c
+++ b/lib/libthr/thread/thr_cond.c
@@ -195,7 +195,6 @@ cond_wait_common(pthread_cond_t *cond, pthread_mutex_t *mutex,
struct cond_cancel_info info;
pthread_cond_t cv;
long seq, oldseq;
- int oldcancel;
int ret = 0;
/*
@@ -231,9 +230,9 @@ cond_wait_common(pthread_cond_t *cond, pthread_mutex_t *mutex,
if (cancel) {
THR_CLEANUP_PUSH(curthread, cond_cancel_handler, &info);
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = _thr_umtx_wait(&cv->c_seqno, seq, tsp);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
THR_CLEANUP_POP(curthread, 0);
} else {
ret = _thr_umtx_wait(&cv->c_seqno, seq, tsp);
diff --git a/lib/libthr/thread/thr_create.c b/lib/libthr/thread/thr_create.c
index 99e3d0c..276e550 100644
--- a/lib/libthr/thread/thr_create.c
+++ b/lib/libthr/thread/thr_create.c
@@ -105,8 +105,8 @@ _pthread_create(pthread_t * thread, const pthread_attr_t * attr,
new_thread->magic = THR_MAGIC;
new_thread->start_routine = start_routine;
new_thread->arg = arg;
- new_thread->cancelflags = PTHREAD_CANCEL_ENABLE |
- PTHREAD_CANCEL_DEFERRED;
+ new_thread->cancel_enable = 1;
+ new_thread->cancel_async = 0;
/* Initialize the mutex queue: */
TAILQ_INIT(&new_thread->mutexq);
TAILQ_INIT(&new_thread->pp_mutexq);
diff --git a/lib/libthr/thread/thr_exit.c b/lib/libthr/thread/thr_exit.c
index d438ac5..32ecc6b 100644
--- a/lib/libthr/thread/thr_exit.c
+++ b/lib/libthr/thread/thr_exit.c
@@ -87,7 +87,7 @@ _pthread_exit(void *status)
struct pthread *curthread = _get_curthread();
/* Check if this thread is already in the process of exiting: */
- if ((curthread->cancelflags & THR_CANCEL_EXITING) != 0) {
+ if (curthread->cancelling) {
char msg[128];
snprintf(msg, sizeof(msg), "Thread %p has called "
"pthread_exit() from a destructor. POSIX 1003.1 "
@@ -96,7 +96,7 @@ _pthread_exit(void *status)
}
/* Flag this thread as exiting. */
- atomic_set_int(&curthread->cancelflags, THR_CANCEL_EXITING);
+ curthread->cancelling = 1;
_thr_exit_cleanup();
diff --git a/lib/libthr/thread/thr_fork.c b/lib/libthr/thread/thr_fork.c
index cb487d4..3a99a4e 100644
--- a/lib/libthr/thread/thr_fork.c
+++ b/lib/libthr/thread/thr_fork.c
@@ -143,7 +143,7 @@ _fork(void)
if ((ret = __sys_fork()) == 0) {
/* Child process */
errsave = errno;
- curthread->cancelflags &= ~THR_CANCEL_NEEDED;
+ curthread->cancel_pending = 0;
curthread->flags &= ~THR_FLAGS_NEED_SUSPEND;
/*
diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
index 3624cf8..ae4ea33 100644
--- a/lib/libthr/thread/thr_init.c
+++ b/lib/libthr/thread/thr_init.c
@@ -402,7 +402,8 @@ init_main_thread(struct pthread *thread)
*/
thread->magic = THR_MAGIC;
- thread->cancelflags = PTHREAD_CANCEL_ENABLE | PTHREAD_CANCEL_DEFERRED;
+ thread->cancel_enable = 1;
+ thread->cancel_async = 0;
thr_set_name(thread->tid, "initial thread");
/* Initialize the mutex queue: */
diff --git a/lib/libthr/thread/thr_join.c b/lib/libthr/thread/thr_join.c
index de27074..92a3b62 100644
--- a/lib/libthr/thread/thr_join.c
+++ b/lib/libthr/thread/thr_join.c
@@ -76,7 +76,6 @@ join_common(pthread_t pthread, void **thread_return,
struct timespec ts, ts2, *tsp;
void *tmp;
long tid;
- int oldcancel;
int ret = 0;
if (pthread == NULL)
@@ -104,7 +103,7 @@ join_common(pthread_t pthread, void **thread_return,
THREAD_LIST_UNLOCK(curthread);
THR_CLEANUP_PUSH(curthread, backout_join, pthread);
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
tid = pthread->tid;
while (pthread->tid != TID_TERMINATED) {
@@ -123,7 +122,7 @@ join_common(pthread_t pthread, void **thread_return,
break;
}
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
THR_CLEANUP_POP(curthread, 0);
if (ret == ETIMEDOUT) {
diff --git a/lib/libthr/thread/thr_list.c b/lib/libthr/thread/thr_list.c
index d85771d..e23e57d 100644
--- a/lib/libthr/thread/thr_list.c
+++ b/lib/libthr/thread/thr_list.c
@@ -293,6 +293,7 @@ _thr_ref_add(struct pthread *curthread, struct pthread *thread,
THREAD_LIST_LOCK(curthread);
if ((ret = _thr_find_thread(curthread, thread, include_dead)) == 0) {
thread->refcount++;
+ THR_CRITICAL_ENTER(curthread);
}
THREAD_LIST_UNLOCK(curthread);
@@ -309,7 +310,7 @@ _thr_ref_delete(struct pthread *curthread, struct pthread *thread)
}
void
-_thr_ref_delete_unlocked(struct pthread *curthread __unused,
+_thr_ref_delete_unlocked(struct pthread *curthread,
struct pthread *thread)
{
if (thread != NULL) {
@@ -317,6 +318,7 @@ _thr_ref_delete_unlocked(struct pthread *curthread __unused,
if ((thread->refcount == 0) && thread->state == PS_DEAD &&
(thread->tlflags & TLFLAGS_DETACHED) != 0)
THR_GCLIST_ADD(thread);
+ THR_CRITICAL_LEAVE(curthread);
}
}
diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h
index 2e370b9..4459a2a 100644
--- a/lib/libthr/thread/thr_private.h
+++ b/lib/libthr/thread/thr_private.h
@@ -350,22 +350,25 @@ struct pthread {
void *arg;
struct pthread_attr attr;
- /*
- * Cancelability flags
- */
-#define THR_CANCEL_DISABLE 0x0001
-#define THR_CANCEL_EXITING 0x0002
-#define THR_CANCEL_AT_POINT 0x0004
-#define THR_CANCEL_NEEDED 0x0008
-#define SHOULD_CANCEL(val) \
- (((val) & (THR_CANCEL_DISABLE | THR_CANCEL_EXITING | \
- THR_CANCEL_NEEDED)) == THR_CANCEL_NEEDED)
-
-#define SHOULD_ASYNC_CANCEL(val) \
- (((val) & (THR_CANCEL_DISABLE | THR_CANCEL_EXITING | \
- THR_CANCEL_NEEDED | THR_CANCEL_AT_POINT)) == \
- (THR_CANCEL_NEEDED | THR_CANCEL_AT_POINT))
- int cancelflags;
+#define SHOULD_CANCEL(thr) \
+ ((thr)->cancel_pending && \
+ ((thr)->cancel_point || (thr)->cancel_async) && \
+ (thr)->cancel_enable && (thr)->cancelling == 0)
+
+ /* Cancellation is enabled */
+ int cancel_enable;
+
+ /* Cancellation request is pending */
+ int cancel_pending;
+
+ /* Thread is at cancellation point */
+ int cancel_point;
+
+ /* Asynchronouse cancellation is enabled */
+ int cancel_async;
+
+ /* Cancellation is in progress */
+ int cancelling;
/* Thread temporary signal mask. */
sigset_t sigmask;
@@ -620,8 +623,9 @@ void _thread_cleanupspecific(void) __hidden;
void _thread_dump_info(void) __hidden;
void _thread_printf(int, const char *, ...) __hidden;
void _thr_spinlock_init(void) __hidden;
-int _thr_cancel_enter(struct pthread *) __hidden;
-void _thr_cancel_leave(struct pthread *, int) __hidden;
+void _thr_cancel_enter(struct pthread *) __hidden;
+void _thr_cancel_leave(struct pthread *) __hidden;
+void _thr_testcancel(struct pthread *) __hidden;
void _thr_signal_block(struct pthread *) __hidden;
void _thr_signal_unblock(struct pthread *) __hidden;
void _thr_signal_init(void) __hidden;
diff --git a/lib/libthr/thread/thr_sem.c b/lib/libthr/thread/thr_sem.c
index ad10aaf..6dbf7f4 100644
--- a/lib/libthr/thread/thr_sem.c
+++ b/lib/libthr/thread/thr_sem.c
@@ -176,16 +176,16 @@ int
_sem_wait(sem_t *sem)
{
struct pthread *curthread;
- int val, oldcancel, retval;
+ int val, retval;
if (sem_check_validity(sem) != 0)
return (-1);
curthread = _get_curthread();
if ((*sem)->syssem != 0) {
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
retval = ksem_wait((*sem)->semid);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (retval);
}
@@ -195,9 +195,9 @@ _sem_wait(sem_t *sem)
if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1))
return (0);
}
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
retval = _thr_umtx_wait((umtx_t *)&(*sem)->count, 0, NULL);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
} while (retval == 0);
errno = retval;
return (-1);
@@ -209,16 +209,16 @@ _sem_timedwait(sem_t * __restrict sem,
{
struct timespec ts, ts2;
struct pthread *curthread;
- int val, oldcancel, retval;
+ int val, retval;
if (sem_check_validity(sem) != 0)
return (-1);
curthread = _get_curthread();
if ((*sem)->syssem != 0) {
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
retval = ksem_timedwait((*sem)->semid, abstime);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (retval);
}
@@ -238,9 +238,9 @@ _sem_timedwait(sem_t * __restrict sem,
}
clock_gettime(CLOCK_REALTIME, &ts);
TIMESPEC_SUB(&ts2, abstime, &ts);
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
retval = _thr_umtx_wait((umtx_t *)&(*sem)->count, 0, &ts2);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
} while (retval == 0);
errno = retval;
return (-1);
diff --git a/lib/libthr/thread/thr_sig.c b/lib/libthr/thread/thr_sig.c
index 495c153..14da797 100644
--- a/lib/libthr/thread/thr_sig.c
+++ b/lib/libthr/thread/thr_sig.c
@@ -68,9 +68,7 @@ void
_thr_ast(struct pthread *curthread)
{
if (!THR_IN_CRITICAL(curthread)) {
- if (__predict_false(
- SHOULD_ASYNC_CANCEL(curthread->cancelflags)))
- _pthread_testcancel();
+ _thr_testcancel(curthread);
if (__predict_false((curthread->flags &
(THR_FLAGS_NEED_SUSPEND | THR_FLAGS_SUSPENDED))
== THR_FLAGS_NEED_SUSPEND))
@@ -154,12 +152,11 @@ int
___pause(void)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __pause();
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -248,7 +245,6 @@ __sigsuspend(const sigset_t * set)
struct pthread *curthread = _get_curthread();
sigset_t newset;
const sigset_t *pset;
- int oldcancel;
int ret;
if (SIGISMEMBER(*set, SIGCANCEL)) {
@@ -258,9 +254,9 @@ __sigsuspend(const sigset_t * set)
} else
pset = set;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_sigsuspend(pset);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -294,7 +290,6 @@ __sigtimedwait(const sigset_t *set, siginfo_t *info,
struct pthread *curthread = _get_curthread();
sigset_t newset;
const sigset_t *pset;
- int oldcancel;
int ret;
if (SIGISMEMBER(*set, SIGCANCEL)) {
@@ -303,9 +298,9 @@ __sigtimedwait(const sigset_t *set, siginfo_t *info,
pset = &newset;
} else
pset = set;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_sigtimedwait(pset, info, timeout);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -333,7 +328,6 @@ __sigwaitinfo(const sigset_t *set, siginfo_t *info)
struct pthread *curthread = _get_curthread();
sigset_t newset;
const sigset_t *pset;
- int oldcancel;
int ret;
if (SIGISMEMBER(*set, SIGCANCEL)) {
@@ -343,9 +337,9 @@ __sigwaitinfo(const sigset_t *set, siginfo_t *info)
} else
pset = set;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_sigwaitinfo(pset, info);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -373,7 +367,6 @@ __sigwait(const sigset_t *set, int *sig)
struct pthread *curthread = _get_curthread();
sigset_t newset;
const sigset_t *pset;
- int oldcancel;
int ret;
if (SIGISMEMBER(*set, SIGCANCEL)) {
@@ -383,8 +376,8 @@ __sigwait(const sigset_t *set, int *sig)
} else
pset = set;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_sigwait(pset, sig);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
diff --git a/lib/libthr/thread/thr_syscalls.c b/lib/libthr/thread/thr_syscalls.c
index f994288..7a07cca 100644
--- a/lib/libthr/thread/thr_syscalls.c
+++ b/lib/libthr/thread/thr_syscalls.c
@@ -160,13 +160,12 @@ int
__accept(int s, struct sockaddr *addr, socklen_t *addrlen)
{
struct pthread *curthread;
- int oldcancel;
int ret;
curthread = _get_curthread();
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_accept(s, addr, addrlen);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -178,12 +177,11 @@ __aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
timespec *timeout)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_aio_suspend(iocbs, niocb, timeout);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -194,12 +192,11 @@ int
__close(int fd)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_close(fd);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -210,12 +207,11 @@ int
__connect(int fd, const struct sockaddr *name, socklen_t namelen)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_connect(fd, name, namelen);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -226,12 +222,11 @@ int
___creat(const char *path, mode_t mode)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __creat(path, mode);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -242,11 +237,10 @@ int
__fcntl(int fd, int cmd,...)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
va_list ap;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
va_start(ap, cmd);
switch (cmd) {
@@ -266,7 +260,7 @@ __fcntl(int fd, int cmd,...)
}
va_end(ap);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -277,12 +271,11 @@ int
__fsync(int fd)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_fsync(fd);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -293,12 +286,11 @@ int
__msync(void *addr, size_t len, int flags)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_msync(addr, len, flags);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -310,12 +302,11 @@ __nanosleep(const struct timespec *time_to_sleep,
struct timespec *time_remaining)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_nanosleep(time_to_sleep, time_remaining);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -326,12 +317,11 @@ int
__open(const char *path, int flags,...)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
int mode = 0;
va_list ap;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
/* Check if the file is being created: */
if (flags & O_CREAT) {
@@ -343,7 +333,7 @@ __open(const char *path, int flags,...)
ret = __sys_open(path, flags, mode);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -354,12 +344,11 @@ int
__poll(struct pollfd *fds, unsigned int nfds, int timeout)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_poll(fds, nfds, timeout);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -371,12 +360,11 @@ ___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
const struct timespec *timo, const sigset_t *mask)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __pselect(count, rfds, wfds, efds, timo, mask);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -387,12 +375,11 @@ ssize_t
__read(int fd, void *buf, size_t nbytes)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
ssize_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_read(fd, buf, nbytes);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -403,12 +390,11 @@ ssize_t
__readv(int fd, const struct iovec *iov, int iovcnt)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
ssize_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_readv(fd, iov, iovcnt);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -420,12 +406,11 @@ __recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
socklen_t *fl)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
ssize_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_recvfrom(s, b, l, f, from, fl);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -436,11 +421,10 @@ __recvmsg(int s, struct msghdr *m, int f)
{
struct pthread *curthread = _get_curthread();
ssize_t ret;
- int oldcancel;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_recvmsg(s, m, f);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -451,12 +435,11 @@ __select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -467,11 +450,10 @@ __sendmsg(int s, const struct msghdr *m, int f)
{
struct pthread *curthread = _get_curthread();
ssize_t ret;
- int oldcancel;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_sendmsg(s, m, f);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -483,11 +465,10 @@ __sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
{
struct pthread *curthread = _get_curthread();
ssize_t ret;
- int oldcancel;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_sendto(s, m, l, f, t, tl);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -497,12 +478,11 @@ unsigned int
___sleep(unsigned int seconds)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
unsigned int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sleep(seconds);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -513,12 +493,11 @@ int
___system(const char *string)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __system(string);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -529,12 +508,11 @@ int
___tcdrain(int fd)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __tcdrain(fd);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -545,12 +523,11 @@ int
___usleep(useconds_t useconds)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
int ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __usleep(useconds);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -569,12 +546,11 @@ pid_t
___wait(int *istat)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
pid_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __wait(istat);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -585,12 +561,11 @@ pid_t
__wait3(int *status, int options, struct rusage *rusage)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
pid_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = _wait4(WAIT_ANY, status, options, rusage);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return (ret);
}
@@ -601,12 +576,11 @@ pid_t
__wait4(pid_t pid, int *status, int options, struct rusage *rusage)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
pid_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_wait4(pid, status, options, rusage);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -617,12 +591,11 @@ pid_t
___waitpid(pid_t wpid, int *status, int options)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
pid_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __waitpid(wpid, status, options);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -633,12 +606,11 @@ ssize_t
__write(int fd, const void *buf, size_t nbytes)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
ssize_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_write(fd, buf, nbytes);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
@@ -649,12 +621,11 @@ ssize_t
__writev(int fd, const struct iovec *iov, int iovcnt)
{
struct pthread *curthread = _get_curthread();
- int oldcancel;
ssize_t ret;
- oldcancel = _thr_cancel_enter(curthread);
+ _thr_cancel_enter(curthread);
ret = __sys_writev(fd, iov, iovcnt);
- _thr_cancel_leave(curthread, oldcancel);
+ _thr_cancel_leave(curthread);
return ret;
}
OpenPOWER on IntegriCloud