/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "ecmascript/dfx/hprof/heap_profiler_interface.h"
#include "ecmascript/dfx/hprof/heap_profiler.h"
#include "ecmascript/runtime.h"


namespace panda::ecmascript {

HeapProfilerInterface *HeapProfilerInterface::GetInstance(EcmaVM *vm)
{
    return vm->GetOrNewHeapProfile();
}

void HeapProfilerInterface::Destroy(EcmaVM *vm)
{
    vm->DeleteHeapProfile();
}

HeapProfilerInterface *HeapProfilerInterface::CreateNewInstance(const EcmaVM *vm)
{
    return new HeapProfiler(vm);
}

void HeapProfilerInterface::DestroyInstance(HeapProfilerInterface *heapProfiler)
{
    delete heapProfiler;
}

void HeapProfilerInterface::DumpHeapSnapshotForCMCOOM(void *thread)
{
#if defined(ECMASCRIPT_SUPPORT_SNAPSHOT) && defined(ENABLE_DUMP_IN_FAULTLOG)
    EcmaVM *vm = Runtime::GetInstance()->GetMainThread()->GetEcmaVM();
    if (thread != nullptr) {
        vm = reinterpret_cast<JSThread *>(thread)->GetEcmaVM();
    }

    auto appfreezeCallback = Runtime::GetInstance()->GetAppFreezeFilterCallback();
    std::string eventConfig;
    bool shouldDump = appfreezeCallback == nullptr || appfreezeCallback(getprocpid(), true, eventConfig);
    if (!vm->GetJSThread()->IsThrowingOOMError()) {
        vm->GetEcmaGCKeyStats()->SendSysEventBeforeDump("OOMDump", 0, 0, eventConfig);
    }
    if (!shouldDump) {
        LOG_ECMA(INFO) << "DumpHeapSnapshotForCMCOOM, no dump quota.";
        return;
    }

    DumpSnapShotOption dumpOption;
    dumpOption.dumpFormat = panda::ecmascript::DumpFormat::BINARY;
    dumpOption.isFullGC = false;
    dumpOption.isSync = false;
    dumpOption.isBeforeFill = false;
    dumpOption.isDumpOOM = true;

    vm->GetOrNewHeapProfile()->DumpHeapSnapshotForOOM(dumpOption);
#endif
}

}  // namespace panda::ecmascript