Try<Nothing> ModuleManager::load(const Modules& modules) { Lock lock(&mutex); initialize(); foreach (const Modules::Library& library, modules.libraries()) { string libraryName; if (library.has_file()) { libraryName = library.file(); } else if (library.has_name()) { libraryName = os::libraries::expandName(library.name()); } else { return Error("Library name or path not provided"); } if (!dynamicLibraries.contains(libraryName)) { Owned<DynamicLibrary> dynamicLibrary(new DynamicLibrary()); Try<Nothing> result = dynamicLibrary->open(libraryName); if (!result.isSome()) { return Error("Error opening library: '" + libraryName + "'"); } dynamicLibraries[libraryName] = dynamicLibrary; } // Load module manifests. foreach (const string& moduleName, library.modules()) { if (moduleName.empty()) { return Error( "Error: module name not provided with library '" + library.file() + "'"); } // Check for possible duplicate module names. if (moduleBases.contains(moduleName)) { return Error("Error loading duplicate module '" + moduleName + "'"); } Try<void*> symbol = dynamicLibraries[libraryName]->loadSymbol(moduleName); if (symbol.isError()) { return Error( "Error loading module '" + moduleName + "': " + symbol.error()); } ModuleBase* moduleBase = (ModuleBase*) symbol.get(); Try<Nothing> result = verifyModule(moduleName, moduleBase); if (result.isError()) { return Error( "Error verifying module '" + moduleName + "': " + result.error()); } moduleBases[moduleName] = (ModuleBase*) symbol.get(); } } return Nothing(); }
Try<Nothing> ModuleManager::load(const Modules& modules) { Lock lock(&mutex); initialize(); foreach (const Modules::Library& library, modules.libraries()) { string libraryName; if (library.has_file()) { libraryName = library.file(); } else if (library.has_name()) { libraryName = os::libraries::expandName(library.name()); } else { return Error("Library name or path not provided"); } if (!dynamicLibraries.contains(libraryName)) { Owned<DynamicLibrary> dynamicLibrary(new DynamicLibrary()); Try<Nothing> result = dynamicLibrary->open(libraryName); if (!result.isSome()) { return Error( "Error opening library: '" + libraryName + "': " + result.error()); } dynamicLibraries[libraryName] = dynamicLibrary; } // Load module manifests. foreach (const Modules::Library::Module& module, library.modules()) { if (!module.has_name()) { return Error( "Error: module name not provided with library '" + libraryName + "'"); } // Check for possible duplicate module names. const std::string moduleName = module.name(); if (moduleBases.contains(moduleName)) { return Error("Error loading duplicate module '" + moduleName + "'"); } // Load ModuleBase. Try<void*> symbol = dynamicLibraries[libraryName]->loadSymbol(moduleName); if (symbol.isError()) { return Error( "Error loading module '" + moduleName + "': " + symbol.error()); } ModuleBase* moduleBase = (ModuleBase*) symbol.get(); // Verify module compatibility including version, etc. Try<Nothing> result = verifyModule(moduleName, moduleBase); if (result.isError()) { return Error( "Error verifying module '" + moduleName + "': " + result.error()); } moduleBases[moduleName] = (ModuleBase*) symbol.get(); // Now copy the supplied module-specific parameters. moduleParameters[moduleName].mutable_parameter()->CopyFrom( module.parameters()); } } return Nothing(); }