@@ -126,8 +126,14 @@ void gc::barriers::disableBarriers() noexcept {
126126namespace  {
127127
128128//  TODO decide whether it's really beneficial to NO_INLINE the slow path
129- NO_INLINE void  beforeHeapRefUpdateSlowPath (mm::DirectRefAccessor ref, ObjHeader* value) noexcept  {
130-     auto  prev = ref.load ();
129+ NO_INLINE void  beforeHeapRefUpdateSlowPath (mm::DirectRefAccessor ref, ObjHeader* value, bool  loadAtomic) noexcept  {
130+     ObjHeader* prev;
131+     if  (loadAtomic) {
132+         prev = ref.loadAtomic (std::memory_order_relaxed);
133+     } else  {
134+         prev = ref.load ();
135+     }
136+ 
131137    if  (prev != nullptr  && prev->heap ()) {
132138        //  TODO Redundant if the destination object is black.
133139        //       Yet at the moment there is now efficient way to distinguish black and gray objects.
@@ -143,11 +149,11 @@ NO_INLINE void beforeHeapRefUpdateSlowPath(mm::DirectRefAccessor ref, ObjHeader*
143149
144150} //  namespace
145151
146- ALWAYS_INLINE void  gc::barriers::beforeHeapRefUpdate (mm::DirectRefAccessor ref, ObjHeader* value) noexcept  {
152+ ALWAYS_INLINE void  gc::barriers::beforeHeapRefUpdate (mm::DirectRefAccessor ref, ObjHeader* value,  bool  loadAtomic ) noexcept  {
147153    auto  phase = currentPhase ();
148154    BarriersLogDebug (phase, " Write *%p <- %p (%p overwritten)" location (), value, ref.load ());
149155    if  (__builtin_expect (phase == BarriersPhase::kMarkClosure , false )) {
150-         beforeHeapRefUpdateSlowPath (ref, value);
156+         beforeHeapRefUpdateSlowPath (ref, value, loadAtomic );
151157    }
152158}
153159
@@ -175,7 +181,7 @@ NO_INLINE ObjHeader* weakRefReadInWeakSweepSlowPath(ObjHeader* weakReferee) noex
175181
176182} //  namespace
177183
178- ALWAYS_INLINE ObjHeader* gc::barriers::weakRefReadBarrier (std::atomic <ObjHeader*>&  weakReferee) noexcept  {
184+ ALWAYS_INLINE ObjHeader* gc::barriers::weakRefReadBarrier (std_support::atomic_ref <ObjHeader*> weakReferee) noexcept  {
179185    if  (__builtin_expect (currentPhase () != BarriersPhase::kDisabled , false )) {
180186        //  Mark dispatcher requires weak reads be protected by the following:
181187        auto  weakReadProtector = markDispatcher ().weakReadProtector ();
0 commit comments