The Gaudi Framework  v29r0 (ff2e7097)
DLLClassManager Class Reference

#include <src/ApplicationMgr/DLLClassManager.h>

Inheritance diagram for DLLClassManager:
Collaboration diagram for DLLClassManager:

Public Member Functions

 DLLClassManager (IInterface *iface)
 
 ~DLLClassManager () override=default
 
StatusCode loadModule (const std::string &module, bool fireIncident=true) override
 
StatusCode queryInterface (const InterfaceID &iid, void **pinterface) override
 implementation of IInterface::queryInterface More...
 
- Public Member Functions inherited from implements< IClassManager >
void * i_cast (const InterfaceID &tid) const override
 Implementation of IInterface::i_cast. More...
 
StatusCode queryInterface (const InterfaceID &ti, void **pp) override
 Implementation of IInterface::queryInterface. More...
 
std::vector< std::stringgetInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 implements ()=default
 Default constructor. More...
 
 implements (const implements &)
 Copy constructor (zero the reference count) More...
 
implementsoperator= (const implements &)
 Assignment operator (do not touch the reference count). More...
 
 ~implements () override=default
 Virtual destructor. More...
 
unsigned long addRef () override
 Reference Interface instance. More...
 
unsigned long release () override
 Release Interface instance. More...
 
unsigned long refCount () const override
 Current reference count. More...
 
- Public Member Functions inherited from extend_interfaces< Interfaces... >
 ~extend_interfaces () override=default
 Virtual destructor. More...
 

Private Attributes

SmartIF< ISvcLocatorm_svclocator
 
SmartIF< IMessageSvcm_msgsvc
 
SmartIF< IInterfacem_pOuter
 

Additional Inherited Members

- Public Types inherited from implements< IClassManager >
using base_class = implements< Interfaces... >
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces... >
 Typedef to the base of this class. More...
 
using iids = typename extend_interfaces_base::ext_iids
 
- Public Types inherited from extend_interfaces< Interfaces... >
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids... >::type
 take union of the ext_iids of all Interfaces... More...
 
- Protected Attributes inherited from implements< IClassManager >
std::atomic_ulong m_refCount
 Reference counter. More...
 

Detailed Description

Definition at line 27 of file DLLClassManager.h.

Constructor & Destructor Documentation

DLLClassManager::DLLClassManager ( IInterface iface)

Definition at line 19 of file DLLClassManager.cpp.

20 {
21  m_pOuter = iface;
23 
24  assert( m_svclocator.isValid() );
25 
26  addRef(); // Initial count set to 1
27 }
unsigned long addRef() override
Reference Interface instance.
Definition: implements.h:41
bool isValid() const
Allow for check if smart pointer is valid.
Definition: SmartIF.h:68
SmartIF< ISvcLocator > m_svclocator
SmartIF< IInterface > m_pOuter
DLLClassManager::~DLLClassManager ( )
overridedefault

Member Function Documentation

StatusCode DLLClassManager::loadModule ( const std::string module,
bool  fireIncident = true 
)
override

Definition at line 30 of file DLLClassManager.cpp.

31 {
32  // Access the message service if not yet done already
33  if ( !m_msgsvc ) m_msgsvc = m_svclocator;
34  MsgStream log( m_msgsvc, "DllClassManager" );
35 
36  std::string mod = module == "" ? System::moduleNameFull() : module;
37  if ( module == "NONE" ) return StatusCode::SUCCESS;
38 
39  void* libHandle = nullptr;
41  try {
42  status = System::loadDynamicLib( module, &libHandle );
43  } catch ( const std::exception& excpt ) {
44  if ( m_msgsvc ) {
45  log << MSG::ERROR << "Exception whilst loading " << module << " : " << excpt.what() << endmsg;
46  }
47  status = StatusCode::FAILURE;
48  }
49 
50  if ( status.isFailure() ) {
51  // DLL library not loaded
52  log << MSG::ERROR << "Could not load module " << module << endmsg;
53  log << MSG::ERROR << "System Error: " << System::getLastErrorString() << endmsg;
54  return StatusCode::FAILURE;
55  }
56  // FIXME this is a hack to avoid a very early call to moduleLoad from
57  // FIXME AppMgr::i_startup
58  if ( fireIncident && !module.empty() ) {
59  // now fire ModuleLoadedIncident
60  const bool CREATEIF( true );
61  auto pIncidentSvc = m_svclocator->service<IIncidentSvc>( "IncidentSvc", CREATEIF );
62  if ( !pIncidentSvc ) {
63  log << MSG::FATAL << "Can not locate IncidentSvc" << endmsg;
64  throw GaudiException( "Error retrieving IncidentSvc", "DLLClassManager::DLLClassManager", StatusCode::FAILURE );
65  }
66  pIncidentSvc->fireIncident( ModuleLoadedIncident( "DLLClassManager", module ) );
67  }
68 
69  return StatusCode::SUCCESS;
70 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
T empty(T...args)
Define general base for Gaudi exception.
GAUDI_API const std::string & moduleNameFull()
Get the full name of the (executable/DLL) file.
Definition: ModuleInfo.cpp:78
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
STL class.
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:79
T what(T...args)
SmartIF< IMessageSvc > m_msgsvc
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
fired when a module (DLL) is loaded
STL class.
SmartIF< ISvcLocator > m_svclocator
GAUDI_API const std::string getLastErrorString()
Get last system error as string.
Definition: System.cpp:291
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
The interface implemented by the IncidentSvc service.
Definition: IIncidentSvc.h:23
GAUDI_API unsigned long loadDynamicLib(const std::string &name, ImageHandle *handle)
Load dynamic link library.
Definition: System.cpp:147
StatusCode DLLClassManager::queryInterface ( const InterfaceID iid,
void **  pinterface 
)
override

implementation of IInterface::queryInterface

Definition at line 73 of file DLLClassManager.cpp.

74 {
75  // try local interfaces
76  StatusCode sc = base_class::queryInterface( iid, pinterface );
77  if ( sc.isSuccess() ) return sc;
78  // fall back on the owner
79  return m_pOuter->queryInterface( iid, pinterface );
80 }
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
StatusCode queryInterface(const InterfaceID &ti, void **pp) override
Implementation of IInterface::queryInterface.
Definition: implements.h:20
SmartIF< IInterface > m_pOuter
virtual StatusCode queryInterface(const InterfaceID &ti, void **pp)=0
Set the void** to the pointer to the requested interface of the instance.

Member Data Documentation

SmartIF<IMessageSvc> DLLClassManager::m_msgsvc
private

Definition at line 43 of file DLLClassManager.h.

SmartIF<IInterface> DLLClassManager::m_pOuter
private

Definition at line 44 of file DLLClassManager.h.

SmartIF<ISvcLocator> DLLClassManager::m_svclocator
private

Definition at line 42 of file DLLClassManager.h.


The documentation for this class was generated from the following files: