SDL: metal: Added missing lock in METAL_INTERNAL_PerformPendingDestroys. (cc150)

From cc150bc5666124b8b906c5283588a25ad0b611e2 Mon Sep 17 00:00:00 2001
From: Jakub Wasilewski <[EMAIL REDACTED]>
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 c8713885d0375..a057eab7bb96b 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