[vlc-devel] commit: libvlc: Get rid of the recursive lock. (Pierre d'Herbemont )

git version control git at videolan.org
Thu Jun 4 06:34:41 CEST 2009


vlc | branch: master | Pierre d'Herbemont <pdherbemont at free.fr> | Wed Jun  3 21:33:17 2009 -0700| [1c0e65e35e8f3fc2e9be3c5e1ae3880960478530] | committer: Pierre d'Herbemont 

libvlc: Get rid of the recursive lock.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1c0e65e35e8f3fc2e9be3c5e1ae3880960478530
---

 src/control/event_async.c |   38 ++++++++++++++++++++++++++------------
 1 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/control/event_async.c b/src/control/event_async.c
index fb5c15c..c88c774 100644
--- a/src/control/event_async.c
+++ b/src/control/event_async.c
@@ -90,6 +90,16 @@ static void push(libvlc_event_manager_t * p_em, libvlc_event_listener_t * listen
     iter->next = elmt;
 }
 
+static inline void queue_lock(libvlc_event_manager_t * p_em)
+{
+    vlc_mutex_lock(&queue(p_em)->lock);
+}
+
+static inline void queue_unlock(libvlc_event_manager_t * p_em)
+{
+    vlc_mutex_unlock(&queue(p_em)->lock);
+}
+
 /* Lock must be held */
 static bool pop(libvlc_event_manager_t * p_em, libvlc_event_listener_t * listener, libvlc_event_t * event)
 {
@@ -172,7 +182,7 @@ libvlc_event_async_init(libvlc_event_manager_t * p_em)
         return;
     }
 
-    vlc_mutex_init_recursive(&queue(p_em)->lock); // Beware, this is re-entrant
+    vlc_mutex_init(&queue(p_em)->lock);
     vlc_cond_init(&queue(p_em)->signal);
 }
 
@@ -186,9 +196,9 @@ libvlc_event_async_ensure_listener_removal(libvlc_event_manager_t * p_em, libvlc
 {
     if(!is_queue_initialized(p_em)) return;
 
-    vlc_mutex_lock(&queue(p_em)->lock);
+    queue_lock(p_em);
     pop_listener(p_em, listener);
-    vlc_mutex_unlock(&queue(p_em)->lock);
+    queue_unlock(p_em);
 }
 
 /**************************************************************************
@@ -205,10 +215,10 @@ libvlc_event_async_dispatch(libvlc_event_manager_t * p_em, libvlc_event_listener
         libvlc_event_async_init(p_em);
     vlc_mutex_unlock(&p_em->object_lock);
 
-    vlc_mutex_lock(&queue(p_em)->lock);
+    queue_lock(p_em);
     push(p_em, listener, event);
     vlc_cond_signal(&queue(p_em)->signal);
-    vlc_mutex_unlock(&queue(p_em)->lock);
+    queue_unlock(p_em);
 }
 
 /**************************************************************************
@@ -222,19 +232,23 @@ static void * event_async_loop(void * arg)
     libvlc_event_listener_t listener;
     libvlc_event_t event;
 
-    vlc_mutex_lock(&queue(p_em)->lock);
+    queue_lock(p_em);
     while (true) {
         int has_listener = pop(p_em, &listener, &event);
 
-        mutex_cleanup_push(&queue(p_em)->lock);
-
         if (has_listener)
-            listener.pf_callback( &event, listener.p_user_data ); // This might edit the queue, ->lock is recursive
+        {
+            queue_unlock(p_em);
+            listener.pf_callback(&event, listener.p_user_data); // This might edit the queue
+            queue_lock(p_em);
+        }
         else
+        {
+            mutex_cleanup_push(&queue(p_em)->lock);
             vlc_cond_wait(&queue(p_em)->signal, &queue(p_em)->lock);
-
-        vlc_cleanup_pop();
+            vlc_cleanup_pop();
+        }
     }
-    vlc_mutex_unlock(&queue(p_em)->lock);
+    queue_unlock(p_em);
     return NULL;
 }




More information about the vlc-devel mailing list