12#if __cpp_lib_jthread >= 201911
13 optional<stop_token> GetCurrentThreadStopToken ();
22 template <
typename MUTEX,
typename CONDITION_VARIABLE>
28 template <
typename MUTEX,
typename CONDITION_VARIABLE>
34 template <
typename MUTEX,
typename CONDITION_VARIABLE>
37 fConditionVariable.notify_one ();
39 template <
typename MUTEX,
typename CONDITION_VARIABLE>
42 fConditionVariable.notify_all ();
44 template <
typename MUTEX,
typename CONDITION_VARIABLE>
50 Require (lock.owns_lock ());
53 if (Time::GetTickCount () > timeoutAt) [[unlikely]] {
54 Ensure (lock.owns_lock ());
55 return cv_status::timeout;
58 auto timeoutAtStopPoint = timeoutAt;
60 if constexpr (kSupportsStopToken) {
62#if __cpp_lib_jthread >= 201911
63 if (optional<stop_token> ost = Thread::GetCurrentThreadStopToken ()) {
64 if (fConditionVariable.wait_until (lock, *ost, Time::Pin2SafeSeconds (timeoutAt), [&] () { return ost->stop_requested (); }))
68 return (Time::GetTickCount () < timeoutAt) ? cv_status::no_timeout : cv_status::timeout;
77 Assert (not kSupportsStopToken or not currentThreadIsInterruptible);
79 if (currentThreadIsInterruptible) {
80 timeoutAtStopPoint = min (timeoutAt, Time::GetTickCount () + sConditionVariableWaitChunkTime);
83 Assert (lock.owns_lock ());
87 (void)fConditionVariable.wait_until (lock, Time::Pin2SafeSeconds (timeoutAtStopPoint));
88 Ensure (lock.owns_lock ());
92 return (Time::GetTickCount () > timeoutAt) ? cv_status::timeout : cv_status::no_timeout;
94 template <
typename MUTEX,
typename CONDITION_VARIABLE>
95 template <invocable PREDICATE>
98 Require (lock.owns_lock ());
103 if constexpr (kSupportsStopToken) {
104#if __cpp_lib_jthread >= 201911
105 if (optional<stop_token> ost = Thread::GetCurrentThreadStopToken ()) {
109 bool ready = fConditionVariable.wait_until (lock, *ost, Time::Pin2SafeSeconds (timeoutAt), readyToWake);
110 while (ost->stop_requested () and not ready) {
121 if (Time::GetTickCount () > timeoutAt) {
125 ready = fConditionVariable.wait_until (
126 lock, Time::Pin2SafeSeconds (min (timeoutAt, Time::GetTickCount () + sConditionVariableWaitChunkTime)), readyToWake);
134 while (not readyToWake ()) {
135 Assert (lock.owns_lock ());
150 if (wait_until (lock, timeoutAt) == cv_status::timeout) {
157 auto result = readyToWake ();
158 Ensure (lock.owns_lock ());
163 Ensure (lock.owns_lock ());
166 template <
typename MUTEX,
typename CONDITION_VARIABLE>
169 Require (lock.owns_lock ());
170 Assert (isinf (timeout.count ()) == isinf ((timeout + Time::GetTickCount ()).time_since_epoch ().count ()));
171 return wait_until (lock, timeout + Time::GetTickCount ());
173 template <
typename MUTEX,
typename CONDITION_VARIABLE>
174 template <invocable PREDICATE>
177 Require (lock.owns_lock ());
178 Assert (isinf (timeout.count ()) == isinf ((timeout + Time::GetTickCount ()).time_since_epoch ().count ()));
179 return wait_until (lock, timeout + Time::GetTickCount (), forward<PREDICATE> (readyToWake));
181 template <
typename MUTEX,
typename CONDITION_VARIABLE>
182 template <invocable FUNCTION>
188 QuickLockType quickLock{fMutex};
191 fConditionVariable.notify_all ();
193 template <
typename MUTEX,
typename CONDITION_VARIABLE>
194 template <invocable FUNCTION>
200 QuickLockType quickLock{fMutex};
203 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)