Skip to content

Commit 05d0c37

Browse files
committed
Add a lock to the engine refcount, to avoid GC race conditions
1 parent 030d8d5 commit 05d0c37

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

src/FAudio.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ uint32_t FAudioCOMConstructWithCustomAllocatorEXT(
128128
#ifndef FAUDIO_DISABLE_DEBUGCONFIGURATION
129129
FAudio_SetDebugConfiguration(*ppFAudio, &debugInit, NULL);
130130
#endif /* FAUDIO_DISABLE_DEBUGCONFIGURATION */
131+
(*ppFAudio)->refLock = FAudio_PlatformCreateMutex();
132+
LOG_MUTEX_CREATE((*ppFAudio), (*ppFAudio)->refLock)
131133
(*ppFAudio)->sourceLock = FAudio_PlatformCreateMutex();
132134
LOG_MUTEX_CREATE((*ppFAudio), (*ppFAudio)->sourceLock)
133135
(*ppFAudio)->submixLock = FAudio_PlatformCreateMutex();
@@ -145,10 +147,20 @@ uint32_t FAudioCOMConstructWithCustomAllocatorEXT(
145147

146148
uint32_t FAudio_AddRef(FAudio *audio)
147149
{
150+
uint32_t refcount;
151+
148152
LOG_API_ENTER(audio)
153+
154+
// FIXME: This should be SDL_AtomicIncRef -flibit
155+
FAudio_PlatformLockMutex(audio->refLock);
156+
LOG_MUTEX_LOCK(audio, audio->refLock)
149157
audio->refcount += 1;
158+
refcount = audio->refcount;
159+
FAudio_PlatformUnlockMutex(audio->refLock);
160+
LOG_MUTEX_UNLOCK(audio, audio->refLock)
161+
150162
LOG_API_EXIT(audio)
151-
return audio->refcount;
163+
return refcount;
152164
}
153165

154166
static void destroy_voice(FAudioVoice *voice);
@@ -159,8 +171,15 @@ uint32_t FAudio_Release(FAudio *audio)
159171
FAudioVoice *voice;
160172

161173
LOG_API_ENTER(audio)
174+
175+
// FIXME: This should be SDL_AtomicDecRef -flibit
176+
FAudio_PlatformLockMutex(audio->refLock);
177+
LOG_MUTEX_LOCK(audio, audio->refLock)
162178
audio->refcount -= 1;
163179
refcount = audio->refcount;
180+
FAudio_PlatformUnlockMutex(audio->refLock);
181+
LOG_MUTEX_UNLOCK(audio, audio->refLock)
182+
164183
if (audio->refcount == 0)
165184
{
166185
while (audio->sources)
@@ -180,6 +199,8 @@ uint32_t FAudio_Release(FAudio *audio)
180199
audio->pFree(audio->decodeCache);
181200
audio->pFree(audio->resampleCache);
182201
audio->pFree(audio->effectChainCache);
202+
LOG_MUTEX_DESTROY(audio, audio->refLock)
203+
FAudio_PlatformDestroyMutex(audio->refLock);
183204
LOG_MUTEX_DESTROY(audio, audio->sourceLock)
184205
FAudio_PlatformDestroyMutex(audio->sourceLock);
185206
LOG_MUTEX_DESTROY(audio, audio->submixLock)

src/FAudio_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ struct FAudio
425425
LinkedList *sources;
426426
LinkedList *submixes;
427427
LinkedList *callbacks;
428+
FAudioMutex refLock; // FIXME: refcount should be an SDL_AtomicInt instead -flibit
428429
FAudioMutex sourceLock;
429430
FAudioMutex submixLock;
430431
FAudioMutex callbackLock;

0 commit comments

Comments
 (0)