fontconfig: Branch 'main' - 3 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 7 16:01:15 UTC 2025


 src/fcptrlist.c     |   18 +++++++++---------
 test/meson.build    |    4 +++-
 test/test-ptrlist.c |   33 +++++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+), 10 deletions(-)

New commits:
commit 4e6cdf71ea8a3e76159aab2cada4c77b5ae35b49
Merge: 005649e d72a348
Author: Akira TAGOH <akira at tagoh.org>
Date:   Wed May 7 16:01:12 2025 +0000

    Merge branch 'issues/466' into 'main'
    
    Improve performance of FcPtrListIterInitAtLast
    
    Closes #466
    
    See merge request fontconfig/fontconfig!402

commit d72a348fe61ca055147339c29461bd9d2e73d34d
Author: Akira TAGOH <akira at tagoh.org>
Date:   Wed May 7 20:06:19 2025 +0900

    Improve performance of FcPtrListIterInitAtLast
    
    It causes slow-parsing a big XML file
    
    Patch from Idriss Fekir
    
    Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/-/issues/466
    
    Changelog: performance

diff --git a/src/fcptrlist.c b/src/fcptrlist.c
index 9be893e..d794b61 100644
--- a/src/fcptrlist.c
+++ b/src/fcptrlist.c
@@ -31,6 +31,7 @@ typedef struct _FcPtrListEntry {
 struct _FcPtrList {
     FcDestroyFunc   destroy_func;
     FcPtrListEntry *list;
+    FcPtrListEntry *last;
 };
 typedef struct _FcPtrListIterPrivate {
     const FcPtrList *list;
@@ -46,6 +47,7 @@ FcPtrListCreate (FcDestroyFunc func)
     if (ret) {
 	ret->destroy_func = func;
 	ret->list = NULL;
+	ret->last = NULL;
     }
 
     return ret;
@@ -85,16 +87,10 @@ FcPtrListIterInitAtLast (FcPtrList     *list,
                          FcPtrListIter *iter)
 {
     FcPtrListIterPrivate *priv = (FcPtrListIterPrivate *)iter;
-    FcPtrListEntry      **e, **p;
-
-    e = &list->list;
-    p = e;
-    for (; *e; p = e, e = &(*e)->next)
-	;
 
     priv->list = list;
-    priv->entry = *e;
-    priv->prev = *p;
+    priv->entry = NULL;
+    priv->prev = list->last;
 }
 
 FcBool
@@ -154,6 +150,7 @@ FcPtrListIterAdd (FcPtrList     *list,
 	priv->entry->next = e;
     } else {
 	e->next = NULL;
+	list->last = e;
 	if (priv->prev) {
 	    priv->prev->next = e;
 	    priv->entry = priv->prev;
@@ -187,6 +184,8 @@ FcPtrListIterRemove (FcPtrList     *list,
 	priv->prev->next = priv->entry->next;
     priv->entry = priv->entry->next;
     free (e);
+    if (!priv->entry)
+	list->last = priv->prev;
 
     return FcTrue;
 }
commit 3878f8e502a3be6f239fce6df917d91897178544
Author: Akira TAGOH <akira at tagoh.org>
Date:   Wed May 7 19:58:14 2025 +0900

    Add a test case for FcPtrList

diff --git a/src/fcptrlist.c b/src/fcptrlist.c
index cac85d4..9be893e 100644
--- a/src/fcptrlist.c
+++ b/src/fcptrlist.c
@@ -60,7 +60,8 @@ FcPtrListDestroy (FcPtrList *list)
 	FcPtrListIterInit (list, &iter);
 	do {
 	    if (FcPtrListIterGetValue (list, &iter))
-		list->destroy_func (FcPtrListIterGetValue (list, &iter));
+		if (list->destroy_func)
+		    list->destroy_func (FcPtrListIterGetValue (list, &iter));
 	    FcPtrListIterRemove (list, &iter);
 	} while (FcPtrListIterIsValid (list, &iter));
 
diff --git a/test/meson.build b/test/meson.build
index 769d088..36cf4fe 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -21,6 +21,7 @@ tests = [
   ['test-bz1744377.c'],
   ['test-issue180.c'],
   ['test-family-matching.c'],
+  ['test-ptrlist.c', {'include_directories': include_directories('../src'), 'dependencies': libintl_dep}],
 ]
 tests_not_parallel = []
 
@@ -53,12 +54,13 @@ foreach test_data : tests + tests_not_parallel
   opts = test_data.length() > 1 ? test_data[1] : {}
   extra_c_args = opts.get('c_args', [])
   extra_deps = opts.get('dependencies', [])
+  extra_incdir = opts.get('include_directories', [])
 
   test_name = fname.split('.')[0].underscorify()
 
   exe = executable(test_name, fname,
     c_args: c_args + extra_c_args,
-    include_directories: incbase,
+    include_directories: [incbase] + extra_incdir,
     link_with: link_with_libs,
     dependencies: extra_deps,
   )
diff --git a/test/test-ptrlist.c b/test/test-ptrlist.c
new file mode 100644
index 0000000..f859923
--- /dev/null
+++ b/test/test-ptrlist.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2025 fontconfig Authors */
+/* SPDX-License-Identifier: HPND */
+
+/* Internal API test case */
+#include "fcint.h"
+#include <stdio.h>
+
+int
+main (void)
+{
+    FcPtrList *p;
+    FcPtrListIter iter;
+    int i, n;
+
+    p = FcPtrListCreate (NULL);
+    FcPtrListIterInitAtLast (p, &iter);
+    FcPtrListIterAdd (p, &iter, (intptr_t *)0);
+    FcPtrListIterAdd(p, &iter, (intptr_t *)1);
+    FcPtrListIterAdd(p, &iter, (intptr_t *)2);
+    FcPtrListIterAdd (p, &iter, (intptr_t *)3);
+
+    FcPtrListIterInit (p, &iter);
+    for (i = 0; FcPtrListIterIsValid (p, &iter); FcPtrListIterNext (p, &iter), i++) {
+	n = (intptr_t)(void *)FcPtrListIterGetValue (p, &iter);
+	if (i != n) {
+	    printf("mispatch the order: %d(%d)\n", i, n);
+	    return 1;
+	}
+    }
+    FcPtrListDestroy (p);
+
+    return 0;
+}


More information about the Fontconfig mailing list