MantisBT - VTK
View Issue Details
0000984VTK(No Category)public2004-07-14 07:422011-01-13 17:00
Mathieu Malaterre 
Mathieu Malaterre 
lowminoralways
closedfixed 
 
 
0000984: vtkDynamicLoader::CloseLibrary bug
I think that vtkDynamicLoader::CloseLibrary misbehaves on UNIX/Linux,
cvs version of VTK.

>From the vtk documentation:
 int vtkDynamicLoader::CloseLibrary (vtkLibHandle) [static]
Attempt to detach a dynamic library from the process. A value of true
is returned if it is successful.

>From man 3 dlclose:
dlclose returns 0 on success, and non-zero on error.

The code:

int vtkDynamicLoader::CloseLibrary(vtkLibHandle lib)
{
  return (int)dlclose(lib);
}

This seems to be in error; the patch below fixes it.
No tags attached.
Issue History
2010-11-29 17:59Mathieu MalaterreSource_changeset_attached => VTK master 27443ddf
2011-01-13 17:00Source_changeset_attached => VTK master a2bd8391
2011-01-13 17:00Source_changeset_attached => VTK master 020ef709
2011-06-16 13:11Zack GalbreathCategory => (No Category)

Notes
(0001259)
Mathieu Malaterre   
2004-07-14 07:45   
applying this patch:

Index: vtkDynamicLoader.cxx
===================================================================
RCS file: /cvsroot/VTK/VTK/Common/vtkDynamicLoader.cxx,v
retrieving revision 1.18
diff -u -3 -p -r1.18 vtkDynamicLoader.cxx
--- a/vtkDynamicLoader.cxx 17 Feb 2004 20:31:01 -0000 1.18
+++ b/vtkDynamicLoader.cxx 14 Jul 2004 11:40:44 -0000
@@ -112,16 +112,21 @@ int vtkDynamicLoader::CloseLibrary(vtkLi
  
 void* vtkDynamicLoader::GetSymbolAddress(vtkLibHandle, const char* sym)
 {
- void *result=0;
- if(NSIsSymbolNameDefined(sym)){
- cout << sym << " is defined!" << endl;
- NSSymbol symbol= NSLookupAndBindSymbol(sym);
- if(symbol){
- result = NSAddressOfSymbol(symbol);
- }
- }else{
- cout << sym << " is not defined!" << endl;
- }
+ void *result = 0;
+ if( NSIsSymbolNameDefined(sym) )
+ {
+ cout << sym << " is defined!" << endl;
+ NSSymbol symbol= NSLookupAndBindSymbol(sym);
+ if(symbol)
+ {
+ result = NSAddressOfSymbol(symbol);
+ }
+ }
+ else
+ {
+ cout << sym << " is not defined!" << endl;
+ }
+
   return result;
 }
  
@@ -154,13 +159,13 @@ const char* vtkDynamicLoader::LastError(
 vtkLibHandle vtkDynamicLoader::OpenLibrary(const char* libname )
 {
 #ifdef UNICODE
- wchar_t *libn = new wchar_t [mbstowcs(NULL, libname, 32000)+1];
- mbstowcs(libn, libname, 32000);
- vtkLibHandle ret = LoadLibrary(libn);
- delete [] libn;
- return ret;
+ wchar_t *libn = new wchar_t [mbstowcs(NULL, libname, 32000)+1];
+ mbstowcs(libn, libname, 32000);
+ vtkLibHandle ret = LoadLibrary(libn);
+ delete [] libn;
+ return ret;
 #else
- return LoadLibrary(libname);
+ return LoadLibrary(libname);
 #endif
 }
  
@@ -172,14 +177,14 @@ int vtkDynamicLoader::CloseLibrary(vtkLi
 void* vtkDynamicLoader::GetSymbolAddress(vtkLibHandle lib, const char* sym)
 {
 #if defined (UNICODE) && !defined(_MSC_VER)
- wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)+1];
- mbstowcs(wsym, sym, 32000);
- // Force GetProcAddress to return void* with a c style cast
- // This is because you can not cast a function to a void* without
- // an error on gcc 3.2 and ANSI C++,
- void *ret = (void*)GetProcAddress(lib, wsym);
- delete [] wsym;
- return ret;
+ wchar_t *wsym = new wchar_t [mbstowcs(NULL, sym, 32000)+1];
+ mbstowcs(wsym, sym, 32000);
+ // Force GetProcAddress to return void* with a c style cast
+ // This is because you can not cast a function to a void* without
+ // an error on gcc 3.2 and ANSI C++,
+ void *ret = (void*)GetProcAddress(lib, wsym);
+ delete [] wsym;
+ return ret;
 #else
   return (void*)GetProcAddress(lib, sym);
 #endif
@@ -237,7 +242,8 @@ vtkLibHandle vtkDynamicLoader::OpenLibra
  
 int vtkDynamicLoader::CloseLibrary(vtkLibHandle lib)
 {
- return (int)dlclose(lib);
+ // dlclose returns 0 on success, and non-zero on error.
+ return !((int)dlclose(lib));
 }
  
 void* vtkDynamicLoader::GetSymbolAddress(vtkLibHandle lib, const char* sym)
(0001260)
Mathieu Malaterre   
2004-07-14 07:50   
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/freelibrary.asp [^]

BOOL FreeLibrary(
  HMODULE hModule
);

Return Values

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError