[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