]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgcc2.c (top_elt): Remove top_elt, it isn't thread safe.
authorMike Stump <mrs@wrs.com>
Mon, 23 Nov 1998 20:37:20 +0000 (15:37 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 23 Nov 1998 20:37:20 +0000 (15:37 -0500)
* 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.
(new_eh_context): Likewise.
(__sjthrow): Likewise.

From-SVN: r23817

gcc/ChangeLog
gcc/libgcc2.c

index e53213f0935acffb58d6f313857f39bad04e411b..bd191ca7bb6db7c0ee15939fd72f7755bf7d0160 100644 (file)
@@ -1,3 +1,13 @@
+Mon Nov 23 20:28:02 1998  Mike Stump  <mrs@wrs.com>
+
+       * 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.
+       (new_eh_context): Likewise.
+       (__sjthrow): Likewise.
+
 Mon Nov 23 09:53:44 1998  Richard Henderson  <rth@cygnus.com>
 
        * local-alloc.c (local_alloc): Use malloc not alloca for
@@ -5,7 +15,7 @@ Mon Nov 23 09:53:44 1998  Richard Henderson  <rth@cygnus.com>
 
 Mon Nov 23 09:49:49 1998  Andrew MacLeod  <amacleod@cygnus.com>
 
-        *cplus-dem.c (demangle_prefix): Use the last "__"
+        * cplus-dem.c (demangle_prefix): Use the last "__"
         in the mangled name when looking for the signature. This allows
         template names to begin with "__".
 
index 7c26e6bc94673f06bc644e3d618fe2ff8a33ec4d..d1854edc8e4cac1f2d099e29a11b5849e6703352 100644 (file)
@@ -3059,10 +3059,6 @@ __empty ()
 
 #include "eh-common.h"
 
-/* This is a safeguard for dynamic handler chain. */
-
-static void *top_elt[2];
-
 /* Allocate and return a new EH context structure. */
 
 extern void __throw ();
@@ -3070,15 +3066,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
@@ -3275,7 +3282,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