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. Signed-off-by: Paul Tarjan <github@paulisageek.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Paul Tarjan committed
Apr 15, 2026 at 13:27 UTC
8372c88f583b8910f1e57c00c89c0afcca7018dc
2 files changed
+28
compat/win32/pthread.c
+26
index 7e93146963..398caa9602 100644
--- a/compat/win32/pthread.c
+++ b/compat/win32/pthread.c
@@ -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)
+ return ETIMEDOUT;
+ 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;
+}
compat/win32/pthread.h
+2
index ccacc5a53b..d80df8d12a 100644
--- a/compat/win32/pthread.h
+++ b/compat/win32/pthread.h
@@ -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)
{