diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2006-03-16 11:01:05 -0500 |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2006-03-16 11:01:05 -0500 |
commit | f483e48d2a2f3361dcf3c60096bbfe9975f90ddf (patch) | |
tree | 2909a53a3efb79bf633ba0be2fa93d7c7b68181f /Source/cmDynamicLoader.cxx | |
parent | 4102949bf95eee1ce88544fafdf80439aece85b2 (diff) | |
download | cmake-f483e48d2a2f3361dcf3c60096bbfe9975f90ddf.tar.gz |
ENH: Cleanup DynamicLoader so that the symbols have more consistent names, start using dynamic loader from kwsys in CMake
Diffstat (limited to 'Source/cmDynamicLoader.cxx')
-rw-r--r-- | Source/cmDynamicLoader.cxx | 266 |
1 files changed, 26 insertions, 240 deletions
diff --git a/Source/cmDynamicLoader.cxx b/Source/cmDynamicLoader.cxx index 1a050607c2..d1b15103df 100644 --- a/Source/cmDynamicLoader.cxx +++ b/Source/cmDynamicLoader.cxx @@ -9,34 +9,26 @@ Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "cmDynamicLoader.h" -// This file is actually several different implementations. -// 1. HP machines which uses shl_load -// 2. Mac OS X 10.2.x and earlier which uses NSLinkModule -// 3. Windows which uses LoadLibrary -// 4. Most unix systems (including Mac OS X 10.3 and later) which use dlopen (default) -// Each part of the ifdef contains a complete implementation for -// the static methods of cmDynamicLoader. - - -class cmDynamicLoaderCache +class cmDynamicLoaderCache { public: ~cmDynamicLoaderCache(); - void CacheFile(const char* path, const cmLibHandle&); - bool GetCacheFile(const char* path, cmLibHandle&); + void CacheFile(const char* path, + const cmsys::DynamicLoader::LibraryHandle&); + bool GetCacheFile(const char* path, cmsys::DynamicLoader::LibraryHandle&); bool FlushCache(const char* path); void FlushCache(); static cmDynamicLoaderCache* GetInstance(); private: - std::map<cmStdString, cmLibHandle> CacheMap; + std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle> CacheMap; static cmDynamicLoaderCache* Instance; }; @@ -46,9 +38,10 @@ cmDynamicLoaderCache::~cmDynamicLoaderCache() { } -void cmDynamicLoaderCache::CacheFile(const char* path, const cmLibHandle& p) +void cmDynamicLoaderCache::CacheFile(const char* path, + const cmsys::DynamicLoader::LibraryHandle& p) { - cmLibHandle h; + cmsys::DynamicLoader::LibraryHandle h; if ( this->GetCacheFile(path, h) ) { this->FlushCache(path); @@ -56,9 +49,11 @@ void cmDynamicLoaderCache::CacheFile(const char* path, const cmLibHandle& p) this->CacheMap[path] = p; } -bool cmDynamicLoaderCache::GetCacheFile(const char* path, cmLibHandle& p) +bool cmDynamicLoaderCache::GetCacheFile(const char* path, + cmsys::DynamicLoader::LibraryHandle& p) { - std::map<cmStdString, cmLibHandle>::iterator it = this->CacheMap.find(path); + std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle>::iterator it + = this->CacheMap.find(path); if ( it != this->CacheMap.end() ) { p = it->second; @@ -69,11 +64,12 @@ bool cmDynamicLoaderCache::GetCacheFile(const char* path, cmLibHandle& p) bool cmDynamicLoaderCache::FlushCache(const char* path) { - std::map<cmStdString, cmLibHandle>::iterator it = this->CacheMap.find(path); + std::map<cmStdString, cmsys::DynamicLoader::LibraryHandle>::iterator it + = this->CacheMap.find(path); bool ret = false; if ( it != this->CacheMap.end() ) { - cmDynamicLoader::CloseLibrary(it->second); + cmsys::DynamicLoader::CloseLibrary(it->second); this->CacheMap.erase(it); ret = true; } @@ -82,10 +78,12 @@ bool cmDynamicLoaderCache::FlushCache(const char* path) void cmDynamicLoaderCache::FlushCache() { - for ( std::map<cmStdString, cmLibHandle>::iterator it = this->CacheMap.begin(); + for ( std::map<cmStdString, + cmsys::DynamicLoader::LibraryHandle>::iterator it + = this->CacheMap.begin(); it != this->CacheMap.end(); it++ ) { - cmDynamicLoader::CloseLibrary(it->second); + cmsys::DynamicLoader::CloseLibrary(it->second); } delete cmDynamicLoaderCache::Instance; cmDynamicLoaderCache::Instance = 0; @@ -100,231 +98,19 @@ cmDynamicLoaderCache* cmDynamicLoaderCache::GetInstance() return cmDynamicLoaderCache::Instance; } -// --------------------------------------------------------------- -// 1. Implementation for HPUX machines -#ifdef __hpux -#define CMDYNAMICLOADER_DEFINED 1 -#include <dl.h> - -cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) +cmsys::DynamicLoader::LibraryHandle cmDynamicLoader::OpenLibrary( + const char* libname ) { - cmLibHandle lh; + cmsys::DynamicLoader::LibraryHandle lh; if ( cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh) ) { return lh; } - - lh = shl_load(libname, BIND_DEFERRED | DYNAMIC_PATH, 0L); + lh = cmsys::DynamicLoader::OpenLibrary(libname); cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh); return lh; } -int cmDynamicLoader::CloseLibrary(cmLibHandle lib) -{ - return !shl_unload(lib); -} - -cmDynamicLoaderFunction -cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) -{ - void* addr; - int status; - - status = shl_findsym (&lib, sym, TYPE_PROCEDURE, &addr); - void* result = (status < 0) ? (void*)0 : addr; - - // Hack to cast pointer-to-data to pointer-to-function. - return *reinterpret_cast<cmDynamicLoaderFunction*>(&result); -} - - -const char* cmDynamicLoader::LastError() -{ - return 0; -} -#endif - - - -// --------------------------------------------------------------- -// 2. Implementation for Mac OS X 10.2.x and earlier -#ifdef __APPLE__ -#if MAC_OS_X_VERSION_MIN_REQUIRED < 1030 -#define CMDYNAMICLOADER_DEFINED 1 -#include <mach-o/dyld.h> - -cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) -{ - cmLibHandle lh; - if ( cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh) ) - { - return lh; - } - - NSObjectFileImageReturnCode rc; - NSObjectFileImage image = 0; - - rc = NSCreateObjectFileImageFromFile(libname, &image); - if(!image) - { - return 0; - } - lh = NSLinkModule(image, libname, NSLINKMODULE_OPTION_BINDNOW); - if(lh) - { - cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh); - } - return lh; -} - -int cmDynamicLoader::CloseLibrary(cmLibHandle lib) -{ - NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_NONE); - return 1; -} - -cmDynamicLoaderFunction -cmDynamicLoader::GetSymbolAddress(cmLibHandle /* lib */, const char* sym) -{ - void *result=0; - if(NSIsSymbolNameDefined(sym)) - { - NSSymbol symbol= NSLookupAndBindSymbol(sym); - if(symbol) - { - result = NSAddressOfSymbol(symbol); - } - } - // Hack to cast pointer-to-data to pointer-to-function. - return *reinterpret_cast<cmDynamicLoaderFunction*>(&result); -} - -const char* cmDynamicLoader::LastError() -{ - return 0; -} - -#endif -#endif - - - - -// --------------------------------------------------------------- -// 3. Implementation for Windows win32 code -#ifdef _WIN32 -#include <windows.h> -#define CMDYNAMICLOADER_DEFINED 1 - -cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) -{ - cmLibHandle lh; - if ( cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh) ) - { - return lh; - } -#ifdef UNICODE - wchar_t *libn = new wchar_t [mbstowcs(NULL, libname, 32000)]; - mbstowcs(libn, libname, 32000); - cmLibHandle ret = LoadLibrary(libn); - delete [] libn; - lh = ret; -#else - lh = LoadLibrary(libname); -#endif - - cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh); - return lh; -} - -int cmDynamicLoader::CloseLibrary(cmLibHandle lib) -{ - return (int)FreeLibrary(lib); -} - -cmDynamicLoaderFunction -cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) -{ -#ifdef UNICODE - wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)]; - mbstowcs(wsym, sym, 32000); - void *ret = GetProcAddress(lib, wsym); - delete [] wsym; - void* result = ret; -#else - void* result = (void*)GetProcAddress(lib, sym); -#endif - // Hack to cast pointer-to-data to pointer-to-function. - return *reinterpret_cast<cmDynamicLoaderFunction*>(&result); -} - - -const char* cmDynamicLoader::LastError() -{ - LPVOID lpMsgBuf; - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - - // Free the buffer. - - static char* str = 0; - delete [] str; - str = strcpy(new char[strlen((char*)lpMsgBuf)+1], (char*)lpMsgBuf); - LocalFree( lpMsgBuf ); - return str; -} - -#endif - -// --------------------------------------------------------------- -// 4. Implementation for default UNIX machines. -// if nothing has been defined then use this -#ifndef CMDYNAMICLOADER_DEFINED -#define CMDYNAMICLOADER_DEFINED 1 -// Setup for most unix machines -#include <dlfcn.h> - -cmLibHandle cmDynamicLoader::OpenLibrary(const char* libname ) -{ - cmLibHandle lh; - if ( cmDynamicLoaderCache::GetInstance()->GetCacheFile(libname, lh) ) - { - return lh; - } - - lh = dlopen(libname, RTLD_LAZY); - cmDynamicLoaderCache::GetInstance()->CacheFile(libname, lh); - return lh; -} - -int cmDynamicLoader::CloseLibrary(cmLibHandle lib) -{ - return !(int)dlclose(lib); -} - -cmDynamicLoaderFunction -cmDynamicLoader::GetSymbolAddress(cmLibHandle lib, const char* sym) -{ - void* result = dlsym(lib, sym); - - // Hack to cast pointer-to-data to pointer-to-function. - return *reinterpret_cast<cmDynamicLoaderFunction*>(&result); -} - -const char* cmDynamicLoader::LastError() -{ - return dlerror(); -} -#endif - void cmDynamicLoader::FlushCache() { cmDynamicLoaderCache::GetInstance()->FlushCache(); @@ -333,7 +119,7 @@ void cmDynamicLoader::FlushCache() // Stay consistent with the Modules/Platform directory as // to what the correct prefix and lib extension const char* cmDynamicLoader::LibPrefix() -{ +{ return CMAKE_SHARED_MODULE_PREFIX; } |