The Gaudi Framework  v30r3 (a5ef0a68)
DLLClassManager.cpp
Go to the documentation of this file.
1 // Include files
2 #include "DLLClassManager.h"
7 #include "GaudiKernel/IService.h"
11 #include "GaudiKernel/MsgStream.h"
12 #include "GaudiKernel/System.h"
13 
14 #include "GaudiKernel/IAlgorithm.h"
15 
16 #include <cassert>
17 #include <iostream>
18 
19 // default creator
21 {
22  m_pOuter = iface;
24 
25  assert( m_svclocator.isValid() );
26 
27  addRef(); // Initial count set to 1
28 }
29 
30 // implementation of IClassManager::loadModule
31 StatusCode DLLClassManager::loadModule( const std::string& module, bool fireIncident )
32 {
33  // Access the message service if not yet done already
34  if ( !m_msgsvc ) m_msgsvc = m_svclocator;
35  MsgStream log( m_msgsvc, "DllClassManager" );
36 
37  std::string mod = module == "" ? System::moduleNameFull() : module;
38  if ( module == "NONE" ) return StatusCode::SUCCESS;
39 
40  void* libHandle = nullptr;
42  try {
43  status = System::loadDynamicLib( module, &libHandle ) ? StatusCode::SUCCESS : StatusCode::FAILURE;
44  } catch ( const std::exception& excpt ) {
45  if ( m_msgsvc ) {
46  log << MSG::ERROR << "Exception whilst loading " << module << " : " << excpt.what() << endmsg;
47  }
48  status = StatusCode::FAILURE;
49  }
50 
51  if ( status.isFailure() ) {
52  // DLL library not loaded
53  log << MSG::ERROR << "Could not load module " << module << endmsg;
54  log << MSG::ERROR << "System Error: " << System::getLastErrorString() << endmsg;
55  return StatusCode::FAILURE;
56  }
57  // FIXME this is a hack to avoid a very early call to moduleLoad from
58  // FIXME AppMgr::i_startup
59  if ( fireIncident && !module.empty() ) {
60  // now fire ModuleLoadedIncident
61  const bool CREATEIF( true );
62  auto pIncidentSvc = m_svclocator->service<IIncidentSvc>( "IncidentSvc", CREATEIF );
63  if ( !pIncidentSvc ) {
64  log << MSG::FATAL << "Can not locate IncidentSvc" << endmsg;
65  throw GaudiException( "Error retrieving IncidentSvc", "DLLClassManager::DLLClassManager", StatusCode::FAILURE );
66  }
67  pIncidentSvc->fireIncident( ModuleLoadedIncident( "DLLClassManager", module ) );
68  }
69 
70  return StatusCode::SUCCESS;
71 }
72 
73 // implementation of IInterface::queryInterface
74 StatusCode DLLClassManager::queryInterface( const InterfaceID& iid, void** pinterface )
75 {
76  // try local interfaces
77  StatusCode sc = base_class::queryInterface( iid, pinterface );
78  if ( sc.isSuccess() ) return sc;
79  // fall back on the owner
80  return m_pOuter->queryInterface( iid, pinterface );
81 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
T empty(T...args)
Define general base for Gaudi exception.
StatusCode loadModule(const std::string &module, bool fireIncident=true) override
bool isSuccess() const
Definition: StatusCode.h:287
GAUDI_API const std::string & moduleNameFull()
Get the full name of the (executable/DLL) file.
Definition: ModuleInfo.cpp:78
bool isFailure() const
Definition: StatusCode.h:139
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
Interface ID class.
Definition: IInterface.h:29
T what(T...args)
SmartIF< IMessageSvc > m_msgsvc
unsigned long addRef() override
Reference Interface instance.
Definition: implements.h:39
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:51
Definition of the basic interface.
Definition: IInterface.h:277
fired when a module (DLL) is loaded
STL class.
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
implementation of IInterface::queryInterface
bool isValid() const
Allow for check if smart pointer is valid.
Definition: SmartIF.h:68
DLLClassManager(IInterface *iface)
SmartIF< ISvcLocator > m_svclocator
GAUDI_API const std::string getLastErrorString()
Get last system error as string.
Definition: System.cpp:294
StatusCode queryInterface(const InterfaceID &ti, void **pp) override
Implementation of IInterface::queryInterface.
Definition: implements.h:20
SmartIF< IInterface > m_pOuter
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:154
virtual StatusCode queryInterface(const InterfaceID &ti, void **pp)=0
Set the void** to the pointer to the requested interface of the instance.