summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2018-08-12 17:32:10 -0700
committerBehdad Esfahbod <behdad@behdad.org>2018-08-12 17:32:10 -0700
commit747d2564e6bdcc15cf6a197e543fb732924159c5 (patch)
tree9be322c0fa42c1c5b88bb1b5ada5a03804ae9d8c
parent7bd508a0c4ce426f474bfcc729cb39207dd1f7b4 (diff)
[lazy] Port more
-rw-r--r--src/hb-machinery-private.hh1
-rw-r--r--src/hb-shaper.cc78
-rw-r--r--src/hb-uniscribe.cc3
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;