Cygwin: implement pthread_cond_clockwait

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2021-07-29 17:21:01 +02:00
parent edf48054e9
commit 123454f9d0
3 changed files with 48 additions and 11 deletions

View File

@ -1092,6 +1092,7 @@ pthread_barrierattr_init SIGFE
pthread_barrierattr_setpshared SIGFE pthread_barrierattr_setpshared SIGFE
pthread_cancel SIGFE pthread_cancel SIGFE
pthread_cond_broadcast SIGFE pthread_cond_broadcast SIGFE
pthread_cond_clockwait SIGFE
pthread_cond_destroy SIGFE pthread_cond_destroy SIGFE
pthread_cond_init SIGFE pthread_cond_init SIGFE
pthread_cond_signal SIGFE pthread_cond_signal SIGFE

View File

@ -120,6 +120,10 @@ int pthread_cond_broadcast (pthread_cond_t *);
int pthread_cond_destroy (pthread_cond_t *); int pthread_cond_destroy (pthread_cond_t *);
int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *); int pthread_cond_init (pthread_cond_t *, const pthread_condattr_t *);
int pthread_cond_signal (pthread_cond_t *); int pthread_cond_signal (pthread_cond_t *);
#if __GNU_VISIBLE
int pthread_cond_clockwait (pthread_cond_t *, pthread_mutex_t *,
clockid_t, const struct timespec *);
#endif
int pthread_cond_timedwait (pthread_cond_t *, int pthread_cond_timedwait (pthread_cond_t *,
pthread_mutex_t *, const struct timespec *); pthread_mutex_t *, const struct timespec *);
int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *); int pthread_cond_wait (pthread_cond_t *, pthread_mutex_t *);

View File

@ -2965,13 +2965,31 @@ __pthread_cond_wait_init (pthread_cond_t *cond, pthread_mutex_t *mutex)
return 0; return 0;
} }
extern "C" int static int
pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex, __pthread_cond_clockwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime) clockid_t clock_id, const struct timespec *abstime)
{ {
int err = 0; int err = 0;
LARGE_INTEGER timeout; LARGE_INTEGER timeout;
do
{
err = pthread_convert_abstime (clock_id, abstime, &timeout);
if (err)
break;
err = (*cond)->wait (*mutex, &timeout);
}
while (err == ETIMEDOUT);
return err;
}
extern "C" int
pthread_cond_clockwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
clockid_t clock_id, const struct timespec *abstime)
{
int err = 0;
pthread_testcancel (); pthread_testcancel ();
__try __try
@ -2979,16 +2997,30 @@ pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
err = __pthread_cond_wait_init (cond, mutex); err = __pthread_cond_wait_init (cond, mutex);
if (err) if (err)
__leave; __leave;
err = __pthread_cond_clockwait (cond, mutex, clock_id, abstime);
do }
__except (NO_ERROR)
{ {
err = pthread_convert_abstime ((*cond)->clock_id, abstime, &timeout); return EINVAL;
}
__endtry
return err;
}
extern "C" int
pthread_cond_timedwait (pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime)
{
int err = 0;
pthread_testcancel ();
__try
{
err = __pthread_cond_wait_init (cond, mutex);
if (err) if (err)
__leave; __leave;
err = __pthread_cond_clockwait (cond, mutex, (*cond)->clock_id, abstime);
err = (*cond)->wait (*mutex, &timeout);
}
while (err == ETIMEDOUT);
} }
__except (NO_ERROR) __except (NO_ERROR)
{ {