diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh index 2a7ef7baa91b9291afe164b6c91dbe98c1d1664c..a179eea9c69b1e342d3302aba2f1a44e037c9c43 100644 --- a/src/hb-machinery-private.hh +++ b/src/hb-machinery-private.hh @@ -698,7 +698,6 @@ struct hb_lazy_loader_t : hb_data_wrapper_t inline Returned * get_unconst (void) const { return const_cast (Funcs::convert (get_stored ())); } /* To be possibly overloaded by subclasses. */ - static inline const Returned* convert (const Stored *p) { return p; } static inline Returned* convert (Stored *p) { return p; } /* By default null/init/fini the object. */ diff --git a/src/hb-shaper.cc b/src/hb-shaper.cc index e487582e53bf7eed4a7beff39b95959e3af0dc1e..e423f2557c5b29ec91ad6dd52df6012ecbfc5b09 100644 --- a/src/hb-shaper.cc +++ b/src/hb-shaper.cc @@ -26,7 +26,7 @@ #include "hb-private.hh" #include "hb-shaper-private.hh" -#include "hb-atomic-private.hh" +#include "hb-machinery-private.hh" static const hb_shaper_pair_t all_shapers[] = { @@ -36,52 +36,28 @@ static const hb_shaper_pair_t all_shapers[] = { }; -/* Thread-safe, lock-free, shapers */ +static void free_static_shapers (void); -static hb_atomic_ptr_t static_shapers; - -#ifdef HB_USE_ATEXIT -static -void free_static_shapers (void) +static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t { -retry: - const hb_shaper_pair_t *shapers = static_shapers.get (); - if (unlikely (!static_shapers.cmpexch (shapers, nullptr))) - goto retry; - - if (unlikely (shapers != all_shapers)) - free ((void *) shapers); -} -#endif - -const hb_shaper_pair_t * -_hb_shapers_get (void) -{ -retry: - hb_shaper_pair_t *shapers = const_cast (static_shapers.get ()); - - if (unlikely (!shapers)) + static inline hb_shaper_pair_t *create (void) { char *env = getenv ("HB_SHAPER_LIST"); - if (!env || !*env) { - (void) static_shapers.cmpexch (nullptr, &all_shapers[0]); - return (const hb_shaper_pair_t *) all_shapers; - } + if (!env || !*env) + return nullptr; - /* Not found; allocate one. */ - shapers = (hb_shaper_pair_t *) calloc (1, sizeof (all_shapers)); + hb_shaper_pair_t *shapers = (hb_shaper_pair_t *) calloc (1, sizeof (all_shapers)); if (unlikely (!shapers)) - { - (void) static_shapers.cmpexch (nullptr, &all_shapers[0]); - return (const hb_shaper_pair_t *) all_shapers; - } + return nullptr; memcpy (shapers, all_shapers, sizeof (all_shapers)); /* Reorder shaper list to prefer requested shapers. */ unsigned int i = 0; char *end, *p = env; - for (;;) { + for (;;) + { end = strchr (p, ','); if (!end) end = p + strlen (p); @@ -103,16 +79,32 @@ retry: p = end + 1; } - if (unlikely (!static_shapers.cmpexch (nullptr, shapers))) - { - free (shapers); - goto retry; - } - #ifdef HB_USE_ATEXIT - atexit (free_static_shapers); /* First person registers atexit() callback. */ + atexit (free_static_shapers); #endif + + return shapers; + } + static inline void destroy (const hb_shaper_pair_t *p) + { + free ((void *) p); } + static inline const hb_shaper_pair_t *get_null (void) + { + return all_shapers; + } +} static_shapers; - return shapers; +#ifdef HB_USE_ATEXIT +static +void free_static_shapers (void) +{ + static_shapers.free_instance (); +} +#endif + +const hb_shaper_pair_t * +_hb_shapers_get (void) +{ + return static_shapers.get_unconst (); } diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 22beb90995672fe2d33dcdff80a8b2ce51306a95..5810977d2270b2607e924cc98ce4e1f1effd4005 100644 --- a/src/hb-uniscribe.cc +++ b/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;