diff --git a/src/aelocker.h b/src/aelocker.h new file mode 100644 index 000000000..942f936c9 --- /dev/null +++ b/src/aelocker.h @@ -0,0 +1,61 @@ +#pragma once + +class AeLocker +{ + bool m_fArmed = false; + +public: + AeLocker() + { + } + + void arm(client *c) // if a client is passed, then the client is already locked + { + if (c != nullptr) + { + serverAssert(!m_fArmed); + serverAssert(c->lock.fOwnLock()); + + bool fClientLocked = true; + while (!aeTryAcquireLock()) + { + if (fClientLocked) c->lock.unlock(); + fClientLocked = false; + aeAcquireLock(); + if (!c->lock.try_lock()) + { + aeReleaseLock(); + } + else + { + break; + } + } + + m_fArmed = true; + } + else if (!m_fArmed) + { + m_fArmed = true; + aeAcquireLock(); + } + } + + void disarm() + { + serverAssert(m_fArmed); + m_fArmed = false; + aeReleaseLock(); + } + + bool isArmed() const + { + return m_fArmed; + } + + ~AeLocker() + { + if (m_fArmed) + aeReleaseLock(); + } +}; \ No newline at end of file