Imported Upstream version 2.8.12.2
[platform/upstream/cmake.git] / Source / cmDynamicLoader.cxx
1 /*============================================================================
2   CMake - Cross Platform Makefile Generator
3   Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
4
5   Distributed under the OSI-approved BSD License (the "License");
6   see accompanying file Copyright.txt for details.
7
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"
13
14 class cmDynamicLoaderCache
15 {
16 public:
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);
22   void FlushCache();
23   static cmDynamicLoaderCache* GetInstance();
24
25 private:
26   std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle> CacheMap;
27   static cmDynamicLoaderCache* Instance;
28 };
29
30 cmDynamicLoaderCache* cmDynamicLoaderCache::Instance = 0;
31
32 cmDynamicLoaderCache::~cmDynamicLoaderCache()
33 {
34 }
35
36 void cmDynamicLoaderCache::CacheFile(const char* path,
37   const cmsys::DynamicLoader::LibraryHandle& p)
38 {
39   cmsys::DynamicLoader::LibraryHandle h;
40   if ( this->GetCacheFile(path, h) )
41     {
42     this->FlushCache(path);
43     }
44   this->CacheMap[path] = p;
45 }
46
47 bool cmDynamicLoaderCache::GetCacheFile(const char* path,
48   cmsys::DynamicLoader::LibraryHandle& p)
49 {
50   std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle>::iterator it
51     = this->CacheMap.find(path);
52   if ( it != this->CacheMap.end() )
53     {
54     p = it->second;
55     return true;
56     }
57   return false;
58 }
59
60 bool cmDynamicLoaderCache::FlushCache(const char* path)
61 {
62   std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle>::iterator it
63     = this->CacheMap.find(path);
64   bool ret = false;
65   if ( it != this->CacheMap.end() )
66     {
67     cmsys::DynamicLoader::CloseLibrary(it->second);
68     this->CacheMap.erase(it);
69     ret = true;
70     }
71   return ret;
72 }
73
74 void cmDynamicLoaderCache::FlushCache()
75 {
76   for ( std::map<cmStdString,
77     cmsys::DynamicLoader::LibraryHandle>::iterator it
78     = this->CacheMap.begin();
79         it != this->CacheMap.end(); it++ )
80     {
81     cmsys::DynamicLoader::CloseLibrary(it->second);
82     }
83   delete cmDynamicLoaderCache::Instance;
84   cmDynamicLoaderCache::Instance = 0;
85 }
86
87 cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance()
88 {
89   if ( !cmDynamicLoaderCache::Instance )
90     {
91     cmDynamicLoaderCache::Instance = new cmDynamicLoaderCache;
92     }
93   return cmDynamicLoaderCache::Instance;
94 }
95
96 cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary(
97   const char* libname )
98 {
99   cmsys::DynamicLoader::LibraryHandle lh;
100   if ( cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh) )
101     {
102     return lh;
103     }
104   lh = cmsys::DynamicLoader::OpenLibrary(libname);
105   cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh);
106   return lh;
107 }
108
109 void cmDynamicLoader::FlushCache()
110 {
111   cmDynamicLoaderCache::GetInstance()->FlushCache();
112 }