From e1b9d091c661b0e1d1e9f73c5c55ad53959c55c7 Mon Sep 17 00:00:00 2001 From: Patrick Lam Date: Fri, 15 Jul 2005 18:49:12 +0000 Subject: [PATCH] Forward port cworth's patch to branch. --- ChangeLog | 15 +++++++++++++ src/fcinit.c | 2 +- src/fcint.h | 2 +- src/fcpat.c | 60 +++++++++++++++++++++++++++++++++++----------------- src/fcxml.c | 1 + 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2984b0f..d3d9a81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2005-07-15 Carl Worth + + * src/fcint.h: + * src/fcinit.c: (FcFini): + * src/fcpat.c: (FcPatternFini): Rename FcPatternThawAll to + FcPatternFini. + + * src/fcpat.c: (FcObjectStaticName), (FcObjectStaticNameFini): + Pull the FcObjectStateName hash table out to file scope, and add + FcObjectStaticNameFini so that FcFini will cleanup this hash table + as well. + + * src/fcxml.c: (FcConfigParseAndLoad): Clear FILE* to NULL after + fclose. + 2005-06-16 Patrick Lam reviewed by: keithp diff --git a/src/fcinit.c b/src/fcinit.c index c3f497b..8a9bdbd 100644 --- a/src/fcinit.c +++ b/src/fcinit.c @@ -116,7 +116,7 @@ FcFini (void) if (_fcConfig) FcConfigDestroy (_fcConfig); - FcPatternThawAll (); + FcPatternFini (); FcCharSetThawAll (); } diff --git a/src/fcint.h b/src/fcint.h index fe2c095..f29b459 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -812,7 +812,7 @@ FcPattern * FcPatternFreeze (FcPattern *p); void -FcPatternThawAll (void); +FcPatternFini (void); FcBool FcPatternAppend (FcPattern *p, FcPattern *s); diff --git a/src/fcpat.c b/src/fcpat.c index 9f8fe14..0633c5a 100644 --- a/src/fcpat.c +++ b/src/fcpat.c @@ -651,13 +651,6 @@ FcPatternFreeze (FcPattern *p) return n; } -void -FcPatternThawAll (void) -{ - FcPatternBaseThawAll (); - FcValueListThawAll (); -} - static int FcPatternPosition (const FcPattern *p, const char *object) { @@ -1584,7 +1577,7 @@ struct objectBucket { struct objectBucket *next; FcChar32 hash; }; -static struct objectBucket **buckets = 0; +static struct objectBucket **FcObjectBuckets = 0; FcObjectPtr FcObjectStaticName (const char *name) @@ -1596,13 +1589,13 @@ FcObjectStaticName (const char *name) int size; FcObjectPtr new; - if (!buckets) + if (!FcObjectBuckets) { - buckets = malloc(sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); - memset (buckets, 0, sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); + FcObjectBuckets = malloc(sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); + memset (FcObjectBuckets, 0, sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); } - for (p = &buckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) { FcObjectPtr bp = *((FcObjectPtr *) (b + 1)); if (b->hash == hash && FcObjectPtrU(bp) && !strcmp (name, FcObjectPtrU(bp))) @@ -1649,7 +1642,7 @@ FcObjectStaticName (const char *name) objectptr_alloc = s; } - size = sizeof (struct objectBucket) + sizeof (FcObjectPtr); + size = sizeof (struct objectBucket) + strlen (name) + 1; b = malloc (size); if (!b) return 0; @@ -1709,11 +1702,11 @@ FcObjectRebuildStaticNameHashtable (void) int i; struct objectBucket *b, *bn; - if (buckets) + if (FcObjectBuckets) { for (i = 0; i < OBJECT_HASH_SIZE; i++) { - b = buckets[i]; + b = FcObjectBuckets[i]; while (b) { bn = b->next; @@ -1723,11 +1716,11 @@ FcObjectRebuildStaticNameHashtable (void) b = bn; } } - free (buckets); + free (FcObjectBuckets); } - buckets = malloc(sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); - memset (buckets, 0, sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); + FcObjectBuckets = malloc(sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); + memset (FcObjectBuckets, 0, sizeof (struct objectBucket *)*OBJECT_HASH_SIZE); for (i = 1; i < objectptr_count; i++) { @@ -1738,7 +1731,7 @@ FcObjectRebuildStaticNameHashtable (void) struct objectBucket **p; int size; - for (p = &buckets[hash % OBJECT_HASH_SIZE]; (b = *p); + for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) ; size = sizeof (struct objectBucket) + sizeof (FcObjectPtr); @@ -1948,3 +1941,32 @@ FcObjectPrepareSerialize (FcObjectPtr si) bail: return FcFalse; } + +static void +FcObjectStaticNameFini (void) +{ + int i, size; + struct objectBucket *b, *next; + char *name; + + for (i = 0; i < OBJECT_HASH_SIZE; i++) + { + for (b = FcObjectBuckets[i]; b; b = next) + { + next = b->next; + name = (char *) (b + 1); + size = sizeof (struct objectBucket) + strlen (name) + 1; + FcMemFree (FC_MEM_STATICSTR, size); + free (b); + } + FcObjectBuckets[i] = 0; + } +} + +void +FcPatternFini (void) +{ + FcPatternBaseThawAll (); + FcValueListThawAll (); + FcObjectStaticNameFini (); +} diff --git a/src/fcxml.c b/src/fcxml.c index 1256bed..d982755 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -2374,6 +2374,7 @@ bail2: XML_ParserFree (p); bail1: fclose (f); + f = NULL; bail0: if (error && complain) {