cmDynamicLoader.cxx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*============================================================================
  2. CMake - Cross Platform Makefile Generator
  3. Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
  4. Distributed under the OSI-approved BSD License (the "License");
  5. see accompanying file Copyright.txt for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even the
  7. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the License for more information.
  9. ============================================================================*/
  10. #include "cmDynamicLoader.h"
  11. class cmDynamicLoaderCache
  12. {
  13. public:
  14. ~cmDynamicLoaderCache();
  15. void CacheFile(const char* path,
  16. const cmsys::DynamicLoader::LibraryHandle& /*p*/);
  17. bool GetCacheFile(const char* path,
  18. cmsys::DynamicLoader::LibraryHandle& /*p*/);
  19. bool FlushCache(const char* path);
  20. void FlushCache();
  21. static cmDynamicLoaderCache* GetInstance();
  22. private:
  23. std::map<std::string, cmsys::DynamicLoader::LibraryHandle> CacheMap;
  24. static cmDynamicLoaderCache* Instance;
  25. };
  26. cmDynamicLoaderCache* cmDynamicLoaderCache::Instance = CM_NULLPTR;
  27. cmDynamicLoaderCache::~cmDynamicLoaderCache()
  28. {
  29. }
  30. void cmDynamicLoaderCache::CacheFile(
  31. const char* path, const cmsys::DynamicLoader::LibraryHandle& p)
  32. {
  33. cmsys::DynamicLoader::LibraryHandle h;
  34. if (this->GetCacheFile(path, h)) {
  35. this->FlushCache(path);
  36. }
  37. this->CacheMap[path] = p;
  38. }
  39. bool cmDynamicLoaderCache::GetCacheFile(const char* path,
  40. cmsys::DynamicLoader::LibraryHandle& p)
  41. {
  42. std::map<std::string, cmsys::DynamicLoader::LibraryHandle>::iterator it =
  43. this->CacheMap.find(path);
  44. if (it != this->CacheMap.end()) {
  45. p = it->second;
  46. return true;
  47. }
  48. return false;
  49. }
  50. bool cmDynamicLoaderCache::FlushCache(const char* path)
  51. {
  52. std::map<std::string, cmsys::DynamicLoader::LibraryHandle>::iterator it =
  53. this->CacheMap.find(path);
  54. bool ret = false;
  55. if (it != this->CacheMap.end()) {
  56. cmsys::DynamicLoader::CloseLibrary(it->second);
  57. this->CacheMap.erase(it);
  58. ret = true;
  59. }
  60. return ret;
  61. }
  62. void cmDynamicLoaderCache::FlushCache()
  63. {
  64. for (std::map<std::string, cmsys::DynamicLoader::LibraryHandle>::iterator
  65. it = this->CacheMap.begin();
  66. it != this->CacheMap.end(); it++) {
  67. cmsys::DynamicLoader::CloseLibrary(it->second);
  68. }
  69. delete cmDynamicLoaderCache::Instance;
  70. cmDynamicLoaderCache::Instance = CM_NULLPTR;
  71. }
  72. cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance()
  73. {
  74. if (!cmDynamicLoaderCache::Instance) {
  75. cmDynamicLoaderCache::Instance = new cmDynamicLoaderCache;
  76. }
  77. return cmDynamicLoaderCache::Instance;
  78. }
  79. cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary(
  80. const char* libname)
  81. {
  82. cmsys::DynamicLoader::LibraryHandle lh;
  83. if (cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh)) {
  84. return lh;
  85. }
  86. lh = cmsys::DynamicLoader::OpenLibrary(libname);
  87. cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh);
  88. return lh;
  89. }
  90. void cmDynamicLoader::FlushCache()
  91. {
  92. cmDynamicLoaderCache::GetInstance()->FlushCache();
  93. }