diff options
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc')
-rw-r--r-- | Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc index 94e6bb551bc..11b7384fa77 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc @@ -190,7 +190,8 @@ hb_ScriptPlaceOpenType( } -struct hb_uniscribe_shaper_funcs_t { +struct hb_uniscribe_shaper_funcs_t +{ SIOT ScriptItemizeOpenType; SSOT ScriptShapeOpenType; SPOT ScriptPlaceOpenType; @@ -220,47 +221,49 @@ struct hb_uniscribe_shaper_funcs_t { } } }; -static hb_uniscribe_shaper_funcs_t *uniscribe_funcs; -#ifdef HB_USE_ATEXIT -static inline void -free_uniscribe_funcs (void) -{ -retry: - hb_uniscribe_shaper_funcs_t *local_uniscribe_funcs = - (hb_uniscribe_shaper_funcs_t *) hb_atomic_ptr_get (&uniscribe_funcs); - if (!hb_atomic_ptr_cmpexch (&uniscribe_funcs, local_uniscribe_funcs, nullptr)) - goto retry; - free (uniscribe_funcs); -} -#endif +static void free_static_uniscribe_shaper_funcs (void); -static hb_uniscribe_shaper_funcs_t * -hb_uniscribe_shaper_get_funcs (void) +static struct hb_uniscribe_shaper_funcs_lazy_loader_t : hb_lazy_loader_t<hb_uniscribe_shaper_funcs_t, + hb_uniscribe_shaper_funcs_lazy_loader_t> { -retry: - hb_uniscribe_shaper_funcs_t *funcs = (hb_uniscribe_shaper_funcs_t *) hb_atomic_ptr_get (&uniscribe_funcs); - - if (unlikely (!funcs)) + static inline hb_uniscribe_shaper_funcs_t *create (void) { - funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t)); + hb_uniscribe_shaper_funcs_t *funcs = (hb_uniscribe_shaper_funcs_t *) calloc (1, sizeof (hb_uniscribe_shaper_funcs_t)); if (unlikely (!funcs)) return nullptr; funcs->init (); - if (!hb_atomic_ptr_cmpexch (&uniscribe_funcs, nullptr, funcs)) { - free (funcs); - goto retry; - } - #ifdef HB_USE_ATEXIT - atexit (free_uniscribe_funcs); /* First person registers atexit() callback. */ + atexit (free_static_uniscribe_shaper_funcs); #endif + + return funcs; } + static inline void destroy (hb_uniscribe_shaper_funcs_t *p) + { + free ((void *) p); + } + static inline hb_uniscribe_shaper_funcs_t *get_null (void) + { + return nullptr; + } +} static_uniscribe_shaper_funcs; - return funcs; +#ifdef HB_USE_ATEXIT +static +void free_static_uniscribe_shaper_funcs (void) +{ + static_uniscribe_shaper_funcs.free_instance (); +} +#endif + +static hb_uniscribe_shaper_funcs_t * +hb_uniscribe_shaper_get_funcs (void) +{ + return static_uniscribe_shaper_funcs.get_unconst (); } |