LCOV - code coverage report
Current view: top level - ers/src - PluginManager.cpp (source / functions) Coverage Total Hit
Test: code.result Lines: 58.6 % 29 17
Test Date: 2026-07-12 15:23:06 Functions: 50.0 % 4 2

            Line data    Source code
       1              : /*
       2              :  * DUNE DAQ modification notice:
       3              :  * This file has been modified from the original ATLAS ers source for the DUNE DAQ project.
       4              :  * Fork baseline commit: 8267df82a4f6fe6bf02c4014923eba19eddc4614 (2020-04-14).
       5              :  * Renamed since fork: yes (from src/PluginManager.cxx to src/PluginManager.cpp).
       6              :  *
       7              :  * Original copyright:
       8              :  * Copyright (C) 2001-2020 CERN for the benefit of the ATLAS collaboration.
       9              :  * Licensed under the Apache License, Version 2.0.
      10              :  */
      11              : 
      12              : #ifndef __rtems__
      13              : #include <dlfcn.h>
      14              : #endif
      15              : 
      16              : #include <vector>
      17              : 
      18              : #include <ers/internal/Util.hpp>
      19              : #include <ers/internal/PluginManager.hpp>
      20              : #include <ers/internal/macro.hpp>
      21              : 
      22              : namespace
      23              : {
      24              :     const char * const SEPARATOR = ":";
      25              :     const char * const DefaultLibraryName = "ers_AbortStream_ersStream:ers_ExitStream_ersStream:ers_FilterStream_ersStream:ers_GlobalLockStream_ersStream:ers_LockStream_ersStream:ers_NullStream_ersStream:ers_RFilterStream_ersStream:ers_StandardStream_ersStream:ers_ThrottleStream_ersStream:ers_ThrowStream_ersStream";
      26              :     const char * const EnvironmentName = "DUNEDAQ_ERS_STREAM_LIBS";
      27              : }
      28              : 
      29              : namespace ers
      30              : {
      31              : 
      32          420 :     PluginManager::SharedLibrary::SharedLibrary( const std::string & name )
      33              :     {
      34              : #ifndef __rtems__
      35          420 :         std::string library = "lib" + name + ".so" ;
      36              : 
      37          420 :         handle_ = dlopen( library.c_str(), RTLD_LAZY|RTLD_GLOBAL );
      38          420 :         char * error = dlerror();
      39              : 
      40          420 :         if ( !handle_ )
      41              :         {
      42            0 :             throw PluginException( error );
      43              :         }
      44              : #endif
      45          420 :     }
      46              : 
      47            0 :     PluginManager::SharedLibrary::~SharedLibrary( )
      48              :     {
      49              :         ////////////////////////////////////////////////////////////////////
      50              :         // Library should be unloaded, but with some compilers (e.g gcc323)
      51              :         // this results in crash of program, because it is not recognized
      52              :         // that the library is still in use
      53              :         ////////////////////////////////////////////////////////////////////
      54              : 
      55              :         //dlclose( handle_ );
      56            0 :     }
      57              : 
      58            0 :     PluginManager::~PluginManager()
      59              :     {
      60            0 :         LibMap::iterator it = libraries_.begin();
      61            0 :         for ( ; it != libraries_.end(); )
      62              :         {
      63            0 :             delete it->second;
      64            0 :             libraries_.erase( it++ );
      65              :         }
      66            0 :     }
      67              : 
      68           42 :     PluginManager::PluginManager( )
      69              :     {
      70           42 :         const char * env = ::getenv( EnvironmentName );
      71           42 :         std::string config( env ? std::string( env ) + SEPARATOR + DefaultLibraryName : DefaultLibraryName );
      72              :         
      73           42 :         std::vector<std::string> libs;
      74           42 :         ers::tokenize( config, SEPARATOR, libs );
      75              :         
      76              :         
      77          462 :         for ( size_t i = 0; i < libs.size(); i++ )
      78              :         {
      79          420 :             LibMap::iterator it = libraries_.find( libs[i] );
      80          420 :             if ( it == libraries_.end() )
      81              :             {
      82          420 :                 try
      83              :                 {
      84          420 :                     libraries_[libs[i]] = new SharedLibrary( libs[i] );
      85              :                 }
      86            0 :                 catch( PluginException & ex )
      87              :                 {
      88            0 :                     ERS_INTERNAL_ERROR( "Library " << libs[i] << " can not be loaded because " << ex.reason() )
      89            0 :                 }
      90              :             }
      91              :         }
      92           42 :     }
      93              : }
        

Generated by: LCOV version 2.0-1