From 66577b2a77a8f1854e84dcb80a60491001875220 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 2 Apr 2025 03:41:32 -0600 Subject: [PATCH] [ot-font] Make advance-cache invalidation threadsafe Hopefully. --- src/hb-ot-font.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 07ffa52a4..5d4aa2d09 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -202,8 +202,14 @@ hb_ot_get_glyph_h_advances (hb_font_t* font, void* font_data, { /* Use cache. */ if (ot_font->cached_coords_serial.get_acquire () != (int) font->serial_coords) { - ot_font->advance_cache->clear (); - ot_font->cached_coords_serial.set_release (font->serial_coords); + // Retire advance cache and let it be recreated. + auto *old_cache = ot_font->advance_cache.get_acquire (); + if (ot_font->advance_cache.cmpexch (cache, nullptr)) + { + ot_font->cached_coords_serial.set_release (font->serial_coords); + hb_free (old_cache); + } + goto retry; } for (unsigned int i = 0; i < count; i++)