1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #pragma once
- #include "mutex.h"
- #include <util/generic/ptr.h>
- #include <util/generic/noncopyable.h>
- #include <util/datetime/base.h>
- #include <utility>
- class TCondVar {
- public:
- TCondVar();
- ~TCondVar();
- void BroadCast() noexcept;
- void Signal() noexcept;
- /*
- * returns false if failed by timeout
- */
- bool WaitD(TMutex& m, TInstant deadline) noexcept;
- template <typename P>
- inline bool WaitD(TMutex& m, TInstant deadline, P pred) noexcept {
- while (!pred()) {
- if (!WaitD(m, deadline)) {
- return pred();
- }
- }
- return true;
- }
- /*
- * returns false if failed by timeout
- */
- inline bool WaitT(TMutex& m, TDuration timeout) noexcept {
- return WaitD(m, timeout.ToDeadLine());
- }
- template <typename P>
- inline bool WaitT(TMutex& m, TDuration timeout, P pred) noexcept {
- return WaitD(m, timeout.ToDeadLine(), std::move(pred));
- }
- /*
- * infinite wait
- */
- inline void WaitI(TMutex& m) noexcept {
- WaitD(m, TInstant::Max());
- }
- template <typename P>
- inline void WaitI(TMutex& m, P pred) noexcept {
- WaitD(m, TInstant::Max(), std::move(pred));
- }
- // deprecated
- inline void Wait(TMutex& m) noexcept {
- WaitI(m);
- }
- template <typename P>
- inline void Wait(TMutex& m, P pred) noexcept {
- WaitI(m, std::move(pred));
- }
- private:
- class TImpl;
- THolder<TImpl> Impl_;
- };
|