// Copyright (c) Wojciech Figat. All rights reserved. #pragma once #include "Engine/Platform/CriticalSection.h" #include "Engine/Platform/ReadWriteLock.h" /// /// Checks if current execution in on the main thread. /// FLAXENGINE_API bool IsInMainThread(); /// /// Scope lock for critical section (mutex). Ensures no other thread can enter scope. /// class ScopeLock { private: const CriticalSection* _section; ScopeLock() = delete; NON_COPYABLE(ScopeLock); public: FORCE_INLINE ScopeLock(const CriticalSection& section) : _section(§ion) { _section->Lock(); } FORCE_INLINE ~ScopeLock() { _section->Unlock(); } }; /// /// Scope lock for read/write lock that allows for shared reading by multiple threads (no writers allowed). /// class ScopeReadLock { private: const ReadWriteLock* _lock; ScopeReadLock() = delete; NON_COPYABLE(ScopeReadLock); public: FORCE_INLINE ScopeReadLock(const ReadWriteLock& lock) : _lock(&lock) { _lock->ReadLock(); } FORCE_INLINE ~ScopeReadLock() { _lock->ReadUnlock(); } }; /// /// Scope lock for read/write lock that allows for exclusive writing by a single thread (no readers allowed). /// class ScopeWriteLock { private: const ReadWriteLock* _lock; ScopeWriteLock() = delete; NON_COPYABLE(ScopeWriteLock); public: FORCE_INLINE ScopeWriteLock(const ReadWriteLock& lock) : _lock(&lock) { _lock->WriteLock(); } FORCE_INLINE ~ScopeWriteLock() { _lock->WriteUnlock(); } };