Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  master (d98a2936)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
DLLClassManager.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #include "DLLClassManager.h"
14 #include <GaudiKernel/IAlgorithm.h>
17 #include <GaudiKernel/IService.h>
21 #include <GaudiKernel/MsgStream.h>
22 #include <GaudiKernel/System.h>
23 #include <cassert>
24 
25 DLLClassManager::DLLClassManager( IInterface* iface ) : m_svclocator( iface ), m_pOuter( iface ) {
26  assert( m_svclocator.isValid() );
27  addRef(); // Initial count set to 1
28 }
29 
30 StatusCode DLLClassManager::loadModule( const std::string& module, bool fireIncident ) {
31  // Access the message service if not yet done
32  if ( !m_msgsvc ) m_msgsvc = m_svclocator;
33  MsgStream log( m_msgsvc, "DllClassManager" );
34 
35  std::string mod = module == "" ? System::moduleNameFull() : module;
36  if ( module == "NONE" ) return StatusCode::SUCCESS;
37 
38  void* libHandle = nullptr;
40  try {
41  status = System::loadDynamicLib( module, &libHandle ) ? StatusCode::SUCCESS : StatusCode::FAILURE;
42  } catch ( const std::exception& excpt ) {
43  if ( m_msgsvc ) { log << MSG::ERROR << "Exception whilst loading " << module << " : " << excpt.what() << endmsg; }
44  status = StatusCode::FAILURE;
45  }
46 
47  if ( status.isFailure() ) {
48  // DLL library not loaded
49  log << MSG::ERROR << "Could not load module " << module << endmsg;
50  log << MSG::ERROR << "System Error: " << System::getLastErrorString() << endmsg;
51  return StatusCode::FAILURE;
52  }
53  // FIXME this is a hack to avoid a very early call to moduleLoad from
54  // FIXME AppMgr::i_startup
55  if ( fireIncident && !module.empty() ) {
56  // now fire ModuleLoadedIncident
57  const bool CREATEIF( true );
58  auto pIncidentSvc = m_svclocator->service<IIncidentSvc>( "IncidentSvc", CREATEIF );
59  if ( !pIncidentSvc ) {
60  log << MSG::FATAL << "Can not locate IncidentSvc" << endmsg;
61  throw GaudiException( "Error retrieving IncidentSvc", "DLLClassManager::DLLClassManager", StatusCode::FAILURE );
62  }
63  pIncidentSvc->fireIncident( ModuleLoadedIncident( "DLLClassManager", module ) );
64  }
65 
66  return StatusCode::SUCCESS;
67 }
68 
69 StatusCode DLLClassManager::queryInterface( const InterfaceID& iid, void** pinterface ) {
70  // try local interfaces
71  StatusCode sc = base_class::queryInterface( iid, pinterface );
72  if ( sc.isSuccess() ) return sc;
73  // fall back on the owner
74  return m_pOuter->queryInterface( iid, pinterface );
75 }
76 void const* DLLClassManager::i_cast( const InterfaceID& iid ) const {
77  if ( auto output = base_class::i_cast( iid ) ) return output;
78  // fall back on the owner
79  return m_pOuter->i_cast( iid );
80 }
implements::queryInterface
StatusCode queryInterface(const InterfaceID &ti, void **pp) override
Implementation of IInterface::queryInterface.
Definition: implements.h:30
System::loadDynamicLib
GAUDI_API unsigned long loadDynamicLib(const std::string &name, ImageHandle *handle)
Load dynamic link library.
Definition: System.cpp:115
IAlgManager.h
IService.h
Gaudi.Configuration.log
log
Definition: Configuration.py:28
DLLClassManager::queryInterface
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
implementation of IInterface::queryInterface
Definition: DLLClassManager.cpp:69
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
System.h
GaudiException.h
GaudiException
Definition: GaudiException.h:29
System::moduleNameFull
GAUDI_API const std::string & moduleNameFull()
Get the full name of the (executable/DLL) file.
Definition: ModuleInfo.cpp:44
ModuleIncident.h
DLLClassManager::loadModule
StatusCode loadModule(const std::string &module, bool fireIncident=true) override
Definition: DLLClassManager.cpp:30
gaudirun.output
output
Definition: gaudirun.py:521
IMessageSvc.h
DLLClassManager::m_svclocator
SmartIF< ISvcLocator > m_svclocator
Definition: DLLClassManager.h:50
IIncidentSvc.h
Gaudi.CommonGaudiConfigurables.mod
mod
Definition: CommonGaudiConfigurables.py:39
implements::i_cast
void const * i_cast(const InterfaceID &tid) const override
Implementation of IInterface::i_cast.
Definition: implements.h:28
DLLClassManager::m_pOuter
SmartIF< IInterface > m_pOuter
Definition: DLLClassManager.h:52
SmartIF::isValid
bool isValid() const
Allow for check if smart pointer is valid.
Definition: SmartIF.h:69
StatusCode
Definition: StatusCode.h:64
DLLClassManager.h
DLLClassManager::m_msgsvc
SmartIF< IMessageSvc > m_msgsvc
Definition: DLLClassManager.h:51
implements< IClassManager >::addRef
unsigned long addRef() const override
Reference Interface instance
Definition: implements.h:48
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:198
MsgStream
Definition: MsgStream.h:29
DLLClassManager::DLLClassManager
DLLClassManager(IInterface *iface)
Definition: DLLClassManager.cpp:25
ModuleLoadedIncident
fired when a module (DLL) is loaded
Definition: ModuleIncident.h:50
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:22
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:99
DLLClassManager::i_cast
void const * i_cast(const InterfaceID &iid) const override
Definition: DLLClassManager.cpp:76
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:22
IInterface
Definition: IInterface.h:225
InterfaceID
Definition: IInterface.h:38
IAlgorithm.h
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
ISvcLocator.h
System::getLastErrorString
GAUDI_API const std::string getLastErrorString()
Get last system error as string.
Definition: System.cpp:234
IIncidentSvc
Definition: IIncidentSvc.h:30
ISvcManager.h
MsgStream.h