diff options
author | Christopher Faylor <me@cgf.cx> | 2008-03-01 17:53:44 +0300 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2008-03-01 17:53:44 +0300 |
commit | 2d80b55b4e58b1c7b1f829809df7864ace82d9dd (patch) | |
tree | a4368f58c114c40c7b46fbbecc2e290afbba538d /winsup/cygwin/cygtls.cc | |
parent | f78f85ce6dffe8d2fc5c73c7e7546d361f3a534b (diff) |
* cygtls.h (_cygtls::handle_threadlist_exception): Eliminate.
(_cygtls::init_threadlist_exceptions): Ditto.
* cygtls.cc (_cygtls::handle_threadlist_exception): Eliminate.
(_cygtls::init_threadlist_exceptions): Ditto.
(_cygtls::find_tls): Use myfault handling to deal with errors caused by
nonexistent threads.
Diffstat (limited to 'winsup/cygwin/cygtls.cc')
-rw-r--r-- | winsup/cygwin/cygtls.cc | 50 |
1 files changed, 10 insertions, 40 deletions
diff --git a/winsup/cygwin/cygtls.cc b/winsup/cygwin/cygtls.cc index 34ba14934..bb6e5a643 100644 --- a/winsup/cygwin/cygtls.cc +++ b/winsup/cygwin/cygtls.cc @@ -195,23 +195,28 @@ _cygtls::push (__stack_t addr) *stackptr++ = (__stack_t) addr; } -#define BAD_IX ((size_t) -1) -static size_t NO_COPY threadlist_ix = BAD_IX; _cygtls * _cygtls::find_tls (int sig) { + static int NO_COPY threadlist_ix; + debug_printf ("sig %d\n", sig); sentry here (INFINITE); - __asm__ volatile (".equ _threadlist_exception_return,."); + _cygtls *res = NULL; - for (threadlist_ix = 0; threadlist_ix < nthreads; threadlist_ix++) + threadlist_ix = -1; + + myfault efault; + if (efault.faulted ()) + cygheap->threadlist[threadlist_ix]->remove (INFINITE); + + while (++threadlist_ix < (int) nthreads) if (sigismember (&(cygheap->threadlist[threadlist_ix]->sigwait_mask), sig)) { res = cygheap->threadlist[threadlist_ix]; break; } - threadlist_ix = BAD_IX; return res; } @@ -221,35 +226,6 @@ _cygtls::set_siginfo (sigpacket *pack) infodata = pack->si; } -extern "C" DWORD __stdcall RtlUnwind (void *, void *, void *, DWORD) __attribute__ ((noreturn)); -int -_cygtls::handle_threadlist_exception (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *c, void *) -{ - if (e->ExceptionCode != STATUS_ACCESS_VIOLATION) - { - system_printf ("unhandled exception %p at %p", e->ExceptionCode, c->Eip); - return 1; - } - - sentry here; - if (threadlist_ix == BAD_IX) - { - api_fatal ("called with threadlist_ix %d", BAD_IX); - return 1; - } - - if (!here.acquired ()) - { - system_printf ("couldn't aquire muto"); - return 1; - } - - extern void *threadlist_exception_return; - cygheap->threadlist[threadlist_ix]->remove (INFINITE); - threadlist_ix = 0; - return 0; -} - /* Set up the exception handler for the current thread. The x86 uses segment register fs, offset 0 to point to the current exception handler. */ @@ -273,9 +249,3 @@ _cygtls::init_exception_handler (exception_handler *eh) el.prev = _except_list; _except_list = ⪙ } - -void -_cygtls::init_threadlist_exceptions () -{ - init_exception_handler (handle_threadlist_exception); -} |