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;
+}
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)
{