]> git.sesse.net Git - vlc/commitdiff
Win32: emulate static condition variables
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 18 Aug 2011 15:14:41 +0000 (18:14 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 18 Aug 2011 14:22:55 +0000 (17:22 +0300)
This is really poor implementation, but it is not really used.

include/vlc_threads.h
src/win32/thread.c

index dfe43599f7ceb74f217c54ea8dbbf8b24b875536..fea79bed881804bda61c559977c4c1483ea04f17 100644 (file)
@@ -144,6 +144,7 @@ typedef struct
     HANDLE   handle;
     unsigned clock;
 } vlc_cond_t;
+#define VLC_STATIC_COND { 0, 0, 0 }
 
 typedef HANDLE  vlc_sem_t;
 
index 6831cbe1a4ec6a2c29a8f7199c4d4698406d146e..99e54b53128a3eed4c3c4eeb9aa475940656632f 100644 (file)
@@ -232,8 +232,8 @@ void vlc_mutex_unlock (vlc_mutex_t *p_mutex)
 /*** Condition variables ***/
 enum
 {
+    CLOCK_REALTIME=0, /* must be zero for VLC_STATIC_COND */
     CLOCK_MONOTONIC,
-    CLOCK_REALTIME,
 };
 
 static void vlc_cond_init_common (vlc_cond_t *p_condvar, unsigned clock)
@@ -262,16 +262,19 @@ void vlc_cond_destroy (vlc_cond_t *p_condvar)
 
 void vlc_cond_signal (vlc_cond_t *p_condvar)
 {
-    /* NOTE: This will cause a broadcast, that is wrong.
-     * This will also wake up the next waiting thread if no threads are yet
-     * waiting, which is also wrong. However both of these issues are allowed
-     * by the provision for spurious wakeups. Better have too many wakeups
-     * than too few (= deadlocks). */
-    SetEvent (p_condvar->handle);
+    if (!p_condvar->handle)
+        return;
+
+    /* This is suboptimal but works. */
+    vlc_cond_broadcast (p_condvar);
 }
 
 void vlc_cond_broadcast (vlc_cond_t *p_condvar)
 {
+    if (!p_condvar->handle)
+        return;
+
+    /* Wake all threads up (as the event HANDLE has manual reset) */
     SetEvent (p_condvar->handle);
 }
 
@@ -279,6 +282,12 @@ void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
 {
     DWORD result;
 
+    if (!p_condvar->handle)
+    {   /* FIXME FIXME FIXME */
+        msleep (50000);
+        return;
+    }
+
     do
     {
         vlc_testcancel ();
@@ -296,6 +305,12 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
 {
     DWORD result;
 
+    if (!p_condvar->handle)
+    {   /* FIXME FIXME FIXME */
+        msleep (50000);
+        return 0;
+    }
+
     do
     {
         vlc_testcancel ();