[vlc-devel] [PATCH] preparser: kill the thread after a delay of 5 seconds
Thomas Guillem
thomas at gllm.fr
Wed Jun 1 14:44:16 CEST 2016
I'll now work on the same thing for the fetcher. Maybe I can factorize them ?
---
src/playlist/preparser.c | 46 +++++++++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 13 deletions(-)
diff --git a/src/playlist/preparser.c b/src/playlist/preparser.c
index 13d5d3c..09d0deb 100644
--- a/src/playlist/preparser.c
+++ b/src/playlist/preparser.c
@@ -33,6 +33,8 @@
#include "preparser.h"
#include "input/input_interface.h"
+#define THREAD_TTL INT64_C(5000000); /* 5 seconds */
+
/*****************************************************************************
* Structures/definitions
*****************************************************************************/
@@ -53,7 +55,9 @@ struct playlist_preparser_t
vlc_mutex_t lock;
vlc_cond_t wait;
+ vlc_cond_t thread_wait;
bool b_live;
+ bool b_request_stop;
preparser_entry_t **pp_waiting;
unsigned int i_waiting;
};
@@ -77,7 +81,9 @@ playlist_preparser_t *playlist_preparser_New( vlc_object_t *parent )
vlc_mutex_init( &p_preparser->lock );
vlc_cond_init( &p_preparser->wait );
+ vlc_cond_init( &p_preparser->thread_wait );
p_preparser->b_live = false;
+ p_preparser->b_request_stop = false;
p_preparser->i_waiting = 0;
p_preparser->pp_waiting = NULL;
@@ -106,6 +112,8 @@ void playlist_preparser_Push( playlist_preparser_t *p_preparser, input_item_t *p
else
p_preparser->b_live = true;
}
+ else
+ vlc_cond_signal( &p_preparser->thread_wait );
vlc_mutex_unlock( &p_preparser->lock );
}
@@ -150,6 +158,8 @@ void playlist_preparser_Delete( playlist_preparser_t *p_preparser )
free( p_entry );
REMOVE_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting, 0 );
}
+ p_preparser->b_request_stop = true;
+ vlc_cond_signal( &p_preparser->thread_wait );
if( p_preparser->input != NULL )
input_Stop( p_preparser->input );
@@ -159,6 +169,7 @@ void playlist_preparser_Delete( playlist_preparser_t *p_preparser )
vlc_mutex_unlock( &p_preparser->lock );
/* Destroy the item preparser */
+ vlc_cond_destroy( &p_preparser->thread_wait );
vlc_cond_destroy( &p_preparser->wait );
vlc_mutex_destroy( &p_preparser->lock );
@@ -284,21 +295,30 @@ static void *Thread( void *data )
input_item_meta_request_option_t i_options;
/* */
- if( p_preparser->i_waiting > 0 )
- {
- preparser_entry_t *p_entry = p_preparser->pp_waiting[0];
- p_current = p_entry->p_item;
- i_options = p_entry->i_options;
- free( p_entry );
- REMOVE_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting, 0 );
- }
- else
+ if( p_preparser->i_waiting == 0 )
{
- p_current = NULL;
- p_preparser->b_live = false;
- vlc_cond_signal( &p_preparser->wait );
- break;
+ const mtime_t deadline = mdate() + THREAD_TTL;
+ int ret = 0;
+
+ /* Abort loop if stop is requested, waiting array is not empty or
+ * in case of timeout */
+ while( !p_preparser->b_request_stop
+ && p_preparser->i_waiting == 0 && ret == 0 )
+ ret = vlc_cond_timedwait( &p_preparser->thread_wait,
+ &p_preparser->lock, deadline );
+ if( p_preparser->i_waiting == 0 )
+ {
+ p_preparser->b_live = false;
+ vlc_cond_signal( &p_preparser->wait );
+ break;
+ }
}
+
+ preparser_entry_t *p_entry = p_preparser->pp_waiting[0];
+ p_current = p_entry->p_item;
+ i_options = p_entry->i_options;
+ free( p_entry );
+ REMOVE_ELEM( p_preparser->pp_waiting, p_preparser->i_waiting, 0 );
assert( p_current );
if( Preparse( p_preparser, p_current, i_options ) == VLC_SUCCESS )
--
2.8.1
More information about the vlc-devel
mailing list