1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2021-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#include "hiview_platform.h"
16020a203aSopenharmony_ci#ifndef _WIN32
17020a203aSopenharmony_ci#include <dlfcn.h>
18020a203aSopenharmony_ci#include <sys/stat.h>
19020a203aSopenharmony_ci#include <sys/types.h>
20020a203aSopenharmony_ci#include <unistd.h>
21020a203aSopenharmony_ci#endif
22020a203aSopenharmony_ci#include <cinttypes>
23020a203aSopenharmony_ci#include <csignal>
24020a203aSopenharmony_ci#include <fstream>
25020a203aSopenharmony_ci#include <functional>
26020a203aSopenharmony_ci
27020a203aSopenharmony_ci#include "app_event_publisher.h"
28020a203aSopenharmony_ci#include "app_event_publisher_factory.h"
29020a203aSopenharmony_ci#include "audit.h"
30020a203aSopenharmony_ci#include "backtrace_local.h"
31020a203aSopenharmony_ci#include "common_utils.h"
32020a203aSopenharmony_ci#include "defines.h"
33020a203aSopenharmony_ci#include "dispatch_rule_parser.h"
34020a203aSopenharmony_ci#include "dynamic_module.h"
35020a203aSopenharmony_ci#include "file_util.h"
36020a203aSopenharmony_ci#include "hiview_event_report.h"
37020a203aSopenharmony_ci#include "hiview_global.h"
38020a203aSopenharmony_ci#include "hiview_platform_config.h"
39020a203aSopenharmony_ci#include "hiview_logger.h"
40020a203aSopenharmony_ci#include "parameter_ex.h"
41020a203aSopenharmony_ci#include "param_event_manager.h"
42020a203aSopenharmony_ci#include "plugin_config.h"
43020a203aSopenharmony_ci#include "plugin_factory.h"
44020a203aSopenharmony_ci#include "string_util.h"
45020a203aSopenharmony_ci#include "time_util.h"
46020a203aSopenharmony_ci#include "xcollie/xcollie.h"
47020a203aSopenharmony_ci
48020a203aSopenharmony_cinamespace OHOS {
49020a203aSopenharmony_cinamespace HiviewDFX {
50020a203aSopenharmony_cinamespace {
51020a203aSopenharmony_ciconstexpr uint32_t AID_SYSTEM = 1000;
52020a203aSopenharmony_cistatic const char VERSION[] = "1.0.0.0";
53020a203aSopenharmony_cistatic const char SEPARATOR_VERSION[] = " ";
54020a203aSopenharmony_cistatic const char RECORDER_VERSION[] = "01.00";
55020a203aSopenharmony_cistatic const char PLUGIN_CONFIG_NAME[] = "plugin_config";
56020a203aSopenharmony_cistatic const char HIVIEW_PID_FILE_NAME[] = "hiview.pid";
57020a203aSopenharmony_cistatic const char DEFAULT_CONFIG_DIR[] = "/system/etc/hiview/";
58020a203aSopenharmony_cistatic const char PIPELINE_RULE_CONFIG_DIR[] = "/system/etc/hiview/dispatch_rule/";
59020a203aSopenharmony_cistatic const char DISPATCH_RULE_CONFIG_DIR[] = "/system/etc/hiview/listener_rule/";
60020a203aSopenharmony_cistatic const char DEFAULT_WORK_DIR[] = "/data/log/hiview/";
61020a203aSopenharmony_cistatic const char DEFAULT_COMMERCIAL_WORK_DIR[] = "/log/LogService/";
62020a203aSopenharmony_cistatic const char DEFAULT_PERSIST_DIR[] = "/log/hiview/";
63020a203aSopenharmony_cistatic const char LIB_SEARCH_DIR[] = "/system/lib/";
64020a203aSopenharmony_cistatic const char LIB64_SEARCH_DIR[] = "/system/lib64/";
65020a203aSopenharmony_ci}
66020a203aSopenharmony_ciDEFINE_LOG_TAG("HiView-HiviewPlatform");
67020a203aSopenharmony_ciHiviewPlatform::HiviewPlatform()
68020a203aSopenharmony_ci    : isReady_(false),
69020a203aSopenharmony_ci      defaultConfigDir_(DEFAULT_CONFIG_DIR),
70020a203aSopenharmony_ci      defaultWorkDir_(DEFAULT_WORK_DIR),
71020a203aSopenharmony_ci      defaultCommercialWorkDir_(DEFAULT_COMMERCIAL_WORK_DIR),
72020a203aSopenharmony_ci      defaultPersistDir_(DEFAULT_PERSIST_DIR),
73020a203aSopenharmony_ci      defaultConfigName_(PLUGIN_CONFIG_NAME),
74020a203aSopenharmony_ci      unorderQueue_(nullptr),
75020a203aSopenharmony_ci      sharedWorkLoop_(nullptr)
76020a203aSopenharmony_ci{
77020a203aSopenharmony_ci    dynamicLibSearchDir_.push_back(LIB_SEARCH_DIR);
78020a203aSopenharmony_ci    dynamicLibSearchDir_.push_back(LIB64_SEARCH_DIR);
79020a203aSopenharmony_ci}
80020a203aSopenharmony_ci
81020a203aSopenharmony_ciHiviewPlatform::~HiviewPlatform()
82020a203aSopenharmony_ci{
83020a203aSopenharmony_ci    if (unorderQueue_ != nullptr) {
84020a203aSopenharmony_ci        unorderQueue_->Stop();
85020a203aSopenharmony_ci    }
86020a203aSopenharmony_ci
87020a203aSopenharmony_ci    if (sharedWorkLoop_ != nullptr) {
88020a203aSopenharmony_ci        sharedWorkLoop_->StopLoop();
89020a203aSopenharmony_ci    }
90020a203aSopenharmony_ci    HiviewGlobal::ReleaseInstance();
91020a203aSopenharmony_ci}
92020a203aSopenharmony_ci
93020a203aSopenharmony_civoid HiviewPlatform::SetMaxProxyIdleTime(time_t idleTime)
94020a203aSopenharmony_ci{
95020a203aSopenharmony_ci    maxIdleTime_ = idleTime;
96020a203aSopenharmony_ci}
97020a203aSopenharmony_ci
98020a203aSopenharmony_civoid HiviewPlatform::SetCheckProxyIdlePeriod(time_t period)
99020a203aSopenharmony_ci{
100020a203aSopenharmony_ci    checkIdlePeriod_ = period;
101020a203aSopenharmony_ci}
102020a203aSopenharmony_ci
103020a203aSopenharmony_cibool HiviewPlatform::InitEnvironment(const std::string& platformConfigDir)
104020a203aSopenharmony_ci{
105020a203aSopenharmony_ci    // wait util the samgr is ready
106020a203aSopenharmony_ci    if (auto res = Parameter::WaitParamSync("bootevent.samgr.ready", "true", 5); res != 0) { // timeout is 5s
107020a203aSopenharmony_ci        HIVIEW_LOGE("Fail to wait the samgr, err=%{public}d", res);
108020a203aSopenharmony_ci        return false;
109020a203aSopenharmony_ci    }
110020a203aSopenharmony_ci    CreateWorkingDirectories(platformConfigDir);
111020a203aSopenharmony_ci
112020a203aSopenharmony_ci    // update beta config
113020a203aSopenharmony_ci    UpdateBetaConfigIfNeed();
114020a203aSopenharmony_ci
115020a203aSopenharmony_ci    // check whether hiview is already started
116020a203aSopenharmony_ci    ExitHiviewIfNeed();
117020a203aSopenharmony_ci
118020a203aSopenharmony_ci    std::string cfgPath = GetPluginConfigPath();
119020a203aSopenharmony_ci    PluginConfig config(cfgPath);
120020a203aSopenharmony_ci    if (!config.StartParse()) {
121020a203aSopenharmony_ci        HIVIEW_LOGE("Fail to parse plugin config. exit!, cfgPath %{public}s", cfgPath.c_str());
122020a203aSopenharmony_ci        return false;
123020a203aSopenharmony_ci    }
124020a203aSopenharmony_ci    StartPlatformDispatchQueue();
125020a203aSopenharmony_ci
126020a203aSopenharmony_ci    // init global context helper, remove in the future
127020a203aSopenharmony_ci    HiviewGlobal::CreateInstance(static_cast<HiviewContext&>(*this));
128020a203aSopenharmony_ci    LoadBusinessPlugin(config);
129020a203aSopenharmony_ci
130020a203aSopenharmony_ci    // start load plugin bundles
131020a203aSopenharmony_ci    LoadPluginBundles();
132020a203aSopenharmony_ci
133020a203aSopenharmony_ci    // maple delay start eventsource
134020a203aSopenharmony_ci    for (const auto& plugin : eventSourceList_) {
135020a203aSopenharmony_ci        auto sharedSource = std::static_pointer_cast<EventSource>(plugin);
136020a203aSopenharmony_ci        if (sharedSource == nullptr) {
137020a203aSopenharmony_ci            HIVIEW_LOGE("Fail to cast plugin to event source!");
138020a203aSopenharmony_ci            continue;
139020a203aSopenharmony_ci        }
140020a203aSopenharmony_ci        StartEventSource(sharedSource);
141020a203aSopenharmony_ci    }
142020a203aSopenharmony_ci    eventSourceList_.clear();
143020a203aSopenharmony_ci    isReady_ = true;
144020a203aSopenharmony_ci    NotifyPluginReady();
145020a203aSopenharmony_ci    ScheduleCheckUnloadablePlugins();
146020a203aSopenharmony_ci    OHOS::Singleton<ParamEventManager>::GetInstance().SubscriberEvent();
147020a203aSopenharmony_ci    if (Parameter::IsBetaVersion()) {
148020a203aSopenharmony_ci        AddWatchDog();
149020a203aSopenharmony_ci    }
150020a203aSopenharmony_ci    return true;
151020a203aSopenharmony_ci}
152020a203aSopenharmony_ci
153020a203aSopenharmony_civoid HiviewPlatform::SaveStack()
154020a203aSopenharmony_ci{
155020a203aSopenharmony_ci    if (hasDumpStack_) {
156020a203aSopenharmony_ci        return;
157020a203aSopenharmony_ci    }
158020a203aSopenharmony_ci
159020a203aSopenharmony_ci    std::string workPath = HiviewGlobal::GetInstance()->GetHiViewDirectory(
160020a203aSopenharmony_ci        HiviewContext::DirectoryType::WORK_DIRECTORY);
161020a203aSopenharmony_ci    std::string stackPath = FileUtil::IncludeTrailingPathDelimiter(workPath) + "hiview_stack.log";
162020a203aSopenharmony_ci    std::string stackTrace = GetProcessStacktrace();
163020a203aSopenharmony_ci    HIVIEW_LOGI("XCollieCallback: %{public}zu", stackTrace.length());
164020a203aSopenharmony_ci    if (!FileUtil::SaveStringToFile(stackPath, stackTrace)) {
165020a203aSopenharmony_ci        HIVIEW_LOGE("XCollieCallback: save stack fail.");
166020a203aSopenharmony_ci        return;
167020a203aSopenharmony_ci    }
168020a203aSopenharmony_ci
169020a203aSopenharmony_ci    if (chmod(stackPath.c_str(), FileUtil::FILE_PERM_600) != 0) {
170020a203aSopenharmony_ci        HIVIEW_LOGE("XCollieCallback: chmod fail.");
171020a203aSopenharmony_ci    }
172020a203aSopenharmony_ci    hasDumpStack_ = true;
173020a203aSopenharmony_ci}
174020a203aSopenharmony_ci
175020a203aSopenharmony_civoid HiviewPlatform::AddWatchDog()
176020a203aSopenharmony_ci{
177020a203aSopenharmony_ci    constexpr int HICOLLIE_TIMER_SECOND = 60 * 5;
178020a203aSopenharmony_ci    watchDogTimer_ = HiviewDFX::XCollie::GetInstance().SetTimer("hiview_watchdog", HICOLLIE_TIMER_SECOND,
179020a203aSopenharmony_ci        [this](void *) { SaveStack(); }, nullptr, HiviewDFX::XCOLLIE_FLAG_NOOP);
180020a203aSopenharmony_ci
181020a203aSopenharmony_ci    auto task = [this] {
182020a203aSopenharmony_ci        HiviewDFX::XCollie::GetInstance().CancelTimer(watchDogTimer_);
183020a203aSopenharmony_ci        watchDogTimer_ = HiviewDFX::XCollie::GetInstance().SetTimer("hiview_watchdog", HICOLLIE_TIMER_SECOND,
184020a203aSopenharmony_ci            [this](void *) { SaveStack(); }, nullptr, HiviewDFX::XCOLLIE_FLAG_NOOP);
185020a203aSopenharmony_ci    };
186020a203aSopenharmony_ci    constexpr int RESET_TIMER_SECOND = 60;
187020a203aSopenharmony_ci    sharedWorkLoop_->AddTimerEvent(nullptr, nullptr, task, RESET_TIMER_SECOND, true);
188020a203aSopenharmony_ci    HIVIEW_LOGI("add watch dog task");
189020a203aSopenharmony_ci}
190020a203aSopenharmony_ci
191020a203aSopenharmony_civoid HiviewPlatform::CreateWorkingDirectories(const std::string& platformConfigDir)
192020a203aSopenharmony_ci{
193020a203aSopenharmony_ci    HiviewPlatformConfig platformConfig = HiviewPlatformConfig(platformConfigDir);
194020a203aSopenharmony_ci    HiviewPlatformConfig::PlatformConfigInfo platformConfigInfo;
195020a203aSopenharmony_ci    bool state = platformConfig.ParsesConfig(platformConfigInfo);
196020a203aSopenharmony_ci    if (state) {
197020a203aSopenharmony_ci        if (platformConfigInfo.defaultPluginConfigName != "") {
198020a203aSopenharmony_ci        defaultConfigName_ = platformConfigInfo.defaultPluginConfigName;
199020a203aSopenharmony_ci        }
200020a203aSopenharmony_ci        if (FileUtil::IsDirectory(platformConfigInfo.commercialWorkDir)) {
201020a203aSopenharmony_ci            defaultCommercialWorkDir_ = platformConfigInfo.commercialWorkDir;
202020a203aSopenharmony_ci        }
203020a203aSopenharmony_ci        if (platformConfigInfo.dynamicLib64SearchDir != ""
204020a203aSopenharmony_ci            || platformConfigInfo.dynamicLibSearchDir != "") {
205020a203aSopenharmony_ci            dynamicLibSearchDir_.clear();
206020a203aSopenharmony_ci        }
207020a203aSopenharmony_ci        if (platformConfigInfo.dynamicLib64SearchDir != "") {
208020a203aSopenharmony_ci            dynamicLibSearchDir_.push_back(platformConfigInfo.dynamicLib64SearchDir);
209020a203aSopenharmony_ci        }
210020a203aSopenharmony_ci        if (platformConfigInfo.dynamicLibSearchDir != "") {
211020a203aSopenharmony_ci            dynamicLibSearchDir_.push_back(platformConfigInfo.dynamicLibSearchDir);
212020a203aSopenharmony_ci        }
213020a203aSopenharmony_ci        ValidateAndCreateDirectories(platformConfigInfo.pluginConfigFileDir,
214020a203aSopenharmony_ci                                     platformConfigInfo.workDir,
215020a203aSopenharmony_ci                                     platformConfigInfo.persistDir);
216020a203aSopenharmony_ci    }
217020a203aSopenharmony_ci}
218020a203aSopenharmony_ci
219020a203aSopenharmony_civoid HiviewPlatform::UpdateBetaConfigIfNeed()
220020a203aSopenharmony_ci{
221020a203aSopenharmony_ci}
222020a203aSopenharmony_ci
223020a203aSopenharmony_civoid HiviewPlatform::LoadBusinessPlugin(const PluginConfig& config)
224020a203aSopenharmony_ci{
225020a203aSopenharmony_ci    // start to load plugin
226020a203aSopenharmony_ci    // 1. create plugin
227020a203aSopenharmony_ci    auto const& pluginInfoList = config.GetPluginInfoList();
228020a203aSopenharmony_ci    for (auto const& pluginInfo : pluginInfoList) {
229020a203aSopenharmony_ci        HIVIEW_LOGI("Start to create plugin %{public}s delay:%{public}d", pluginInfo.name.c_str(),
230020a203aSopenharmony_ci                    pluginInfo.loadDelay);
231020a203aSopenharmony_ci        if (pluginInfo.loadDelay > 0) {
232020a203aSopenharmony_ci            auto task = std::bind(&HiviewPlatform::ScheduleCreateAndInitPlugin, this, pluginInfo);
233020a203aSopenharmony_ci            sharedWorkLoop_->AddTimerEvent(nullptr, nullptr, task, pluginInfo.loadDelay, false);
234020a203aSopenharmony_ci        } else {
235020a203aSopenharmony_ci            CreatePlugin(pluginInfo);
236020a203aSopenharmony_ci        }
237020a203aSopenharmony_ci    }
238020a203aSopenharmony_ci    // 2. create pipelines
239020a203aSopenharmony_ci    auto const& pipelineInfoList = config.GetPipelineInfoList();
240020a203aSopenharmony_ci    for (auto const& pipelineInfo : pipelineInfoList) {
241020a203aSopenharmony_ci        HIVIEW_LOGI("Start to create pipeline %{public}s", pipelineInfo.name.c_str());
242020a203aSopenharmony_ci        CreatePipeline(pipelineInfo);
243020a203aSopenharmony_ci    }
244020a203aSopenharmony_ci
245020a203aSopenharmony_ci    // 3. bind pipeline and call onload of event source
246020a203aSopenharmony_ci    for (auto const& pluginInfo : pluginInfoList) {
247020a203aSopenharmony_ci        HIVIEW_LOGI("Start to Load plugin %{public}s", pluginInfo.name.c_str());
248020a203aSopenharmony_ci        InitPlugin(config, pluginInfo);
249020a203aSopenharmony_ci    }
250020a203aSopenharmony_ci
251020a203aSopenharmony_ci    // 4. delay start EventSource
252020a203aSopenharmony_ci    for (auto const& pluginInfo : pluginInfoList) {
253020a203aSopenharmony_ci        if (pluginInfo.isEventSource) {
254020a203aSopenharmony_ci            HIVIEW_LOGI("Start to Load eventSource %{public}s", pluginInfo.name.c_str());
255020a203aSopenharmony_ci            auto& plugin = pluginMap_[pluginInfo.name];
256020a203aSopenharmony_ci            auto sharedSource = std::static_pointer_cast<EventSource>(plugin);
257020a203aSopenharmony_ci            if (sharedSource == nullptr) {
258020a203aSopenharmony_ci                HIVIEW_LOGE("Fail to cast plugin to event source!");
259020a203aSopenharmony_ci                continue;
260020a203aSopenharmony_ci            }
261020a203aSopenharmony_ci            eventSourceList_.push_back(plugin);
262020a203aSopenharmony_ci        }
263020a203aSopenharmony_ci    }
264020a203aSopenharmony_ci
265020a203aSopenharmony_ci    CleanupUnusedResources();
266020a203aSopenharmony_ci}
267020a203aSopenharmony_ci
268020a203aSopenharmony_cistd::string HiviewPlatform::SplitBundleNameFromPath(const std::string& filePath)
269020a203aSopenharmony_ci{
270020a203aSopenharmony_ci        // the path should be like /system/etc/hiview/bundleName_plugin_config
271020a203aSopenharmony_ci        auto pos = filePath.find_last_of("/\\");
272020a203aSopenharmony_ci        if (pos == std::string::npos) {
273020a203aSopenharmony_ci            return "";
274020a203aSopenharmony_ci        }
275020a203aSopenharmony_ci
276020a203aSopenharmony_ci        std::string fileName = filePath.substr(pos + 1);
277020a203aSopenharmony_ci        pos = fileName.find(defaultConfigName_);
278020a203aSopenharmony_ci        if (pos == std::string::npos || pos == 0) {
279020a203aSopenharmony_ci            return "";
280020a203aSopenharmony_ci        }
281020a203aSopenharmony_ci
282020a203aSopenharmony_ci        pos = fileName.find_first_of("_");
283020a203aSopenharmony_ci        if (pos == std::string::npos) {
284020a203aSopenharmony_ci            return "";
285020a203aSopenharmony_ci        }
286020a203aSopenharmony_ci
287020a203aSopenharmony_ci        return fileName.substr(0, pos);
288020a203aSopenharmony_ci}
289020a203aSopenharmony_ci
290020a203aSopenharmony_cistd::string HiviewPlatform::SearchPluginBundle(const std::string& name) const
291020a203aSopenharmony_ci{
292020a203aSopenharmony_ci    for (const auto& pathPrefix : dynamicLibSearchDir_) {
293020a203aSopenharmony_ci        std::string bundlePath = pathPrefix  + GetDynamicLibName(name, true);
294020a203aSopenharmony_ci        printf("bundlePath is %s\n", bundlePath.c_str());
295020a203aSopenharmony_ci        if (FileUtil::FileExists(bundlePath)) {
296020a203aSopenharmony_ci            return bundlePath;
297020a203aSopenharmony_ci        }
298020a203aSopenharmony_ci    }
299020a203aSopenharmony_ci    return "";
300020a203aSopenharmony_ci}
301020a203aSopenharmony_ci
302020a203aSopenharmony_civoid HiviewPlatform::LoadPluginBundle(const std::string& bundleName, const std::string& filePath)
303020a203aSopenharmony_ci{
304020a203aSopenharmony_ci    PluginConfig config(filePath);
305020a203aSopenharmony_ci    if (!config.StartParse()) {
306020a203aSopenharmony_ci        HIVIEW_LOGE("Fail to parse plugin config %{public}s, filePath is %{public}s",
307020a203aSopenharmony_ci            bundleName.c_str(), filePath.c_str());
308020a203aSopenharmony_ci        return;
309020a203aSopenharmony_ci    }
310020a203aSopenharmony_ci
311020a203aSopenharmony_ci    std::string bundlePath = SearchPluginBundle(bundleName);
312020a203aSopenharmony_ci    if (bundlePath == "") {
313020a203aSopenharmony_ci        HIVIEW_LOGE("bundleName: %{public}s doesn't exist", bundleName.c_str());
314020a203aSopenharmony_ci        return;
315020a203aSopenharmony_ci    }
316020a203aSopenharmony_ci    auto handle = LoadModule(bundlePath);
317020a203aSopenharmony_ci    if (handle == DynamicModuleDefault) {
318020a203aSopenharmony_ci        return;
319020a203aSopenharmony_ci    }
320020a203aSopenharmony_ci
321020a203aSopenharmony_ci    LoadBusinessPlugin(config);
322020a203aSopenharmony_ci    std::shared_ptr<PluginBundle> bundle = std::make_shared<PluginBundle>(bundleName, config, handle);
323020a203aSopenharmony_ci    pluginBundleInfos_.insert(std::pair<std::string, std::shared_ptr<PluginBundle>>(bundleName, bundle));
324020a203aSopenharmony_ci}
325020a203aSopenharmony_ci
326020a203aSopenharmony_civoid HiviewPlatform::LoadPluginBundles()
327020a203aSopenharmony_ci{
328020a203aSopenharmony_ci    std::vector<std::string> configFiles;
329020a203aSopenharmony_ci    FileUtil::GetDirFiles(defaultConfigDir_, configFiles);
330020a203aSopenharmony_ci    sort(configFiles.begin(), configFiles.end()); // guarantee DFT plugins config parse first
331020a203aSopenharmony_ci    for (const auto& filePath : configFiles) {
332020a203aSopenharmony_ci        auto bundleName = SplitBundleNameFromPath(filePath);
333020a203aSopenharmony_ci        if (bundleName.empty()) {
334020a203aSopenharmony_ci            continue;
335020a203aSopenharmony_ci        }
336020a203aSopenharmony_ci        LoadPluginBundle(bundleName, filePath);
337020a203aSopenharmony_ci    }
338020a203aSopenharmony_ci}
339020a203aSopenharmony_ci
340020a203aSopenharmony_civoid HiviewPlatform::ProcessArgsRequest(int argc, char* argv[])
341020a203aSopenharmony_ci{
342020a203aSopenharmony_ci#ifndef _WIN32
343020a203aSopenharmony_ci    umask(0002); // 0002 is block other write permissions, -------w-
344020a203aSopenharmony_ci    signal(SIGPIPE, SIG_IGN);
345020a203aSopenharmony_ci    int ch = -1;
346020a203aSopenharmony_ci    while ((ch = getopt(argc, argv, "v")) != -1) {
347020a203aSopenharmony_ci        if (ch == 'v') {
348020a203aSopenharmony_ci            HIVIEW_LOGI("hiview version: %s%s%s", VERSION, SEPARATOR_VERSION, RECORDER_VERSION);
349020a203aSopenharmony_ci            printf("hiview version: %s%s%s\n", VERSION, SEPARATOR_VERSION, RECORDER_VERSION);
350020a203aSopenharmony_ci            _exit(1);
351020a203aSopenharmony_ci        }
352020a203aSopenharmony_ci    }
353020a203aSopenharmony_ci#endif // !_WIN32
354020a203aSopenharmony_ci}
355020a203aSopenharmony_ci
356020a203aSopenharmony_ciDynamicModule HiviewPlatform::LoadDynamicPlugin(const std::string& name) const
357020a203aSopenharmony_ci{
358020a203aSopenharmony_ci    // if the plugin Class is AbcPlugin, the so name should be libabcplugin.z.so
359020a203aSopenharmony_ci    std::string dynamicPluginName = GetDynamicLibName(name, true);
360020a203aSopenharmony_ci    auto handle = LoadModule(dynamicPluginName.c_str());
361020a203aSopenharmony_ci    if (handle == nullptr) {
362020a203aSopenharmony_ci        // retry load library
363020a203aSopenharmony_ci        dynamicPluginName = GetDynamicLibName(name, false);
364020a203aSopenharmony_ci        handle = LoadModule(dynamicPluginName.c_str());
365020a203aSopenharmony_ci    }
366020a203aSopenharmony_ci    return handle;
367020a203aSopenharmony_ci}
368020a203aSopenharmony_ci
369020a203aSopenharmony_cistd::string HiviewPlatform::GetDynamicLibName(const std::string& name, bool hasOhosSuffix) const
370020a203aSopenharmony_ci{
371020a203aSopenharmony_ci#ifdef __HIVIEW_OHOS__
372020a203aSopenharmony_ci    std::string tmp = "lib" + name;
373020a203aSopenharmony_ci    if (hasOhosSuffix) {
374020a203aSopenharmony_ci        tmp.append(".z.so");
375020a203aSopenharmony_ci    } else {
376020a203aSopenharmony_ci        tmp.append(".so");
377020a203aSopenharmony_ci    }
378020a203aSopenharmony_ci
379020a203aSopenharmony_ci    for (unsigned i = 0; i < tmp.length(); i++) {
380020a203aSopenharmony_ci        tmp[i] = std::tolower(tmp[i]);
381020a203aSopenharmony_ci    }
382020a203aSopenharmony_ci    return tmp;
383020a203aSopenharmony_ci#elif defined(_WIN32)
384020a203aSopenharmony_ci    std::string dynamicLibName = "";
385020a203aSopenharmony_ci    dynamicLibName.append(name);
386020a203aSopenharmony_ci    dynamicLibName.append(".dll");
387020a203aSopenharmony_ci    return dynamicLibName;
388020a203aSopenharmony_ci#else
389020a203aSopenharmony_ci    // dynamic plugins feature is only enabled in double framework version
390020a203aSopenharmony_ci    (void)hasOhosSuffix;
391020a203aSopenharmony_ci    HIVIEW_LOGI("could not load dynamic lib %s, not supported yet.", name.c_str());
392020a203aSopenharmony_ci    return "";
393020a203aSopenharmony_ci#endif
394020a203aSopenharmony_ci}
395020a203aSopenharmony_ci
396020a203aSopenharmony_civoid HiviewPlatform::CreatePlugin(const PluginConfig::PluginInfo& pluginInfo)
397020a203aSopenharmony_ci{
398020a203aSopenharmony_ci    if (pluginInfo.name.empty()) {
399020a203aSopenharmony_ci        return;
400020a203aSopenharmony_ci    }
401020a203aSopenharmony_ci    if (pluginMap_.find(pluginInfo.name) != pluginMap_.end()) {
402020a203aSopenharmony_ci        HiviewEventReport::ReportPluginLoad(pluginInfo.name, PluginEventSpace::LOAD_DUPLICATE_NAME);
403020a203aSopenharmony_ci        HIVIEW_LOGW("plugin %{public}s already exists! create plugin failed", pluginInfo.name.c_str());
404020a203aSopenharmony_ci        return;
405020a203aSopenharmony_ci    }
406020a203aSopenharmony_ci    // the dynamic plugin will register it's constructor to factory automatically after opening the binary
407020a203aSopenharmony_ci    // if we get null in factory, it means something must go wrong.
408020a203aSopenharmony_ci    DynamicModule handle = DynamicModuleDefault;
409020a203aSopenharmony_ci    if (!pluginInfo.isStatic) {
410020a203aSopenharmony_ci        handle = LoadDynamicPlugin(pluginInfo.name);
411020a203aSopenharmony_ci    }
412020a203aSopenharmony_ci
413020a203aSopenharmony_ci    std::shared_ptr<PluginRegistInfo> registInfo = PluginFactory::GetGlobalPluginInfo(pluginInfo.name);
414020a203aSopenharmony_ci    if (registInfo == nullptr) {
415020a203aSopenharmony_ci        HiviewEventReport::ReportPluginLoad(pluginInfo.name, PluginEventSpace::LOAD_UNREGISTERED);
416020a203aSopenharmony_ci        if (handle != DynamicModuleDefault) {
417020a203aSopenharmony_ci            UnloadModule(handle);
418020a203aSopenharmony_ci        }
419020a203aSopenharmony_ci        return;
420020a203aSopenharmony_ci    }
421020a203aSopenharmony_ci
422020a203aSopenharmony_ci    std::shared_ptr<Plugin> plugin = nullptr;
423020a203aSopenharmony_ci    if (registInfo->needCreateProxy) {
424020a203aSopenharmony_ci        plugin = std::make_shared<PluginProxy>();
425020a203aSopenharmony_ci        plugin->SetType(Plugin::PluginType::PROXY);
426020a203aSopenharmony_ci        (std::static_pointer_cast<PluginProxy>(plugin))->SetPluginConfig(pluginInfo);
427020a203aSopenharmony_ci    } else {
428020a203aSopenharmony_ci        plugin = registInfo->getPluginObject();
429020a203aSopenharmony_ci    }
430020a203aSopenharmony_ci
431020a203aSopenharmony_ci    // app event publisher
432020a203aSopenharmony_ci    if (AppEventPublisherFactory::IsPublisher(pluginInfo.name)) {
433020a203aSopenharmony_ci        auto appEventHandler = std::make_shared<AppEventHandler>();
434020a203aSopenharmony_ci        (std::static_pointer_cast<AppEventPublisher>(plugin))->AddAppEventHandler(appEventHandler);
435020a203aSopenharmony_ci    }
436020a203aSopenharmony_ci
437020a203aSopenharmony_ci    // Initialize plugin parameters
438020a203aSopenharmony_ci    plugin->SetName(pluginInfo.name);
439020a203aSopenharmony_ci    plugin->SetHandle(handle);
440020a203aSopenharmony_ci    plugin->SetHiviewContext(this);
441020a203aSopenharmony_ci
442020a203aSopenharmony_ci    // call preload, check whether we should release at once
443020a203aSopenharmony_ci    if (!plugin->ReadyToLoad()) {
444020a203aSopenharmony_ci        // if the plugin is a dynamic loaded library, the handle will be closed when calling the destructor
445020a203aSopenharmony_ci        return;
446020a203aSopenharmony_ci    }
447020a203aSopenharmony_ci    // hold the global reference of the plugin
448020a203aSopenharmony_ci    pluginMap_[pluginInfo.name] = std::move(plugin);
449020a203aSopenharmony_ci}
450020a203aSopenharmony_ci
451020a203aSopenharmony_civoid HiviewPlatform::CreatePipeline(const PluginConfig::PipelineInfo& pipelineInfo)
452020a203aSopenharmony_ci{
453020a203aSopenharmony_ci    if (pipelines_.find(pipelineInfo.name) != pipelines_.end()) {
454020a203aSopenharmony_ci        HIVIEW_LOGW("pipeline %{public}s already exists! create pipeline failed", pipelineInfo.name.c_str());
455020a203aSopenharmony_ci        return;
456020a203aSopenharmony_ci    }
457020a203aSopenharmony_ci
458020a203aSopenharmony_ci    std::list<std::weak_ptr<Plugin>> pluginList;
459020a203aSopenharmony_ci    for (const auto& pluginName : pipelineInfo.pluginNameList) {
460020a203aSopenharmony_ci        if (pluginMap_.find(pluginName) == pluginMap_.end()) {
461020a203aSopenharmony_ci            HIVIEW_LOGI("could not find plugin(%{public}s), skip adding to pipeline(%{public}s).",
462020a203aSopenharmony_ci                pluginName.c_str(), pipelineInfo.name.c_str());
463020a203aSopenharmony_ci            continue;
464020a203aSopenharmony_ci        }
465020a203aSopenharmony_ci        pluginList.push_back(pluginMap_[pluginName]);
466020a203aSopenharmony_ci    }
467020a203aSopenharmony_ci
468020a203aSopenharmony_ci    std::shared_ptr<Pipeline> pipeline = std::make_shared<Pipeline>(pipelineInfo.name, pluginList);
469020a203aSopenharmony_ci    pipelines_[pipelineInfo.name] = std::move(pipeline);
470020a203aSopenharmony_ci
471020a203aSopenharmony_ci    std::string configPath = PIPELINE_RULE_CONFIG_DIR + pipelineInfo.name;
472020a203aSopenharmony_ci    HIVIEW_LOGI("config file=%{public}s", configPath.c_str());
473020a203aSopenharmony_ci    if (!FileUtil::FileExists(configPath)) {
474020a203aSopenharmony_ci        HIVIEW_LOGI("file=%{public}s does not exist", configPath.c_str());
475020a203aSopenharmony_ci        return;
476020a203aSopenharmony_ci    }
477020a203aSopenharmony_ci    DispatchRuleParser ruleParser(configPath);
478020a203aSopenharmony_ci    if (auto rule = ruleParser.GetRule(); rule != nullptr) {
479020a203aSopenharmony_ci        pipelineRules_[pipelineInfo.name] = rule;
480020a203aSopenharmony_ci    } else {
481020a203aSopenharmony_ci        HIVIEW_LOGE("failed to parse config file=%{public}s", configPath.c_str());
482020a203aSopenharmony_ci    }
483020a203aSopenharmony_ci}
484020a203aSopenharmony_ci
485020a203aSopenharmony_civoid HiviewPlatform::InitPlugin(const PluginConfig& config __UNUSED, const PluginConfig::PluginInfo& pluginInfo)
486020a203aSopenharmony_ci{
487020a203aSopenharmony_ci    if (pluginMap_.find(pluginInfo.name) == pluginMap_.end()) {
488020a203aSopenharmony_ci        return;
489020a203aSopenharmony_ci    }
490020a203aSopenharmony_ci    auto& plugin = pluginMap_[pluginInfo.name];
491020a203aSopenharmony_ci
492020a203aSopenharmony_ci    if (pluginInfo.workHandlerType == "thread") {
493020a203aSopenharmony_ci        auto workLoop = GetAvailableWorkLoop(pluginInfo.workHandlerName);
494020a203aSopenharmony_ci        plugin->BindWorkLoop(workLoop);
495020a203aSopenharmony_ci    }
496020a203aSopenharmony_ci
497020a203aSopenharmony_ci    uint64_t beginTime = TimeUtil::GenerateTimestamp();
498020a203aSopenharmony_ci    plugin->OnLoad();
499020a203aSopenharmony_ci
500020a203aSopenharmony_ci    if (std::string configPath = DISPATCH_RULE_CONFIG_DIR + pluginInfo.name; FileUtil::FileExists(configPath)) {
501020a203aSopenharmony_ci        HIVIEW_LOGI("config file=%{public}s", configPath.c_str());
502020a203aSopenharmony_ci        DispatchRuleParser ruleParser(configPath);
503020a203aSopenharmony_ci        if (auto rule = ruleParser.GetRule(); rule != nullptr) {
504020a203aSopenharmony_ci            AddDispatchInfo(std::weak_ptr<Plugin>(plugin), rule->typeList,
505020a203aSopenharmony_ci                rule->eventList, rule->tagList, rule->domainRuleMap);
506020a203aSopenharmony_ci        } else {
507020a203aSopenharmony_ci            HIVIEW_LOGE("failed to parse config file=%{public}s", configPath.c_str());
508020a203aSopenharmony_ci        }
509020a203aSopenharmony_ci    }
510020a203aSopenharmony_ci
511020a203aSopenharmony_ci    if (pluginInfo.isEventSource) {
512020a203aSopenharmony_ci        auto sharedSource = std::static_pointer_cast<EventSource>(plugin);
513020a203aSopenharmony_ci        if (sharedSource == nullptr) {
514020a203aSopenharmony_ci            HIVIEW_LOGE("Fail to cast plugin to event source!");
515020a203aSopenharmony_ci            return;
516020a203aSopenharmony_ci        }
517020a203aSopenharmony_ci        for (const auto& pipelineName : pluginInfo.pipelineNameList) {
518020a203aSopenharmony_ci            sharedSource->AddPipeline(pipelines_[pipelineName]);
519020a203aSopenharmony_ci        }
520020a203aSopenharmony_ci    }
521020a203aSopenharmony_ci
522020a203aSopenharmony_ci    if (plugin->GetType() == Plugin::PluginType::PROXY) {
523020a203aSopenharmony_ci        std::shared_ptr<PluginRegistInfo> registInfo = PluginFactory::GetGlobalPluginInfo(pluginInfo.name);
524020a203aSopenharmony_ci        if (registInfo != nullptr && registInfo->needStartupLoading) {
525020a203aSopenharmony_ci            std::shared_ptr<PluginProxy> pluginProxy = std::static_pointer_cast<PluginProxy>(plugin);
526020a203aSopenharmony_ci            pluginProxy->LoadPluginIfNeed();
527020a203aSopenharmony_ci        }
528020a203aSopenharmony_ci    }
529020a203aSopenharmony_ci
530020a203aSopenharmony_ci    uint64_t endTime = TimeUtil::GenerateTimestamp();
531020a203aSopenharmony_ci    uint64_t loadDuration = endTime > beginTime ? (endTime - beginTime) : 0;
532020a203aSopenharmony_ci    HIVIEW_LOGI("Plugin %{public}s loadtime:%{public}" PRIu64 ".", pluginInfo.name.c_str(), loadDuration);
533020a203aSopenharmony_ci    HiviewEventReport::ReportPluginLoad(pluginInfo.name, PluginEventSpace::LOAD_SUCCESS, loadDuration);
534020a203aSopenharmony_ci}
535020a203aSopenharmony_ci
536020a203aSopenharmony_civoid HiviewPlatform::NotifyPluginReady()
537020a203aSopenharmony_ci{
538020a203aSopenharmony_ci    auto event = std::make_shared<Event>("platform");
539020a203aSopenharmony_ci    event->messageType_ = Event::MessageType::PLUGIN_MAINTENANCE;
540020a203aSopenharmony_ci    event->eventId_ = Event::EventId::PLUGIN_LOADED;
541020a203aSopenharmony_ci    PostUnorderedEvent(nullptr, event);
542020a203aSopenharmony_ci}
543020a203aSopenharmony_ci
544020a203aSopenharmony_civoid HiviewPlatform::StartEventSource(std::shared_ptr<EventSource> source)
545020a203aSopenharmony_ci{
546020a203aSopenharmony_ci    auto workLoop = source->GetWorkLoop();
547020a203aSopenharmony_ci    auto name = source->GetName();
548020a203aSopenharmony_ci    if (workLoop == nullptr) {
549020a203aSopenharmony_ci        HIVIEW_LOGW("No work loop available, start event source[%s] in current thead!", name.c_str());
550020a203aSopenharmony_ci        source->StartEventSource();
551020a203aSopenharmony_ci    } else {
552020a203aSopenharmony_ci        HIVIEW_LOGI("Start event source[%s] in thead[%s].", name.c_str(), workLoop->GetName().c_str());
553020a203aSopenharmony_ci        auto task = std::bind(&EventSource::StartEventSource, source.get());
554020a203aSopenharmony_ci        workLoop->AddEvent(nullptr, nullptr, task);
555020a203aSopenharmony_ci    }
556020a203aSopenharmony_ci    HIVIEW_LOGI("Start event source[%s] in current thead done.", name.c_str());
557020a203aSopenharmony_ci}
558020a203aSopenharmony_ci
559020a203aSopenharmony_ci// only call from main thread
560020a203aSopenharmony_cistd::shared_ptr<EventLoop> HiviewPlatform::GetAvailableWorkLoop(const std::string& name)
561020a203aSopenharmony_ci{
562020a203aSopenharmony_ci    auto it = privateWorkLoopMap_.find(name);
563020a203aSopenharmony_ci    if (it != privateWorkLoopMap_.end()) {
564020a203aSopenharmony_ci        return it->second;
565020a203aSopenharmony_ci    }
566020a203aSopenharmony_ci
567020a203aSopenharmony_ci    auto privateLoop = std::make_shared<EventLoop>(name);
568020a203aSopenharmony_ci    if (privateLoop != nullptr) {
569020a203aSopenharmony_ci        privateWorkLoopMap_.insert(std::make_pair(name, privateLoop));
570020a203aSopenharmony_ci        privateLoop->StartLoop();
571020a203aSopenharmony_ci    }
572020a203aSopenharmony_ci    return privateLoop;
573020a203aSopenharmony_ci}
574020a203aSopenharmony_ci
575020a203aSopenharmony_civoid HiviewPlatform::CleanupUnusedResources()
576020a203aSopenharmony_ci{
577020a203aSopenharmony_ci    auto iter = pluginMap_.begin();
578020a203aSopenharmony_ci    while (iter != pluginMap_.end()) {
579020a203aSopenharmony_ci        if (iter->second == nullptr) {
580020a203aSopenharmony_ci            iter = pluginMap_.erase(iter);
581020a203aSopenharmony_ci        } else {
582020a203aSopenharmony_ci            ++iter;
583020a203aSopenharmony_ci        }
584020a203aSopenharmony_ci    }
585020a203aSopenharmony_ci}
586020a203aSopenharmony_ci
587020a203aSopenharmony_civoid HiviewPlatform::ScheduleCreateAndInitPlugin(const PluginConfig::PluginInfo& pluginInfo)
588020a203aSopenharmony_ci{
589020a203aSopenharmony_ci    // only support thread type
590020a203aSopenharmony_ci    CreatePlugin(pluginInfo);
591020a203aSopenharmony_ci    if (pluginMap_.find(pluginInfo.name) == pluginMap_.end()) {
592020a203aSopenharmony_ci        return;
593020a203aSopenharmony_ci    }
594020a203aSopenharmony_ci    auto& plugin = pluginMap_[pluginInfo.name];
595020a203aSopenharmony_ci
596020a203aSopenharmony_ci    if (pluginInfo.workHandlerType == "thread") {
597020a203aSopenharmony_ci        auto workLoop = GetAvailableWorkLoop(pluginInfo.workHandlerName);
598020a203aSopenharmony_ci        plugin->BindWorkLoop(workLoop);
599020a203aSopenharmony_ci    }
600020a203aSopenharmony_ci    plugin->OnLoad();
601020a203aSopenharmony_ci}
602020a203aSopenharmony_ci
603020a203aSopenharmony_civoid HiviewPlatform::StartLoop()
604020a203aSopenharmony_ci{
605020a203aSopenharmony_ci    // empty implementation
606020a203aSopenharmony_ci}
607020a203aSopenharmony_ci
608020a203aSopenharmony_civoid HiviewPlatform::StartPlatformDispatchQueue()
609020a203aSopenharmony_ci{
610020a203aSopenharmony_ci    if (unorderQueue_ == nullptr) {
611020a203aSopenharmony_ci        unorderQueue_ = std::make_shared<EventDispatchQueue>("plat_unorder", Event::ManageType::UNORDERED, this);
612020a203aSopenharmony_ci        unorderQueue_->Start();
613020a203aSopenharmony_ci    }
614020a203aSopenharmony_ci
615020a203aSopenharmony_ci    if (sharedWorkLoop_ == nullptr) {
616020a203aSopenharmony_ci        sharedWorkLoop_ = std::make_shared<EventLoop>("plat_shared");
617020a203aSopenharmony_ci        sharedWorkLoop_->StartLoop();
618020a203aSopenharmony_ci    }
619020a203aSopenharmony_ci}
620020a203aSopenharmony_ci
621020a203aSopenharmony_cistd::list<std::weak_ptr<Plugin>> HiviewPlatform::GetPipelineSequenceByName(const std::string& name)
622020a203aSopenharmony_ci{
623020a203aSopenharmony_ci    if (!isReady_) {
624020a203aSopenharmony_ci        return std::list<std::weak_ptr<Plugin>>();
625020a203aSopenharmony_ci    }
626020a203aSopenharmony_ci
627020a203aSopenharmony_ci    auto it = pipelines_.find(name);
628020a203aSopenharmony_ci    if (it != pipelines_.end()) {
629020a203aSopenharmony_ci        return it->second->GetProcessSequence();
630020a203aSopenharmony_ci    }
631020a203aSopenharmony_ci    return std::list<std::weak_ptr<Plugin>>(0);
632020a203aSopenharmony_ci}
633020a203aSopenharmony_ci
634020a203aSopenharmony_civoid HiviewPlatform::PostUnorderedEvent(std::shared_ptr<Plugin> plugin, std::shared_ptr<Event> event)
635020a203aSopenharmony_ci{
636020a203aSopenharmony_ci    if (!isReady_) {
637020a203aSopenharmony_ci        return;
638020a203aSopenharmony_ci    }
639020a203aSopenharmony_ci
640020a203aSopenharmony_ci    if (plugin == nullptr) {
641020a203aSopenharmony_ci        HIVIEW_LOGI("maybe platform send event");
642020a203aSopenharmony_ci    }
643020a203aSopenharmony_ci
644020a203aSopenharmony_ci    if (unorderQueue_ != nullptr && event != nullptr) {
645020a203aSopenharmony_ci        event->processType_ = Event::ManageType::UNORDERED;
646020a203aSopenharmony_ci        unorderQueue_->Enqueue(event);
647020a203aSopenharmony_ci    }
648020a203aSopenharmony_ci}
649020a203aSopenharmony_ci
650020a203aSopenharmony_civoid HiviewPlatform::RegisterUnorderedEventListener(std::weak_ptr<EventListener> listener)
651020a203aSopenharmony_ci{
652020a203aSopenharmony_ci    auto ptr = listener.lock();
653020a203aSopenharmony_ci    if (ptr == nullptr) {
654020a203aSopenharmony_ci        return;
655020a203aSopenharmony_ci    }
656020a203aSopenharmony_ci    auto name = ptr->GetListenerName();
657020a203aSopenharmony_ci    auto itListenerInfo = listeners_.find(name);
658020a203aSopenharmony_ci    if (itListenerInfo == listeners_.end()) {
659020a203aSopenharmony_ci        auto tmp = std::make_shared<ListenerInfo>();
660020a203aSopenharmony_ci        tmp->listener_ = listener;
661020a203aSopenharmony_ci        listeners_[name] = tmp;
662020a203aSopenharmony_ci    } else {
663020a203aSopenharmony_ci        auto tmp = listeners_[name];
664020a203aSopenharmony_ci        tmp->listener_ = listener;
665020a203aSopenharmony_ci    }
666020a203aSopenharmony_ci}
667020a203aSopenharmony_ci
668020a203aSopenharmony_cibool HiviewPlatform::PostSyncEventToTarget(std::shared_ptr<Plugin> caller, const std::string& calleeName,
669020a203aSopenharmony_ci                                           std::shared_ptr<Event> event)
670020a203aSopenharmony_ci{
671020a203aSopenharmony_ci    if (!isReady_) {
672020a203aSopenharmony_ci        return false;
673020a203aSopenharmony_ci    }
674020a203aSopenharmony_ci
675020a203aSopenharmony_ci    auto it = pluginMap_.find(calleeName);
676020a203aSopenharmony_ci    if (it == pluginMap_.end()) {
677020a203aSopenharmony_ci        return false;
678020a203aSopenharmony_ci    }
679020a203aSopenharmony_ci
680020a203aSopenharmony_ci    auto callee = it->second;
681020a203aSopenharmony_ci    if (callee == nullptr) {
682020a203aSopenharmony_ci        return false;
683020a203aSopenharmony_ci    }
684020a203aSopenharmony_ci
685020a203aSopenharmony_ci    auto workLoop = callee->GetWorkLoop();
686020a203aSopenharmony_ci    std::future<bool> ret;
687020a203aSopenharmony_ci    if (workLoop == nullptr) {
688020a203aSopenharmony_ci        ret = sharedWorkLoop_->AddEventForResult(callee, event);
689020a203aSopenharmony_ci    } else {
690020a203aSopenharmony_ci        ret = workLoop->AddEventForResult(callee, event);
691020a203aSopenharmony_ci    }
692020a203aSopenharmony_ci    return ret.get();
693020a203aSopenharmony_ci}
694020a203aSopenharmony_ci
695020a203aSopenharmony_civoid HiviewPlatform::PostAsyncEventToTarget(std::shared_ptr<Plugin> caller, const std::string& calleeName,
696020a203aSopenharmony_ci                                            std::shared_ptr<Event> event)
697020a203aSopenharmony_ci{
698020a203aSopenharmony_ci    if (!isReady_) {
699020a203aSopenharmony_ci        return;
700020a203aSopenharmony_ci    }
701020a203aSopenharmony_ci
702020a203aSopenharmony_ci    auto it = pluginMap_.find(calleeName);
703020a203aSopenharmony_ci    if (it == pluginMap_.end()) {
704020a203aSopenharmony_ci        return;
705020a203aSopenharmony_ci    }
706020a203aSopenharmony_ci
707020a203aSopenharmony_ci    auto callee = it->second;
708020a203aSopenharmony_ci    if (callee == nullptr) {
709020a203aSopenharmony_ci        return;
710020a203aSopenharmony_ci    }
711020a203aSopenharmony_ci
712020a203aSopenharmony_ci    auto workLoop = callee->GetWorkLoop();
713020a203aSopenharmony_ci    if (workLoop == nullptr) {
714020a203aSopenharmony_ci        sharedWorkLoop_->AddEvent(callee, event);
715020a203aSopenharmony_ci    } else {
716020a203aSopenharmony_ci        workLoop->AddEvent(callee, event);
717020a203aSopenharmony_ci    }
718020a203aSopenharmony_ci    HIVIEW_LOGI("Post async event to %{public}s successfully", calleeName.c_str());
719020a203aSopenharmony_ci}
720020a203aSopenharmony_ci
721020a203aSopenharmony_cistd::shared_ptr<EventLoop> HiviewPlatform::GetSharedWorkLoop()
722020a203aSopenharmony_ci{
723020a203aSopenharmony_ci    return sharedWorkLoop_;
724020a203aSopenharmony_ci}
725020a203aSopenharmony_ci
726020a203aSopenharmony_cibool HiviewPlatform::IsReady()
727020a203aSopenharmony_ci{
728020a203aSopenharmony_ci    return isReady_;
729020a203aSopenharmony_ci}
730020a203aSopenharmony_ci
731020a203aSopenharmony_civoid HiviewPlatform::RequestUnloadPlugin(std::shared_ptr<Plugin> caller)
732020a203aSopenharmony_ci{
733020a203aSopenharmony_ci    if (caller == nullptr) {
734020a203aSopenharmony_ci        HiviewEventReport::ReportPluginUnload("", PluginEventSpace::UNLOAD_INVALID);
735020a203aSopenharmony_ci        return;
736020a203aSopenharmony_ci    }
737020a203aSopenharmony_ci
738020a203aSopenharmony_ci    std::string name = caller->GetName();
739020a203aSopenharmony_ci    auto task = std::bind(&HiviewPlatform::UnloadPlugin, this, name);
740020a203aSopenharmony_ci    // delay 1s to unload target plugin
741020a203aSopenharmony_ci    const int unloadDelay = 1;
742020a203aSopenharmony_ci    sharedWorkLoop_->AddTimerEvent(nullptr, nullptr, task, unloadDelay, false);
743020a203aSopenharmony_ci}
744020a203aSopenharmony_ci
745020a203aSopenharmony_civoid HiviewPlatform::UnloadPlugin(const std::string& name)
746020a203aSopenharmony_ci{
747020a203aSopenharmony_ci    auto it = pluginMap_.find(name);
748020a203aSopenharmony_ci    if (it == pluginMap_.end()) {
749020a203aSopenharmony_ci        HiviewEventReport::ReportPluginUnload(name, PluginEventSpace::UNLOAD_NOT_FOUND);
750020a203aSopenharmony_ci        return;
751020a203aSopenharmony_ci    }
752020a203aSopenharmony_ci    auto target = it->second;
753020a203aSopenharmony_ci    if (target == nullptr) {
754020a203aSopenharmony_ci        HIVIEW_LOGW("Plugin %{public}s target is null.", name.c_str());
755020a203aSopenharmony_ci        return;
756020a203aSopenharmony_ci    }
757020a203aSopenharmony_ci    auto count = target.use_count();
758020a203aSopenharmony_ci    if (count > 2) { // two counts for 1.current ref 2.map holder ref
759020a203aSopenharmony_ci        HIVIEW_LOGW("Plugin %{public}s has more refs(%{public}ld), may caused by unfinished task. unload failed.",
760020a203aSopenharmony_ci            name.c_str(), count);
761020a203aSopenharmony_ci        HiviewEventReport::ReportPluginUnload(name, PluginEventSpace::UNLOAD_IN_USE);
762020a203aSopenharmony_ci        return;
763020a203aSopenharmony_ci    }
764020a203aSopenharmony_ci    pluginMap_.erase(name);
765020a203aSopenharmony_ci    target->OnUnload();
766020a203aSopenharmony_ci
767020a203aSopenharmony_ci    // By default, reloading is not supported after unloading!
768020a203aSopenharmony_ci    PluginFactory::UnregisterPlugin(target->GetName());
769020a203aSopenharmony_ci    // report unloading success event
770020a203aSopenharmony_ci    HiviewEventReport::ReportPluginUnload(name, PluginEventSpace::UNLOAD_SUCCESS);
771020a203aSopenharmony_ci
772020a203aSopenharmony_ci    auto looper = target->GetWorkLoop();
773020a203aSopenharmony_ci    if (looper == nullptr) {
774020a203aSopenharmony_ci        return;
775020a203aSopenharmony_ci    }
776020a203aSopenharmony_ci    if (looper.use_count() <= 3) { // three counts for 1.current ref 2.plugin ref 3.map holder ref
777020a203aSopenharmony_ci        auto looperName = looper->GetRawName();
778020a203aSopenharmony_ci        HIVIEW_LOGI("%{public}s has refs(%{public}ld).", looperName.c_str(), looper.use_count());
779020a203aSopenharmony_ci        looper->StopLoop();
780020a203aSopenharmony_ci        privateWorkLoopMap_.erase(looperName);
781020a203aSopenharmony_ci        HIVIEW_LOGI("Stop %{public}s done.", looperName.c_str());
782020a203aSopenharmony_ci    }
783020a203aSopenharmony_ci}
784020a203aSopenharmony_ci
785020a203aSopenharmony_cistd::string HiviewPlatform::GetHiViewDirectory(HiviewContext::DirectoryType type)
786020a203aSopenharmony_ci{
787020a203aSopenharmony_ci    switch (type) {
788020a203aSopenharmony_ci        case HiviewContext::DirectoryType::CONFIG_DIRECTORY:
789020a203aSopenharmony_ci            return defaultConfigDir_;
790020a203aSopenharmony_ci        case HiviewContext::DirectoryType::WORK_DIRECTORY:
791020a203aSopenharmony_ci            return defaultWorkDir_;
792020a203aSopenharmony_ci        case HiviewContext::DirectoryType::PERSIST_DIR:
793020a203aSopenharmony_ci            return defaultPersistDir_;
794020a203aSopenharmony_ci        default:
795020a203aSopenharmony_ci            break;
796020a203aSopenharmony_ci    }
797020a203aSopenharmony_ci    return "";
798020a203aSopenharmony_ci}
799020a203aSopenharmony_ci
800020a203aSopenharmony_civoid HiviewPlatform::ValidateAndCreateDirectory(std::string& defaultPath, const std::string& realPath)
801020a203aSopenharmony_ci{
802020a203aSopenharmony_ci    if (defaultPath != realPath) {
803020a203aSopenharmony_ci        defaultPath = realPath;
804020a203aSopenharmony_ci    }
805020a203aSopenharmony_ci    if (FileUtil::IsDirectory(defaultPath)) {
806020a203aSopenharmony_ci        return;
807020a203aSopenharmony_ci    }
808020a203aSopenharmony_ci    FileUtil::CreateDirWithDefaultPerm(defaultPath, AID_SYSTEM, AID_SYSTEM);
809020a203aSopenharmony_ci}
810020a203aSopenharmony_ci
811020a203aSopenharmony_civoid HiviewPlatform::ValidateAndCreateDirectories(const std::string& localPath, const std::string& workPath,
812020a203aSopenharmony_ci    const std::string& persistPath)
813020a203aSopenharmony_ci{
814020a203aSopenharmony_ci    ValidateAndCreateDirectory(defaultConfigDir_, localPath);
815020a203aSopenharmony_ci    ValidateAndCreateDirectory(defaultWorkDir_, workPath);
816020a203aSopenharmony_ci    ValidateAndCreateDirectory(defaultPersistDir_, persistPath);
817020a203aSopenharmony_ci}
818020a203aSopenharmony_ci
819020a203aSopenharmony_ci#ifndef _WIN32
820020a203aSopenharmony_civoid HiviewPlatform::ExitHiviewIfNeed()
821020a203aSopenharmony_ci{
822020a203aSopenharmony_ci    int selfPid = getpid();
823020a203aSopenharmony_ci    std::string selfProcName = CommonUtils::GetProcNameByPid(selfPid);
824020a203aSopenharmony_ci    if (selfProcName != "hiview") {
825020a203aSopenharmony_ci        return;
826020a203aSopenharmony_ci    }
827020a203aSopenharmony_ci
828020a203aSopenharmony_ci    std::string pidFile = defaultWorkDir_ + "/" + std::string(HIVIEW_PID_FILE_NAME);
829020a203aSopenharmony_ci    if (!FileUtil::FileExists(pidFile)) {
830020a203aSopenharmony_ci        return;
831020a203aSopenharmony_ci    }
832020a203aSopenharmony_ci
833020a203aSopenharmony_ci    std::string content;
834020a203aSopenharmony_ci    FileUtil::LoadStringFromFile(pidFile, content);
835020a203aSopenharmony_ci    int32_t pid = -1;
836020a203aSopenharmony_ci    if (!StringUtil::StrToInt(content, pid)) {
837020a203aSopenharmony_ci        return;
838020a203aSopenharmony_ci    }
839020a203aSopenharmony_ci
840020a203aSopenharmony_ci    std::string procName = CommonUtils::GetProcNameByPid(pid);
841020a203aSopenharmony_ci    if (procName == "hiview") {
842020a203aSopenharmony_ci        printf("Hiview is already started, exit! \n");
843020a203aSopenharmony_ci        exit(1);
844020a203aSopenharmony_ci    }
845020a203aSopenharmony_ci    FileUtil::SaveStringToFile(pidFile, std::to_string(selfPid));
846020a203aSopenharmony_ci}
847020a203aSopenharmony_ci#else
848020a203aSopenharmony_civoid HiviewPlatform::ExitHiviewIfNeed()
849020a203aSopenharmony_ci{
850020a203aSopenharmony_ci}
851020a203aSopenharmony_ci#endif
852020a203aSopenharmony_ci
853020a203aSopenharmony_cistd::string HiviewPlatform::GetPluginConfigPath()
854020a203aSopenharmony_ci{
855020a203aSopenharmony_ci    return defaultConfigDir_ + defaultConfigName_;
856020a203aSopenharmony_ci}
857020a203aSopenharmony_ci
858020a203aSopenharmony_civoid HiviewPlatform::AppendPluginToPipeline(const std::string& pluginName, const std::string& pipelineName)
859020a203aSopenharmony_ci{
860020a203aSopenharmony_ci    auto it = pipelines_.find(pipelineName);
861020a203aSopenharmony_ci    if (it == pipelines_.end()) {
862020a203aSopenharmony_ci        HIVIEW_LOGW("Fail to find pipeline with name :%{public}s", pipelineName.c_str());
863020a203aSopenharmony_ci        return;
864020a203aSopenharmony_ci    }
865020a203aSopenharmony_ci    auto ptr = GetPluginByName(pluginName);
866020a203aSopenharmony_ci    if (ptr == nullptr) {
867020a203aSopenharmony_ci        HIVIEW_LOGW("Fail to find plugin with name :%{public}s", pluginName.c_str());
868020a203aSopenharmony_ci        return;
869020a203aSopenharmony_ci    }
870020a203aSopenharmony_ci    it->second->AppendProcessor(ptr);
871020a203aSopenharmony_ci    HIVIEW_LOGI("plugin %{public}s add to pipeline %{public}s succeed.", pluginName.c_str(), pipelineName.c_str());
872020a203aSopenharmony_ci}
873020a203aSopenharmony_ci
874020a203aSopenharmony_civoid HiviewPlatform::RequestLoadBundle(const std::string& bundleName)
875020a203aSopenharmony_ci{
876020a203aSopenharmony_ci    if (pluginBundleInfos_.find(bundleName) != pluginBundleInfos_.end()) {
877020a203aSopenharmony_ci        HIVIEW_LOGW("Bundle already loaded.");
878020a203aSopenharmony_ci        return;
879020a203aSopenharmony_ci    }
880020a203aSopenharmony_ci
881020a203aSopenharmony_ci    std::string configPath = defaultConfigDir_ + bundleName + "_plugin_config";
882020a203aSopenharmony_ci    LoadPluginBundle(bundleName, configPath);
883020a203aSopenharmony_ci}
884020a203aSopenharmony_ci
885020a203aSopenharmony_civoid HiviewPlatform::RequestUnloadBundle(const std::string& bundleName, uint64_t delay)
886020a203aSopenharmony_ci{
887020a203aSopenharmony_ci    auto task = [this, bundleName]() {
888020a203aSopenharmony_ci        HIVIEW_LOGI("start to unload the bundle %{public}s.", bundleName.c_str());
889020a203aSopenharmony_ci        if (pluginBundleInfos_.find(bundleName) != pluginBundleInfos_.end()) {
890020a203aSopenharmony_ci            pluginBundleInfos_.erase(bundleName);
891020a203aSopenharmony_ci        }
892020a203aSopenharmony_ci    };
893020a203aSopenharmony_ci    sharedWorkLoop_->AddTimerEvent(nullptr, nullptr, task, delay, false);
894020a203aSopenharmony_ci}
895020a203aSopenharmony_ci
896020a203aSopenharmony_cistd::shared_ptr<Plugin> HiviewPlatform::InstancePluginByProxy(std::shared_ptr<Plugin> proxy)
897020a203aSopenharmony_ci{
898020a203aSopenharmony_ci    if (proxy == nullptr) {
899020a203aSopenharmony_ci        return nullptr;
900020a203aSopenharmony_ci    }
901020a203aSopenharmony_ci
902020a203aSopenharmony_ci    auto proxyPtr = std::static_pointer_cast<PluginProxy>(proxy);
903020a203aSopenharmony_ci    std::shared_ptr<PluginRegistInfo> registInfo = PluginFactory::GetGlobalPluginInfo(proxyPtr->GetName());
904020a203aSopenharmony_ci    if (registInfo == nullptr) {
905020a203aSopenharmony_ci        HIVIEW_LOGE("Failed to find registInfo:%{public}s", proxyPtr->GetName().c_str());
906020a203aSopenharmony_ci        return nullptr;
907020a203aSopenharmony_ci    }
908020a203aSopenharmony_ci
909020a203aSopenharmony_ci    auto plugin = registInfo->getPluginObject();
910020a203aSopenharmony_ci    plugin->SetName(proxyPtr->GetName());
911020a203aSopenharmony_ci    plugin->SetHiviewContext(this);
912020a203aSopenharmony_ci    plugin->BindWorkLoop(proxyPtr->GetWorkLoop());
913020a203aSopenharmony_ci    plugin->OnLoad();
914020a203aSopenharmony_ci    auto config = proxyPtr->GetPluginConfig();
915020a203aSopenharmony_ci    if (config.isEventSource) {
916020a203aSopenharmony_ci        auto sharedSource = std::static_pointer_cast<EventSource>(plugin);
917020a203aSopenharmony_ci        for (auto& pipelineName : config.pipelineNameList) {
918020a203aSopenharmony_ci            sharedSource->AddPipeline(pipelines_[pipelineName]);
919020a203aSopenharmony_ci        }
920020a203aSopenharmony_ci        eventSourceList_.push_back(plugin);
921020a203aSopenharmony_ci    }
922020a203aSopenharmony_ci    return plugin;
923020a203aSopenharmony_ci}
924020a203aSopenharmony_ci
925020a203aSopenharmony_cistd::shared_ptr<Plugin> HiviewPlatform::GetPluginByName(const std::string& name)
926020a203aSopenharmony_ci{
927020a203aSopenharmony_ci    auto it = pluginMap_.find(name);
928020a203aSopenharmony_ci    if (it == pluginMap_.end()) {
929020a203aSopenharmony_ci        return nullptr;
930020a203aSopenharmony_ci    }
931020a203aSopenharmony_ci    return it->second;
932020a203aSopenharmony_ci}
933020a203aSopenharmony_ci
934020a203aSopenharmony_cistd::string HiviewPlatform::GetHiviewProperty(const std::string& key, const std::string& defaultValue)
935020a203aSopenharmony_ci{
936020a203aSopenharmony_ci    auto propPair = hiviewProperty_.find(key);
937020a203aSopenharmony_ci    if (propPair != hiviewProperty_.end()) {
938020a203aSopenharmony_ci        return propPair->second;
939020a203aSopenharmony_ci    }
940020a203aSopenharmony_ci    return Parameter::GetString(key, defaultValue);
941020a203aSopenharmony_ci}
942020a203aSopenharmony_ci
943020a203aSopenharmony_cibool HiviewPlatform::SetHiviewProperty(const std::string& key, const std::string& value, bool forceUpdate)
944020a203aSopenharmony_ci{
945020a203aSopenharmony_ci    auto propPair = hiviewProperty_.find(key);
946020a203aSopenharmony_ci    if (forceUpdate || (propPair == hiviewProperty_.end())) {
947020a203aSopenharmony_ci        hiviewProperty_[key] = value;
948020a203aSopenharmony_ci        return true;
949020a203aSopenharmony_ci    }
950020a203aSopenharmony_ci    return Parameter::SetProperty(key, value);
951020a203aSopenharmony_ci}
952020a203aSopenharmony_ci
953020a203aSopenharmony_civoid HiviewPlatform::CheckUnloadablePlugins()
954020a203aSopenharmony_ci{
955020a203aSopenharmony_ci    for (auto const &pluginKv : pluginMap_) {
956020a203aSopenharmony_ci        if (pluginKv.second->GetType() != Plugin::PluginType::PROXY) {
957020a203aSopenharmony_ci            continue;
958020a203aSopenharmony_ci        }
959020a203aSopenharmony_ci        auto ptr = std::static_pointer_cast<PluginProxy>(pluginKv.second);
960020a203aSopenharmony_ci        if (ptr == nullptr) {
961020a203aSopenharmony_ci            continue;
962020a203aSopenharmony_ci        }
963020a203aSopenharmony_ci        std::shared_ptr<EventLoop> eventloop = ptr->GetWorkLoop();
964020a203aSopenharmony_ci        if (eventloop != nullptr) {
965020a203aSopenharmony_ci            auto task = std::bind(&PluginProxy::DestroyInstanceIfNeed, ptr.get(), maxIdleTime_);
966020a203aSopenharmony_ci            if (eventloop->AddEvent(nullptr, nullptr, task) != 0) {
967020a203aSopenharmony_ci                continue;
968020a203aSopenharmony_ci            }
969020a203aSopenharmony_ci            HIVIEW_LOGW("AddEvent failed");
970020a203aSopenharmony_ci        }
971020a203aSopenharmony_ci        ptr->DestroyInstanceIfNeed(maxIdleTime_);
972020a203aSopenharmony_ci    }
973020a203aSopenharmony_ci}
974020a203aSopenharmony_ci
975020a203aSopenharmony_civoid HiviewPlatform::ScheduleCheckUnloadablePlugins()
976020a203aSopenharmony_ci{
977020a203aSopenharmony_ci    auto task = std::bind(&HiviewPlatform::CheckUnloadablePlugins, this);
978020a203aSopenharmony_ci    sharedWorkLoop_->AddTimerEvent(nullptr, nullptr, task, checkIdlePeriod_, true);
979020a203aSopenharmony_ci}
980020a203aSopenharmony_ci
981020a203aSopenharmony_civoid HiviewPlatform::AddDispatchInfo(std::weak_ptr<Plugin> plugin, const std::unordered_set<uint8_t>& types,
982020a203aSopenharmony_ci    const std::unordered_set<std::string>& eventNames, const std::unordered_set<std::string>& tags,
983020a203aSopenharmony_ci    const std::unordered_map<std::string, DomainRule>& domainRulesMap)
984020a203aSopenharmony_ci{
985020a203aSopenharmony_ci    auto ptr = plugin.lock();
986020a203aSopenharmony_ci    if (ptr == nullptr) {
987020a203aSopenharmony_ci        return;
988020a203aSopenharmony_ci    }
989020a203aSopenharmony_ci    auto name = ptr->GetName();
990020a203aSopenharmony_ci    auto itDispatchInfo = dispatchers_.find(name);
991020a203aSopenharmony_ci    std::shared_ptr<DispatchInfo> data = nullptr;
992020a203aSopenharmony_ci    if (itDispatchInfo == dispatchers_.end()) {
993020a203aSopenharmony_ci        auto tmp = std::make_shared<DispatchInfo>();
994020a203aSopenharmony_ci        tmp->plugin_ = plugin;
995020a203aSopenharmony_ci        dispatchers_[name] = tmp;
996020a203aSopenharmony_ci        data = dispatchers_[name];
997020a203aSopenharmony_ci    } else {
998020a203aSopenharmony_ci        data = itDispatchInfo->second;
999020a203aSopenharmony_ci    }
1000020a203aSopenharmony_ci    if (!types.empty()) {
1001020a203aSopenharmony_ci        data->typesInfo_.insert(types.begin(), types.end());
1002020a203aSopenharmony_ci    }
1003020a203aSopenharmony_ci    if (!tags.empty()) {
1004020a203aSopenharmony_ci        data->tagsInfo_.insert(tags.begin(), tags.end());
1005020a203aSopenharmony_ci    }
1006020a203aSopenharmony_ci    if (!eventNames.empty()) {
1007020a203aSopenharmony_ci        data->eventsInfo_.insert(eventNames.begin(), eventNames.end());
1008020a203aSopenharmony_ci    }
1009020a203aSopenharmony_ci    if (!domainRulesMap.empty()) {
1010020a203aSopenharmony_ci        data->domainsInfo_.insert(domainRulesMap.begin(), domainRulesMap.end());
1011020a203aSopenharmony_ci    }
1012020a203aSopenharmony_ci}
1013020a203aSopenharmony_ci
1014020a203aSopenharmony_civoid HiviewPlatform::AddListenerInfo(uint32_t type, const std::string& name, const std::set<std::string>& eventNames,
1015020a203aSopenharmony_ci    const std::map<std::string, DomainRule>& domainRulesMap)
1016020a203aSopenharmony_ci{
1017020a203aSopenharmony_ci    auto itListenerInfo = listeners_.find(name);
1018020a203aSopenharmony_ci    std::shared_ptr<ListenerInfo> data = nullptr;
1019020a203aSopenharmony_ci    if (itListenerInfo == listeners_.end()) {
1020020a203aSopenharmony_ci        auto tmp = std::make_shared<ListenerInfo>();
1021020a203aSopenharmony_ci        listeners_[name] = tmp;
1022020a203aSopenharmony_ci        data = listeners_[name];
1023020a203aSopenharmony_ci    } else {
1024020a203aSopenharmony_ci        data = itListenerInfo->second;
1025020a203aSopenharmony_ci    }
1026020a203aSopenharmony_ci    if (!eventNames.empty()) {
1027020a203aSopenharmony_ci        auto it = data->eventsInfo_.find(type);
1028020a203aSopenharmony_ci        if (it != data->eventsInfo_.end()) {
1029020a203aSopenharmony_ci            it->second.insert(eventNames.begin(), eventNames.end());
1030020a203aSopenharmony_ci        } else {
1031020a203aSopenharmony_ci            data->eventsInfo_[type] = eventNames;
1032020a203aSopenharmony_ci        }
1033020a203aSopenharmony_ci    }
1034020a203aSopenharmony_ci    if (!domainRulesMap.empty()) {
1035020a203aSopenharmony_ci        auto it = data->domainsInfo_.find(type);
1036020a203aSopenharmony_ci        if (it != data->domainsInfo_.end()) {
1037020a203aSopenharmony_ci            it->second.insert(domainRulesMap.begin(), domainRulesMap.end());
1038020a203aSopenharmony_ci        } else {
1039020a203aSopenharmony_ci            data->domainsInfo_[type] = domainRulesMap;
1040020a203aSopenharmony_ci        }
1041020a203aSopenharmony_ci    }
1042020a203aSopenharmony_ci}
1043020a203aSopenharmony_ci
1044020a203aSopenharmony_civoid HiviewPlatform::AddListenerInfo(uint32_t type, const std::string& name)
1045020a203aSopenharmony_ci{
1046020a203aSopenharmony_ci    auto itListenerInfo = listeners_.find(name);
1047020a203aSopenharmony_ci    std::shared_ptr<ListenerInfo> data = nullptr;
1048020a203aSopenharmony_ci    if (itListenerInfo == listeners_.end()) {
1049020a203aSopenharmony_ci        auto tmp = std::make_shared<ListenerInfo>();
1050020a203aSopenharmony_ci        listeners_[name] = tmp;
1051020a203aSopenharmony_ci        data = listeners_[name];
1052020a203aSopenharmony_ci    } else {
1053020a203aSopenharmony_ci        data = itListenerInfo->second;
1054020a203aSopenharmony_ci    }
1055020a203aSopenharmony_ci    data->messageTypes_.push_back(type);
1056020a203aSopenharmony_ci}
1057020a203aSopenharmony_ci
1058020a203aSopenharmony_cistd::vector<std::weak_ptr<EventListener>> HiviewPlatform::GetListenerInfo(uint32_t type,
1059020a203aSopenharmony_ci    const std::string& eventName, const std::string& domain)
1060020a203aSopenharmony_ci{
1061020a203aSopenharmony_ci    std::vector<std::weak_ptr<EventListener>> ret;
1062020a203aSopenharmony_ci    for (auto& pairListener : listeners_) {
1063020a203aSopenharmony_ci        auto listenerInfo = pairListener.second;
1064020a203aSopenharmony_ci        if (listenerInfo->Match(type, eventName, domain)) {
1065020a203aSopenharmony_ci            ret.push_back(listenerInfo->listener_);
1066020a203aSopenharmony_ci        }
1067020a203aSopenharmony_ci    }
1068020a203aSopenharmony_ci    return ret;
1069020a203aSopenharmony_ci}
1070020a203aSopenharmony_ci
1071020a203aSopenharmony_cistd::vector<std::weak_ptr<Plugin>> HiviewPlatform::GetDisPatcherInfo(uint32_t type,
1072020a203aSopenharmony_ci    const std::string& eventName, const std::string& tag, const std::string& domain)
1073020a203aSopenharmony_ci{
1074020a203aSopenharmony_ci    std::vector<std::weak_ptr<Plugin>> ret;
1075020a203aSopenharmony_ci    for (auto& pairDispatcher : dispatchers_) {
1076020a203aSopenharmony_ci        auto dispatcherInfo = pairDispatcher.second;
1077020a203aSopenharmony_ci        if (dispatcherInfo->Match(type, eventName, tag, domain)) {
1078020a203aSopenharmony_ci            ret.push_back(dispatcherInfo->plugin_);
1079020a203aSopenharmony_ci        }
1080020a203aSopenharmony_ci    }
1081020a203aSopenharmony_ci    return ret;
1082020a203aSopenharmony_ci}
1083020a203aSopenharmony_ci} // namespace HiviewDFX
1084020a203aSopenharmony_ci} // namespace OHOS
1085