diff options
-rw-r--r-- | lib/libthr/thread/thr_cancel.c | 128 | ||||
-rw-r--r-- | lib/libthr/thread/thr_cond.c | 5 | ||||
-rw-r--r-- | lib/libthr/thread/thr_create.c | 4 | ||||
-rw-r--r-- | lib/libthr/thread/thr_exit.c | 4 | ||||
-rw-r--r-- | lib/libthr/thread/thr_fork.c | 2 | ||||
-rw-r--r-- | lib/libthr/thread/thr_init.c | 3 | ||||
-rw-r--r-- | lib/libthr/thread/thr_join.c | 5 | ||||
-rw-r--r-- | lib/libthr/thread/thr_list.c | 4 | ||||
-rw-r--r-- | lib/libthr/thread/thr_private.h | 40 | ||||
-rw-r--r-- | lib/libthr/thread/thr_sem.c | 20 | ||||
-rw-r--r-- | lib/libthr/thread/thr_sig.c | 29 | ||||
-rw-r--r-- | lib/libthr/thread/thr_syscalls.c | 145 |
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; } |