[vlc-devel] commit: Used a weaker lock scheme for input_resource_HoldAout. ( Laurent Aimar )
git version control
git at videolan.org
Thu Jun 18 23:43:53 CEST 2009
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Jun 18 22:41:16 2009 +0200| [9ef7e90ea5797622453649a35511eb3f4e419d9c] | committer: Laurent Aimar
Used a weaker lock scheme for input_resource_HoldAout.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9ef7e90ea5797622453649a35511eb3f4e419d9c
---
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 5f5b0de..cf71bbf 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