diff options
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc')
-rw-r--r-- | Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc | 74 |
1 files changed, 38 insertions, 36 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc index c1e73656c17..3c2e6c4a969 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc @@ -32,6 +32,7 @@ #include "hb-shape-plan-private.hh" #include "hb-buffer-private.hh" #include "hb-font-private.hh" +#include "hb-machinery-private.hh" /** * SECTION:hb-shape @@ -45,21 +46,50 @@ * contains the output glyphs and their positions. **/ -static const char **static_shaper_list; + +static void free_static_shaper_list (void); +static const char *nil_shaper_list[] = {nullptr}; + +static struct hb_shaper_list_lazy_loader_t : hb_lazy_loader_t<const char *, + hb_shaper_list_lazy_loader_t> +{ + static inline const char ** create (void) + { + const char **shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *)); + if (unlikely (!shaper_list)) + return nullptr; + + const hb_shaper_pair_t *shapers = _hb_shapers_get (); + unsigned int i; + for (i = 0; i < HB_SHAPERS_COUNT; i++) + shaper_list[i] = shapers[i].name; + shaper_list[i] = nullptr; + +#ifdef HB_USE_ATEXIT + atexit (free_static_shaper_list); +#endif + + return shaper_list; + } + static inline void destroy (const char **l) + { + free (l); + } + static inline const char ** get_null (void) + { + return nil_shaper_list; + } +} static_shaper_list; #ifdef HB_USE_ATEXIT static void free_static_shaper_list (void) { -retry: - const char **shaper_list = (const char **) hb_atomic_ptr_get (&static_shaper_list); - if (!hb_atomic_ptr_cmpexch (&static_shaper_list, shaper_list, nullptr)) - goto retry; - - free (shaper_list); + static_shaper_list.free_instance (); } #endif + /** * hb_shape_list_shapers: * @@ -73,35 +103,7 @@ retry: const char ** hb_shape_list_shapers (void) { -retry: - const char **shaper_list = (const char **) hb_atomic_ptr_get (&static_shaper_list); - - if (unlikely (!shaper_list)) - { - /* Not found; allocate one. */ - shaper_list = (const char **) calloc (1 + HB_SHAPERS_COUNT, sizeof (const char *)); - if (unlikely (!shaper_list)) { - static const char *nil_shaper_list[] = {nullptr}; - return nil_shaper_list; - } - - const hb_shaper_pair_t *shapers = _hb_shapers_get (); - unsigned int i; - for (i = 0; i < HB_SHAPERS_COUNT; i++) - shaper_list[i] = shapers[i].name; - shaper_list[i] = nullptr; - - if (!hb_atomic_ptr_cmpexch (&static_shaper_list, nullptr, shaper_list)) { - free (shaper_list); - goto retry; - } - -#ifdef HB_USE_ATEXIT - atexit (free_static_shaper_list); /* First person registers atexit() callback. */ -#endif - } - - return shaper_list; + return static_shaper_list.get_unconst (); } |