The Gaudi Framework  master (82fdf313)
Loading...
Searching...
No Matches
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"
22#include <GaudiKernel/System.h>
23#include <cassert>
24
26 assert( m_svclocator.isValid() );
27 addRef(); // Initial count set to 1
28}
29
30StatusCode DLLClassManager::loadModule( const std::string& module, bool fireIncident ) {
31 // Access the message service if not yet done
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;
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
67}
68
69StatusCode 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}
76void 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}
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
SmartIF< ISvcLocator > m_svclocator
void const * i_cast(const InterfaceID &iid) const override
StatusCode queryInterface(const InterfaceID &iid, void **pinterface) override
implementation of IInterface::queryInterface
StatusCode loadModule(const std::string &module, bool fireIncident=true) override
DLLClassManager(IInterface *iface)
SmartIF< IInterface > m_pOuter
SmartIF< IMessageSvc > m_msgsvc
Define general base for Gaudi exception.
The interface implemented by the IncidentSvc service.
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
Definition of the basic interface.
Definition IInterface.h:225
Interface ID class.
Definition IInterface.h:38
fired when a module (DLL) is loaded
Definition of the MsgStream class used to transmit messages.
Definition MsgStream.h:29
This class is used for returning status codes from appropriate routines.
Definition StatusCode.h:64
bool isFailure() const
Definition StatusCode.h:129
bool isSuccess() const
Definition StatusCode.h:314
constexpr static const auto SUCCESS
Definition StatusCode.h:99
constexpr static const auto FAILURE
Definition StatusCode.h:100
@ FATAL
Definition IMessageSvc.h:22
@ ERROR
Definition IMessageSvc.h:22
GAUDI_API unsigned long loadDynamicLib(const std::string &name, ImageHandle *handle)
Load dynamic link library.
Definition System.cpp:115
GAUDI_API const std::string getLastErrorString()
Get last system error as string.
Definition System.cpp:234
StatusCode queryInterface(const InterfaceID &ti, void **pp) override
Definition implements.h:30
unsigned long addRef() const override
Definition implements.h:48
void const * i_cast(const InterfaceID &tid) const override
Definition implements.h:28