]> git.sesse.net Git - vlc/commitdiff
Win32: fix previous commit plus small optimization
authorRémi Denis-Courmont <remi@remlab.net>
Wed, 30 Dec 2009 14:08:07 +0000 (16:08 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Wed, 30 Dec 2009 14:08:07 +0000 (16:08 +0200)
include/vlc_threads.h
src/misc/w32thread.c

index 65a4eb4807703f8140f01ff874ea7cc60baf7d85..da892ac70997529b489bd9a4d1cccb2c847f1703 100644 (file)
@@ -127,11 +127,15 @@ typedef struct
     bool dynamic;
     union
     {
-        bool locked;
+        struct
+        {
+            bool locked;
+            unsigned long contention;
+        };
         CRITICAL_SECTION mutex;
     };
 } vlc_mutex_t;
-#define VLC_STATIC_MUTEX { false, { false } }
+#define VLC_STATIC_MUTEX { false, { { false, 0 } } }
 
 typedef HANDLE  vlc_cond_t;
 typedef HANDLE  vlc_sem_t;
index f4e247c85e8de3c3ae7c222910e32b7b0e073692..349dd81e4704a955b7edd1f536a577b50a82b407 100644 (file)
@@ -195,7 +195,11 @@ void vlc_mutex_lock (vlc_mutex_t *p_mutex)
 
         vlc_mutex_lock (&super_mutex);
         while (p_mutex->locked)
-            vlc_cond_wait (&super_mutex, &super_variable);
+        {
+            p_mutex->contention++;
+            vlc_cond_wait (&super_variable, &super_mutex);
+            p_mutex->contention--;
+        }
         p_mutex->locked = true;
         vlc_mutex_unlock (&super_mutex);
         return;
@@ -233,7 +237,8 @@ void vlc_mutex_unlock (vlc_mutex_t *p_mutex)
         vlc_mutex_lock (&super_mutex);
         assert (p_mutex->locked);
         p_mutex->locked = false;
-        vlc_cond_signal (&super_variable);
+        if (p_mutex->contention)
+            vlc_cond_broadcast (&super_variable);
         vlc_mutex_unlock (&super_mutex);
         return;
     }