14#if defined(__cpp_lib_jthread)
15 optional<stop_token> GetCurrentThreadStopToken ();
24 template <
typename MUTEX,
typename CONDITION_VARIABLE>
30 template <
typename MUTEX,
typename CONDITION_VARIABLE>
36 template <
typename MUTEX,
typename CONDITION_VARIABLE>
39 fConditionVariable.notify_one ();
41 template <
typename MUTEX,
typename CONDITION_VARIABLE>
44 fConditionVariable.notify_all ();
46 template <
typename MUTEX,
typename CONDITION_VARIABLE>
52 Require (lock.owns_lock ());
55 if (Time::GetTickCount () > timeoutAt) [[unlikely]] {
56 Ensure (lock.owns_lock ());
57 return cv_status::timeout;
60 auto timeoutAtStopPoint = timeoutAt;
62 if constexpr (kSupportsStopToken) {
64#if defined(__cpp_lib_jthread)
65 if (optional<stop_token> ost = Thread::GetCurrentThreadStopToken ()) {
66 if (fConditionVariable.wait_until (lock, *ost, Time::Pin2SafeSeconds (timeoutAt), [&] () { return ost->stop_requested (); }))
70 return (Time::GetTickCount () < timeoutAt) ? cv_status::no_timeout : cv_status::timeout;
79 Assert (not kSupportsStopToken or not currentThreadIsInterruptible);
81 if (currentThreadIsInterruptible) {
82 timeoutAtStopPoint = min (timeoutAt, Time::GetTickCount () + sConditionVariableWaitChunkTime);
85 Assert (lock.owns_lock ());
89 (void)fConditionVariable.wait_until (lock, Time::Pin2SafeSeconds (timeoutAtStopPoint));
90 Ensure (lock.owns_lock ());
94 return (Time::GetTickCount () > timeoutAt) ? cv_status::timeout : cv_status::no_timeout;
96 template <
typename MUTEX,
typename CONDITION_VARIABLE>
97 template <invocable PREDICATE>
100 Require (lock.owns_lock ());
105 if constexpr (kSupportsStopToken) {
106#if defined(__cpp_lib_jthread)
107 if (optional<stop_token> ost = Thread::GetCurrentThreadStopToken ()) {
111 bool ready = fConditionVariable.wait_until (lock, *ost, Time::Pin2SafeSeconds (timeoutAt), readyToWake);
112 while (ost->stop_requested () and not ready) {
123 if (Time::GetTickCount () > timeoutAt) {
127 ready = fConditionVariable.wait_until (
128 lock, Time::Pin2SafeSeconds (min (timeoutAt, Time::GetTickCount () + sConditionVariableWaitChunkTime)), readyToWake);
136 while (not readyToWake ()) {
137 Assert (lock.owns_lock ());
152 if (wait_until (lock, timeoutAt) == cv_status::timeout) {
159 auto result = readyToWake ();
160 Ensure (lock.owns_lock ());
165 Ensure (lock.owns_lock ());
168 template <
typename MUTEX,
typename CONDITION_VARIABLE>
171 Require (lock.owns_lock ());
172 Assert (isinf (timeout.count ()) == isinf ((timeout + Time::GetTickCount ()).time_since_epoch ().count ()));
173 return wait_until (lock, timeout + Time::GetTickCount ());
175 template <
typename MUTEX,
typename CONDITION_VARIABLE>
176 template <invocable PREDICATE>
179 Require (lock.owns_lock ());
180 Assert (isinf (timeout.count ()) == isinf ((timeout + Time::GetTickCount ()).time_since_epoch ().count ()));
181 return wait_until (lock, timeout + Time::GetTickCount (), forward<PREDICATE> (readyToWake));
183 template <
typename MUTEX,
typename CONDITION_VARIABLE>
184 template <invocable FUNCTION>
190 QuickLockType quickLock{fMutex};
193 fConditionVariable.notify_all ();
195 template <
typename MUTEX,
typename CONDITION_VARIABLE>
196 template <invocable FUNCTION>
202 QuickLockType quickLock{fMutex};
205 fConditionVariable.notify_one ();
time_point< RealtimeClock, DurationSeconds > TimePointSeconds
TimePointSeconds is a simpler approach to chrono::time_point, which doesn't require using templates e...
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
void CheckForInterruption()
bool IsCurrentThreadInterruptible()
nonvirtual void notify_all() noexcept
forward notify_all () call to underlying std::condition_variable'
nonvirtual void release_and_notify_one(LockType &lock) noexcept
nonvirtual cv_status wait_until(LockType &lock, Time::TimePointSeconds timeoutAt)
nonvirtual void MutateDataNotifyAll(FUNCTION &&mutatorFunction)
nonvirtual cv_status wait_for(LockType &lock, Time::DurationSeconds timeout)
unique_lock< MUTEX > LockType
nonvirtual void notify_one() noexcept
forward notify_one () call to underlying std::condition_variable'
nonvirtual void release_and_notify_all(LockType &lock) noexcept
nonvirtual void MutateDataNotifyOne(FUNCTION &&mutatorFunction)