From 48b88af88a67b641eb5253af8b2c4c06bc38ba31 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 12 Dec 2022 20:16:03 +0100 Subject: [PATCH] Fix deadlock in GPUDevice caused by f2c594569d37aac0bf729626ebffa0bed731dfd8 --- Source/Engine/Graphics/GPUDevice.cpp | 22 ++++++++++++---------- Source/Engine/Graphics/GPUDevice.h | 1 + 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Source/Engine/Graphics/GPUDevice.cpp b/Source/Engine/Graphics/GPUDevice.cpp index d82900c1b..432acc548 100644 --- a/Source/Engine/Graphics/GPUDevice.cpp +++ b/Source/Engine/Graphics/GPUDevice.cpp @@ -374,24 +374,24 @@ bool GPUDevice::CanDraw() void GPUDevice::AddResource(GPUResource* resource) { - Locker.Lock(); + _resourcesLock.Lock(); ASSERT(resource && !_resources.Contains(resource)); _resources.Add(resource); - Locker.Unlock(); + _resourcesLock.Unlock(); } void GPUDevice::RemoveResource(GPUResource* resource) { - Locker.Lock(); + _resourcesLock.Lock(); ASSERT(resource && _resources.Contains(resource)); _resources.Remove(resource); - Locker.Unlock(); + _resourcesLock.Unlock(); } void GPUDevice::DumpResourcesToLog() const { StringBuilder output; - Locker.Lock(); + _resourcesLock.Lock(); output.AppendFormat(TEXT("GPU Resources dump. Count: {0}, total GPU memory used: {1}"), _resources.Count(), Utilities::BytesToText(GetMemoryUsage())); output.AppendLine(); @@ -428,7 +428,7 @@ void GPUDevice::DumpResourcesToLog() const output.AppendLine(); } - Locker.Unlock(); + _resourcesLock.Unlock(); LOG_STR(Info, output.ToStringView()); } @@ -449,11 +449,13 @@ void GPUDevice::preDispose() // Release GPU resources memory and unlink from device // Note: after that no GPU resources should be used/created, only deleted + _resourcesLock.Lock(); for (int32 i = _resources.Count() - 1; i >= 0 && i < _resources.Count(); i--) { _resources[i]->OnDeviceDispose(); } _resources.Clear(); + _resourcesLock.Unlock(); Locker.Unlock(); } @@ -592,18 +594,18 @@ void GPUDevice::Dispose() uint64 GPUDevice::GetMemoryUsage() const { uint64 result = 0; - Locker.Lock(); + _resourcesLock.Lock(); for (int32 i = 0; i < _resources.Count(); i++) result += _resources[i]->GetMemoryUsage(); - Locker.Unlock(); + _resourcesLock.Unlock(); return result; } Array GPUDevice::GetResources() const { - Locker.Lock(); + _resourcesLock.Lock(); Array result = _resources; - Locker.Unlock(); + _resourcesLock.Unlock(); return result; } diff --git a/Source/Engine/Graphics/GPUDevice.h b/Source/Engine/Graphics/GPUDevice.h index ca63d233a..0f28033af 100644 --- a/Source/Engine/Graphics/GPUDevice.h +++ b/Source/Engine/Graphics/GPUDevice.h @@ -94,6 +94,7 @@ protected: struct PrivateData; PrivateData* _res; Array _resources; + CriticalSection _resourcesLock; protected: ///