From c7ca30a5337cb660e650d51ddd17d389909357c2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 12 Aug 2018 13:46:53 -0700 Subject: [PATCH] [ot/ft] Port font_funcs statis to lazy-loader --- src/hb-ft.cc | 56 ++++++++++++++++++------------------- src/hb-machinery-private.hh | 14 ++++++++++ src/hb-ot-font.cc | 51 +++++++++++++++------------------ 3 files changed, 63 insertions(+), 58 deletions(-) diff --git a/src/hb-ft.cc b/src/hb-ft.cc index 5ab2a8879..c58cd87c2 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -32,6 +32,7 @@ #include "hb-ft.h" #include "hb-font-private.hh" +#include "hb-machinery-private.hh" #include FT_ADVANCES_H #include FT_MULTIPLE_MASTERS_H @@ -416,30 +417,13 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, return true; } -static hb_atomic_ptr_t static_ft_funcs; +static void free_static_ft_funcs (void); -#ifdef HB_USE_ATEXIT -static -void free_static_ft_funcs (void) +static struct hb_ft_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t { -retry: - hb_font_funcs_t *ft_funcs = static_ft_funcs.get (); - if (unlikely (!static_ft_funcs.cmpexch (ft_funcs, nullptr))) - goto retry; - - hb_font_funcs_destroy (ft_funcs); -} -#endif - -static void -_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref) -{ -retry: - hb_font_funcs_t *funcs = static_ft_funcs.get (); - - if (unlikely (!funcs)) + static inline hb_font_funcs_t *create (void) { - funcs = hb_font_funcs_create (); + hb_font_funcs_t *funcs = hb_font_funcs_create (); hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, nullptr, nullptr); //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, nullptr, nullptr); @@ -458,21 +442,35 @@ retry: hb_font_funcs_make_immutable (funcs); - if (unlikely (!static_ft_funcs. cmpexch (nullptr, funcs))) - { - hb_font_funcs_destroy (funcs); - goto retry; - } +#ifdef HB_USE_ATEXIT + atexit (free_static_ft_funcs); +#endif + + return funcs; + } +} static_ft_funcs; #ifdef HB_USE_ATEXIT - atexit (free_static_ft_funcs); /* First person registers atexit() callback. */ +static +void free_static_ft_funcs (void) +{ + static_ft_funcs.fini (); +} #endif - }; +static hb_font_funcs_t * +_hb_ft_get_font_funcs (void) +{ + return const_cast (static_ft_funcs.get ()); +} + +static void +_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref) +{ bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL; hb_font_set_funcs (font, - funcs, + _hb_ft_get_font_funcs (), _hb_ft_font_create (ft_face, symbol, unref), _hb_ft_font_destroy); } diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh index 873596de3..b26ca710e 100644 --- a/src/hb-machinery-private.hh +++ b/src/hb-machinery-private.hh @@ -749,6 +749,20 @@ struct hb_table_lazy_loader_t : hb_lazy_loader_t +struct hb_font_funcs_lazy_loader_t : hb_lazy_loader_t +{ + static inline void destroy (hb_font_funcs_t *p) + { + hb_font_funcs_destroy (p); + } + static inline const hb_font_funcs_t *get_null (void) + { + return hb_font_funcs_get_empty (); + } +}; template struct hb_unicode_funcs_lazy_loader_t : hb_lazy_loader_tv_metrics.has_font_extents; } -static hb_atomic_ptr_t static_ot_funcs; -#ifdef HB_USE_ATEXIT -static -void free_static_ot_funcs (void) +static void free_static_ot_funcs (void); + +static struct hb_ot_font_funcs_lazy_loader_t : hb_font_funcs_lazy_loader_t { -retry: - hb_font_funcs_t *ot_funcs = static_ot_funcs.get (); - if (unlikely (!static_ot_funcs.cmpexch (ot_funcs, nullptr))) - goto retry; - - hb_font_funcs_destroy (ot_funcs); -} -#endif - -static hb_font_funcs_t * -_hb_ot_get_font_funcs (void) -{ -retry: - hb_font_funcs_t *funcs = static_ot_funcs.get (); - - if (unlikely (!funcs)) + static inline hb_font_funcs_t *create (void) { - funcs = hb_font_funcs_create (); + hb_font_funcs_t *funcs = hb_font_funcs_create (); hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr); hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr); @@ -267,18 +252,26 @@ retry: hb_font_funcs_make_immutable (funcs); - if (unlikely (!static_ot_funcs.cmpexch (nullptr, funcs))) - { - hb_font_funcs_destroy (funcs); - goto retry; - } +#ifdef HB_USE_ATEXIT + atexit (free_static_ot_funcs); +#endif + + return funcs; + } +} static_ot_funcs; #ifdef HB_USE_ATEXIT - atexit (free_static_ot_funcs); /* First person registers atexit() callback. */ +static +void free_static_ot_funcs (void) +{ + static_ot_funcs.fini (); +} #endif - }; - return funcs; +static hb_font_funcs_t * +_hb_ot_get_font_funcs (void) +{ + return const_cast (static_ot_funcs.get ()); }