From cc150bc5666124b8b906c5283588a25ad0b611e2 Mon Sep 17 00:00:00 2001 From: Jakub Wasilewski Date: Wed, 29 Apr 2026 10:26:35 +0200 Subject: [PATCH] metal: Added missing lock in METAL_INTERNAL_PerformPendingDestroys. Without this lock, a concurrent call to SDL_ReleaseGPUBuffer, SDL_ReleaseGPUTransferBuffer or SDL_ReleaseGPUTexture can cause one of the arrays to be reallocated while METAL_INTERNAL_PerformPendingDestroys is iterating over it, causing a bad day all around. (cherry picked from commit 1492911c7d752e5dc73b836ca25490919b344508) --- src/gpu/metal/SDL_gpu_metal.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m index c8713885d0..a057eab7bb 100644 --- a/src/gpu/metal/SDL_gpu_metal.m +++ b/src/gpu/metal/SDL_gpu_metal.m @@ -3545,6 +3545,8 @@ static void METAL_INTERNAL_PerformPendingDestroys( Sint32 i; Uint32 j; + SDL_LockMutex(renderer->disposeLock); + for (i = renderer->bufferContainersToDestroyCount - 1; i >= 0; i -= 1) { referenceCount = 0; for (j = 0; j < renderer->bufferContainersToDestroy[i]->bufferCount; j += 1) { @@ -3574,6 +3576,8 @@ static void METAL_INTERNAL_PerformPendingDestroys( renderer->textureContainersToDestroyCount -= 1; } } + + SDL_UnlockMutex(renderer->disposeLock); } // Fences