[vlc-devel] [PATCH 2/2] threads: winstore: Use native wait condition implementation

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Nov 20 14:36:13 CET 2014


---
 include/vlc_threads.h |  4 ++++
 src/win32/thread.c    | 44 +++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/include/vlc_threads.h b/include/vlc_threads.h
index 00435cb..45a733d 100644
--- a/include/vlc_threads.h
+++ b/include/vlc_threads.h
@@ -57,7 +57,11 @@ typedef struct
 #define VLC_STATIC_MUTEX { false, { { false, 0 } } }
 typedef struct
 {
+#ifndef VLC_WINSTORE_APP
     HANDLE   handle;
+#else
+    CONDITION_VARIABLE cond;
+#endif
     unsigned clock;
 } vlc_cond_t;
 #define VLC_STATIC_COND { 0, 0 }
diff --git a/src/win32/thread.c b/src/win32/thread.c
index 1cb2ee0..32fef2b 100644
--- a/src/win32/thread.c
+++ b/src/win32/thread.c
@@ -202,10 +202,14 @@ enum
 
 static void vlc_cond_init_common (vlc_cond_t *p_condvar, unsigned clock)
 {
+#ifndef VLC_WINSTORE_APP
     /* Create a manual-reset event (manual reset is needed for broadcast). */
     p_condvar->handle = CreateEvent (NULL, TRUE, FALSE, NULL);
     if (!p_condvar->handle)
         abort();
+#else
+    InitializeConditionVariable(&p_condvar->cond);
+#endif
     p_condvar->clock = clock;
 }
 
@@ -221,7 +225,9 @@ void vlc_cond_init_daytime (vlc_cond_t *p_condvar)
 
 void vlc_cond_destroy (vlc_cond_t *p_condvar)
 {
+#ifndef VLC_WINSTORE_APP
     CloseHandle (p_condvar->handle);
+#endif
 }
 
 void vlc_cond_signal (vlc_cond_t *p_condvar)
@@ -229,8 +235,12 @@ void vlc_cond_signal (vlc_cond_t *p_condvar)
     if (!p_condvar->clock)
         return;
 
+#ifndef VLC_WINSTORE_APP
     /* This is suboptimal but works. */
     vlc_cond_broadcast (p_condvar);
+#else
+    WakeConditionVariable(&p_condvar->cond);
+#endif
 }
 
 void vlc_cond_broadcast (vlc_cond_t *p_condvar)
@@ -238,20 +248,25 @@ void vlc_cond_broadcast (vlc_cond_t *p_condvar)
     if (!p_condvar->clock)
         return;
 
+#ifndef VLC_WINSTORE_APP
     /* Wake all threads up (as the event HANDLE has manual reset) */
     SetEvent (p_condvar->handle);
+#else
+    WakeAllConditionVariable(&p_condvar->cond);
+#endif
 }
 
 void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
 {
-    DWORD result;
-
     if (!p_condvar->clock)
     {   /* FIXME FIXME FIXME */
-        msleep (50000);
+        msleep(50000);
         return;
     }
 
+#ifndef VLC_WINSTORE_APP
+    DWORD result;
+
     do
     {
         vlc_testcancel ();
@@ -262,12 +277,16 @@ void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
     while (result == WAIT_IO_COMPLETION);
 
     ResetEvent (p_condvar->handle);
+#else
+    vlc_cond_timedwait(p_condvar, p_mutex, INFINITE);
+#endif
 }
 
 int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
                         mtime_t deadline)
 {
     DWORD result;
+    DWORD delay;
 
     do
     {
@@ -292,14 +311,29 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
         if( total < 0 )
             total = 0;
 
-        DWORD delay = (total > 0x7fffffff) ? 0x7fffffff : total;
-        vlc_mutex_unlock (p_mutex);
+        delay = (total > 0x7fffffff) ? 0x7fffffff : total;
+#ifndef VLC_WINSTORE_APP
+        vlc_mutex_unlock(p_mutex);
         result = vlc_WaitForSingleObject (p_condvar->handle, delay);
         vlc_mutex_lock (p_mutex);
     }
     while (result == WAIT_IO_COMPLETION);
 
     ResetEvent (p_condvar->handle);
+#else
+        DWORD new_delay = 50;
+        if (new_delay > delay)
+            new_delay = delay;
+        if (SleepConditionVariableCS(&p_condvar->cond, &p_mutex->mutex, new_delay))
+            return 0;
+        if (delay != INFINITE)
+            delay -= new_delay;
+        result = GetLastError();
+        if (isCancelled())
+            result = WAIT_IO_COMPLETION;
+    }
+    while (delay);
+#endif
 
     return (result == WAIT_OBJECT_0) ? 0 : ETIMEDOUT;
 }
-- 
1.8.5.2 (Apple Git-48)




More information about the vlc-devel mailing list