[vlc-devel] [PATCH 2/2] demux: adaptive: use C++ wait conditions and lock
Thomas Guillem
thomas at gllm.fr
Tue Feb 11 10:15:01 CET 2020
Not sure about this patch. cf. the Qt code. It is using VLC mutex and conds.
So, if you do that change, you should do it for every c++ code, for consistency. No ?
On Tue, Feb 11, 2020, at 10:01, 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
More information about the vlc-devel
mailing list