From 0ef0d3838e6ca261733105bd6fed3fc84751b46a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 13 Feb 2000 08:09:42 +0000 Subject: [PATCH] (pthread_cond_timedwait_relative_old): Undo last patch but keep the code around. A bug in the kernel prevent us from using the code. (pthread_cond_timedwait_relative_new): Likewise. --- linuxthreads/condvar.c | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/linuxthreads/condvar.c b/linuxthreads/condvar.c index 38c4423d892..e781793fd2b 100644 --- a/linuxthreads/condvar.c +++ b/linuxthreads/condvar.c @@ -134,13 +134,23 @@ pthread_cond_timedwait_relative_old(pthread_cond_t *cond, { volatile pthread_descr self = thread_self(); sigset_t unblock, initial_mask; +#ifdef NANOSLEEP_WORKS int already_canceled = 0; int was_signalled = 0; +#else + int retsleep; + int already_canceled; + int was_signalled; +#endif sigjmp_buf jmpbuf; pthread_extricate_if extr; struct timeval now; struct timespec reltime; +#ifndef NANOSLEEP_WORKS + requeue_and_wait_again: +#endif + /* Compute a time offset relative to now. */ __gettimeofday (&now, NULL); reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000; @@ -152,6 +162,12 @@ pthread_cond_timedwait_relative_old(pthread_cond_t *cond, if (reltime.tv_sec < 0) return ETIMEDOUT; +#ifndef NANOSLEEP_WORKS + retsleep = 0; + already_canceled = 0; + was_signalled = 0; +#endif + /* Set up extrication interface */ extr.pu_object = cond; extr.pu_extricate_func = cond_extricate_func; @@ -186,14 +202,22 @@ pthread_cond_timedwait_relative_old(pthread_cond_t *cond, sigemptyset(&unblock); sigaddset(&unblock, __pthread_sig_restart); sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask); +#ifdef NANOSLEEP_WORKS /* Sleep for the required duration. If woken by a signal, resume waiting as required by Single Unix Specification. */ while (__libc_nanosleep(&reltime, &reltime) != 0) ; +#else + /* Sleep for the required duration */ + retsleep = __libc_nanosleep(&reltime, NULL); +#endif /* Block the restart signal again */ sigprocmask(SIG_SETMASK, &initial_mask, NULL); was_signalled = 0; } else { +#ifndef NANOSLEEP_WORKS + retsleep = -1; +#endif was_signalled = 1; } THREAD_SETMEM(self, p_signal_jmp, NULL); @@ -225,7 +249,15 @@ pthread_cond_timedwait_relative_old(pthread_cond_t *cond, if (was_on_queue) { __pthread_set_own_extricate_if(self, 0); pthread_mutex_lock(mutex); +#ifdef NANOSLEEP_WORKS return ETIMEDOUT; +#else + if (retsleep == 0) + return ETIMEDOUT; + /* Woken by a signal: resume waiting as required by Single Unix + Specification. */ + goto requeue_and_wait_again; +#endif } suspend(self); @@ -258,13 +290,23 @@ pthread_cond_timedwait_relative_new(pthread_cond_t *cond, { volatile pthread_descr self = thread_self(); sigset_t unblock, initial_mask; +#ifdef NANOSLEEP_WORKS int already_canceled = 0; int was_signalled = 0; +#else + int retsleep; + int already_canceled; + int was_signalled; +#endif sigjmp_buf jmpbuf; pthread_extricate_if extr; struct timeval now; struct timespec reltime; +#ifndef NANOSLEEP_WORKS + requeue_and_wait_again: +#endif + /* Compute a time offset relative to now. */ __gettimeofday (&now, NULL); reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000; @@ -276,8 +318,11 @@ pthread_cond_timedwait_relative_new(pthread_cond_t *cond, if (reltime.tv_sec < 0) return ETIMEDOUT; +#ifndef NANOSLEEP_WORKS + retsleep = 0; already_canceled = 0; was_signalled = 0; +#endif /* Set up extrication interface */ extr.pu_object = cond; @@ -312,14 +357,22 @@ pthread_cond_timedwait_relative_new(pthread_cond_t *cond, sigemptyset(&unblock); sigaddset(&unblock, __pthread_sig_restart); sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask); +#ifdef NANOSLEEP_WORKS /* Sleep for the required duration. If woken by a signal, resume waiting as required by Single Unix Specification. */ while (__libc_nanosleep(&reltime, &reltime) != 0) ; +#else + /* Sleep for the required duration */ + retsleep = __libc_nanosleep(&reltime, NULL); +#endif /* Block the restart signal again */ sigprocmask(SIG_SETMASK, &initial_mask, NULL); was_signalled = 0; } else { +#ifndef NANOSLEEP_WORKS + retsleep = -1; +#endif was_signalled = 1; } THREAD_SETMEM(self, p_signal_jmp, NULL); @@ -348,7 +401,15 @@ pthread_cond_timedwait_relative_new(pthread_cond_t *cond, if (was_on_queue) { __pthread_set_own_extricate_if(self, 0); pthread_mutex_lock(mutex); +#ifdef NANOSLEEP_WORKS return ETIMEDOUT; +#else + if (retsleep == 0) + return ETIMEDOUT; + /* Woken by a signal: resume waiting as required by Single Unix + Specification. */ + goto requeue_and_wait_again; +#endif } /* Eat the outstanding restart() from the signaller */ -- 2.47.2