/* * Copyright (C) 2005-2018 Team Kodi * This file is part of Kodi - https://kodi.tv * * SPDX-License-Identifier: GPL-2.0-or-later * See LICENSES/README.md for more information. */ #pragma once #include "threads/CriticalSection.h" #include #include #include #include #include namespace XbmcThreads { /** * This is a thin wrapper around std::condition_variable_any. It is subject * to "spurious returns" */ class ConditionVariable { private: std::condition_variable_any cond; ConditionVariable(const ConditionVariable&) = delete; ConditionVariable& operator=(const ConditionVariable&) = delete; public: ConditionVariable() = default; inline void wait(CCriticalSection& lock, std::function predicate) { int count = lock.count; lock.count = 0; cond.wait(lock.get_underlying(), std::move(predicate)); lock.count = count; } inline void wait(CCriticalSection& lock) { int count = lock.count; lock.count = 0; cond.wait(lock.get_underlying()); lock.count = count; } template inline bool wait(CCriticalSection& lock, std::chrono::duration duration, std::function predicate) { int count = lock.count; lock.count = 0; bool ret = cond.wait_for(lock.get_underlying(), duration, predicate); lock.count = count; return ret; } template inline bool wait(CCriticalSection& lock, std::chrono::duration duration) { int count = lock.count; lock.count = 0; std::cv_status res = cond.wait_for(lock.get_underlying(), duration); lock.count = count; return res == std::cv_status::no_timeout; } inline void wait(std::unique_lock& lock, std::function predicate) { cond.wait(*lock.mutex(), std::move(predicate)); } inline void wait(std::unique_lock& lock) { wait(*lock.mutex()); } template inline bool wait(std::unique_lock& lock, std::chrono::duration duration, std::function predicate) { return wait(*lock.mutex(), duration, predicate); } template inline bool wait(std::unique_lock& lock, std::chrono::duration duration) { return wait(*lock.mutex(), duration); } inline void notifyAll() { cond.notify_all(); } inline void notify() { cond.notify_one(); } }; }