fix some shutdown memory leaks
authorSimon Marlow <marlowsd@gmail.com>
Fri, 20 Aug 2010 09:31:33 +0000 (09:31 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 20 Aug 2010 09:31:33 +0000 (09:31 +0000)
rts/sm/MBlock.c

index 5317275..b9d71f6 100644 (file)
@@ -88,10 +88,11 @@ setHeapAlloced(void *p, StgWord8 i)
     if(map == NULL)
     {
        mblock_map_count++;
     if(map == NULL)
     {
        mblock_map_count++;
-       mblock_maps = realloc(mblock_maps,
-                             sizeof(MBlockMap*) * mblock_map_count);
+       mblock_maps = stgReallocBytes(mblock_maps,
+                                      sizeof(MBlockMap*) * mblock_map_count,
+                                      "markHeapAlloced(1)");
        map = mblock_maps[mblock_map_count-1] = 
        map = mblock_maps[mblock_map_count-1] = 
-            stgMallocBytes(sizeof(MBlockMap),"markHeapAlloced");
+            stgMallocBytes(sizeof(MBlockMap),"markHeapAlloced(2)");
         memset(map,0,sizeof(MBlockMap));
        map->addrHigh32 = (StgWord32) (((StgWord)p) >> 32);
     }
         memset(map,0,sizeof(MBlockMap));
        map->addrHigh32 = (StgWord32) (((StgWord)p) >> 32);
     }
@@ -264,8 +265,16 @@ freeMBlocks(void *addr, nat n)
 void
 freeAllMBlocks(void)
 {
 void
 freeAllMBlocks(void)
 {
+    nat n;
+
     debugTrace(DEBUG_gc, "freeing all megablocks");
     debugTrace(DEBUG_gc, "freeing all megablocks");
+
     osFreeAllMBlocks();
     osFreeAllMBlocks();
+
+    for (n = 0; n < mblock_map_count; n++) {
+        stgFree(mblock_maps[n]);
+    }
+    stgFree(mblock_maps);
 }
 
 void
 }
 
 void