gthr-vxworks.h (__ehdtor): Fix memory leak.
authorMike Stump <mrs@wrs.com>
Fri, 4 Dec 1998 00:28:34 +0000 (00:28 +0000)
committerJeff Law <law@gcc.gnu.org>
Fri, 4 Dec 1998 00:28:34 +0000 (17:28 -0700)
        * gthr-vxworks.h (__ehdtor): Fix memory leak.  The delete hook
        runs in the context of the deleter, not the deletee, so we must
        use taskVarGet to find the correct memory to free.
        (__gthread_key_create): Initialize the task
        variable subsystem so that the task variable is still active when
        the delete hook is run.

From-SVN: r24079

gcc/ChangeLog
gcc/gthr-vxworks.h

index f7ad2112a6576eb8e4934eeb0b90c3680a2aac62..1231b9fbebb4d8cfd32774dd62582b636f06c946 100644 (file)
@@ -1,3 +1,12 @@
+Thu Dec  3 11:19:50 1998  Mike Stump  <mrs@wrs.com>
+
+       * gthr-vxworks.h (__ehdtor): Fix memory leak.  The delete hook
+       runs in the context of the deleter, not the deletee, so we must
+       use taskVarGet to find the correct memory to free.
+       (__gthread_key_create): Initialize the task
+       variable subsystem so that the task variable is still active when
+       the delete hook is run.
+
 1998-12-03  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * pdp11.h (TARGET_40_PLUS): Fix typo.
index 9876646781888aae1d62ce0c277e8284610947a0..6d51ded2cdadd031c512887d209f6a19a28eef7b 100644 (file)
@@ -60,11 +60,16 @@ extern __gthread_key_t eh_context_key;
    don't map well enough onto VxWorks.  */
 
 static void
-__ehdtor ()
+__ehdtor (void *pTcb)
 {
-  if (eh_context_key)
-    free ((void*)eh_context_key);
-  eh_context_key = 0;
+  int tid = (int) pTcb;
+  void *p = (void*)taskVarGet(tid, &eh_context_key);
+  if (p != (void*)-1)
+    {
+      if (p)
+       free (p);
+      taskVarSet(tid, &eh_context_key, 0);
+    }
 }
 
 /* This only works for the code in libgcc2.c.  */
@@ -74,6 +79,11 @@ __gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
 {
   *key = 0;
 
+  /* Do this first so that the task variables are visible during the
+     running of the delete hook.  */
+
+  taskVarInit();
+
   /* We don't have a way to track dtor here, so instead, we
      register a generic routine that can cleanup any task.  */