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.
This commit is contained in:
Jakub Wasilewski
2026-04-29 10:26:35 +02:00
committed by Sam Lantinga
parent 1aa72247af
commit 1492911c7d

View File

@@ -3551,6 +3551,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) {
@@ -3580,6 +3582,8 @@ static void METAL_INTERNAL_PerformPendingDestroys(
renderer->textureContainersToDestroyCount -= 1;
}
}
SDL_UnlockMutex(renderer->disposeLock);
}
// Fences