cmDynamicLoader.cxx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmDynamicLoader.h"
  4. #include <map>
  5. #include <string>
  6. #include <utility>
  7. class cmDynamicLoaderCache
  8. {
  9. public:
  10. ~cmDynamicLoaderCache();
  11. void CacheFile(const char* path, cmsys::DynamicLoader::LibraryHandle /*p*/);
  12. bool GetCacheFile(const char* path,
  13. cmsys::DynamicLoader::LibraryHandle& /*p*/);
  14. bool FlushCache(const char* path);
  15. void FlushCache();
  16. static cmDynamicLoaderCache* GetInstance();
  17. private:
  18. std::map<std::string, cmsys::DynamicLoader::LibraryHandle> CacheMap;
  19. static cmDynamicLoaderCache* Instance;
  20. };
  21. cmDynamicLoaderCache* cmDynamicLoaderCache::Instance = nullptr;
  22. cmDynamicLoaderCache::~cmDynamicLoaderCache() = default;
  23. void cmDynamicLoaderCache::CacheFile(const char* path,
  24. cmsys::DynamicLoader::LibraryHandle p)
  25. {
  26. cmsys::DynamicLoader::LibraryHandle h;
  27. if (this->GetCacheFile(path, h)) {
  28. this->FlushCache(path);
  29. }
  30. this->CacheMap[path] = p;
  31. }
  32. bool cmDynamicLoaderCache::GetCacheFile(const char* path,
  33. cmsys::DynamicLoader::LibraryHandle& p)
  34. {
  35. auto it = this->CacheMap.find(path);
  36. if (it != this->CacheMap.end()) {
  37. p = it->second;
  38. return true;
  39. }
  40. return false;
  41. }
  42. bool cmDynamicLoaderCache::FlushCache(const char* path)
  43. {
  44. auto it = this->CacheMap.find(path);
  45. bool ret = false;
  46. if (it != this->CacheMap.end()) {
  47. cmsys::DynamicLoader::CloseLibrary(it->second);
  48. this->CacheMap.erase(it);
  49. ret = true;
  50. }
  51. return ret;
  52. }
  53. void cmDynamicLoaderCache::FlushCache()
  54. {
  55. for (auto const& it : this->CacheMap) {
  56. cmsys::DynamicLoader::CloseLibrary(it.second);
  57. }
  58. delete cmDynamicLoaderCache::Instance;
  59. cmDynamicLoaderCache::Instance = nullptr;
  60. }
  61. cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance()
  62. {
  63. if (!cmDynamicLoaderCache::Instance) {
  64. cmDynamicLoaderCache::Instance = new cmDynamicLoaderCache;
  65. }
  66. return cmDynamicLoaderCache::Instance;
  67. }
  68. cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary(
  69. const char* libname)
  70. {
  71. cmsys::DynamicLoader::LibraryHandle lh;
  72. if (cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh)) {
  73. return lh;
  74. }
  75. lh = cmsys::DynamicLoader::OpenLibrary(libname);
  76. cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh);
  77. return lh;
  78. }
  79. void cmDynamicLoader::FlushCache()
  80. {
  81. cmDynamicLoaderCache::GetInstance()->FlushCache();
  82. }