From 0bdf655e2f1ea41a82cf16eaac1aa627ef5504b1 Mon Sep 17 00:00:00 2001 From: Gabriel A Date: Sat, 6 Jul 2024 11:52:42 -0300 Subject: [PATCH] Ensure locks are released if exceptions are thrown --- src/Ryujinx.Graphics.Vulkan/FenceHolder.cs | 43 ++++++++++++------- .../MultiFenceHolder.cs | 23 ++++++---- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs b/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs index 9416590a90..0cdb93f201 100644 --- a/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs @@ -107,31 +107,44 @@ namespace Ryujinx.Graphics.Vulkan if (_concurrentWaitUnsupported) { AcquireLock(); + + try + { + FenceHelper.WaitAllIndefinitely(_api, _device, stackalloc Fence[] { _fence }); + } + finally + { + ReleaseLock(); + } } - - FenceHelper.WaitAllIndefinitely(_api, _device, stackalloc Fence[] { _fence }); - - if (_concurrentWaitUnsupported) + else { - ReleaseLock(); + FenceHelper.WaitAllIndefinitely(_api, _device, stackalloc Fence[] { _fence }); } } public bool IsSignaled() { - if (_concurrentWaitUnsupported && !TryAcquireLock()) - { - return false; - } - - bool result = FenceHelper.AllSignaled(_api, _device, stackalloc Fence[] { _fence }); - if (_concurrentWaitUnsupported) { - ReleaseLock(); - } + if (!TryAcquireLock()) + { + return false; + } - return result; + try + { + return FenceHelper.AllSignaled(_api, _device, stackalloc Fence[] { _fence }); + } + finally + { + ReleaseLock(); + } + } + else + { + return FenceHelper.AllSignaled(_api, _device, stackalloc Fence[] { _fence }); + } } public void Dispose() diff --git a/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs b/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs index 4a3aa04f9b..b425247128 100644 --- a/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs +++ b/src/Ryujinx.Graphics.Vulkan/MultiFenceHolder.cs @@ -196,18 +196,23 @@ namespace Ryujinx.Graphics.Vulkan bool signaled = true; - if (hasTimeout) + try { - signaled = FenceHelper.AllSignaled(api, device, fences[..fenceCount], timeout); + if (hasTimeout) + { + signaled = FenceHelper.AllSignaled(api, device, fences[..fenceCount], timeout); + } + else + { + FenceHelper.WaitAllIndefinitely(api, device, fences[..fenceCount]); + } } - else + finally { - FenceHelper.WaitAllIndefinitely(api, device, fences[..fenceCount]); - } - - for (int i = 0; i < fenceCount; i++) - { - fenceHolders[i].PutLock(); + for (int i = 0; i < fenceCount; i++) + { + fenceHolders[i].PutLock(); + } } return signaled;