[vlc-commits] medialibrary: metadata extractor: Handle timeouts

Hugo Beauzée-Luyssen git at videolan.org
Wed Jan 23 11:05:58 CET 2019


vlc | branch: master | Hugo Beauzée-Luyssen <hugo at beauzee.fr> | Fri Nov 30 15:28:44 2018 +0100| [6da3414bceb6430a6505ab0b9f9fe4fe532cea82] | committer: Hugo Beauzée-Luyssen

medialibrary: metadata extractor: Handle timeouts

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6da3414bceb6430a6505ab0b9f9fe4fe532cea82
---

 modules/misc/medialibrary/MetadataExtractor.cpp | 11 ++++++++++-
 modules/misc/medialibrary/medialibrary.h        | 12 +++++++-----
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/modules/misc/medialibrary/MetadataExtractor.cpp b/modules/misc/medialibrary/MetadataExtractor.cpp
index 7440bd4db3..fc04ba870d 100644
--- a/modules/misc/medialibrary/MetadataExtractor.cpp
+++ b/modules/misc/medialibrary/MetadataExtractor.cpp
@@ -170,9 +170,18 @@ medialibrary::parser::Status MetadataExtractor::run( medialibrary::parser::IItem
 
     {
         vlc::threads::mutex_locker lock( ctx.m_mutex );
+        auto deadline = vlc_tick_now() + VLC_TICK_FROM_SEC( 5 );
         while ( ctx.needsProbing == false )
         {
-            ctx.m_cond.wait( ctx.m_mutex );
+            auto res = ctx.m_cond.timedwait( ctx.m_mutex, deadline );
+            if ( res != 0 )
+            {
+                msg_Dbg( m_obj, "Timed out while extracting %s metadata",
+                         item.mrl().c_str() );
+                ctx.state = ERROR_S;
+                input_Stop( ctx.input.get() );
+                break;
+            }
             if ( ctx.needsProbing == true )
             {
                 if ( ctx.state == END_S || ctx.state == ERROR_S )
diff --git a/modules/misc/medialibrary/medialibrary.h b/modules/misc/medialibrary/medialibrary.h
index 759fd38b1a..f339ab77d8 100644
--- a/modules/misc/medialibrary/medialibrary.h
+++ b/modules/misc/medialibrary/medialibrary.h
@@ -49,23 +49,25 @@ private:
     struct ParseContext
     {
         ParseContext( MetadataExtractor* mde, medialibrary::parser::IItem& item )
-            : inputItem( nullptr, &input_item_Release )
-            , input( nullptr, &input_Close )
-            , needsProbing( false )
+            : needsProbing( false )
             , state( INIT_S )
             , mde( mde )
             , item( item )
+            , inputItem( nullptr, &input_item_Release )
+            , input( nullptr, &input_Close )
         {
         }
 
-        std::unique_ptr<input_item_t, decltype(&input_item_Release)> inputItem;
-        std::unique_ptr<input_thread_t, decltype(&input_Close)> input;
         vlc::threads::condition_variable m_cond;
         vlc::threads::mutex m_mutex;
         bool needsProbing;
         input_state_e state;
         MetadataExtractor* mde;
         medialibrary::parser::IItem& item;
+        std::unique_ptr<input_item_t, decltype(&input_item_Release)> inputItem;
+        // Needs to be last to be destroyed first, otherwise a late callback
+        // could use some already destroyed fields
+        std::unique_ptr<input_thread_t, decltype(&input_Close)> input;
     };
 
 public:



More information about the vlc-commits mailing list