1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#ifndef ECMASCRIPT_TOOLING_AGENT_PROFILER_IMPL_H 17e509ee18Sopenharmony_ci#define ECMASCRIPT_TOOLING_AGENT_PROFILER_IMPL_H 18e509ee18Sopenharmony_ci 19e509ee18Sopenharmony_ci#include "tooling/base/pt_params.h" 20e509ee18Sopenharmony_ci#include "tooling/base/pt_returns.h" 21e509ee18Sopenharmony_ci#include "dispatcher.h" 22e509ee18Sopenharmony_ci 23e509ee18Sopenharmony_ci#include "ecmascript/dfx/cpu_profiler/samples_record.h" 24e509ee18Sopenharmony_ci#include "libpandabase/macros.h" 25e509ee18Sopenharmony_ci 26e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling { 27e509ee18Sopenharmony_ciclass ProfilerImpl final { 28e509ee18Sopenharmony_cipublic: 29e509ee18Sopenharmony_ci ProfilerImpl(const EcmaVM *vm, ProtocolChannel *channel) : vm_(vm), frontend_(channel) {} 30e509ee18Sopenharmony_ci ~ProfilerImpl() = default; 31e509ee18Sopenharmony_ci 32e509ee18Sopenharmony_ci DispatchResponse Disable(); 33e509ee18Sopenharmony_ci DispatchResponse Enable(); 34e509ee18Sopenharmony_ci DispatchResponse Start(); 35e509ee18Sopenharmony_ci DispatchResponse Stop(std::unique_ptr<Profile> *profile); 36e509ee18Sopenharmony_ci DispatchResponse SetSamplingInterval(const SetSamplingIntervalParams ¶ms); 37e509ee18Sopenharmony_ci DispatchResponse GetBestEffortCoverage(); 38e509ee18Sopenharmony_ci DispatchResponse StopPreciseCoverage(); 39e509ee18Sopenharmony_ci DispatchResponse TakePreciseCoverage(); 40e509ee18Sopenharmony_ci DispatchResponse StartPreciseCoverage(const StartPreciseCoverageParams ¶ms); 41e509ee18Sopenharmony_ci DispatchResponse StartTypeProfile(); 42e509ee18Sopenharmony_ci DispatchResponse StopTypeProfile(); 43e509ee18Sopenharmony_ci DispatchResponse TakeTypeProfile(); 44e509ee18Sopenharmony_ci DispatchResponse EnableSerializationTimeoutCheck(const SeriliazationTimeoutCheckEnableParams ¶ms); 45e509ee18Sopenharmony_ci DispatchResponse DisableSerializationTimeoutCheck(); 46e509ee18Sopenharmony_ci 47e509ee18Sopenharmony_ci class DispatcherImpl final : public DispatcherBase { 48e509ee18Sopenharmony_ci public: 49e509ee18Sopenharmony_ci DispatcherImpl(ProtocolChannel *channel, std::unique_ptr<ProfilerImpl> profiler) 50e509ee18Sopenharmony_ci : DispatcherBase(channel), profiler_(std::move(profiler)) {} 51e509ee18Sopenharmony_ci ~DispatcherImpl() override = default; 52e509ee18Sopenharmony_ci 53e509ee18Sopenharmony_ci void Dispatch(const DispatchRequest &request) override; 54e509ee18Sopenharmony_ci void Enable(const DispatchRequest &request); 55e509ee18Sopenharmony_ci void Disable(const DispatchRequest &request); 56e509ee18Sopenharmony_ci void Start(const DispatchRequest &request); 57e509ee18Sopenharmony_ci void Stop(const DispatchRequest &request); 58e509ee18Sopenharmony_ci void SetSamplingInterval(const DispatchRequest &request); 59e509ee18Sopenharmony_ci void GetBestEffortCoverage(const DispatchRequest &request); 60e509ee18Sopenharmony_ci void StopPreciseCoverage(const DispatchRequest &request); 61e509ee18Sopenharmony_ci void TakePreciseCoverage(const DispatchRequest &request); 62e509ee18Sopenharmony_ci void StartPreciseCoverage(const DispatchRequest &request); 63e509ee18Sopenharmony_ci void StartTypeProfile(const DispatchRequest &request); 64e509ee18Sopenharmony_ci void StopTypeProfile(const DispatchRequest &request); 65e509ee18Sopenharmony_ci void TakeTypeProfile(const DispatchRequest &request); 66e509ee18Sopenharmony_ci void EnableSerializationTimeoutCheck(const DispatchRequest &request); 67e509ee18Sopenharmony_ci void DisableSerializationTimeoutCheck(const DispatchRequest &request); 68e509ee18Sopenharmony_ci 69e509ee18Sopenharmony_ci enum class Method { 70e509ee18Sopenharmony_ci DISABLE, 71e509ee18Sopenharmony_ci ENABLE, 72e509ee18Sopenharmony_ci START, 73e509ee18Sopenharmony_ci STOP, 74e509ee18Sopenharmony_ci SET_SAMPLING_INTERVAL, 75e509ee18Sopenharmony_ci GET_BEST_EFFORT_COVERAGE, 76e509ee18Sopenharmony_ci STOP_PRECISE_COVERAGE, 77e509ee18Sopenharmony_ci TAKE_PRECISE_COVERAGE, 78e509ee18Sopenharmony_ci START_PRECISE_COVERAGE, 79e509ee18Sopenharmony_ci START_TYPE_PROFILE, 80e509ee18Sopenharmony_ci STOP_TYPE_PROFILE, 81e509ee18Sopenharmony_ci TAKE_TYPE_PROFILE, 82e509ee18Sopenharmony_ci ENABLE_SERIALIZATION_TIMEOUT_CHECK, 83e509ee18Sopenharmony_ci DISABLE_SERIALIZATION_TIMEOUT_CHECK, 84e509ee18Sopenharmony_ci UNKNOWN 85e509ee18Sopenharmony_ci }; 86e509ee18Sopenharmony_ci Method GetMethodEnum(const std::string& method); 87e509ee18Sopenharmony_ci 88e509ee18Sopenharmony_ci private: 89e509ee18Sopenharmony_ci NO_COPY_SEMANTIC(DispatcherImpl); 90e509ee18Sopenharmony_ci NO_MOVE_SEMANTIC(DispatcherImpl); 91e509ee18Sopenharmony_ci 92e509ee18Sopenharmony_ci std::unique_ptr<ProfilerImpl> profiler_ {}; 93e509ee18Sopenharmony_ci }; 94e509ee18Sopenharmony_ci 95e509ee18Sopenharmony_ci class Frontend { 96e509ee18Sopenharmony_ci public: 97e509ee18Sopenharmony_ci explicit Frontend(ProtocolChannel *channel) : channel_(channel) {} 98e509ee18Sopenharmony_ci ~Frontend() = default; 99e509ee18Sopenharmony_ci 100e509ee18Sopenharmony_ci void PreciseCoverageDeltaUpdate(); 101e509ee18Sopenharmony_ci 102e509ee18Sopenharmony_ci private: 103e509ee18Sopenharmony_ci bool AllowNotify() const; 104e509ee18Sopenharmony_ci 105e509ee18Sopenharmony_ci ProtocolChannel *channel_ {nullptr}; 106e509ee18Sopenharmony_ci }; 107e509ee18Sopenharmony_ci 108e509ee18Sopenharmony_ciprivate: 109e509ee18Sopenharmony_ci NO_COPY_SEMANTIC(ProfilerImpl); 110e509ee18Sopenharmony_ci NO_MOVE_SEMANTIC(ProfilerImpl); 111e509ee18Sopenharmony_ci 112e509ee18Sopenharmony_ci void InitializeExtendedProtocolsList(); 113e509ee18Sopenharmony_ci 114e509ee18Sopenharmony_ci const EcmaVM *vm_ {nullptr}; 115e509ee18Sopenharmony_ci [[maybe_unused]] Frontend frontend_; 116e509ee18Sopenharmony_ci std::vector<std::string> profilerExtendedProtocols_ {}; 117e509ee18Sopenharmony_ci}; 118e509ee18Sopenharmony_ci} // namespace panda::ecmascript::tooling 119e509ee18Sopenharmony_ci#endif 120