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 ()) {
106 bool ready = fConditionVariable.wait_until (lock, *ost, Time::Pin2SafeSeconds (timeoutAt), forward<PREDICATE> (readyToWake));
107 while (ost->stop_requested () and not ready) {
118 if (Time::GetTickCount () > timeoutAt) {
122 ready = fConditionVariable.wait_until (
123 lock, Time::Pin2SafeSeconds (min (timeoutAt, Time::GetTickCount () + sConditionVariableWaitChunkTime)),
124 forward<PREDICATE> (readyToWake));
132 while (not readyToWake ()) {
133 Assert (lock.owns_lock ());
148 if (wait_until (lock, timeoutAt) == cv_status::timeout) {
155 auto result = readyToWake ();
156 Ensure (lock.owns_lock ());
161 Ensure (lock.owns_lock ());
164 template <
typename MUTEX,
typename CONDITION_VARIABLE>
167 Require (lock.owns_lock ());
168 Assert (isinf (timeout.count ()) == isinf ((timeout + Time::GetTickCount ()).time_since_epoch ().count ()));
169 return wait_until (lock, timeout + Time::GetTickCount ());
171 template <
typename MUTEX,
typename CONDITION_VARIABLE>
172 template <invocable PREDICATE>
175 Require (lock.owns_lock ());
176 Assert (isinf (timeout.count ()) == isinf ((timeout + Time::GetTickCount ()).time_since_epoch ().count ()));
177 return wait_until (lock, timeout + Time::GetTickCount (), forward<PREDICATE> (readyToWake));
179 template <
typename MUTEX,
typename CONDITION_VARIABLE>
180 template <invocable FUNCTION>
186 QuickLockType quickLock{fMutex};
189 fConditionVariable.notify_all ();
191 template <
typename MUTEX,
typename CONDITION_VARIABLE>
192 template <invocable FUNCTION>
198 QuickLockType quickLock{fMutex};
201 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)