You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Chris Storah <ch...@orionsmg.com> on 2006/01/01 02:00:25 UTC
Re: [PATCH] APR thread handle leak on Windows
The endthreadex() would also need CloseHandle(thd->td).
i.e.
...
if (thd->td) {
CloseHandle(thd->td);
_endthreadex(0);
}
...
Chris
> William A. Rowe, Jr. wrote:
> > Chris Storah wrote:
> >
> >> Enclosed is a patch to fix a leak in APR threads, due to
> _endthreadex
> >> not automatically closing the handle (unlike _endthread).
> >
> >
> > Chris,
> >
> > this is facinating, thank you for bringing it to our attention!!!
> >
>
> There are couple of more things:
> 1. dummy_worker must be __stdcall.
> 2. dummy_worker must call _endthreadex:
> now its:
> apr_thread_t *thd = (apr_thread_t *)opaque;
> TlsSetValue(tls_apr_thread, thd->td);
> return thd->func(thd, thd->data);
> it should be:
> void *rv;
> apr_thread_t *thd = (apr_thread_t *)opaque;
> TlsSetValue(tls_apr_thread, thd->td);
> rv = thd->func(thd, thd->data);
> TlsSetValue(tls_apr_thread, NULL);
> if (thd->td)
> _endthreadex(0);
> return rv;
> This will ensure that either on thread_join and thread_exit
> both handle and per thread CRT data gets released.
> Now we have a situation where _beginthreadex->CloseHandle
> can be executed, while we should for each _beginthreadex
> have corresponding _endthreadex. This can happen in
> situations where we call thread_join on threads that
> does not call the thread_exit before returning.
>
> Regards,
> Mladen.