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