View Issue Details Jump to Notes ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0000984VTK(No Category)public2004-07-14 07:422011-01-13 17:00
ReporterMathieu Malaterre 
Assigned ToMathieu Malaterre 
PrioritylowSeverityminorReproducibilityalways
StatusclosedResolutionfixed 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0000984: vtkDynamicLoader::CloseLibrary bug
DescriptionI 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.
TagsNo tags attached.
Project
Type
Attached Files

 Relationships

  Notes
(0001259)
Mathieu Malaterre (developer)
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 (developer)
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

 Issue History
Date Modified Username Field Change
2010-11-29 17:59 Mathieu Malaterre Source_changeset_attached => VTK master 27443ddf
2011-01-13 17:00 Source_changeset_attached => VTK master a2bd8391
2011-01-13 17:00 Source_changeset_attached => VTK master 020ef709
2011-06-16 13:11 Zack Galbreath Category => (No Category)


Copyright © 2000 - 2018 MantisBT Team