wineqtdecoder: properly clean up splitter and loader threads on QTSplitter destruction
Aric Stewart
aric at codeweavers.com
Tue Nov 20 07:30:36 CST 2012
On 12/11/20 5:29, Alexandre Julliard wrote:
> Aric Stewart <aric at codeweavers.com> writes:
>
>> @@ -495,9 +518,14 @@ static DWORD WINAPI QTSplitter_loading_thread(LPVOID data)
>> to try to minimize that.
>> */
>>
>> - while(GetMovieLoadState(This->pQTMovie) < kMovieLoadStateComplete)
>> + while(This->pQTMovie && GetMovieLoadState(This->pQTMovie) < kMovieLoadStateComplete)
>> {
>> EnterCriticalSection(&This->csReceive);
>> + if (!This || !This->pQTMovie)
>> + {
>> + LeaveCriticalSection(&This->csReceive);
>> + return 0;
>> + }
>
> This doesn't make sense. The this pointer cannot become NULL, and the
> whole thing should most likely be inside the critical section.
>
I added the check on the "this" pointer just to cover my bases. I agree that there is no way I was seeing that it would become NULL. I can easily remove that.
I cannot add the whole while loop into the critical section because then the loading thread block playing, which defeats the point. Unless I can do.
EnterCriticalSection(&This->csReceive);
while(This->pQTMovie && GetMovieLoadState(This->pQTMovie) < kMovieLoadStateComplete)
{
.
.
.
LeaveCriticalSection(&This->csReceive);
Sleep(0);
EnterCriticalSection(&This->csReceive);
}
LeaveCriticalSection(&This->csReceive);
Does that work?
-aric
More information about the wine-devel
mailing list