Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef GAUDIKERNEL_DSOUTILS_H
00009 #define GAUDIKERNEL_DSOUTILS_H
00010
00011
00012 #include <string>
00013
00014 #include "GaudiKernel/System.h"
00015
00016
00017 #include "Reflex/Reflex.h"
00018
00019 namespace DsoUtils {
00020
00021 inline std::string libNativeName( const std::string& libName )
00022 {
00023 #if defined(_WIN32)
00024 return libName+".dll";
00025 #elif defined(__linux) || defined(__APPLE__)
00026 return "lib"+libName+".so";
00027 #else
00028
00029 return libName;
00030 #endif
00031 }
00032
00033 #ifdef _GNU_SOURCE
00034 #include <dlfcn.h>
00035 static std::string dsoName( const ROOT::Reflex::Member& mem )
00036 {
00037 Dl_info info;
00038 if (dladdr (
00039 #if __GNUC__ < 4
00040 (void*)mem.Stubfunction()
00041 #else
00042 System::FuncPtrCast<void*>(mem.Stubfunction())
00043 #endif
00044 , &info) == 0)
00045 return "";
00046
00047 const char* pos = strrchr (info.dli_fname, '/');
00048 if (pos)
00049 ++pos;
00050 else
00051 pos = info.dli_fname;
00052 return pos;
00053 }
00054 #elif defined(_WIN32)
00055 #include <windows.h>
00056
00057 static std::string dsoName( const ROOT::Reflex::Member& mem )
00058 {
00059 void* addr = (void*)(mem.Stubfunction());
00060 if (addr) {
00061 MEMORY_BASIC_INFORMATION mbi;
00062 if ( VirtualQuery(addr, &mbi, sizeof(mbi)) ) {
00063 HMODULE h_module = (HMODULE)mbi.AllocationBase;
00064 char mod[1024];
00065 if( GetModuleFileName(h_module, mod, sizeof(mod)) ) {
00066 const char* pos = strrchr (mod, '\\');
00067 if (pos)
00068 ++pos;
00069 else
00070 pos = mod;
00071 return pos;
00072 }
00073 }
00074 }
00075 return "";
00076 }
00077
00078 #else // dummy implementation for unknown platforms
00079 static std::string dsoName( const ROOT::Reflex::Member& )
00080 {
00081 return "";
00082 }
00083
00084 #endif
00085
00086 static bool inDso( const ROOT::Reflex::Member& mem,
00087 const std::string& dsoname )
00088 {
00089 #ifdef _WIN32
00090 char sep = '\\';
00091 #else
00092 char sep = '/';
00093 #endif
00094
00095 std::string srcname = dsoName(mem);
00096 if (srcname.empty()) {
00097
00098 return true;
00099 }
00100
00101 std::string::size_type pos = dsoname.find_last_of(sep);
00102 std::string curname;
00103 if (std::string::npos == pos) {
00104 curname = dsoname;
00105 } else {
00106 curname = dsoname.substr(pos+1);
00107 }
00108
00109 return srcname == curname;
00110 }
00111
00112 }
00113
00114 #endif // not GAUDIKERNEL_DSOUTILS_H
00115