* cygtls.cc (_cygtls::remove): Call remove_wq even when we can't necessarily

get the cygtls table lock.
* cygtls.h (_cygtls::remove_wq): Add wait argument.
* sigproc.cc (_cygtls::remove_wq): Honor wait argument when acquiring lock.
(proc_terminate): Don't NULL sync_proc_subproc since other threads may still
try to access it.
This commit is contained in:
Christopher Faylor 2004-03-15 02:47:35 +00:00
parent 6644f5097c
commit 168d7785fc
4 changed files with 38 additions and 24 deletions

View File

@ -1,3 +1,13 @@
2004-03-14 Christopher Faylor <cgf@redhat.com>
* cygtls.cc (_cygtls::remove): Call remove_wq even when we can't
necessarily get the cygtls table lock.
* cygtls.h (_cygtls::remove_wq): Add wait argument.
* sigproc.cc (_cygtls::remove_wq): Honor wait argument when acquiring
lock.
(proc_terminate): Don't NULL sync_proc_subproc since other threads may
still try to access it.
2004-03-12 Corinna Vinschen <corinna@vinschen.de>
* errno.cc (errmap): Map ERROR_BEGINNING_OF_MEDIA and

View File

@ -150,19 +150,22 @@ void
_cygtls::remove (DWORD wait)
{
debug_printf ("wait %p\n", wait);
sentry here (wait);
if (here.acquired ())
do
{
for (size_t i = 0; i < nthreads; i++)
if (this == cygheap->threadlist[i])
{
if (i < --nthreads)
cygheap->threadlist[i] = cygheap->threadlist[nthreads];
debug_printf ("removed %p element %d", this, i);
remove_wq ();
break;
}
}
sentry here (wait);
if (here.acquired ())
{
for (size_t i = 0; i < nthreads; i++)
if (this == cygheap->threadlist[i])
{
if (i < --nthreads)
cygheap->threadlist[i] = cygheap->threadlist[nthreads];
debug_printf ("removed %p element %d", this, i);
break;
}
}
} while (0);
remove_wq (wait);
}
void

View File

@ -154,7 +154,7 @@ struct _cygtls
void set_threadkill () {threadkill = true;}
void reset_threadkill () {threadkill = false;}
int call_signal_handler () __attribute__ ((regparm (1)));
void remove_wq () __attribute__ ((regparm (1)));
void remove_wq (DWORD) __attribute__ ((regparm (1)));
void fixup_after_fork () __attribute__ ((regparm (1)));
void lock () __attribute__ ((regparm (1)));
void unlock () __attribute__ ((regparm (1)));

View File

@ -471,17 +471,19 @@ out1:
// FIXME: This is inelegant
void
_cygtls::remove_wq ()
_cygtls::remove_wq (DWORD wait)
{
sync_proc_subproc->acquire ();
for (waitq *w = &waitq_head; w->next != NULL; w = w->next)
if (w->next == &wq)
{
ForceCloseHandle1 (wq.thread_ev, wq_ev);
w->next = wq.next;
break;
}
sync_proc_subproc->release ();
if (sync_proc_subproc && sync_proc_subproc->acquire (wait))
{
for (waitq *w = &waitq_head; w->next != NULL; w = w->next)
if (w->next == &wq)
{
ForceCloseHandle1 (wq.thread_ev, wq_ev);
w->next = wq.next;
break;
}
sync_proc_subproc->release ();
}
}
/* Terminate the wait_subproc thread.
@ -536,7 +538,6 @@ proc_terminate (void)
pchildren[i].release ();
}
nchildren = nzombies = 0;
sync_proc_subproc = NULL;
}
sigproc_printf ("leaving");
}