[FFmpeg-devel] Close Thread Handle in avcodec_thread_free

Shehzad Salim shehzadsalim
Fri Aug 7 17:31:59 CEST 2009


On Fri, Aug 7, 2009 at 3:41 PM, Reimar D?ffinger
<Reimar.Doeffinger at gmx.de>wrote:

> On Fri, Aug 07, 2009 at 12:59:07PM +0100, Shehzad Salim wrote:
> > But I have no idea to how to create a diff file or patch file on windows
> OS.
>
> Have you ever tried TortoiseSVN? Not only can you easily get the latest
> SVN of FFmpeg (which patches have to be against), you also can also
> easily create diffs of the changes you made.
> Also several IDEs (like eclipse) have at least optional plugins for SVN
> support that can do that kind of thing, too.
> Of course you can just use the commandline subversion client in exactly
> the same way you do on Linux or so.


Thanks a lot for telling about TortoiseSVN


>
> > Only one line is added in avcodec_thread_free function which is
> > CloseHandle(c[i].thread);
> >
> > void avcodec_thread_free(AVCodecContext *s){
> >     ThreadContext *c= s->thread_opaque;
> >     int i;
> >
> >     for(i=0; i<s->thread_count; i++){
> >
> >         c[i].func= NULL;
> >         ReleaseSemaphore(c[i].work_sem, 1, 0);
> >         WaitForSingleObject(c[i].thread, INFINITE);
> >         if(c[i].work_sem) CloseHandle(c[i].work_sem);
> >         if(c[i].done_sem) CloseHandle(c[i].done_sem);
> >         CloseHandle(c[i].thread);
> >     }
> >
> >     av_freep(&s->thread_opaque);
> > }
>
> Ok, I read it up. This is indeed correct since we use _beginthreadex.
> It is also incomplete though, the thread function must call
> _endthreadex, the return 0 is wrong and may leak memory, too (well,
> actually the documentation contradicts itself here, it says that
> _endthreadex will be called automatically anyway, but also says that
> calling it will help reclaiming resources, the exact quote:
> "You can call  _endthread or  _endthreadex explicitly to terminate a
> thread; however, _endthread or _endthreadex is called automatically when
> the thread returns from the routine passed as a parameter. Terminating a
> thread with a call to endthread or _endthreadex helps to ensure proper
> recovery of resources allocated for the thread.").


I guess call to WaitForSingleObject is making sure that thread is finished,
automatically either by _endthread or _endthreadex.
But it's handle never get's closed. Call to CloseHandle makes sure that it
is closed and now I don't have any more problems. Windows OS behaves very
badly once process handle count goes above 7 or 8 thousand.

Please find enclosed patch for w32thread.c


>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at mplayerhq.hu
> https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-devel
>



-- 
?????? ????? ????? ???? ??????

Best Regards
Shehzad Salim
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ThreadHandleLeak.patch
Type: application/octet-stream
Size: 463 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090807/e5702316/attachment.obj>



More information about the ffmpeg-devel mailing list