[vlc-devel] [PATCH 2/2] demux: adaptive: use C++ wait conditions and lock

Alexandre Janniaux ajanni at videolabs.io
Tue Feb 11 10:32:59 CET 2020


Hi,

Perfect, thank you for checking this!

Regards,
--
Alexandre Janniaux
Videolabs

On Tue, Feb 11, 2020 at 10:16:35AM +0100, Steve Lhomme wrote:
> I'm using LLVM+mingw64 lately. But I can try a pull request to see if
> there's any target that chokes on this code.
>
> On 2020-02-11 10:13, Alexandre Janniaux wrote:
> > Hi,
> >
> > Does it compile/link with the mingw docker image?
> > Last time I tried using C++ thread tools, it wasn't but
> > it was before the shift to C++14 so maybe tools have evolved.
> >
> > Regards,
> > --
> > Alexandre Janniaux
> > Videolabs
> >
> > On Tue, Feb 11, 2020 at 10:01:06AM +0100, Steve Lhomme wrote:
> > > ---
> > >   modules/demux/adaptive/PlaylistManager.cpp | 42 ++++++++++------------
> > >   modules/demux/adaptive/PlaylistManager.h   |  5 +--
> > >   2 files changed, 22 insertions(+), 25 deletions(-)
> > >
> > > diff --git a/modules/demux/adaptive/PlaylistManager.cpp b/modules/demux/adaptive/PlaylistManager.cpp
> > > index 62c697e1432..13067f7589c 100644
> > > --- a/modules/demux/adaptive/PlaylistManager.cpp
> > > +++ b/modules/demux/adaptive/PlaylistManager.cpp
> > > @@ -70,8 +70,6 @@ PlaylistManager::PlaylistManager( demux_t *p_demux_,
> > >       demux.i_firstpcr = VLC_TICK_INVALID;
> > >       vlc_mutex_init(&demux.lock);
> > >       vlc_cond_init(&demux.cond);
> > > -    vlc_mutex_init(&lock);
> > > -    vlc_cond_init(&waitcond);
> > >       vlc_mutex_init(&cached.lock);
> > >       cached.b_live = false;
> > >       cached.f_position = 0.0;
> > > @@ -89,8 +87,6 @@ PlaylistManager::~PlaylistManager   ()
> > >       delete playlist;
> > >       delete logic;
> > >       delete resources;
> > > -    vlc_cond_destroy(&waitcond);
> > > -    vlc_mutex_destroy(&lock);
> > >       vlc_mutex_destroy(&demux.lock);
> > >       vlc_cond_destroy(&demux.cond);
> > >       vlc_mutex_destroy(&cached.lock);
> > > @@ -183,10 +179,11 @@ void PlaylistManager::stop()
> > >   {
> > >       if(thread != nullptr)
> > >       {
> > > -        vlc_mutex_lock(&lock);
> > > -        b_canceled = true;
> > > -        vlc_cond_signal(&waitcond);
> > > -        vlc_mutex_unlock(&lock);
> > > +        {
> > > +            std::lock_guard<std::mutex> lk(lock);
> > > +            b_canceled = true;
> > > +            waitcond.notify_one();
> > > +        }
> > >
> > >           vlc_join(thread, NULL);
> > >           thread = nullptr;
> > > @@ -608,21 +605,20 @@ int PlaylistManager::doControl(int i_query, va_list args)
> > >
> > >   void PlaylistManager::setBufferingRunState(bool b)
> > >   {
> > > -    vlc_mutex_lock(&lock);
> > > +    std::lock_guard<std::mutex> lk(lock);
> > >       b_buffering = b;
> > > -    vlc_cond_signal(&waitcond);
> > > -    vlc_mutex_unlock(&lock);
> > > +    waitcond.notify_one();
> > >   }
> > >
> > >   void PlaylistManager::Run()
> > >   {
> > > -    vlc_mutex_lock(&lock);
> > > +    std::unique_lock<std::mutex> wait_lock(lock);
> > >       const vlc_tick_t i_min_buffering = playlist->getMinBuffering();
> > >       const vlc_tick_t i_extra_buffering = playlist->getMaxBuffering() - i_min_buffering;
> > >       while(1)
> > >       {
> > >           while(!b_buffering && !b_canceled)
> > > -            vlc_cond_wait(&waitcond, &lock);
> > > +            waitcond.wait(wait_lock);
> > >           if (b_canceled)
> > >               break;
> > >
> > > @@ -646,29 +642,29 @@ void PlaylistManager::Run()
> > >
> > >           if(i_return != AbstractStream::buffering_lessthanmin)
> > >           {
> > > -            vlc_tick_t i_deadline = vlc_tick_now();
> > > +            auto deadline = std::chrono::system_clock::now();
> > > +
> > > +            using namespace std::chrono_literals;
> > >               if(i_return == AbstractStream::buffering_ongoing)
> > > -                i_deadline += VLC_TICK_FROM_MS(10);
> > > +                deadline += 10ms;
> > >               else if(i_return == AbstractStream::buffering_full)
> > > -                i_deadline += VLC_TICK_FROM_MS(100);
> > > +                deadline += 100ms;
> > >               else if(i_return == AbstractStream::buffering_end)
> > > -                i_deadline += VLC_TICK_FROM_SEC(1);
> > > +                deadline += 1000ms;
> > >               else /*if(i_return == AbstractStream::buffering_suspended)*/
> > > -                i_deadline += VLC_TICK_FROM_MS(250);
> > > +                deadline += 250ms;
> > >
> > >               vlc_mutex_lock(&demux.lock);
> > >               vlc_cond_signal(&demux.cond);
> > >               vlc_mutex_unlock(&demux.lock);
> > >
> > > -            while(b_buffering &&
> > > -                    vlc_cond_timedwait(&waitcond, &lock, i_deadline) == 0 &&
> > > -                    i_deadline > vlc_tick_now() &&
> > > -                    !b_canceled);
> > > +            waitcond.wait_until(wait_lock, deadline, [this](){
> > > +                      return !b_buffering || b_canceled;
> > > +                  });
> > >               if (b_canceled)
> > >                   break;
> > >           }
> > >       }
> > > -    vlc_mutex_unlock(&lock);
> > >   }
> > >
> > >   void * PlaylistManager::managerThread(void *opaque)
> > > diff --git a/modules/demux/adaptive/PlaylistManager.h b/modules/demux/adaptive/PlaylistManager.h
> > > index 501200f9b7a..3eece82aec5 100644
> > > --- a/modules/demux/adaptive/PlaylistManager.h
> > > +++ b/modules/demux/adaptive/PlaylistManager.h
> > > @@ -25,6 +25,7 @@
> > >   #include "logic/AbstractAdaptationLogic.h"
> > >   #include "Streams.hpp"
> > >   #include <vector>
> > > +#include <condition_variable>
> > >
> > >   namespace adaptive
> > >   {
> > > @@ -130,9 +131,9 @@ namespace adaptive
> > >               void setBufferingRunState(bool);
> > >               void Run();
> > >               static void * managerThread(void *);
> > > -            vlc_mutex_t  lock;
> > >               vlc_thread_t thread;
> > > -            vlc_cond_t   waitcond;
> > > +            std::condition_variable waitcond;
> > > +            std::mutex              lock;
> > >               bool         b_buffering;
> > >               bool         b_canceled;
> > >       };
> > > --
> > > 2.17.1
> > >
> > > _______________________________________________
> > > vlc-devel mailing list
> > > To unsubscribe or modify your subscription options:
> > > https://mailman.videolan.org/listinfo/vlc-devel
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> >
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list