Fix previous commit to use atomic operations
diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh
index 39a7fd1..ec41e2b 100644
--- a/src/hb-machinery-private.hh
+++ b/src/hb-machinery-private.hh
@@ -639,9 +639,16 @@
inline void set_stored (Stored *instance_)
{
- if (instance)
- thiz ()->destroy (instance);
- instance = instance_;
+ /* This *must* be called when there are no other threads accessing.
+ * However, to make TSan, etc, happy, we using cmpexch. */
+ retry:
+ Stored *p = (Stored *) hb_atomic_ptr_get (&this->instance);
+ if (p)
+ {
+ if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<Stored **>(&this->instance), p, instance_)))
+ goto retry;
+ thiz ()->destroy (p);
+ }
}
inline const Returned * get (void) const