[Windows] Remove redundant DirectSound error codes
[xbmc.git] / xbmc / threads / Condition.h
blob3738352bf2b265aa7c675ced1830a580b7a47766
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #pragma once
11 #include "threads/CriticalSection.h"
13 #include <chrono>
14 #include <condition_variable>
15 #include <functional>
16 #include <mutex>
17 #include <utility>
19 namespace XbmcThreads
22 /**
23 * This is a thin wrapper around std::condition_variable_any. It is subject
24 * to "spurious returns"
26 class ConditionVariable
28 private:
29 std::condition_variable_any cond;
30 ConditionVariable(const ConditionVariable&) = delete;
31 ConditionVariable& operator=(const ConditionVariable&) = delete;
33 public:
34 ConditionVariable() = default;
36 inline void wait(CCriticalSection& lock, std::function<bool()> predicate)
38 int count = lock.count;
39 lock.count = 0;
40 cond.wait(lock.get_underlying(), std::move(predicate));
41 lock.count = count;
44 inline void wait(CCriticalSection& lock)
46 int count = lock.count;
47 lock.count = 0;
48 cond.wait(lock.get_underlying());
49 lock.count = count;
52 template<typename Rep, typename Period>
53 inline bool wait(CCriticalSection& lock,
54 std::chrono::duration<Rep, Period> duration,
55 std::function<bool()> predicate)
57 int count = lock.count;
58 lock.count = 0;
59 bool ret = cond.wait_for(lock.get_underlying(), duration, predicate);
60 lock.count = count;
61 return ret;
64 template<typename Rep, typename Period>
65 inline bool wait(CCriticalSection& lock, std::chrono::duration<Rep, Period> duration)
67 int count = lock.count;
68 lock.count = 0;
69 std::cv_status res = cond.wait_for(lock.get_underlying(), duration);
70 lock.count = count;
71 return res == std::cv_status::no_timeout;
74 inline void wait(std::unique_lock<CCriticalSection>& lock, std::function<bool()> predicate)
76 cond.wait(*lock.mutex(), std::move(predicate));
79 inline void wait(std::unique_lock<CCriticalSection>& lock) { wait(*lock.mutex()); }
81 template<typename Rep, typename Period>
82 inline bool wait(std::unique_lock<CCriticalSection>& lock,
83 std::chrono::duration<Rep, Period> duration,
84 std::function<bool()> predicate)
86 return wait(*lock.mutex(), duration, predicate);
89 template<typename Rep, typename Period>
90 inline bool wait(std::unique_lock<CCriticalSection>& lock,
91 std::chrono::duration<Rep, Period> duration)
93 return wait(*lock.mutex(), duration);
96 inline void notifyAll()
98 cond.notify_all();
101 inline void notify()
103 cond.notify_one();