cmDynamicLoader.cxx 3.0 KB

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