1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci
16020a203aSopenharmony_ci#include <sys/prctl.h>
17020a203aSopenharmony_ci#include "ThrExecutor.h"
18020a203aSopenharmony_ci#include "hiview_logger.h"
19020a203aSopenharmony_ci
20020a203aSopenharmony_cinamespace OHOS {
21020a203aSopenharmony_cinamespace HiviewDFX {
22020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D66, "Hiview-XPerformance");
23020a203aSopenharmony_ci
24020a203aSopenharmony_ciconst static std::string MAIN_THREAD_NAME = "XperfMainThr";
25020a203aSopenharmony_ci
26020a203aSopenharmony_ciThrExecutor::ThrExecutor()
27020a203aSopenharmony_ci{
28020a203aSopenharmony_ci    ThrTaskContainer* contMain = new ThrTaskContainer();
29020a203aSopenharmony_ci    contMain->StartLoop(MAIN_THREAD_NAME.c_str());
30020a203aSopenharmony_ci    containers.insert(std::pair<int, ThrTaskContainer*>(MAIN_THR, contMain));
31020a203aSopenharmony_ci}
32020a203aSopenharmony_ci
33020a203aSopenharmony_ciThrExecutor::~ThrExecutor()
34020a203aSopenharmony_ci{
35020a203aSopenharmony_ci    for (std::map<int, ThrTaskContainer*>::iterator it = containers.begin(); it != containers.end(); it++) {
36020a203aSopenharmony_ci        ThrTaskContainer* con = it->second;
37020a203aSopenharmony_ci        if (con != nullptr) {
38020a203aSopenharmony_ci            con->StopLoop();
39020a203aSopenharmony_ci        }
40020a203aSopenharmony_ci    }
41020a203aSopenharmony_ci}
42020a203aSopenharmony_ci
43020a203aSopenharmony_civoid ThrExecutor::ValidateNonNull(void* task)
44020a203aSopenharmony_ci{
45020a203aSopenharmony_ci    if (task == nullptr) {
46020a203aSopenharmony_ci        throw std::invalid_argument("null task");
47020a203aSopenharmony_ci    }
48020a203aSopenharmony_ci}
49020a203aSopenharmony_ci
50020a203aSopenharmony_ciclass ProcessTimoutWrapperTask : public ITask {
51020a203aSopenharmony_cipublic:
52020a203aSopenharmony_ci    ProcessTimoutWrapperTask(ITimeoutExecutor::ITimeoutHandler* evtProcessor, std::string name)
53020a203aSopenharmony_ci    {
54020a203aSopenharmony_ci        this->evtProcessor = evtProcessor;
55020a203aSopenharmony_ci        this->name = name;
56020a203aSopenharmony_ci    }
57020a203aSopenharmony_ci
58020a203aSopenharmony_ci    void Run()
59020a203aSopenharmony_ci    {
60020a203aSopenharmony_ci        if (evtProcessor != nullptr) {
61020a203aSopenharmony_ci            evtProcessor->HandleTimeoutInMainThr(this->name);
62020a203aSopenharmony_ci        }
63020a203aSopenharmony_ci        delete this;
64020a203aSopenharmony_ci    }
65020a203aSopenharmony_ci
66020a203aSopenharmony_ci    std::string GetTaskInfo()
67020a203aSopenharmony_ci    {
68020a203aSopenharmony_ci        return this->taskName;
69020a203aSopenharmony_ci    }
70020a203aSopenharmony_ciprivate:
71020a203aSopenharmony_ci    const std::string taskName = "ProcessTimoutWrapperTask";
72020a203aSopenharmony_ci    ITimeoutExecutor::ITimeoutHandler* evtProcessor;
73020a203aSopenharmony_ci    std::string name;
74020a203aSopenharmony_ci};
75020a203aSopenharmony_ci
76020a203aSopenharmony_civoid ThrExecutor::ExecuteTimeoutInMainThr(ITimeoutHandler* task, std::string name)
77020a203aSopenharmony_ci{
78020a203aSopenharmony_ci    ValidateNonNull(task);
79020a203aSopenharmony_ci    ThrTaskContainer* con = containers[MAIN_THR];
80020a203aSopenharmony_ci    if (con != nullptr) {
81020a203aSopenharmony_ci        ITask* evtTask = new ProcessTimoutWrapperTask(task, name);
82020a203aSopenharmony_ci        con->PostTask(evtTask);
83020a203aSopenharmony_ci    } else {
84020a203aSopenharmony_ci        HIVIEW_LOGE("ThrExecutor::ExecuteTimeoutInMainThr main thread task container is null");
85020a203aSopenharmony_ci    }
86020a203aSopenharmony_ci}
87020a203aSopenharmony_ci
88020a203aSopenharmony_ciclass ProcessAppEvtWrapperTask : public ITask {
89020a203aSopenharmony_cipublic:
90020a203aSopenharmony_ci    ProcessAppEvtWrapperTask(IAppThrExecutor::IProcessAppEvtTask* task, const IAppThrExecutor::AppEvtData data)
91020a203aSopenharmony_ci    {
92020a203aSopenharmony_ci        this->evtProcessor = task;
93020a203aSopenharmony_ci        this->data = data;
94020a203aSopenharmony_ci    }
95020a203aSopenharmony_ci
96020a203aSopenharmony_ci    void Run()
97020a203aSopenharmony_ci    {
98020a203aSopenharmony_ci        if (evtProcessor != nullptr) {
99020a203aSopenharmony_ci            evtProcessor->ExecuteProcessAppEvtTaskInMainThr(this->data);
100020a203aSopenharmony_ci        }
101020a203aSopenharmony_ci        delete this;
102020a203aSopenharmony_ci    }
103020a203aSopenharmony_ci
104020a203aSopenharmony_ci    std::string GetTaskInfo()
105020a203aSopenharmony_ci    {
106020a203aSopenharmony_ci        return this->taskName + ", " + data.eventName;
107020a203aSopenharmony_ci    }
108020a203aSopenharmony_ciprivate:
109020a203aSopenharmony_ci    const std::string taskName = "ProcessAppEvtWrapperTask";
110020a203aSopenharmony_ci    IAppThrExecutor::IProcessAppEvtTask* evtProcessor;
111020a203aSopenharmony_ci    IAppThrExecutor::AppEvtData data;
112020a203aSopenharmony_ci};
113020a203aSopenharmony_ci
114020a203aSopenharmony_civoid ThrExecutor::ExecuteHandleEvtInMainThr(IProcessAppEvtTask* task, const AppEvtData& data)
115020a203aSopenharmony_ci{
116020a203aSopenharmony_ci    ValidateNonNull(task);
117020a203aSopenharmony_ci    ThrTaskContainer* con = containers[MAIN_THR];
118020a203aSopenharmony_ci    if (con != nullptr) {
119020a203aSopenharmony_ci        ITask* evtTask = new ProcessAppEvtWrapperTask(task, data);
120020a203aSopenharmony_ci        con->PostTask(evtTask);
121020a203aSopenharmony_ci    } else {
122020a203aSopenharmony_ci        HIVIEW_LOGE("ThrExecutor::ExecuteHandleEvtInMainThr main thread task container is null");
123020a203aSopenharmony_ci    }
124020a203aSopenharmony_ci}
125020a203aSopenharmony_ci
126020a203aSopenharmony_ciclass ProcessMonitorEvtWrapperTask : public ITask {
127020a203aSopenharmony_cipublic:
128020a203aSopenharmony_ci    ProcessMonitorEvtWrapperTask(
129020a203aSopenharmony_ci            IMonitorThrExecutor::IHandleMonitorEvt* handleTask, const std::shared_ptr <XperfEvt> evt)
130020a203aSopenharmony_ci    {
131020a203aSopenharmony_ci        this->handleTask = handleTask;
132020a203aSopenharmony_ci        this->evt = evt;
133020a203aSopenharmony_ci    }
134020a203aSopenharmony_ci
135020a203aSopenharmony_ci    void Run()
136020a203aSopenharmony_ci    {
137020a203aSopenharmony_ci        if (handleTask != nullptr) {
138020a203aSopenharmony_ci            handleTask->HandleMainThrEvt(this->evt);
139020a203aSopenharmony_ci        }
140020a203aSopenharmony_ci        delete this;
141020a203aSopenharmony_ci    }
142020a203aSopenharmony_ci
143020a203aSopenharmony_ci    std::string GetTaskInfo()
144020a203aSopenharmony_ci    {
145020a203aSopenharmony_ci        return this->taskName;
146020a203aSopenharmony_ci    }
147020a203aSopenharmony_ciprivate:
148020a203aSopenharmony_ci    const std::string taskName = "ProcessMonitorEvtWrapperTask";
149020a203aSopenharmony_ci    IMonitorThrExecutor::IHandleMonitorEvt* handleTask;
150020a203aSopenharmony_ci    std::shared_ptr <XperfEvt> evt;
151020a203aSopenharmony_ci};
152020a203aSopenharmony_ci
153020a203aSopenharmony_civoid ThrExecutor::ExecuteMonitorInMainThr(IHandleMonitorEvt* task, std::shared_ptr <XperfEvt> evt)
154020a203aSopenharmony_ci{
155020a203aSopenharmony_ci    ValidateNonNull(task);
156020a203aSopenharmony_ci    ThrTaskContainer* con = containers[MAIN_THR];
157020a203aSopenharmony_ci    if (con != nullptr) {
158020a203aSopenharmony_ci        ITask* evtTask = new ProcessMonitorEvtWrapperTask(task, evt);
159020a203aSopenharmony_ci        con->PostTask(evtTask);
160020a203aSopenharmony_ci    } else {
161020a203aSopenharmony_ci        HIVIEW_LOGE("ThrExecutor::ExecuteMonitorInMainThr main thread task container is null");
162020a203aSopenharmony_ci    }
163020a203aSopenharmony_ci}
164020a203aSopenharmony_ci} // HiviewDFX
165020a203aSopenharmony_ci} // OHOS