[Fontconfig] fontconfig: Branch 'wip/threadsafe'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Sat Oct 6 15:12:45 PDT 2012
src/fcpat.c | 62 ++++++++----------------------------------------------------
1 file changed, 9 insertions(+), 53 deletions(-)
New commits:
commit 6a64ca1e9f718d761136f672404e7737a651a306
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sat Oct 6 18:12:19 2012 -0400
Remove shared-str pool
We used to have a shared-str pool. Removed to make thread-safety
work easier. My measurements show that the extra overhead is not
significant by any means.
diff --git a/src/fcpat.c b/src/fcpat.c
index ebd6e57..92b4cc4 100644
--- a/src/fcpat.c
+++ b/src/fcpat.c
@@ -1023,68 +1023,24 @@ bail0:
return NULL;
}
-#define OBJECT_HASH_SIZE 251
-static struct objectBucket {
- struct objectBucket *next;
- FcChar32 hash;
- int ref_count;
-} *FcObjectBuckets[OBJECT_HASH_SIZE];
+
+/* We used to have a shared-str pool. Removed to make thread-safety
+ * work easier. My measurements show that the extra overhead is not
+ * significant by any means. */
FcBool
FcSharedStrFree (const FcChar8 *name)
{
- FcChar32 hash = FcStringHash (name);
- struct objectBucket **p;
- struct objectBucket *b;
- int size;
-
- for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
- if (b->hash == hash && ((char *)name == (char *) (b + 1)))
- {
- b->ref_count--;
- if (!b->ref_count)
- {
- *p = b->next;
- size = sizeof (struct objectBucket) + strlen ((char *)name) + 1;
- size = (size + 3) & ~3;
- FcMemFree (FC_MEM_SHAREDSTR, size);
- free (b);
- }
- return FcTrue;
- }
- return FcFalse;
+ free (name);
+ FcMemFree (FC_MEM_SHAREDSTR, 8);
+ return FcTrue;
}
const FcChar8 *
FcSharedStr (const FcChar8 *name)
{
- FcChar32 hash = FcStringHash (name);
- struct objectBucket **p;
- struct objectBucket *b;
- int size;
-
- for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
- if (b->hash == hash && !strcmp ((char *)name, (char *) (b + 1)))
- {
- b->ref_count++;
- return (FcChar8 *) (b + 1);
- }
- size = sizeof (struct objectBucket) + strlen ((char *)name) + 1;
- /*
- * workaround valgrind warning because glibc takes advantage of how it knows memory is
- * allocated to implement strlen by reading in groups of 4
- */
- size = (size + 3) & ~3;
- b = malloc (size);
- FcMemAlloc (FC_MEM_SHAREDSTR, size);
- if (!b)
- return NULL;
- b->next = 0;
- b->hash = hash;
- b->ref_count = 1;
- strcpy ((char *) (b + 1), (char *)name);
- *p = b;
- return (FcChar8 *) (b + 1);
+ FcMemAlloc (FC_MEM_SHAREDSTR, 8);
+ return strdup (name);
}
FcBool
More information about the Fontconfig
mailing list