38 #include "blocxx/BLOCXX_config.h" 39 #if defined(BLOCXX_USE_DL) 46 #ifdef BLOCXX_HAVE_FCNTL_H 53 #if defined(BLOCXX_USE_FAKE_LIBS) 59 #define BLOCXX_FAKELIB_HEADING "FAKE" 60 #define BLOCXX_FAKELIB_HEADING_LENGTH 4 70 bool dlSharedLibrary::s_call_dlclose =
true;
74 dlSharedLibrary::dlSharedLibrary(
void * libhandle,
const String& libName)
75 : SharedLibrary(), m_libhandle( libhandle ), m_libName(libName)
77 #if defined(BLOCXX_USE_FAKE_LIBS) 79 m_fakeLibrary = dlSharedLibrary::isFakeLibrary(libName);
83 initializeSymbolMap();
88 dlSharedLibrary::~dlSharedLibrary()
90 #if !defined(BLOCXX_VALGRIND_SUPPORT) // dlclose()ing shared libs make it impossible to see where memory leaks occurred with valgrind. 93 dlclose( m_libhandle );
97 bool dlSharedLibrary::doGetFunctionPointer(
const String& functionName,
100 MutexLock l(dlSharedLibrary_guard);
101 #if defined(BLOCXX_USE_FAKE_LIBS) 102 String realFunctionName = functionName;
108 if ( symIter == m_symbolMap.end() )
112 realFunctionName = symIter->second;
114 *fp = dlsym( m_libhandle, realFunctionName.c_str() );
116 *fp = dlsym( m_libhandle, functionName.c_str() );
126 bool dlSharedLibrary::isFakeLibrary(
const String& library_path)
129 #if defined(BLOCXX_USE_FAKE_LIBS) 134 int libfd = open(library_path.c_str(), O_RDONLY);
138 char buffer[(BLOCXX_FAKELIB_HEADING_LENGTH) + 1];
139 size_t num_read =
read(libfd, buffer,(BLOCXX_FAKELIB_HEADING_LENGTH));
140 if ( num_read == (BLOCXX_FAKELIB_HEADING_LENGTH) )
143 buffer[BLOCXX_FAKELIB_HEADING_LENGTH] =
'\0';
144 if ( String(BLOCXX_FAKELIB_HEADING) == buffer )
157 #if defined(BLOCXX_USE_FAKE_LIBS) 158 void dlSharedLibrary::initializeSymbolMap()
160 if ( ! m_fakeLibrary )
169 for ( StringArray::const_iterator iter = lines.begin();
174 if ( iter->startsWith(
'#') )
180 if ( current_line.size() != 2 )
185 String option = String(current_line[0]).trim();
186 String value = String(current_line[1]).trim();
187 m_symbolMap[option] = value;
BLOCXX_COMMON_API StringArray getFileLines(const String &filename)
Read and return the lines of a test file.
BLOCXX_COMMON_API int close(const FileHandle &hdl)
Close file handle.
void read(std::streambuf &istrm, void *dataIn, size_t dataInLen)
Array< String > StringArray
BLOCXX_COMMON_API bool canRead(const String &path)
M::const_iterator const_iterator
LazyGlobal< Mutex, int, GlobalMutexFactory > GlobalMutex
#define BLOCXX_GLOBAL_MUTEX_INIT()