diff options
Diffstat (limited to 'sysdeps/htl')
-rw-r--r-- | sysdeps/htl/pt-cond-timedwait.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/sysdeps/htl/pt-cond-timedwait.c b/sysdeps/htl/pt-cond-timedwait.c index c05944d16d..f7801b30ae 100644 --- a/sysdeps/htl/pt-cond-timedwait.c +++ b/sysdeps/htl/pt-cond-timedwait.c @@ -117,29 +117,30 @@ __pthread_cond_timedwait_internal (pthread_cond_t *cond, cancelled = (self->cancel_state == PTHREAD_CANCEL_ENABLE) && self->cancel_pending; - if (!cancelled) + if (cancelled) { - self->cancel_hook = cancel_hook; - self->cancel_hook_arg = &ctx; - oldtype = self->cancel_type; - - if (oldtype != PTHREAD_CANCEL_DEFERRED) - self->cancel_type = PTHREAD_CANCEL_DEFERRED; - - /* Add ourselves to the list of waiters. This is done while setting - the cancellation hook to simplify the cancellation procedure, i.e. - if the thread is queued, it can be cancelled, otherwise it is - already unblocked, progressing on the return path. */ - __pthread_spin_wait (&cond->__lock); - __pthread_enqueue (&cond->__queue, self); - if (cond->__attr != NULL && clockid == -1) - clock_id = cond->__attr->__clock; - __pthread_spin_unlock (&cond->__lock); + __pthread_mutex_unlock (&self->cancel_lock); + __pthread_exit (PTHREAD_CANCELED); } - __pthread_mutex_unlock (&self->cancel_lock); - if (cancelled) - __pthread_exit (PTHREAD_CANCELED); + self->cancel_hook = cancel_hook; + self->cancel_hook_arg = &ctx; + oldtype = self->cancel_type; + + if (oldtype != PTHREAD_CANCEL_DEFERRED) + self->cancel_type = PTHREAD_CANCEL_DEFERRED; + + /* Add ourselves to the list of waiters. This is done while setting + the cancellation hook to simplify the cancellation procedure, i.e. + if the thread is queued, it can be cancelled, otherwise it is + already unblocked, progressing on the return path. */ + __pthread_spin_wait (&cond->__lock); + __pthread_enqueue (&cond->__queue, self); + if (cond->__attr != NULL && clockid == -1) + clock_id = cond->__attr->__clock; + __pthread_spin_unlock (&cond->__lock); + + __pthread_mutex_unlock (&self->cancel_lock); /* Release MUTEX before blocking. */ __pthread_mutex_unlock (mutex); |