// 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();
}
};