vlc | branch: master | Hugo Beauzée-Luyssen <[email protected]> | 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: _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
