* cygheap.cc (init_cygheap::find_tls): Allow to keep loop going after

access to threadlist[ix] faulted.  In case of an exception, remove
	threadlist[ix] from threadlist only.  Add comment.
This commit is contained in:
Corinna Vinschen 2014-11-27 16:20:14 +00:00
parent 84b2a020da
commit db880b5642
2 changed files with 33 additions and 19 deletions

View File

@ -1,3 +1,9 @@
2014-11-27 Corinna Vinschen <corinna@vinschen.de>
* cygheap.cc (init_cygheap::find_tls): Allow to keep loop going after
access to threadlist[ix] faulted. In case of an exception, remove
threadlist[ix] from threadlist only. Add comment.
2014-11-26 Corinna Vinschen <corinna@vinschen.de> 2014-11-26 Corinna Vinschen <corinna@vinschen.de>
* Makefile.in (install): Add install-ldif target. * Makefile.in (install): Add install-ldif target.

View File

@ -667,11 +667,12 @@ init_cygheap::find_tls (int sig, bool& issig_wait)
_cygtls *t = NULL; _cygtls *t = NULL;
issig_wait = false; issig_wait = false;
__try
{
ix = -1; ix = -1;
/* Scan thread list looking for valid signal-delivery candidates */ /* Scan thread list looking for valid signal-delivery candidates */
while (++ix < (int) nthreads) while (++ix < (int) nthreads)
{
__try
{
if (!threadlist[ix]->tid) if (!threadlist[ix]->tid)
continue; continue;
else if (sigismember (&(threadlist[ix]->sigwait_mask), sig)) else if (sigismember (&(threadlist[ix]->sigwait_mask), sig))
@ -685,8 +686,15 @@ init_cygheap::find_tls (int sig, bool& issig_wait)
} }
__except (NO_ERROR) __except (NO_ERROR)
{ {
threadlist[ix]->remove (INFINITE); /* We're here because threadlist[ix] became NULL or invalid. In
theory this should be impossible due to correct synchronization.
But *if* it happens, just remove threadlist[ix] from threadlist.
TODO: This should be totally unnecessary. */
debug_printf ("cygtls synchronization is leaking...");
remove_tls (threadlist[ix], 0);
--ix;
} }
__endtry __endtry
}
return t; return t;
} }