[vlc-devel] [PATCH] decoder: merge conditions and locks
Thomas Guillem
thomas at gllm.fr
Wed Apr 1 19:10:39 CEST 2015
- Merge wait_fifo condition with wait_acknowledge condition.
- Merge Fifo condition with wait_request condition.
- Merge Fifo lock with owner lock. The Fifo is not locked by its own lock
anymore.
---
src/input/decoder.c | 61 ++++++++++++++++++++++++++++-------------------------
1 file changed, 32 insertions(+), 29 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 76c4038..c2cf590 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -89,7 +89,6 @@ struct decoder_owner_sys_t
vlc_mutex_t lock;
vlc_cond_t wait_request;
vlc_cond_t wait_acknowledge;
- vlc_cond_t wait_fifo; /* TODO: merge with wait_acknowledge */
/* -- These variables need locking on write(only) -- */
audio_output_t *p_aout;
@@ -1421,10 +1420,10 @@ static void *DecoderThread( void *p_data )
{
block_t *p_block;
- vlc_fifo_Lock( p_owner->p_fifo );
- vlc_fifo_CleanupPush( p_owner->p_fifo );
+ vlc_mutex_lock( &p_owner->lock );
+ mutex_cleanup_push( &p_owner->lock );
- vlc_cond_signal( &p_owner->wait_fifo );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
while( vlc_fifo_IsEmpty( p_owner->p_fifo ) )
{
@@ -1436,7 +1435,9 @@ static void *DecoderThread( void *p_data )
}
p_owner->b_idle = true;
- vlc_fifo_Wait( p_owner->p_fifo );
+ vlc_cond_signal( &p_owner->wait_acknowledge );
+ vlc_cond_wait( &p_owner->wait_request, &p_owner->lock );
+
/* Make sure there is no cancellation point other than this one^^.
* If you need one, be sure to push cleanup of p_block. */
p_owner->b_idle = false;
@@ -1597,7 +1598,6 @@ static decoder_t * CreateDecoder( vlc_object_t *p_parent,
vlc_mutex_init( &p_owner->lock );
vlc_cond_init( &p_owner->wait_request );
vlc_cond_init( &p_owner->wait_acknowledge );
- vlc_cond_init( &p_owner->wait_fifo );
p_owner->b_fmt_description = false;
p_owner->p_description = NULL;
@@ -1711,7 +1711,6 @@ static void DeleteDecoder( decoder_t * p_dec )
vlc_object_release( p_owner->p_packetizer );
}
- vlc_cond_destroy( &p_owner->wait_fifo );
vlc_cond_destroy( &p_owner->wait_acknowledge );
vlc_cond_destroy( &p_owner->wait_request );
vlc_mutex_destroy( &p_owner->lock );
@@ -1852,18 +1851,13 @@ void input_DecoderDelete( decoder_t *p_dec )
DeleteDecoder( p_dec );
}
-/**
- * Put a block_t in the decoder's fifo.
- * Thread-safe w.r.t. the decoder. May be a cancellation point.
- *
- * \param p_dec the decoder object
- * \param p_block the data block
- */
-void input_DecoderDecode( decoder_t *p_dec, block_t *p_block, bool b_do_pace )
+static void DecoderDecodeLocked( decoder_t *p_dec, block_t *p_block,
+ bool b_do_pace )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
- vlc_fifo_Lock( p_owner->p_fifo );
+ vlc_assert_locked( &p_owner->lock );
+
if( !b_do_pace )
{
/* FIXME: ideally we would check the time amount of data
@@ -1882,11 +1876,27 @@ void input_DecoderDecode( decoder_t *p_dec, block_t *p_block, bool b_do_pace )
* Locking is not necessary as b_waiting is only read, not written by
* the decoder thread. */
while( vlc_fifo_GetCount( p_owner->p_fifo ) >= 10 )
- vlc_fifo_WaitCond( p_owner->p_fifo, &p_owner->wait_fifo );
+ vlc_cond_wait( &p_owner->wait_acknowledge, &p_owner->lock );
}
vlc_fifo_QueueUnlocked( p_owner->p_fifo, p_block );
- vlc_fifo_Unlock( p_owner->p_fifo );
+ vlc_cond_signal( &p_owner->wait_request );
+}
+
+/**
+ * Put a block_t in the decoder's fifo.
+ * Thread-safe w.r.t. the decoder. May be a cancellation point.
+ *
+ * \param p_dec the decoder object
+ * \param p_block the data block
+ */
+void input_DecoderDecode( decoder_t *p_dec, block_t *p_block, bool b_do_pace )
+{
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+ vlc_mutex_lock( &p_owner->lock );
+ DecoderDecodeLocked( p_dec, p_block, b_do_pace );
+ vlc_mutex_unlock( &p_owner->lock );
}
bool input_DecoderIsEmpty( decoder_t * p_dec )
@@ -1924,10 +1934,10 @@ void input_DecoderDrain( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
- vlc_fifo_Lock( p_owner->p_fifo );
+ vlc_mutex_lock( &p_owner->lock );
p_owner->b_draining = true;
- vlc_fifo_Signal( p_owner->p_fifo );
- vlc_fifo_Unlock( p_owner->p_fifo );
+ vlc_cond_signal( &p_owner->wait_request );
+ vlc_mutex_unlock( &p_owner->lock );
}
static void DecoderFlush( decoder_t *p_dec )
@@ -1936,11 +1946,9 @@ static void DecoderFlush( decoder_t *p_dec )
vlc_assert_locked( &p_owner->lock );
- vlc_fifo_Lock( p_owner->p_fifo );
/* Empty the fifo */
block_ChainRelease( vlc_fifo_DequeueAllUnlocked( p_owner->p_fifo ) );
p_owner->b_draining = false; /* flush supersedes drain */
- vlc_fifo_Unlock( p_owner->p_fifo );
/* Monitor for flush end */
p_owner->b_flushing = true;
@@ -1950,7 +1958,7 @@ static void DecoderFlush( decoder_t *p_dec )
block_t *p_null = DecoderBlockFlushNew();
if( !p_null )
return;
- input_DecoderDecode( p_dec, p_null, false );
+ DecoderDecodeLocked( p_dec, p_null, false );
/* */
while( p_owner->b_flushing )
@@ -2127,7 +2135,6 @@ void input_DecoderWait( decoder_t *p_dec )
assert( p_owner->b_waiting );
vlc_mutex_lock( &p_owner->lock );
- vlc_fifo_Lock( p_owner->p_fifo );
while( !p_owner->b_has_data )
{
if( p_owner->b_idle && vlc_fifo_IsEmpty( p_owner->p_fifo ) )
@@ -2135,12 +2142,8 @@ void input_DecoderWait( decoder_t *p_dec )
msg_Warn( p_dec, "can't wait without data to decode" );
break;
}
- vlc_fifo_Signal( p_owner->p_fifo );
- vlc_fifo_Unlock( p_owner->p_fifo );
vlc_cond_wait( &p_owner->wait_acknowledge, &p_owner->lock );
- vlc_fifo_Lock( p_owner->p_fifo );
}
- vlc_fifo_Unlock( p_owner->p_fifo );
vlc_mutex_unlock( &p_owner->lock );
}
--
2.1.3
More information about the vlc-devel
mailing list