[vlc-devel] [PATCH 3/3] fingerprinter: use vlc_cond_t instead of sleep

Alexandre Janniaux ajanni at videolabs.io
Sun Mar 22 16:21:22 CET 2020


Instead of checking new requests every seconds, wait for actual new
requests to be enqueued before trying to do any processing. This avoid
the harmful sleep warning on vlc_tick_sleep as well as providing better
latency for new fingerprinting requests on a cold fingerprinter.
---
 modules/misc/fingerprinter.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/modules/misc/fingerprinter.c b/modules/misc/fingerprinter.c
index 99a05346f0..18cc83bc2c 100644
--- a/modules/misc/fingerprinter.c
+++ b/modules/misc/fingerprinter.c
@@ -51,6 +51,8 @@ struct fingerprinter_sys_t
         vlc_mutex_t         lock;
     } incoming, results;
 
+    vlc_cond_t              incoming_cond;
+
     struct
     {
         vlc_array_t         queue;
@@ -85,14 +87,13 @@ static int EnqueueRequest( fingerprinter_thread_t *f, fingerprint_request_t *r )
     fingerprinter_sys_t *p_sys = f->p_sys;
     vlc_mutex_lock( &p_sys->incoming.lock );
     int i_ret = vlc_array_append( &p_sys->incoming.queue, r );
+    vlc_cond_signal( &p_sys->incoming_cond );
     vlc_mutex_unlock( &p_sys->incoming.lock );
     return i_ret;
 }
 
 static void QueueIncomingRequests( fingerprinter_sys_t *p_sys )
 {
-    vlc_mutex_lock( &p_sys->incoming.lock );
-
     for( size_t i = vlc_array_count( &p_sys->incoming.queue ); i > 0 ; i-- )
     {
         fingerprint_request_t *r = vlc_array_item_at_index( &p_sys->incoming.queue, i - 1 );
@@ -100,7 +101,6 @@ static void QueueIncomingRequests( fingerprinter_sys_t *p_sys )
             fingerprint_request_Delete( r );
     }
     vlc_array_clear( &p_sys->incoming.queue );
-    vlc_mutex_unlock(&p_sys->incoming.lock);
 }
 
 static fingerprint_request_t * GetResult( fingerprinter_thread_t *f )
@@ -250,6 +250,7 @@ static int Open(vlc_object_t *p_this)
 
     vlc_array_init( &p_sys->incoming.queue );
     vlc_mutex_init( &p_sys->incoming.lock );
+    vlc_cond_init( &p_sys->incoming_cond );
 
     vlc_array_init( &p_sys->processing.queue );
     vlc_cond_init( &p_sys->processing.cond );
@@ -344,12 +345,19 @@ static void *Run( void *opaque )
     /* main loop */
     for (;;)
     {
-        vlc_tick_sleep( VLC_TICK_FROM_SEC(1) );
-
-        QueueIncomingRequests( p_sys );
-
         vlc_testcancel();
 
+        vlc_mutex_lock( &p_sys->incoming.lock );
+        mutex_cleanup_push( &p_sys->incoming.lock );
+
+        while( vlc_array_count( &p_sys->incoming.queue ) == 0 )
+            vlc_cond_wait( &p_sys->incoming_cond, &p_sys->incoming.lock );
+
+        QueueIncomingRequests( p_sys );
+
+        vlc_cleanup_pop();
+        vlc_mutex_unlock( &p_sys->incoming.lock );
+
         bool results_available = false;
         while( vlc_array_count( &p_sys->processing.queue ) )
         {
-- 
2.25.2



More information about the vlc-devel mailing list