[vlc-devel] commit: Used a weaker lock scheme for input_resource_HoldAout. ( Laurent Aimar )

git version control git at videolan.org
Fri Jun 19 00:13:06 CEST 2009


vlc | branch: 1.0-bugfix | Laurent Aimar <fenrir at videolan.org> | Thu Jun 18 22:41:16 2009 +0200| [82ae423ab2dbb87be3be8ee2a50943f945ff8ccc] | committer: Derk-Jan Hartman 

Used a weaker lock scheme for input_resource_HoldAout.
(cherry picked from commit 9ef7e90ea5797622453649a35511eb3f4e419d9c)

Signed-off-by: Derk-Jan Hartman <hartman at videolan.org>

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

 src/input/resource.c |   34 +++++++++++++++++++++++-----------
 1 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/input/resource.c b/src/input/resource.c
index 28d2729..f10f40f 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -51,7 +51,6 @@ struct input_resource_t
 
     sout_instance_t *p_sout;
     vout_thread_t   *p_vout_free;
-    aout_instance_t *p_aout;
 
     /* This lock is used to protect vout resources access (for hold)
      * It is a special case because of embed video (possible deadlock
@@ -61,8 +60,11 @@ struct input_resource_t
 
     /* You need lock+lock_hold to write to the following variables and
      * only lock or lock_hold to read them */
+
     int             i_vout;
     vout_thread_t   **pp_vout;
+
+    aout_instance_t *p_aout;
 };
 
 /* */
@@ -324,9 +326,13 @@ static void DestroyAout( input_resource_t *p_resource )
 }
 static aout_instance_t *DetachAout( input_resource_t *p_resource )
 {
+    vlc_mutex_lock( &p_resource->lock_hold );
+
     aout_instance_t *p_aout = p_resource->p_aout;
     p_resource->p_aout = NULL;
 
+    vlc_mutex_unlock( &p_resource->lock_hold );
+
     return p_aout;
 }
 
@@ -342,33 +348,39 @@ static aout_instance_t *RequestAout( input_resource_t *p_resource, aout_instance
     }
     else
     {
-        if( !p_resource->p_aout )
+        p_aout = p_resource->p_aout;
+        if( !p_aout )
         {
             msg_Dbg( p_resource->p_input, "creating aout" );
-            p_resource->p_aout = aout_New( p_resource->p_input );
+            p_aout = aout_New( p_resource->p_input );
+
+            vlc_mutex_lock( &p_resource->lock_hold );
+            p_resource->p_aout = p_aout;
+            vlc_mutex_unlock( &p_resource->lock_hold );
         }
         else
         {
             msg_Dbg( p_resource->p_input, "reusing aout" );
         }
 
-        if( !p_resource->p_aout )
+        if( !p_aout )
             return NULL;
 
-        vlc_object_detach( p_resource->p_aout );
-        vlc_object_attach( p_resource->p_aout, p_resource->p_input );
-        vlc_object_hold( p_resource->p_aout );
-        return p_resource->p_aout;
+        vlc_object_detach( p_aout );
+        vlc_object_attach( p_aout, p_resource->p_input );
+        vlc_object_hold( p_aout );
+        return p_aout;
     }
 }
 static aout_instance_t *HoldAout( input_resource_t *p_resource )
 {
-    if( !p_resource->p_aout )
-        return NULL;
+    vlc_mutex_lock( &p_resource->lock_hold );
 
     aout_instance_t *p_aout = p_resource->p_aout;
+    if( p_aout )
+        vlc_object_hold( p_aout );
 
-    vlc_object_hold( p_aout );
+    vlc_mutex_unlock( &p_resource->lock_hold );
 
     return p_aout;
 }




More information about the vlc-devel mailing list