[HarfBuzz] harfbuzz: Branch 'master'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Wed Nov 14 01:50:50 UTC 2018
src/hb-machinery.hh | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
New commits:
commit dc4225ccd1d16a1139cbc6092353db9ed03e8980
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Nov 13 20:48:46 2018 -0500
Don't retry creating again and again in lazy_loader if create failed
Still does that if get_null() returns nullptr. Our shaper data objects
are like that. Shrug.
diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh
index ce6c9453..ffc9627f 100644
--- a/src/hb-machinery.hh
+++ b/src/hb-machinery.hh
@@ -752,16 +752,19 @@ struct hb_data_wrapper_t
return *(((Data **) (void *) this) - WheresData);
}
+ inline bool is_inert (void) const { return !get_data (); }
+
template <typename Stored, typename Subclass>
inline Stored * call_create (void) const
{
- Data *data = this->get_data ();
- return likely (data) ? Subclass::create (data) : nullptr;
+ return Subclass::create (this->get_data ());
}
};
template <>
struct hb_data_wrapper_t<void, 0>
{
+ inline bool is_inert (void) const { return false; }
+
template <typename Stored, typename Funcs>
inline Stored * call_create (void) const
{
@@ -800,7 +803,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
static inline void do_destroy (Stored *p)
{
- if (p)
+ if (p && p != const_cast<Stored *> (Funcs::get_null ()))
Funcs::destroy (p);
}
@@ -814,9 +817,12 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData>
Stored *p = this->instance.get ();
if (unlikely (!p))
{
+ if (unlikely (this->is_inert ()))
+ return const_cast<Stored *> (Funcs::get_null ());
+
p = this->template call_create<Stored, Funcs> ();
if (unlikely (!p))
- return const_cast<Stored *> (Funcs::get_null ());
+ p = const_cast<Stored *> (Funcs::get_null ());
if (unlikely (!this->instance.cmpexch (nullptr, p)))
{
More information about the HarfBuzz
mailing list