148f512ceSopenharmony_ci/*
248f512ceSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
348f512ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
448f512ceSopenharmony_ci * you may not use this file except in compliance with the License.
548f512ceSopenharmony_ci * You may obtain a copy of the License at
648f512ceSopenharmony_ci *
748f512ceSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
848f512ceSopenharmony_ci *
948f512ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1048f512ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1148f512ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1248f512ceSopenharmony_ci * See the License for the specific language governing permissions and
1348f512ceSopenharmony_ci * limitations under the License.
1448f512ceSopenharmony_ci */
1548f512ceSopenharmony_ci
1648f512ceSopenharmony_ci#include <sys/utsname.h>
1748f512ceSopenharmony_ci#include "subcommand_list.h"
1848f512ceSopenharmony_ci
1948f512ceSopenharmony_ciusing namespace std;
2048f512ceSopenharmony_cinamespace OHOS {
2148f512ceSopenharmony_cinamespace Developtools {
2248f512ceSopenharmony_cinamespace HiPerf {
2348f512ceSopenharmony_cibool SubCommandList::OnSubCommand(vector<string> &args)
2448f512ceSopenharmony_ci{
2548f512ceSopenharmony_ci    vector<perf_type_id> requestEventTypes;
2648f512ceSopenharmony_ci
2748f512ceSopenharmony_ci    SetHM();
2848f512ceSopenharmony_ci
2948f512ceSopenharmony_ci    if (args.empty()) {
3048f512ceSopenharmony_ci        // all the list
3148f512ceSopenharmony_ci        for (auto it : PERF_TYPES) {
3248f512ceSopenharmony_ci            requestEventTypes.push_back(it.first);
3348f512ceSopenharmony_ci        }
3448f512ceSopenharmony_ci    } else {
3548f512ceSopenharmony_ci        string requestEventType = args.front().c_str();
3648f512ceSopenharmony_ci        auto it = SUPPORT_NAME_OPTIONS.find(requestEventType);
3748f512ceSopenharmony_ci        if (it == SUPPORT_NAME_OPTIONS.end()) {
3848f512ceSopenharmony_ci            printf("not support option: '%s'\n", requestEventType.c_str());
3948f512ceSopenharmony_ci            return false;
4048f512ceSopenharmony_ci        } else {
4148f512ceSopenharmony_ci            requestEventTypes.push_back(it->second);
4248f512ceSopenharmony_ci        }
4348f512ceSopenharmony_ci    }
4448f512ceSopenharmony_ci    ShowSupportEventsTypes(requestEventTypes);
4548f512ceSopenharmony_ci    return true;
4648f512ceSopenharmony_ci}
4748f512ceSopenharmony_cibool SubCommandList::ShowSupportEventsTypes(vector<perf_type_id> requestEventTypes)
4848f512ceSopenharmony_ci{
4948f512ceSopenharmony_ci    // each type
5048f512ceSopenharmony_ci    for (perf_type_id id : requestEventTypes) {
5148f512ceSopenharmony_ci        // each config
5248f512ceSopenharmony_ci        auto configs = perfEvents_.GetSupportEvents(id);
5348f512ceSopenharmony_ci        printf("\nSupported events for %s:\n", PERF_TYPES.at(id).c_str());
5448f512ceSopenharmony_ci        for (auto config : configs) {
5548f512ceSopenharmony_ci            printf("\t%s\n", config.second.c_str());
5648f512ceSopenharmony_ci        }
5748f512ceSopenharmony_ci        if (configs.size() == 0) {
5848f512ceSopenharmony_ci            return false; // support nothing
5948f512ceSopenharmony_ci        }
6048f512ceSopenharmony_ci    }
6148f512ceSopenharmony_ci    std::cout << std::endl;
6248f512ceSopenharmony_ci    return true;
6348f512ceSopenharmony_ci};
6448f512ceSopenharmony_ci
6548f512ceSopenharmony_civoid SubCommandList::RegisterSubCommandList()
6648f512ceSopenharmony_ci{
6748f512ceSopenharmony_ci    SubCommand::RegisterSubCommand("list", make_unique<SubCommandList>());
6848f512ceSopenharmony_ci}
6948f512ceSopenharmony_ci
7048f512ceSopenharmony_civoid SubCommandList::SetHM()
7148f512ceSopenharmony_ci{
7248f512ceSopenharmony_ci    utsname unameBuf;
7348f512ceSopenharmony_ci    if ((uname(&unameBuf)) == 0) {
7448f512ceSopenharmony_ci        std::string osrelease = unameBuf.release;
7548f512ceSopenharmony_ci        isHM_ = osrelease.find(HMKERNEL) != std::string::npos;
7648f512ceSopenharmony_ci    }
7748f512ceSopenharmony_ci    perfEvents_.SetHM(isHM_);
7848f512ceSopenharmony_ci    HLOGD("Set isHM_: %d", isHM_);
7948f512ceSopenharmony_ci}
8048f512ceSopenharmony_ci} // namespace HiPerf
8148f512ceSopenharmony_ci} // namespace Developtools
8248f512ceSopenharmony_ci} // namespace OHOS
83