From aa268fc8ef84ec353f2ef0c3878d0ba8dcd54303 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 9 Mar 2025 03:31:01 -0600 Subject: [PATCH] [font/ft] See if tsan is happy with atomic_int_t serials --- src/hb-atomic.hh | 2 ++ src/hb-font.cc | 15 ++++++++++----- src/hb-font.hh | 5 +++-- src/hb-ft.cc | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/hb-atomic.hh b/src/hb-atomic.hh index 121c463a5..ce6ac38d8 100644 --- a/src/hb-atomic.hh +++ b/src/hb-atomic.hh @@ -186,6 +186,8 @@ struct hb_atomic_int_t hb_atomic_int_t& operator = (int v_) { set_relaxed (v_); return *this; } operator int () const { return get_relaxed (); } + int operator ++ (int) { return inc (); } + int operator -- (int) { return dec (); } void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); } void set_release (int v_) { hb_atomic_int_impl_set (&v, v_); } diff --git a/src/hb-font.cc b/src/hb-font.cc index 2c79c0d83..526c96bbb 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -2744,7 +2744,8 @@ hb_font_set_variations (hb_font_t *font, if (hb_object_is_immutable (font)) return; - font->serial_coords = ++font->serial; + font->serial++; + font->serial_coords = font->serial; if (!variations_length && font->instance_index == HB_FONT_NO_VAR_NAMED_INSTANCE) { @@ -2814,7 +2815,8 @@ hb_font_set_variation (hb_font_t *font, if (hb_object_is_immutable (font)) return; - font->serial_coords = ++font->serial; + font->serial++; + font->serial_coords = font->serial; // TODO Share some of this code with set_variations() @@ -2886,7 +2888,8 @@ hb_font_set_var_coords_design (hb_font_t *font, if (hb_object_is_immutable (font)) return; - font->serial_coords = ++font->serial; + font->serial++; + font->serial_coords = font->serial; int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr; float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr; @@ -2924,7 +2927,8 @@ hb_font_set_var_named_instance (hb_font_t *font, if (font->instance_index == instance_index) return; - font->serial_coords = ++font->serial; + font->serial++; + font->serial_coords = font->serial; font->instance_index = instance_index; hb_font_set_variations (font, nullptr, 0); @@ -2971,7 +2975,8 @@ hb_font_set_var_coords_normalized (hb_font_t *font, if (hb_object_is_immutable (font)) return; - font->serial_coords = ++font->serial; + font->serial++; + font->serial_coords = font->serial; int *copy = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr; int *unmapped = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr; diff --git a/src/hb-font.hh b/src/hb-font.hh index 4c8190b0d..a8e6f7b0a 100644 --- a/src/hb-font.hh +++ b/src/hb-font.hh @@ -32,6 +32,7 @@ #include "hb.hh" #include "hb-face.hh" +#include "hb-atomic.hh" #include "hb-shaper.hh" @@ -105,8 +106,8 @@ DECLARE_NULL_INSTANCE (hb_font_funcs_t); struct hb_font_t { hb_object_header_t header; - unsigned int serial; - unsigned int serial_coords; + hb_atomic_int_t serial; + hb_atomic_int_t serial_coords; hb_font_t *parent; hb_face_t *face; diff --git a/src/hb-ft.cc b/src/hb-ft.cc index f5fd7cae0..fdb021dd8 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -101,7 +101,7 @@ struct hb_ft_font_t mutable hb_mutex_t lock; /* Protects members below. */ FT_Face ft_face; - mutable unsigned cached_serial; + mutable hb_atomic_int_t cached_serial; mutable hb_ft_advance_cache_t advance_cache; }; @@ -118,7 +118,7 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING; - ft_font->cached_serial = (unsigned) -1; + ft_font->cached_serial = -1; new (&ft_font->advance_cache) hb_ft_advance_cache_t; return ft_font;