14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_DFX_VMSTAT_RUNTIME_STAT_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_DFX_VMSTAT_RUNTIME_STAT_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/ecma_vm.h"
204514f5e3Sopenharmony_ci#include "ecmascript/js_thread.h"
214514f5e3Sopenharmony_ci#include "ecmascript/mem/c_containers.h"
224514f5e3Sopenharmony_ci#include "ecmascript/dfx/vmstat/caller_stat.h"
234514f5e3Sopenharmony_ci
244514f5e3Sopenharmony_cinamespace panda::ecmascript {
254514f5e3Sopenharmony_ciclass EcmaRuntimeStat {
264514f5e3Sopenharmony_cipublic:
274514f5e3Sopenharmony_ci    // NOLINTNEXTLINE(modernize-avoid-c-arrays)
284514f5e3Sopenharmony_ci    EcmaRuntimeStat(const char * const runtimeCallerNames[], int count);
294514f5e3Sopenharmony_ci    EcmaRuntimeStat() = default;
304514f5e3Sopenharmony_ci    virtual ~EcmaRuntimeStat() = default;
314514f5e3Sopenharmony_ci
324514f5e3Sopenharmony_ci    DEFAULT_NOEXCEPT_MOVE_SEMANTIC(EcmaRuntimeStat);
334514f5e3Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(EcmaRuntimeStat);
344514f5e3Sopenharmony_ci
354514f5e3Sopenharmony_ci    void SetRuntimeStatEnabled(bool enable)
364514f5e3Sopenharmony_ci    {
374514f5e3Sopenharmony_ci        runtimeStatEnabled_ = enable;
384514f5e3Sopenharmony_ci    }
394514f5e3Sopenharmony_ci    bool IsRuntimeStatEnabled()
404514f5e3Sopenharmony_ci    {
414514f5e3Sopenharmony_ci        return runtimeStatEnabled_;
424514f5e3Sopenharmony_ci    }
434514f5e3Sopenharmony_ci    void PUBLIC_API StartCount(PandaRuntimeTimer *timer, int callerId);
444514f5e3Sopenharmony_ci    void PUBLIC_API StopCount(const PandaRuntimeTimer *timer);
454514f5e3Sopenharmony_ci    void PrintAllStats() const;
464514f5e3Sopenharmony_ci    void ResetAllCount();
474514f5e3Sopenharmony_ci    void Print() const;
484514f5e3Sopenharmony_ci
494514f5e3Sopenharmony_ciprivate:
504514f5e3Sopenharmony_ci    bool runtimeStatEnabled_ {false};
514514f5e3Sopenharmony_ci    PandaRuntimeTimer *currentTimer_ = nullptr;
524514f5e3Sopenharmony_ci    CVector<PandaRuntimeCallerStat> callerStat_ {};
534514f5e3Sopenharmony_ci};
544514f5e3Sopenharmony_ci
554514f5e3Sopenharmony_ciclass EcmaRuntimeStatScope {
564514f5e3Sopenharmony_cipublic:
574514f5e3Sopenharmony_ci    explicit EcmaRuntimeStatScope(EcmaVM *vm);
584514f5e3Sopenharmony_ci    virtual ~EcmaRuntimeStatScope();
594514f5e3Sopenharmony_ci
604514f5e3Sopenharmony_ciprivate:
614514f5e3Sopenharmony_ci    EcmaVM *vm_ = nullptr;
624514f5e3Sopenharmony_ci};
634514f5e3Sopenharmony_ci
644514f5e3Sopenharmony_ciclass RuntimeTimerScope {
654514f5e3Sopenharmony_cipublic:
664514f5e3Sopenharmony_ci    RuntimeTimerScope(int callerId, EcmaRuntimeStat *stat)
674514f5e3Sopenharmony_ci    {
684514f5e3Sopenharmony_ci        if (stat == nullptr || !stat->IsRuntimeStatEnabled()) {
694514f5e3Sopenharmony_ci            return;
704514f5e3Sopenharmony_ci        }
714514f5e3Sopenharmony_ci        stats_ = stat;
724514f5e3Sopenharmony_ci        stats_->StartCount(&timer_, callerId);
734514f5e3Sopenharmony_ci    }
744514f5e3Sopenharmony_ci    ~RuntimeTimerScope()
754514f5e3Sopenharmony_ci    {
764514f5e3Sopenharmony_ci        if (stats_ != nullptr) {
774514f5e3Sopenharmony_ci            stats_->StopCount(&timer_);
784514f5e3Sopenharmony_ci        }
794514f5e3Sopenharmony_ci    }
804514f5e3Sopenharmony_ci    NO_COPY_SEMANTIC(RuntimeTimerScope);
814514f5e3Sopenharmony_ci    NO_MOVE_SEMANTIC(RuntimeTimerScope);
824514f5e3Sopenharmony_ci
834514f5e3Sopenharmony_ciprivate:
844514f5e3Sopenharmony_ci    PandaRuntimeTimer timer_ {};
854514f5e3Sopenharmony_ci    EcmaRuntimeStat *stats_ {nullptr};
864514f5e3Sopenharmony_ci};
874514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
884514f5e3Sopenharmony_ci#endif // ECMASCRIPT_DFX_VMSTAT_RUNTIME_STAT_H
89