33 lines
731 B
C++
33 lines
731 B
C++
#ifndef COUNTDOWNLATCH_H
|
|
#define COUNTDOWNLATCH_H
|
|
|
|
#include <QSemaphore>
|
|
#include <climits>
|
|
|
|
class DoricCountDownLatch {
|
|
Q_DISABLE_COPY(DoricCountDownLatch)
|
|
QSemaphore m_sem{INT_MAX};
|
|
|
|
public:
|
|
DoricCountDownLatch() {}
|
|
~DoricCountDownLatch() {
|
|
m_sem.acquire(INT_MAX);
|
|
m_sem.release(INT_MAX);
|
|
}
|
|
class Locker {
|
|
DoricCountDownLatch *sem;
|
|
|
|
public:
|
|
Locker(const Locker &other) : sem{other.sem} { sem->m_sem.acquire(); }
|
|
Locker(Locker &&other) : sem{other.sem} { other.sem = nullptr; }
|
|
Locker(DoricCountDownLatch *sem) : sem{sem} { sem->m_sem.acquire(); }
|
|
~Locker() {
|
|
if (sem)
|
|
sem->m_sem.release();
|
|
}
|
|
};
|
|
Locker lock() { return Locker{this}; }
|
|
};
|
|
|
|
#endif // COUNTDOWNLATCH_H
|