Gaudi Framework, version v23r4

Home   Generated: Mon Sep 17 2012

DsoUtils.h

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 //  note: This, I believe, should be part of Reflex::SharedLibrary
00007 
00008 #ifndef GAUDIKERNEL_DSOUTILS_H
00009 #define GAUDIKERNEL_DSOUTILS_H
00010 
00011 // STL includes
00012 #include <string>
00013 
00014 #include "GaudiKernel/System.h"
00015 
00016 // Reflex includes
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   // variant of the GIGO design pattern
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     // we do not know the name of the library, let's guess it's OK
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 } // end namespace DsoUtils
00113 
00114 #endif // not GAUDIKERNEL_DSOUTILS_H
00115 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Mon Sep 17 2012 13:49:34 for Gaudi Framework, version v23r4 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004