1 /*============================================================================
2 CMake - Cross Platform Makefile Generator
3 Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
5 Distributed under the OSI-approved BSD License (the "License");
6 see accompanying file Copyright.txt for details.
8 This software is distributed WITHOUT ANY WARRANTY; without even the
9 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License for more information.
11 ============================================================================*/
12 #include "cmDynamicLoader.h"
14 class cmDynamicLoaderCache
17 ~cmDynamicLoaderCache();
18 void CacheFile(const char* path,
19 const cmsys::DynamicLoader::LibraryHandle&);
20 bool GetCacheFile(const char* path, cmsys::DynamicLoader::LibraryHandle&);
21 bool FlushCache(const char* path);
23 static cmDynamicLoaderCache* GetInstance();
26 std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle> CacheMap;
27 static cmDynamicLoaderCache* Instance;
30 cmDynamicLoaderCache* cmDynamicLoaderCache::Instance = 0;
32 cmDynamicLoaderCache::~cmDynamicLoaderCache()
36 void cmDynamicLoaderCache::CacheFile(const char* path,
37 const cmsys::DynamicLoader::LibraryHandle& p)
39 cmsys::DynamicLoader::LibraryHandle h;
40 if ( this->GetCacheFile(path, h) )
42 this->FlushCache(path);
44 this->CacheMap[path] = p;
47 bool cmDynamicLoaderCache::GetCacheFile(const char* path,
48 cmsys::DynamicLoader::LibraryHandle& p)
50 std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle>::iterator it
51 = this->CacheMap.find(path);
52 if ( it != this->CacheMap.end() )
60 bool cmDynamicLoaderCache::FlushCache(const char* path)
62 std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle>::iterator it
63 = this->CacheMap.find(path);
65 if ( it != this->CacheMap.end() )
67 cmsys::DynamicLoader::CloseLibrary(it->second);
68 this->CacheMap.erase(it);
74 void cmDynamicLoaderCache::FlushCache()
76 for ( std::map<cmStdString,
77 cmsys::DynamicLoader::LibraryHandle>::iterator it
78 = this->CacheMap.begin();
79 it != this->CacheMap.end(); it++ )
81 cmsys::DynamicLoader::CloseLibrary(it->second);
83 delete cmDynamicLoaderCache::Instance;
84 cmDynamicLoaderCache::Instance = 0;
87 cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance()
89 if ( !cmDynamicLoaderCache::Instance )
91 cmDynamicLoaderCache::Instance = new cmDynamicLoaderCache;
93 return cmDynamicLoaderCache::Instance;
96 cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary(
99 cmsys::DynamicLoader::LibraryHandle lh;
100 if ( cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh) )
104 lh = cmsys::DynamicLoader::OpenLibrary(libname);
105 cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh);
109 void cmDynamicLoader::FlushCache()
111 cmDynamicLoaderCache::GetInstance()->FlushCache();