cmDynamicLoader.cxx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 = CM_NULLPTR;
  22. cmDynamicLoaderCache::~cmDynamicLoaderCache()
  23. {
  24. }
  25. void cmDynamicLoaderCache::CacheFile(const char* path,
  26. cmsys::DynamicLoader::LibraryHandle p)
  27. {
  28. cmsys::DynamicLoader::LibraryHandle h;
  29. if (this->GetCacheFile(path, h)) {
  30. this->FlushCache(path);
  31. }
  32. this->CacheMap[path] = p;
  33. }
  34. bool cmDynamicLoaderCache::GetCacheFile(const char* path,
  35. cmsys::DynamicLoader::LibraryHandle& p)
  36. {
  37. std::map<std::string, cmsys::DynamicLoader::LibraryHandle>::iterator it =
  38. this->CacheMap.find(path);
  39. if (it != this->CacheMap.end()) {
  40. p = it->second;
  41. return true;
  42. }
  43. return false;
  44. }
  45. bool cmDynamicLoaderCache::FlushCache(const char* path)
  46. {
  47. std::map<std::string, cmsys::DynamicLoader::LibraryHandle>::iterator it =
  48. this->CacheMap.find(path);
  49. bool ret = false;
  50. if (it != this->CacheMap.end()) {
  51. cmsys::DynamicLoader::CloseLibrary(it->second);
  52. this->CacheMap.erase(it);
  53. ret = true;
  54. }
  55. return ret;
  56. }
  57. void cmDynamicLoaderCache::FlushCache()
  58. {
  59. for (std::map<std::string, cmsys::DynamicLoader::LibraryHandle>::iterator
  60. it = this->CacheMap.begin();
  61. it != this->CacheMap.end(); it++) {
  62. cmsys::DynamicLoader::CloseLibrary(it->second);
  63. }
  64. delete cmDynamicLoaderCache::Instance;
  65. cmDynamicLoaderCache::Instance = CM_NULLPTR;
  66. }
  67. cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance()
  68. {
  69. if (!cmDynamicLoaderCache::Instance) {
  70. cmDynamicLoaderCache::Instance = new cmDynamicLoaderCache;
  71. }
  72. return cmDynamicLoaderCache::Instance;
  73. }
  74. cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary(
  75. const char* libname)
  76. {
  77. cmsys::DynamicLoader::LibraryHandle lh;
  78. if (cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh)) {
  79. return lh;
  80. }
  81. lh = cmsys::DynamicLoader::OpenLibrary(libname);
  82. cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh);
  83. return lh;
  84. }
  85. void cmDynamicLoader::FlushCache()
  86. {
  87. cmDynamicLoaderCache::GetInstance()->FlushCache();
  88. }