From: Ulrich Drepper Date: Sat, 25 Sep 1999 07:07:14 +0000 (+0000) Subject: (pthread_cond_timedwait_relative): Never return with EINTR. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f8be8172b4bad3cde1efa57924289385bb5fdb3a;p=thirdparty%2Fglibc.git (pthread_cond_timedwait_relative): Never return with EINTR. --- diff --git a/linuxthreads/condvar.c b/linuxthreads/condvar.c index cd22a241af2..0ce852abaa7 100644 --- a/linuxthreads/condvar.c +++ b/linuxthreads/condvar.c @@ -76,6 +76,7 @@ pthread_cond_timedwait_relative(pthread_cond_t *cond, enqueue(&cond->__c_waiting, self); __pthread_unlock(&cond->__c_lock); pthread_mutex_unlock(mutex); + continue_waiting: /* Set up a longjmp handler for the restart and cancel signals */ if (sigsetjmp(jmpbuf, 1) == 0) { THREAD_SETMEM(self, p_signal_jmp, &jmpbuf); @@ -113,13 +114,16 @@ pthread_cond_timedwait_relative(pthread_cond_t *cond, pthread_mutex_lock(mutex); pthread_exit(PTHREAD_CANCELED); } - /* If not signaled: also remove ourselves and return an error code */ + /* If not signaled: also remove ourselves and return an error code, but + only if the timeout has elapsed. If not, just continue waiting. */ if (THREAD_GETMEM(self, p_signal) == 0) { + if (retsleep != 0) + goto continue_waiting; __pthread_lock(&cond->__c_lock, self); remove_from_queue(&cond->__c_waiting, self); __pthread_unlock(&cond->__c_lock); pthread_mutex_lock(mutex); - return retsleep == 0 ? ETIMEDOUT : EINTR; + return ETIMEDOUT; } /* Otherwise, return normally */ pthread_mutex_lock(mutex);