LCOV - code coverage report
Current view: top level - lunchbox - dso.cpp (source / functions) Hit Total Coverage
Test: lcov2.info Lines: 35 39 89.7 %
Date: 2014-08-05 Functions: 11 11 100.0 %

          Line data    Source code
       1             : 
       2             : /* Copyright (c) 2009, Cedric Stalder <cedric.stalder@gmail.com>
       3             :  *               2009-2014, Stefan Eilemann <eile@equalizergraphics.com>
       4             :  *
       5             :  * This library is free software; you can redistribute it and/or modify it under
       6             :  * the terms of the GNU Lesser General Public License version 2.1 as published
       7             :  * by the Free Software Foundation.
       8             :  *
       9             :  * This library is distributed in the hope that it will be useful, but WITHOUT
      10             :  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
      11             :  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
      12             :  * details.
      13             :  *
      14             :  * You should have received a copy of the GNU Lesser General Public License
      15             :  * along with this library; if not, write to the Free Software Foundation, Inc.,
      16             :  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      17             :  */
      18             : 
      19             : #include "dso.h"
      20             : 
      21             : #include "debug.h"
      22             : #include "log.h"
      23             : #include "os.h"
      24             : 
      25             : #ifdef _WIN32 //_MSC_VER
      26             : #  define LB_DL_ERROR sysError
      27             : #else
      28             : #  include <dlfcn.h>
      29             : #  define LB_DL_ERROR dlerror()
      30             : #endif
      31             : 
      32             : namespace lunchbox
      33             : {
      34             : namespace detail
      35             : {
      36             : class DSO
      37             : {
      38             : public:
      39           4 :     DSO() : dso( 0 ) {}
      40             : 
      41             : #ifdef _WIN32 //_MSC_VER
      42             :     HMODULE dso;
      43             : #else
      44             :     void* dso;
      45             : #endif
      46             : };
      47             : }
      48             : 
      49           1 : DSO::DSO()
      50           1 :     : _impl( new detail::DSO )
      51           1 : {}
      52             : 
      53           3 : DSO::DSO( const std::string& name )
      54           3 :     : _impl( new detail::DSO )
      55             : {
      56           3 :     open( name );
      57           3 : }
      58             : 
      59           4 : DSO::~DSO()
      60             : {
      61           4 :     close();
      62           4 :     delete _impl;
      63           4 : }
      64             : 
      65           5 : bool DSO::open( const std::string& fileName )
      66             : {
      67           5 :     if( _impl->dso )
      68             :     {
      69           1 :         LBWARN << "DSO already open, close it first" << std::endl;
      70           1 :         return false;
      71             :     }
      72             : 
      73           4 :     if( fileName.empty( ))
      74             :     {
      75             : #ifdef _WIN32 //_MSC_VER
      76             :         _impl->dso = GetModuleHandle( 0 );
      77             :         LBASSERT( _impl->dso );
      78             : #else
      79           0 :         _impl->dso = RTLD_DEFAULT;
      80             : #endif
      81             :     }
      82             :     else
      83             :     {
      84             : #ifdef _WIN32 //_MSC_VER
      85             :         _impl->dso = LoadLibrary( fileName.c_str() );
      86             : #elif defined( RTLD_LOCAL )
      87           4 :         _impl->dso = dlopen( fileName.c_str(), RTLD_LAZY | RTLD_LOCAL );
      88             : #else
      89             :         _impl->dso = dlopen( fileName.c_str(), RTLD_LAZY );
      90             : #endif
      91           4 :         if( !_impl->dso )
      92             :         {
      93           0 :             LBINFO << "Can't open library " << fileName << ": " << LB_DL_ERROR
      94           0 :                    << std::endl;
      95           0 :             return false;
      96             :         }
      97             :     }
      98             : 
      99           4 :     return true;
     100             : }
     101             : 
     102           6 : void DSO::close()
     103             : {
     104           6 :     if( !_impl->dso )
     105           8 :         return;
     106             : 
     107             : #ifdef _WIN32 //_MSC_VER
     108             :     if( _impl->dso != GetModuleHandle( 0 ))
     109             :         FreeLibrary( _impl->dso ) ;
     110             : #else
     111           4 :     if( _impl->dso != RTLD_DEFAULT )
     112           4 :         dlclose ( _impl->dso );
     113             : #endif
     114             : 
     115           4 :     _impl->dso = 0;
     116             : }
     117             : 
     118          19 : void* DSO::getFunctionPointer( const std::string& name ) const
     119             : {
     120          19 :     if( !_impl->dso )
     121           1 :         return 0;
     122             : 
     123             : #ifdef _WIN32 //_MSC_VER
     124             :     return (void*)GetProcAddress( _impl->dso, name.c_str( ));
     125             : #else
     126          18 :     return dlsym( _impl->dso, name.c_str( ));
     127             : #endif
     128             : }
     129             : 
     130           4 : bool DSO::isOpen() const
     131             : {
     132           4 :     return _impl->dso != 0;
     133             : }
     134             : 
     135           8 : bool DSO::operator == ( const DSO& rhs ) const
     136             : {
     137           8 :     return _impl->dso == rhs._impl->dso;
     138             : }
     139             : 
     140          87 : }

Generated by: LCOV version 1.10