vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon May 18 19:14:09 2015 +0300| [d1bc9375a1780964f5dff7d9437d122d8effa323] | committer: Rémi Denis-Courmont
win32: factor common code in vlc_cond_(timed)wait() > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d1bc9375a1780964f5dff7d9437d122d8effa323 --- src/win32/thread.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/win32/thread.c b/src/win32/thread.c index 302e9a2..8e0319e 100644 --- a/src/win32/thread.c +++ b/src/win32/thread.c @@ -259,7 +259,8 @@ void vlc_cond_broadcast(vlc_cond_t *wait) ReleaseSemaphore(wait->semaphore, waiters, NULL); } -void vlc_cond_wait(vlc_cond_t *wait, vlc_mutex_t *lock) +static DWORD vlc_cond_wait_delay(vlc_cond_t *wait, vlc_mutex_t *lock, + DWORD delay) { DWORD result; @@ -268,26 +269,29 @@ void vlc_cond_wait(vlc_cond_t *wait, vlc_mutex_t *lock) if (wait->semaphore == NULL) { /* FIXME FIXME FIXME */ vlc_mutex_unlock(lock); - result = SleepEx(50, TRUE); + result = SleepEx((delay > 50u) ? 50u : delay, TRUE); } else { InterlockedIncrement(&wait->waiters); vlc_mutex_unlock(lock); - result = vlc_WaitForSingleObject(wait->semaphore, INFINITE); + result = vlc_WaitForSingleObject(wait->semaphore, delay); } vlc_mutex_lock(lock); if (result == WAIT_IO_COMPLETION) vlc_testcancel(); + return result; +} + +void vlc_cond_wait(vlc_cond_t *wait, vlc_mutex_t *lock) +{ + vlc_cond_wait_delay(wait, lock, INFINITE); } int vlc_cond_timedwait(vlc_cond_t *wait, vlc_mutex_t *lock, mtime_t deadline) { mtime_t total; - DWORD result; - - vlc_testcancel(); switch (wait->clock) { @@ -307,23 +311,9 @@ int vlc_cond_timedwait(vlc_cond_t *wait, vlc_mutex_t *lock, mtime_t deadline) DWORD delay = (total > 0x7fffffff) ? 0x7fffffff : total; - if (wait->semaphore == NULL) - { /* FIXME FIXME FIXME */ - vlc_mutex_unlock(lock); - result = SleepEx((delay > 50) ? 50 : delay, TRUE); - } - else - { - InterlockedIncrement(&wait->waiters); - vlc_mutex_unlock(lock); - result = vlc_WaitForSingleObject(wait->semaphore, delay); - } - vlc_mutex_lock(lock); - - if (result == WAIT_IO_COMPLETION) - vlc_testcancel(); - - return (result == WAIT_TIMEOUT) ? ETIMEDOUT : 0; + if (vlc_cond_wait_delay(wait, lock, delay) == WAIT_TIMEOUT) + return ETIMEDOUT; + return 0; } /*** Semaphore ***/ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
