Files
UnrealEngine/Engine/Source/Developer/TraceServices/Private/Common/ProviderLock.cpp
2025-05-18 13:04:45 +08:00

65 lines
1.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Common/ProviderLock.h"
namespace TraceServices
{
void FProviderLock::ReadAccessCheck(FProviderLock::FThreadLocalState& State) const
{
checkf(State.Lock == this && (State.ReadLockCount > 0 || State.WriteLockCount > 0),
TEXT("Trying to READ from provider outside of a READ scope"));
}
void FProviderLock::WriteAccessCheck(FProviderLock::FThreadLocalState& State) const
{
checkf(State.Lock == this && (State.WriteLockCount > 0),
TEXT("Trying to WRITE to provider outside of an EDIT/WRITE scope"));
}
void FProviderLock::BeginRead(FProviderLock::FThreadLocalState& State)
{
check(!State.Lock || State.Lock == this);
checkf(State.WriteLockCount == 0, TEXT("Trying to lock provider for READ while holding EDIT/WRITE access"));
if (State.ReadLockCount++ == 0)
{
State.Lock = this;
RWLock.ReadLock();
}
}
void FProviderLock::EndRead(FProviderLock::FThreadLocalState& State)
{
check(State.Lock == this);
check(State.ReadLockCount > 0);
if (--State.ReadLockCount == 0)
{
RWLock.ReadUnlock();
State.Lock = nullptr;
}
}
void FProviderLock::BeginWrite(FProviderLock::FThreadLocalState& State)
{
check(!State.Lock || State.Lock == this);
checkf(State.ReadLockCount == 0, TEXT("Trying to lock provider for EDIT/WRITE while holding READ access"));
if (State.WriteLockCount++ == 0)
{
State.Lock = this;
RWLock.WriteLock();
}
}
void FProviderLock::EndWrite(FProviderLock::FThreadLocalState& State)
{
check(State.Lock == this);
check(State.WriteLockCount > 0);
if (--State.WriteLockCount == 0)
{
RWLock.WriteUnlock();
State.Lock = nullptr;
}
}
} // namespace TraceServices