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 : }
|