PCMDynLoad.cpp

Go to the documentation of this file.
00001 
00002 //
00003 // This source file is a part of ParCompMark
00004 // Parallel Compositing Benchmark Framework
00005 //
00006 // for latest info see http://parcompmark.sourceforge.net
00007 
00008 //
00009 // Copyright (C) 2006 IT2 ParCompMark Dev. Team
00010 // 
00011 // This program is free software; you can redistribute it and/or
00012 // modify it under the terms of the GNU General Public License
00013 // as published by the Free Software Foundation; either version 2
00014 // of the License, or (at your option) any later version.
00015 // 
00016 // This program is distributed in the hope that it will be useful,
00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00019 // GNU General Public License for more details.
00020 // 
00021 // You should have received a copy of the GNU General Public License
00022 // along with this program; if not, write to the Free Software
00023 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00024 
00025 //
00026 // Inner includes
00027 //
00028 
00029 #include "../include/PCMDynLoad.h"
00030 
00031 //
00032 // Outer includes
00033 //
00034 
00035 #include <dlfcn.h>
00036 
00037 namespace ParCompMark
00038 {
00039 
00040   //
00041   // Constructors & destructor
00042   //
00043 
00044   DynLoad::DynLoad(const std::string & libName)
00045         // You have to initialize the following attributes:
00046         // - mHandle
00047         // - mLibraryName
00048   {
00049         mLibraryName = libName;
00050         load();
00051   }
00052 
00053  /*----------------------------------------------------------------------*/
00054 
00055   DynLoad::~DynLoad()
00056   {
00057         if(mHandle)
00058         {
00059          unload();
00060          mHandle = 0;
00061         }
00062   }
00063 
00064  /*----------------------------------------------------------------------*/
00065 
00066   //
00067   // Methods
00068   //
00069 
00070   bool DynLoad::hasFunction(const std::string & funcName) const
00071   {
00072         Assert(mHandle, INVALID_OPERATION_ERROR, "DynLoad::hasFunction()");
00073         void *f = dlsym(mHandle, funcName.c_str());
00074 
00075         return f != 0;
00076   }
00077 
00078  /*----------------------------------------------------------------------*/
00079 
00080   void *DynLoad::getFunction(const std::string & funcName) const
00081   {
00082         Assert(mHandle, INVALID_OPERATION_ERROR, "DynLoad::getFunction()");
00083 
00084         char *m;
00085 
00086         void *f = dlsym(mHandle, funcName.c_str());
00087 
00088         if(!f)
00089         {
00090          m = dlerror();
00091          if(m)
00092                 Except(INTERNAL_ERROR, "DynLoad::getFunction()", m);
00093         }
00094 
00095         return f;
00096 
00097   }
00098 
00099  /*----------------------------------------------------------------------*/
00100 
00101   void DynLoad::load()
00102   {
00103         if((mHandle = dlopen(mLibraryName.c_str(), RTLD_LAZY)) == NULL)
00104         {
00105          Except(INTERNAL_ERROR, "DynLoad::load()", dlerror());
00106         }
00107 
00108         Logger::getInstance()->log(Logger::NOTICE, mLibraryName + " loaded.");
00109   }
00110 
00111  /*----------------------------------------------------------------------*/
00112 
00113   void DynLoad::unload()
00114   {
00115 
00116         if(dlclose(mHandle) != 0)
00117         {
00118          Except(INTERNAL_ERROR, "DynLoad::unload()", dlerror());
00119         }
00120 
00121         Logger::getInstance()->log(Logger::NOTICE, mLibraryName + " unloaded.");
00122   }
00123 
00124  /*----------------------------------------------------------------------*/
00125 
00126 }