#include "GcRequest.h"
#include "Base/TimeUtils.h"
#include "GcStats.h"
namespace MapleRuntime {
namespace {
uint64_t g_initHeuTriggerTimestamp = TimeUtil::NanoSeconds() - LONG_MIN_HEU_GC_INTERVAL_NS;
uint64_t g_initNativeTriggerTimestamp = TimeUtil::NanoSeconds() - MIN_ASYNC_GC_INTERVAL_NS;
}
inline bool GCRequest::IsFrequentGC() const
{
if (minIntervelNs == 0) {
return false;
}
int64_t now = static_cast<int64_t>(TimeUtil::NanoSeconds());
return (now - prevRequestTime < minIntervelNs);
}
inline bool GCRequest::IsFrequentAsyncGC() const
{
int64_t now = static_cast<int64_t>(TimeUtil::NanoSeconds());
return (now - GCStats::GetPrevGCFinishTime() < minIntervelNs);
}
inline bool GCRequest::IsFrequentHeuristicGC() const { return IsFrequentAsyncGC(); }
bool GCRequest::ShouldBeIgnored() const
{
switch (reason) {
case GC_REASON_HEU:
return IsFrequentHeuristicGC();
case GC_REASON_NATIVE:
return IsFrequentAsyncGC();
case GC_REASON_OOM:
case GC_REASON_FORCE:
return IsFrequentGC();
default:
return false;
}
}
GCRequest g_gcRequests[] = {
{ GC_REASON_USER, "user", false, true, 0, 0 },
{ GC_REASON_OOM, "oom", true, false, 0, 0 },
{ GC_REASON_BACKUP, "backup", true, false, 0, 0 },
{ GC_REASON_HEU, "heuristic", false, true, LONG_MIN_HEU_GC_INTERVAL_NS, g_initHeuTriggerTimestamp },
{ GC_REASON_NATIVE, "native_alloc", false, true, MIN_ASYNC_GC_INTERVAL_NS, g_initNativeTriggerTimestamp },
{ GC_REASON_HEU_SYNC, "heuristic_sync", true, true, 0, 0 },
{ GC_REASON_NATIVE_SYNC, "native_alloc_sync", true, true, 0, 0 },
{ GC_REASON_FORCE, "force", true, false, 0, 0 }
};
}