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

Steve Lhomme robux4 at ycbcr.xyz
Tue Feb 11 10:38:26 CET 2020


Well, it turns our the gcc we use for win32/win64 doesn't support this. 
So never mind this patch for now...

https://code.videolan.org/robUx4/vlc/-/jobs/354120
https://code.videolan.org/robUx4/vlc/-/jobs/354119

On 2020-02-11 10:32, Alexandre Janniaux wrote:
> 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
> _______________________________________________
> 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