[SDL] race condition in SDL_ThreadedTimerCheck?
Clifford T. Matthews
ctm at ardi.com
Tue Jan 4 11:13:20 PST 2005
>>>>> "Sam" == Sam Lantinga <slouken at devolution.com> writes:
Sam> Hi Cliff!
>> I have an application that uses SDL_SetTimer that dies on
>> Hyperthreaded P4s running Windows XP. Looking at
>> SDL_ThreadedTimerCheck, I see this code:
>> SDL_mutexV(SDL_timer_mutex); ms = t->cb(t->interval, t->param);
>> But without SDL_timer_mutex being held, can't the memory
>> pointed to by t be freed? Shouldn't a copy of *t be made on
>> the stack before the lock is released and then that copy's cb,
>> interval and param field be used?
Sam> Yep, thanks for catching this.
You're welcome. The problem actually showed up about a year ago and
I've only now had time to track it down. I thought it was an Executor
bug until I peered into the timer code. There still may be Executor
timer bugs, but there are some problems with the SDL timer code that
need to be cleaned up.
Sam> Please try the attached file, to see if it's fixed.
That doesn't fix it.
I have a fix I've been testing that definitely improves things. I
think I saw one mystery crash with my new fix in though, so I'm
reluctant to send anything out until I investigate further.
Other problems in the timer code, I beleive, include not setting
list_changed to SDL_TRUE if the callback returns 0, and the setting of
list_changed to SDL_FALSE unconditionally in the loop.
--Cliff Matthews <ctm at ardi.com>
+1 505 363 5754 Cell
More information about the SDL