#ifndef MRT_TRACE_FIX_BARRIER_H
#define MRT_TRACE_FIX_BARRIER_H
#include "Allocator/RegionSpace.h"
#include "IdleBarrier.h"
namespace MapleRuntime {
class PreforwardBarrier : public IdleBarrier {
public:
explicit PreforwardBarrier(Collector& collector) : IdleBarrier(collector) {}
BaseObject* ReadReference(BaseObject* obj, RefField<false>& field) const override;
BaseObject* ReadStaticRef(RefField<false>& field) const override;
BaseObject* ReadWeakRef(BaseObject* obj, RefField<false>& field) const override;
void ReadStruct(MAddress dst, BaseObject* obj, MAddress src, size_t size) const override;
void ReadStaticStruct(MAddress dst, MAddress src, size_t size, const GCTib gctib) const override;
BaseObject* AtomicReadReference(BaseObject* obj, RefField<true>& field, MemoryOrder order) const override;
void AtomicWriteReference(BaseObject* obj, RefField<true>& field, BaseObject* ref,
MemoryOrder order) const override;
BaseObject* AtomicSwapReference(BaseObject* obj, RefField<true>& field, BaseObject* ref,
MemoryOrder order) const override;
bool CompareAndSwapReference(BaseObject* obj, RefField<true>& field, BaseObject* oldRef, BaseObject* newRef,
MemoryOrder succOrder, MemoryOrder failOrder) const override;
void CopyStructArray(BaseObject* dstObj, MAddress dstField, MIndex dstSize, BaseObject* srcObj, MAddress srcField,
MIndex srcSize) const override;
};
}
#endif