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
|