From d0b9a143e7552eef02291ab94d986867acb828ee Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Mon, 23 Nov 1998 20:37:32 +0000 Subject: [PATCH] libgcc2.c (top_elt): Remove top_elt, it isn't thread safe. * libgcc2.c (top_elt): Remove top_elt, it isn't thread safe. The strategy we now use is to pre allocate the top_elt along with the EH context so that each thread has its own top_elt. This is necessary as the dynmanic cleanup chain is used on the top element of the stack and each thread MUST have its own. (eh_context_static): Likewise. (new_eh_context): Likewise. (__sjthrow): Likewise. From-SVN: r23818 --- gcc/ChangeLog | 11 +++++++++++ gcc/libgcc2.c | 29 +++++++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88008971929..19c73a15af0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Mon Nov 23 20:28:02 1998 Mike Stump + + * libgcc2.c (top_elt): Remove top_elt, it isn't thread safe. + The strategy we now use is to pre allocate the top_elt along + with the EH context so that each thread has its own top_elt. + This is necessary as the dynmanic cleanup chain is used on the + top element of the stack and each thread MUST have its own. + (eh_context_static): Likewise. + (new_eh_context): Likewise. + (__sjthrow): Likewise. + Mon Nov 23 20:25:03 1998 Jason Merrill * i386/linux.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Wrap in do...while. diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index 029c624c6a5..0b5bfa304b0 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -3067,10 +3067,6 @@ __empty () #include #endif -/* This is a safeguard for dynamic handler chain. */ - -static void *top_elt[2]; - /* Allocate and return a new EH context structure. */ extern void __throw (); @@ -3078,15 +3074,26 @@ extern void __throw (); static void * new_eh_context () { - struct eh_context *eh = (struct eh_context *) malloc (sizeof *eh); - if (! eh) + struct eh_full_context { + struct eh_context c; + void *top_elt[2]; + } *ehfc = (struct eh_full_context *) malloc (sizeof *ehfc); + + if (! ehfc) __terminate (); - memset (eh, 0, sizeof *eh); + memset (ehfc, 0, sizeof *ehfc); - eh->dynamic_handler_chain = top_elt; + ehfc->c.dynamic_handler_chain = (void **) ehfc->top_elt; - return eh; + /* This should optimize out entirely. This should always be true, + but just in case it ever isn't, don't allow bogus code to be + generated. */ + + if ((void*)(&ehfc->c) != (void*)ehfc) + __terminate (); + + return &ehfc->c; } #if __GTHREADS @@ -3180,6 +3187,8 @@ eh_context_static () { static struct eh_context eh; static int initialized; + static void *top_elt[2]; + if (! initialized) { initialized = 1; @@ -3290,7 +3299,7 @@ __sjthrow () /* We must call terminate if we try and rethrow an exception, when there is no exception currently active and when there are no handlers left. */ - if (! eh->info || (*dhc) == top_elt) + if (! eh->info || (*dhc)[0] == 0) __terminate (); /* Find the jmpbuf associated with the top element of the dynamic -- 2.30.2