提交 b53d4800cd178844e8521d8946dc0519186a786d

作者 LJH 李佳桓
1 个父辈 d1acab07

add

  1 +/*
  2 + * @Author: your name
  3 + * @Date: 2021-04-26 11:49:54
  4 + * @LastEditTime: 2021-04-26 11:53:35
  5 + * @LastEditors: Please set LastEditors
  6 + * @Description: In User Settings Edit
  7 + * @FilePath: /dmapserver/src/server/dmpservicenativeloader.cpp
  8 + */
  9 +/**************************************************************************
  10 +* file: dmpservicenativeloader.cpp
  11 +
  12 +* Author: wanzhongping
  13 +* Date: 2020-12-24 16:01:21
  14 +* Email: zhongpingw@chinadci.com
  15 +* copyright: 广州城市信息研究所有限公司
  16 +***************************************************************************/
  17 +#include "dmpservicenativeloader.h"
  18 +#include "dmpservicemodule.h"
  19 +#include <boost/dll/import.hpp>
  20 +#include <dlfcn.h>
  21 +#include "dmpserverutils.h"
  22 +
  23 +std::shared_ptr<DmpServiceModule> DmpServiceNativeLoader::LoadNativeModule(const std::string &location)
  24 +{
  25 + std::shared_ptr<DmpServiceModule> sp_module = FindModule(location);
  26 + if (sp_module)
  27 + {
  28 + return sp_module;
  29 + }
  30 +
  31 + boost::dll::fs::error_code error;
  32 + std::shared_ptr<boost::dll::shared_library> lib = std::make_shared<boost::dll::shared_library>(location, error);
  33 + if (error)
  34 + {
  35 + return nullptr;
  36 + }
  37 + if (lib->has("service_module"))
  38 + {
  39 + sp_module = boost::move(lib)->get_alias<std::shared_ptr<DmpServiceModule>()>("service_module")();
  40 + if (sp_module)
  41 + {
  42 + //保存lib的引用,否则sp_module会被释放掉
  43 + sp_module->set_lib(boost::move(lib));
  44 + modules_[location] = sp_module;
  45 + return sp_module;
  46 + }
  47 + }
  48 + return nullptr;
  49 +}
  50 +
  51 +void DmpServiceNativeLoader::LoadModules(const boost::filesystem::path &module_path,
  52 + DmpServiceRegistry &registrar)
  53 +{
  54 + std::vector<boost::filesystem::path> locations;
  55 + DmpServerUtils::GetLibraryPaths(module_path, locations);
  56 +
  57 + std::vector<boost::filesystem::path>::iterator iter;
  58 + for (iter = locations.begin(); iter != locations.end(); iter++)
  59 + {
  60 + std::shared_ptr<DmpServiceModule> sp_module = LoadNativeModule(iter->string());
  61 + if (sp_module)
  62 + {
  63 + sp_module->RegisterSelf(registrar);
  64 + }
  65 + }
  66 +}
  67 +
  68 +std::shared_ptr<DmpServiceModule> DmpServiceNativeLoader::FindModule(const std::string &location)
  69 +{
  70 + ModuleMap::iterator item = modules_.find(location);
  71 + if (item != modules_.end())
  72 + {
  73 + return item->second;
  74 + }
  75 + return nullptr;
  76 +}
  77 +
  78 +void DmpServiceNativeLoader::UnloadModules()
  79 +{
  80 + modules_.clear();
  81 +}
\ No newline at end of file
... ...
注册登录 后发表评论