MCPcopy Create free account
hub / github.com/AimRT/AimRT / LoadPkg

Method LoadPkg

src/runtime/core/module/module_loader.cc:19–118  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

17static constexpr const char* kDynlibDestroyModuleFuncName = "AimRTDynlibDestroyModule";
18
19void ModuleLoader::LoadPkg(std::string_view pkg_path,
20 const std::vector<std::string>& disable_modules,
21 const std::vector<std::string>& enable_modules) {
22 pkg_path_ = pkg_path;
23
24 AIMRT_CHECK_ERROR_THROW(dynamic_lib_.Load(pkg_path_),
25 "Load dynamic lib failed, lib path {}, error info {}",
26 pkg_path_, aimrt::common::util::DynamicLib::GetErr());
27
28 auto* get_module_num_func = dynamic_lib_.GetSymbol(kDynlibGetModuleNumFuncName);
29 AIMRT_CHECK_ERROR_THROW(get_module_num_func != nullptr,
30 "Cannot find symbol '{}' in lib {}.",
31 kDynlibGetModuleNumFuncName, pkg_path_);
32
33 auto* get_module_name_list_func = dynamic_lib_.GetSymbol(kDynlibGetModuleNameListFuncName);
34 AIMRT_CHECK_ERROR_THROW(get_module_name_list_func != nullptr,
35 "Cannot find symbol '{}' in lib {}.",
36 kDynlibGetModuleNameListFuncName, pkg_path_);
37
38 auto* create_func = dynamic_lib_.GetSymbol(kDynlibCreateModuleFuncName);
39 AIMRT_CHECK_ERROR_THROW(create_func != nullptr,
40 "Cannot find symbol '{}' in lib {}.",
41 kDynlibCreateModuleFuncName, pkg_path_);
42
43 destroy_func_ = dynamic_lib_.GetSymbol(kDynlibDestroyModuleFuncName);
44 AIMRT_CHECK_ERROR_THROW(destroy_func_ != nullptr,
45 "Cannot find symbol '{}' in lib {}.",
46 kDynlibDestroyModuleFuncName, pkg_path_);
47
48 size_t module_num = ((DynlibGetModuleNumFunc)get_module_num_func)();
49 AIMRT_CHECK_ERROR_THROW(module_num > 0, "No module in lib {}.", pkg_path_);
50
51 const aimrt_string_view_t* module_name_array =
52 ((DynlibGetModuleNameListFunc)get_module_name_list_func)();
53 AIMRT_CHECK_ERROR_THROW(module_name_array != nullptr,
54 "Module name list is null in lib {}.", pkg_path_);
55
56 // Check the module list
57 module_name_vec_.reserve(module_num);
58 for (size_t ii = 0; ii < module_num; ++ii) {
59 auto module_name = aimrt::util::ToStdStringView(module_name_array[ii]);
60 AIMRT_CHECK_ERROR_THROW(!module_name.empty(),
61 "Module name index [{}] is empty in lib {}.",
62 ii, pkg_path_);
63
64 AIMRT_CHECK_ERROR_THROW(
65 std::find(module_name_vec_.begin(), module_name_vec_.end(), module_name) == module_name_vec_.end(),
66 "Module name '{}' repeated in lib {}.", module_name, pkg_path_);
67
68 module_name_vec_.emplace_back(module_name);
69 }
70
71 // Loading module
72 loaded_module_name_vec_.reserve(module_num);
73
74 // Before loading the module, check whether the enabled and disabled modules conflict (alarm only once)
75 if (!disable_modules.empty() && !enable_modules.empty()) {
76 AIMRT_WARN("Enabled modules and disabled modules are conficted! Only enabled modules are loaded, disabled modules are ignored!\n");

Callers 1

InitializeMethod · 0.80

Calls 4

ToStdStringViewFunction · 0.85
ToAimRTStringViewFunction · 0.85
GetSymbolMethod · 0.80
LoadMethod · 0.45

Tested by

no test coverage detected