[vlc-commits] Do not used vlc_thread_create() in input/decoder.c
Laurent Aimar
git at videolan.org
Sun May 8 19:02:17 CEST 2011
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sun May 8 18:58:46 2011 +0200| [7f865115a5477ca2edf905ef43eb46c61072eeba] | committer: Laurent Aimar
Do not used vlc_thread_create() in input/decoder.c
It also fixes shared access to b_die without a lock(or equivalent) being used.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7f865115a5477ca2edf905ef43eb46c61072eeba
---
src/input/decoder.c | 44 ++++++++++++++++++++++++++++++--------------
1 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 9688597..8ff0cd8 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -58,7 +58,7 @@ static decoder_t *CreateDecoder( vlc_object_t *, input_thread_t *,
sout_instance_t *p_sout );
static void DeleteDecoder( decoder_t * );
-static void *DecoderThread( vlc_object_t * );
+static void *DecoderThread( void * );
static void DecoderProcess( decoder_t *, block_t * );
static void DecoderError( decoder_t *p_dec, block_t *p_block );
static void DecoderOutputChangePause( decoder_t *, bool b_paused, mtime_t i_date );
@@ -96,6 +96,8 @@ struct decoder_owner_sys_t
sout_instance_t *p_sout;
sout_packetizer_input_t *p_sout_input;
+ vlc_thread_t thread;
+
/* Some decoders require already packetized data (ie. not truncated) */
decoder_t *p_packetizer;
bool b_packetizer;
@@ -125,7 +127,8 @@ struct decoder_owner_sys_t
vout_thread_t *p_vout;
/* -- Theses variables need locking on read *and* write -- */
- /* */
+ bool b_exit;
+
/* Pause */
bool b_paused;
struct
@@ -299,7 +302,7 @@ static decoder_t *decoder_New( vlc_object_t *p_parent, input_thread_t *p_input,
i_priority = VLC_THREAD_PRIORITY_VIDEO;
/* Spawn the decoder thread */
- if( vlc_thread_create( p_dec, DecoderThread, i_priority ) )
+ if( vlc_clone( &p_dec->p_owner->thread, DecoderThread, p_dec, i_priority ) )
{
msg_Err( p_dec, "cannot spawn decoder thread" );
module_unneed( p_dec, p_dec->p_module );
@@ -347,18 +350,19 @@ void input_DecoderDelete( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
- vlc_object_kill( p_dec );
+ vlc_cancel( p_owner->thread );
- /* Make sure we aren't paused/buffering/waiting anymore */
+ /* Make sure we aren't paused/buffering/waiting/decoding anymore */
vlc_mutex_lock( &p_owner->lock );
const bool b_was_paused = p_owner->b_paused;
p_owner->b_paused = false;
p_owner->b_buffering = false;
p_owner->b_flushing = true;
+ p_owner->b_exit = true;
vlc_cond_signal( &p_owner->wait_request );
vlc_mutex_unlock( &p_owner->lock );
- vlc_thread_join( p_dec );
+ vlc_join( p_owner->thread, NULL );
p_owner->b_paused = b_was_paused;
module_unneed( p_dec, p_dec->p_module );
@@ -493,7 +497,6 @@ int input_DecoderSetCcState( decoder_t *p_dec, bool b_decode, int i_channel )
if( p_cc )
{
- vlc_object_kill( p_cc );
module_unneed( p_cc, p_cc->p_module );
DeleteDecoder( p_cc );
}
@@ -876,6 +879,8 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
es_format_Init( &p_owner->fmt_description, UNKNOWN_ES, 0 );
p_owner->p_description = NULL;
+ p_owner->b_exit = false;
+
p_owner->b_paused = false;
p_owner->pause.i_date = VLC_TS_INVALID;
p_owner->pause.i_ignore = 0;
@@ -915,9 +920,9 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
*
* \param p_dec the decoder
*/
-static void *DecoderThread( vlc_object_t *p_this )
+static void *DecoderThread( void *p_data )
{
- decoder_t *p_dec = (decoder_t *)p_this;
+ decoder_t *p_dec = (decoder_t *)p_data;
decoder_owner_sys_t *p_owner = p_dec->p_owner;
/* The decoder's main loop */
@@ -1136,6 +1141,17 @@ static void DecoderFixTs( decoder_t *p_dec, mtime_t *pi_ts0, mtime_t *pi_ts1,
}
}
+static bool DecoderIsExitRequested( decoder_t *p_dec )
+{
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+ vlc_mutex_lock( &p_owner->lock );
+ bool b_exit = p_owner->b_exit;
+ vlc_mutex_unlock( &p_owner->lock );
+
+ return b_exit;
+}
+
/**
* If *pb_reject, it does nothing, otherwise it waits for the given
* deadline or a flush request (in which case it set *pi_reject to true.
@@ -1151,7 +1167,7 @@ static void DecoderWaitDate( decoder_t *p_dec,
for( ;; )
{
vlc_mutex_lock( &p_owner->lock );
- if( p_owner->b_flushing || p_dec->b_die )
+ if( p_owner->b_flushing || p_owner->b_exit )
{
*pb_reject = true;
vlc_mutex_unlock( &p_owner->lock );
@@ -1285,7 +1301,7 @@ static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block )
aout_instance_t *p_aout = p_owner->p_aout;
aout_input_t *p_aout_input = p_owner->p_aout_input;
- if( p_dec->b_die )
+ if( DecoderIsExitRequested( p_dec ) )
{
/* It prevent freezing VLC in case of broken decoder */
aout_DecDeleteBuffer( p_aout, p_aout_input, p_aout_buf );
@@ -1510,7 +1526,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
while( (p_pic = p_dec->pf_decode_video( p_dec, &p_block )) )
{
vout_thread_t *p_vout = p_owner->p_vout;
- if( p_dec->b_die )
+ if( DecoderIsExitRequested( p_dec ) )
{
/* It prevent freezing VLC in case of broken decoder */
vout_ReleasePicture( p_vout, p_pic );
@@ -2437,7 +2453,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
*/
for( ;; )
{
- if( p_dec->b_die || p_dec->b_error )
+ if( DecoderIsExitRequested( p_dec ) || p_dec->b_error )
return NULL;
picture_t *p_picture = vout_GetPicture( p_owner->p_vout );
@@ -2483,7 +2499,7 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
while( i_attempts-- )
{
- if( p_dec->b_die || p_dec->b_error )
+ if( DecoderIsExitRequested( p_dec ) || p_dec->b_error )
break;
p_vout = input_resource_HoldVout( p_owner->p_resource );
More information about the vlc-commits
mailing list