]> git.wh0rd.org - fontconfig.git/commitdiff
Fix a few memory tracking mistakes.
authorKeith Packard <keithp@keithp.com>
Sun, 4 May 2008 08:26:40 +0000 (01:26 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 4 May 2008 08:26:40 +0000 (01:26 -0700)
The built-in memory tracking code in fontconfig relies on a lot of manual
function call tracking. A pain, but it helps debug leaks.

src/fcatomic.c
src/fccharset.c
src/fcinit.c
src/fcpat.c
src/fcstr.c

index 9038a5f2eea5351f694e08cc8b3c0fe122332160..8c04510823684dac15ca3e9dfd30dd5414454c58 100644 (file)
@@ -205,7 +205,7 @@ void
 FcAtomicDestroy (FcAtomic *atomic)
 {
     FcMemFree (FC_MEM_ATOMIC, sizeof (FcAtomic) +
-              strlen ((char *) atomic->file) * 4 + 1 +
+              strlen ((char *) atomic->file) * 4 + 4 +
               sizeof (NEW_NAME) + sizeof (LCK_NAME) + 
               sizeof (TMP_NAME));
 
index 5da131283d07f17991fbe361c239511282dd9a61..f4042db07dbc2c541213b5578f160456d3023d81 100644 (file)
@@ -1239,6 +1239,9 @@ FcCharSetFreezerDestroy (FcCharSetFreezer *freezer)
        for (ent = freezer->set_hash_table[i]; ent; ent = next)
        {
            next = ent->next;
+           FcMemFree (FC_MEM_CHARSET, (sizeof (FcCharSetEnt) +
+                                       ent->set.num * sizeof (FcCharLeaf *) +
+                                       ent->set.num * sizeof (FcChar16)));
            free (ent);
        }
     }
@@ -1254,7 +1257,10 @@ FcCharSetFreezerDestroy (FcCharSetFreezer *freezer)
     }
 
     for (i = 0; i < freezer->leaf_block_count; i++)
+    {
        free (freezer->leaf_blocks[i]);
+       FcMemFree (FC_MEM_CHARLEAF, FC_CHAR_LEAF_BLOCK * sizeof (FcCharLeafEnt));
+    }
 
     free (freezer->leaf_blocks);
     free (freezer);
index 96aaa4497a1295367706080ad6a52f9cf8734d31..0998abc02e55091e3513e6353932c9b9934a6809 100644 (file)
@@ -141,6 +141,8 @@ FcFini (void)
 
     FcPatternFini ();
     FcCacheFini ();
+    if (FcDebug() & FC_DBG_MEMORY)
+       FcMemReport ();
 }
 
 /*
index 9a62ec9d9d4edcf4ee57bc46f6c964901b1af647..35127f2a38558751fd09178bd7f49fcdac695740 100644 (file)
@@ -1054,7 +1054,7 @@ FcStrStaticNameFini (void)
            next = b->next;
            name = (char *) (b + 1);
            size = sizeof (struct objectBucket) + strlen (name) + 1;
-           FcMemFree (FC_MEM_STATICSTR, size);
+           FcMemFree (FC_MEM_STATICSTR, size + sizeof (int));
            free (b);
        }
        FcObjectBuckets[i] = 0;
index 1e7b4662fc8c49add3691dca0185586855505ad9..f56f823bc2f99a0c5600e60ad4cd9b62c3808767 100644 (file)
@@ -1025,11 +1025,14 @@ _FcStrSetAppend (FcStrSet *set, FcChar8 *s)
        if (!strs)
            return FcFalse;
        FcMemAlloc (FC_MEM_STRSET, (set->size + 2) * sizeof (FcChar8 *));
-       set->size = set->size + 1;
        if (set->num)
            memcpy (strs, set->strs, set->num * sizeof (FcChar8 *));
        if (set->strs)
+       {
+           FcMemFree (FC_MEM_STRSET, (set->size + 1) * sizeof (FcChar8 *));
            free (set->strs);
+       }
+       set->size = set->size + 1;
        set->strs = strs;
     }
     set->strs[set->num++] = s;
@@ -1118,9 +1121,11 @@ FcStrSetDestroy (FcStrSet *set)
     
        for (i = 0; i < set->num; i++)
            FcStrFree (set->strs[i]);
-       FcMemFree (FC_MEM_STRSET, (set->size) * sizeof (FcChar8 *));
        if (set->strs)
+       {
+           FcMemFree (FC_MEM_STRSET, (set->size + 1) * sizeof (FcChar8 *));
            free (set->strs);
+       }
        FcMemFree (FC_MEM_STRSET, sizeof (FcStrSet));
        free (set);
     }