Fix previous commit to use atomic operations
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 9 Aug 2018 05:01:04 +0000 (22:01 -0700)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 9 Aug 2018 05:01:38 +0000 (22:01 -0700)
src/hb-machinery-private.hh

index 39a7fd1..ec41e2b 100644 (file)
@@ -639,9 +639,16 @@ struct hb_lazy_loader_t
 
   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