#ifndef MRT_COLLECTOR_H
#define MRT_COLLECTOR_H
#include <atomic>
#include <cstdint>
#include <cstdlib>
#include <functional>
#include <set>
#include <vector>
#include "GcRequest.h"
#include "GcStats.h"
namespace MapleRuntime {
enum GCPhase : uint8_t {
GC_PHASE_UNDEF = 0,
GC_PHASE_IDLE = 1,
GC_PHASE_FINISH = 2,
GC_PHASE_RECLAIM_SATB_NODE = 3,
GC_PHASE_INIT = 8,
GC_PHASE_ENUM = 9,
GC_PHASE_TRACE = 10,
GC_PHASE_CLEAR_SATB_BUFFER = 11,
GC_PHASE_POST_TRACE = 12,
GC_PHASE_PREFORWARD = 13,
GC_PHASE_FORWARD = 14,
};
enum CollectorType {
NO_COLLECTOR = 0,
PROXY_COLLECTOR,
COPY_COLLECTOR,
SMOOTH_COLLECTOR,
COLLECTOR_TYPE_COUNT,
};
class Collector {
public:
Collector();
virtual ~Collector() = default;
static const char* GetGCPhaseName(GCPhase phase);
virtual void Init() = 0;
virtual void Fini() {}
const char* GetCollectorName() const;
void RequestGC(GCReason reason, bool async);
virtual GCPhase GetGCPhase() const { return gcPhase.load(std::memory_order_acquire); }
virtual void SetGCPhase(const GCPhase phase) { gcPhase.store(phase, std::memory_order_release); }
virtual void MarkNewObject(BaseObject*) {}
virtual void FixObject(BaseObject&) const {}
virtual void RunGarbageCollection(uint64_t, GCReason) = 0;
virtual GCStats& GetGCStats() { std::abort(); }
virtual BaseObject* ForwardObject(BaseObject*) { std::abort(); }
virtual bool ShouldIgnoreRequest(GCRequest& quest) = 0;
virtual bool IsFromObject(BaseObject*) const { std::abort(); }
virtual bool IsGhostFromObject(BaseObject*) const { std::abort(); }
virtual bool IsUnmovableFromObject(BaseObject*) const { std::abort(); }
virtual BaseObject* FindToVersion(BaseObject* obj) const = 0;
virtual bool TryUpdateRefField(BaseObject*, RefField<>&, BaseObject*&) const { std::abort(); }
virtual bool TryForwardRefField(BaseObject*, RefField<>&, BaseObject*&) const { std::abort(); }
virtual bool TryUntagRefField(BaseObject*, RefField<>&, BaseObject*&) const { std::abort(); }
virtual bool TryTagRefField(BaseObject*, RefField<>&, BaseObject*) const { std::abort(); }
virtual RefField<> GetAndTryTagRefField(BaseObject*) const { std::abort(); }
virtual bool IsOldPointer(RefField<>&) const { std::abort(); }
virtual bool IsCurrentPointer(RefField<>&) const { std::abort(); }
virtual void AddRawPointerObject(BaseObject*) { std::abort(); }
virtual void RemoveRawPointerObject(BaseObject*) { std::abort(); }
virtual void ResolveCycleRef() { std::abort(); }
BaseObject* FindLatestVersion(BaseObject* obj) const
{
if (obj == nullptr) {
return nullptr;
}
auto to = FindToVersion(obj);
if (to != nullptr) {
return to;
}
return obj;
};
protected:
virtual void RequestGCInternal(GCReason, bool) { std::abort(); }
CollectorType collectorType = CollectorType::NO_COLLECTOR;
std::atomic<GCPhase> gcPhase = { GCPhase::GC_PHASE_IDLE };
};
}
#endif