diff options
| author | Stefan Boberg <[email protected]> | 2021-05-24 21:03:13 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-05-24 21:03:13 +0200 |
| commit | a25d2425e3dd9ef2d5299e7e5045819b6bdbc2a7 (patch) | |
| tree | c969934f81aecb8cc4dd97778fe82c50930ddff2 /zencore/include | |
| parent | Added std::hash<IoHash> implementation for convenience (diff) | |
| download | zen-a25d2425e3dd9ef2d5299e7e5045819b6bdbc2a7.tar.xz zen-a25d2425e3dd9ef2d5299e7e5045819b6bdbc2a7.zip | |
Added support for early release of scoped RWLock helpers
Diffstat (limited to 'zencore/include')
| -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: |