示例#1
0
文件: manager.cpp 项目: viadeo/mesos
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();
}
示例#2
0
文件: manager.cpp 项目: GSidRam/mesos
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();
}