cmDynamicLoader.cxx 3.0 KB

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