compat/win32: add pthread_cond_timedwait

Add a pthread_cond_timedwait() implementation to the Windows pthread
compatibility layer using SleepConditionVariableCS() with a millisecond
timeout computed from the absolute deadline.

This enables callers to use bounded waits on condition variables
instead of blocking indefinitely with pthread_cond_wait().

Signed-off-by: Paul Tarjan <github@paulisageek.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Paul Tarjan
2026-02-26 00:27:16 +00:00
committed by Junio C Hamano
parent 4187776953
commit 945f158bc7
2 changed files with 28 additions and 0 deletions

View File

@@ -66,3 +66,29 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
return err_win_to_posix(GetLastError());
return 0;
}
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime)
{
struct timeval now;
long long now_ms, deadline_ms;
DWORD timeout_ms;
gettimeofday(&now, NULL);
now_ms = (long long)now.tv_sec * 1000 + now.tv_usec / 1000;
deadline_ms = (long long)abstime->tv_sec * 1000 +
abstime->tv_nsec / 1000000;
if (deadline_ms <= now_ms)
timeout_ms = 0;
else
timeout_ms = (DWORD)(deadline_ms - now_ms);
if (SleepConditionVariableCS(cond, mutex, timeout_ms) == 0) {
DWORD err = GetLastError();
if (err == ERROR_TIMEOUT)
return ETIMEDOUT;
return err_win_to_posix(err);
}
return 0;
}

View File

@@ -64,6 +64,8 @@ int win32_pthread_join(pthread_t *thread, void **value_ptr);
pthread_t pthread_self(void);
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime);
static inline void NORETURN pthread_exit(void *ret)
{