| 17 | static constexpr const char* kDynlibDestroyModuleFuncName = "AimRTDynlibDestroyModule"; |
| 18 | |
| 19 | void 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"); |
no test coverage detected