Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2014-05-12 10:35:41 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2017-08-04 20:12:13 +0300
commit2325f12557d8fd6ad1645682e19cf4b71e50f9a1 (patch)
tree6362d779f35bb9ec9df7ad2fe5ce5c6cd48fa0bd
parent2dd2a8322d41415c5b39eda06dc6ecb3534c82a9 (diff)
w32pthreads: provide pthread_cond_timedwait_w32, API incompatible timed waiter.
-rw-r--r--compat/w32pthreads.h36
1 files changed, 28 insertions, 8 deletions
diff --git a/compat/w32pthreads.h b/compat/w32pthreads.h
index eeead6051f..a7c4b5d6e9 100644
--- a/compat/w32pthreads.h
+++ b/compat/w32pthreads.h
@@ -165,10 +165,19 @@ static inline int pthread_cond_broadcast(pthread_cond_t *cond)
return 0;
}
+static inline int pthread_cond_timedwait_w32(pthread_cond_t *cond, pthread_mutex_t *mutex, DWORD timeout)
+{
+ int ret;
+
+ ret = SleepConditionVariableCS(cond, mutex, timeout);
+ if (!ret && GetLastError() == ERROR_TIMEOUT)
+ errno = ETIMEDOUT;
+ return (ret ? 0 : -1);
+}
+
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{
- SleepConditionVariableCS(cond, mutex, INFINITE);
- return 0;
+ return pthread_cond_timedwait_w32(cond, mutex, INFINITE);
}
static inline int pthread_cond_signal(pthread_cond_t *cond)
@@ -335,13 +344,16 @@ static av_unused int pthread_cond_broadcast(pthread_cond_t *cond)
return 0;
}
-static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+static av_unused int pthread_cond_timedwait_w32(pthread_cond_t *cond, pthread_mutex_t *mutex, DWORD timeout)
{
+ DWORD dwRet;
win32_cond_t *win32_cond = (win32_cond_t*)cond->Ptr;
- int last_waiter;
+ int last_waiter, ret;
if (cond_wait) {
- cond_wait(cond, mutex, INFINITE);
- return 0;
+ ret = cond_wait(cond, mutex, timeout);
+ if (!ret && GetLastError() == ERROR_TIMEOUT)
+ errno = ETIMEDOUT;
+ return (ret ? 0 : -1);
}
/* non native condition variables */
@@ -353,7 +365,9 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
// unlock the external mutex
pthread_mutex_unlock(mutex);
- WaitForSingleObject(win32_cond->semaphore, INFINITE);
+ dwRet = WaitForSingleObject(win32_cond->semaphore, timeout);
+ if (dwRet == WAIT_TIMEOUT)
+ errno = ETIMEDOUT;
pthread_mutex_lock(&win32_cond->mtx_waiter_count);
win32_cond->waiter_count--;
@@ -364,7 +378,13 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
SetEvent(win32_cond->waiters_done);
// lock the external mutex
- return pthread_mutex_lock(mutex);
+ pthread_mutex_lock(mutex);
+ return (dwRet ? -1 : 0);
+}
+
+static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
+{
+ return pthread_cond_timedwait_w32(cond, mutex, INFINITE);
}
static av_unused int pthread_cond_signal(pthread_cond_t *cond)