diff options
| -rw-r--r-- | zencore/include/zencore/thread.h | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/zencore/include/zencore/thread.h b/zencore/include/zencore/thread.h index 48afad33f..46b251e07 100644 --- a/zencore/include/zencore/thread.h +++ b/zencore/include/zencore/thread.h @@ -25,20 +25,38 @@ public: struct SharedLockScope { - SharedLockScope(RwLock& lock) : m_Lock(lock) { m_Lock.AcquireShared(); } - ~SharedLockScope() { m_Lock.ReleaseShared(); } + SharedLockScope(RwLock& Lock) : m_Lock(&Lock) { Lock.AcquireShared(); } + ~SharedLockScope() { ReleaseNow(); } + + void ReleaseNow() + { + if (m_Lock) + { + m_Lock->ReleaseShared(); + m_Lock = nullptr; + } + } private: - RwLock& m_Lock; + RwLock* m_Lock; }; struct ExclusiveLockScope { - ExclusiveLockScope(RwLock& lock) : m_Lock(lock) { m_Lock.AcquireExclusive(); } - ~ExclusiveLockScope() { m_Lock.ReleaseExclusive(); } + ExclusiveLockScope(RwLock& Lock) : m_Lock(&Lock) { Lock.AcquireExclusive(); } + ~ExclusiveLockScope() { ReleaseNow(); } + + void ReleaseNow() + { + if (m_Lock) + { + m_Lock->ReleaseExclusive(); + m_Lock = nullptr; + } + } private: - RwLock& m_Lock; + RwLock* m_Lock; }; private: |