69 template<
typename Pred>
70 void wait(
mutexBase& mutex, Pred predicate)
noexcept(
noexcept(predicate()));
81 template<
typename Pred>
115 pthread_cond_t cond_;
166template<
typename Pred>
168 while (!predicate()){
173template<
typename Pred>
176 while (!predicate()) {
177 auto elapsed = time::point::now() - start;
180 if (!this->waitFor(mutex, d - elapsed))
190 if (
const int code = pthread_cond_init(&this->cond_,
nullptr); code != 0)
198 const auto p_mutex =
dynamic_cast<pMutex*
>(&mutex);
200 throw valueError(
"Invalid mutex type for condition variable: must be pMutex");
204 if (
const int code = pthread_cond_wait(&this->cond_, handle); code != 0) {
211 const auto p_mutex =
dynamic_cast<pMutex*
>(&mutex);
213 throw valueError(
"Invalid mutex type for condition variable: must be pMutex");
217 const auto ts = deadline.toTimespec();
219 const int code = pthread_cond_timedwait(&this->cond_, handle, &ts);
220 if (code == 0)
return true;
221 if (code == ETIMEDOUT)
return false;
227 if (
const int code = pthread_cond_signal(&this->cond_); code != 0) {
234 if (
const int code = pthread_cond_broadcast(&this->cond_); code != 0) {
241 if (
const int code = pthread_cond_destroy(&this->cond_); code != 0) {
242 std::cerr <<
"Warning: Failed to destroy condition variable (pthread_cond_destroy returned "
243 << code <<
")" << std::endl;
Abstract base class for condition variable implementations.
Definition condition.h:38
virtual void notifyAll()=0
Notifies all waiting threads.
conditionBase & operator=(const conditionBase &)=delete
Deleted copy assignment operator.
virtual void wait(mutexBase &mutex)=0
Waits for notification while holding the mutex.
conditionBase(const conditionBase &)=delete
Deleted copy constructor.
virtual bool waitFor(mutexBase &mutex, time::duration d)=0
Waits for notification with timeout.
virtual ~conditionBase()=default
Virtual destructor.
conditionBase()=default
Default constructor.
virtual void notify()=0
Notifies one waiting thread.
Abstract base class for mutex implementations.
Definition mutex.h:30
POSIX condition variable implementation.
Definition condition.h:114
void wait(mutexBase &mutex) override
Waits for notification while holding the mutex.
Definition condition.h:196
bool waitFor(mutexBase &mutex, time::duration d) override
Waits for notification with timeout.
Definition condition.h:209
void notifyAll() override
Notifies all waiting threads.
Definition condition.h:232
void notify() override
Notifies one waiting thread.
Definition condition.h:225
~pCondition() override
Destroys the condition variable.
Definition condition.h:239
pCondition()
Constructs and initializes the condition variable.
Definition condition.h:188
POSIX thread mutex implementation.
Definition mutex.h:153
pthread_mutex_t native_handle
Native handle type (pthread_mutex_t)
Definition mutex.h:157
static std::string formatString(const TYPE &t)
Universal value-to-string conversion.
Definition printable.h:263
Exception for generic system failure.
Definition error.h:306
Represents a time duration with nanosecond precision.
Definition zeit.h:134
Represents a point in time with nanosecond precision.
Definition zeit.h:374
static point now()
Gets current time point.
Definition zeit.h:1352
Exception for invalid parameter values.
Definition error.h:150
Cross-platform mutex and lock management utilities.
Main namespace for the project Original.
Definition algorithms.h:21
Time and date handling utilities.