diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2018-08-12 17:32:10 -0700 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2018-08-12 17:32:10 -0700 |
commit | 747d2564e6bdcc15cf6a197e543fb732924159c5 (patch) | |
tree | 9be322c0fa42c1c5b88bb1b5ada5a03804ae9d8c | |
parent | 7bd508a0c4ce426f474bfcc729cb39207dd1f7b4 (diff) |
[lazy] Port more
-rw-r--r-- | src/hb-machinery-private.hh | 1 | ||||
-rw-r--r-- | src/hb-shaper.cc | 78 | ||||
-rw-r--r-- | src/hb-uniscribe.cc | 3 |
3 files changed, 37 insertions, 45 deletions
diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh index 2a7ef7ba..a179eea9 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<Data, WheresData> inline Returned * get_unconst (void) const { return const_cast<Returned *> (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 e487582e..e423f255 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<const hb_shaper_pair_t> static_shapers; - -#ifdef HB_USE_ATEXIT -static -void free_static_shapers (void) +static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<const hb_shaper_pair_t, + hb_shapers_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<hb_shaper_pair_t *> (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 22beb909..5810977d 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; |