[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