[pango/speed-up-format-filtering] Call FcInit in a thread
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/speed-up-format-filtering] Call FcInit in a thread
- Date: Wed, 19 Aug 2020 18:23:01 +0000 (UTC)
commit 1cebfb245fe95147a6c18e7b47b19bec386f1eb0
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Aug 19 14:09:00 2020 -0400
Call FcInit in a thread
With a big fontconfig configuration, FcInit takes some
time (60-100ms on my system). Doing this work off the
main thread can potentially avoid blocking other work.
Unfortunately, it currently doesn't, since we have to
wait for the result shortly after kicking off the thread.
This could be improved by moving things ot a constructor,
or some explicit init call.
pango/pangofc-fontmap.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
---
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index fd1256a3..e5cdaccf 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -109,6 +109,14 @@
* FcCharSetMerge().
*/
+/* We call FcInit in a thread and set fc_initialized
+ * when done, and are protected by a mutex. The thread
+ * signals the cond when FcInit is done.
+ */
+static GMutex fc_init_mutex;
+static GCond fc_init_cond;
+static gboolean fc_initialized;
+
typedef struct _PangoFcFontFaceData PangoFcFontFaceData;
typedef struct _PangoFcFace PangoFcFace;
@@ -1313,6 +1321,29 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (PangoFcFontMap, pango_fc_font_map, PANGO_TYPE_
G_ADD_PRIVATE (PangoFcFontMap)
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL,
pango_fc_font_map_list_model_init))
+static void
+init_in_thread (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ FcInit ();
+
+ g_mutex_lock (&fc_init_mutex);
+ fc_initialized = TRUE;
+ g_cond_signal (&fc_init_cond);
+ g_mutex_unlock (&fc_init_mutex);
+}
+
+static void
+wait_for_fc_init (void)
+{
+ g_mutex_lock (&fc_init_mutex);
+ while (!fc_initialized)
+ g_cond_wait (&fc_init_cond, &fc_init_mutex);
+ g_mutex_unlock (&fc_init_mutex);
+}
+
static void
pango_fc_font_map_init (PangoFcFontMap *fcfontmap)
{
@@ -1343,6 +1374,16 @@ pango_fc_font_map_init (PangoFcFontMap *fcfontmap)
(GDestroyNotify)pango_fc_font_face_data_free,
NULL);
priv->dpi = -1;
+
+ if (!fc_initialized)
+ {
+ GTask *task;
+
+ task = g_task_new (fcfontmap, NULL, NULL, NULL);
+ g_task_set_name (task, "[pango] FcInit");
+ g_task_run_in_thread (task, init_in_thread);
+ g_object_unref (task);
+ }
}
static void
@@ -1568,6 +1609,8 @@ ensure_families (PangoFcFontMap *fcfontmap)
int i;
int count;
+ wait_for_fc_init ();
+
if (priv->n_families < 0)
{
FcObjectSet *os = FcObjectSetBuild (FC_FAMILY, FC_SPACING, FC_STYLE, FC_WEIGHT, FC_WIDTH, FC_SLANT,
@@ -2220,6 +2263,9 @@ pango_fc_font_map_set_config (PangoFcFontMap *fcfontmap,
if (oldconfig)
FcConfigDestroy (oldconfig);
+
+ /* No need to wait anymore */
+ fc_initialized = TRUE;
}
/**
@@ -2240,6 +2286,8 @@ pango_fc_font_map_get_config (PangoFcFontMap *fcfontmap)
{
g_return_val_if_fail (PANGO_IS_FC_FONT_MAP (fcfontmap), NULL);
+ wait_for_fc_init ();
+
return fcfontmap->priv->config;
}
@@ -2251,6 +2299,8 @@ pango_fc_font_map_get_config_fonts (PangoFcFontMap *fcfontmap,
int set;
int n;
+ wait_for_fc_init ();
+
n = 0;
for (set = 0; set < 2; set++)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]