14 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) ) 15 #define DEBUG_MSG ON_DEBUG debug() 22 auto* queue = algoId_algoQueue.second;
37 info() <<
"TopAlg list empty. Recovering the one of Application Manager" <<
endmsg;
56 if ( !startSc.
isSuccess() )
return startSc;
60 startSc = ialgo->sysStart();
62 error() <<
"Unable to start Algorithm: " << ialgo->name() <<
endmsg;
74 size_t algo_id = hash_function( name );
78 error() <<
"Algorithm " << name <<
" requested, but not recognised" <<
endmsg;
85 itQueueIAlgPtr->second->pop( algo );
97 DEBUG_MSG <<
"No instance of algorithm " << name <<
" could be retrieved in non-blocking mode" <<
endmsg;
109 error() <<
"Failure to allocate resources of algorithm " << name <<
endmsg;
112 if ( 0 != algo->
cardinality() ) { itQueueIAlgPtr->second->push( algo ); }
117 itQueueIAlgPtr->second->push( algo );
128 size_t algo_id = hash_function( name );
167 error() <<
"Unable to dcast Algorithm " << algo->
name() <<
" to a Sequence, but it has isSequence==true" 172 auto subAlgorithms =
seq->subAlgorithms();
177 for (
auto subalgo : *subAlgorithms ) {
180 error() <<
"Algorithm " << subalgo->name() <<
" could not be flattened" <<
endmsg;
197 error() <<
"Algorithm manager could not be properly fetched." <<
endmsg;
205 this->
warning() <<
"Algorithm " << item_type <<
"/" << item_name <<
" could not be created." <<
endmsg;
213 for (
auto&
name : topAlgNames ) {
221 if ( !algoSmartIF.isValid() ) {
222 createAlg( item_type, item_name, algo );
235 fatal() <<
"Conversion from IAlgorithm to Gaudi::Algorithm failed" <<
endmsg;
253 debug() <<
" o " << algo->type() <<
"/" << algo->name() <<
" @ " << algo <<
endmsg;
259 unsigned int resource_counter( 0 );
263 const std::string& item_name = ialgoSmartIF->name();
265 verbose() <<
"Treating resource management and clones of " << item_name <<
endmsg;
269 fatal() <<
"Conversion from IAlgorithm to Gaudi::Algorithm failed" <<
endmsg;
274 size_t algo_id = hash_function( item_name );
281 queue->push( ialgo );
283 if ( ialgo->isReEntrant() ) {
284 if ( ialgo->cardinality() != 0 ) {
285 info() <<
"Algorithm " << ialgo->name() <<
" is ReEntrant, but Cardinality was set to " << ialgo->cardinality()
291 }
else if ( ialgo->isClonable() ) {
294 if ( ialgo->cardinality() == 1 ) {
298 info() <<
"Algorithm " << ialgo->name() <<
" is un-Clonable but Cardinality was set to " 299 << ialgo->cardinality() <<
". Only creating 1 instance" <<
endmsg;
302 warning() <<
"Overriding UnClonability of Algorithm " << ialgo->name() <<
". Setting Cardinality to " 303 << ialgo->cardinality() <<
endmsg;
312 for (
auto& resource_name : ialgo->neededResources() ) {
315 if ( ret.second ) ++resource_counter;
317 requirements.resize( resource_counter );
319 requirements[ret.first->second] =
true;
327 debug() <<
"type/name to create clone of: " << item_type <<
"/" << item_name <<
endmsg;
329 createAlg( item_type, item_name, ialgoClone );
332 error() <<
"unable to initialize Algorithm clone " << ialgoClone->name() <<
endmsg;
336 queue->push( ialgoClone );
374 if ( !stopSc.
isSuccess() )
return stopSc;
378 stopSc = ialgo->sysStop();
380 error() <<
"Unable to stop Algorithm: " << ialgo->name() <<
endmsg;
ListAlg m_flatUniqueAlgList
The flat list of algorithms w/o clones.
virtual SmartIF< IAlgorithm > & algorithm(const Gaudi::Utils::TypeNameString &typeName, const bool createIf=true)=0
Returns a smart pointer to a service.
StatusCode initialize() override
const std::string & name() const override
Retrieve name of the service.
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatusCode start() override
const std::string & name() const override
The identifying name of the algorithm object.
std::map< std::string, unsigned int > m_resource_indices
bool isSequence() const override
Are we a Sequence?
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
constexpr static const auto SUCCESS
std::mutex m_resource_mutex
StatusCode stop() override
virtual StatusCode getProperty(Gaudi::Details::PropertyBase *p) const =0
Get the property by property.
The AlgResourcePool is a concrete implementation of the IAlgResourcePool interface.
state_type m_available_resources
Gaudi::Property< bool > m_overrideUnClonable
virtual StatusCode sysInitialize()=0
Initialization method invoked by the framework.
#define DECLARE_COMPONENT(type)
boost::dynamic_bitset state_type
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Helper class to parse a string of format "type/name".
MsgStream & warning() const
shortcut for the method msgStream(MSG::WARNING)
tbb::concurrent_bounded_queue< IAlgorithm * > concurrentQueueIAlgPtr
std::list< IAlgorithm * > m_flatUniqueAlgPtrList
The flat list of algorithms w/o clones which is returned.
This class is used for returning status codes from appropriate routines.
std::map< size_t, state_type > m_resource_requirements
StatusCode start() override
~AlgResourcePool() override
std::list< IAlgorithm * > m_topAlgPtrList
The top list of algorithms.
virtual unsigned int cardinality() const =0
Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentra...
virtual void setIndex(const unsigned int &idx)=0
Set instantiation index of Alg.
std::list< IAlgorithm * > getFlatAlgList() override
StatusCode releaseResource(const std::string &name) override
Release a certrain resource.
Gaudi::Property< std::vector< std::string > > m_topAlgNames
std::list< IAlgorithm * > getTopAlgList() override
StatusCode stop() override
The IAlgorithm is the interface implemented by the Algorithm base class.
StatusCode acquireResource(const std::string &name) override
Acquire a certain resource.
std::map< size_t, concurrentQueueIAlgPtr * > m_algqueue_map
const std::string & type() const override
The type of the algorithm object.
StatusCode decodeTopAlgs()
Decode the top alg list.
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
StatusCode flattenSequencer(Gaudi::Algorithm *sequencer, ListAlg &alglist, unsigned int recursionDepth=0)
Recursively flatten an algList.
bool isValid() const
Allow for check if smart pointer is valid.
const std::string & type() const
const StatusCode & ignore() const
Ignore/check StatusCode.
Base class from which all concrete algorithm classes should be derived.
virtual StatusCode createAlgorithm(const std::string &algtype, const std::string &algname, IAlgorithm *&alg, bool managed=false, bool checkIfExists=true )=0
Create an instance of a algorithm type that has been declared beforehand and assigns to it a name...
StatusCode acquireAlgorithm(const std::string &name, IAlgorithm *&algo, bool blocking=false) override
Acquire a certain algorithm using its name.
constexpr static const auto FAILURE
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
std::map< size_t, unsigned int > m_n_of_created_instances
AttribStringParser::Iterator begin(const AttribStringParser &parser)
const std::string & name() const
StatusCode initialize() override
MsgStream & fatal() const
shortcut for the method msgStream(MSG::FATAL)
ListAlg m_topAlgList
The list of top algorithms.
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
std::map< size_t, size_t > m_n_of_allowed_instances
ListAlg m_algList
The list of all algorithms created withing the Pool which are not top.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
StatusCode releaseAlgorithm(const std::string &name, IAlgorithm *&algo) override
Release a certain algorithm.
Gaudi::Property< bool > m_lazyCreation
MSG::Level msgLevel() const
get the cached level (originally extracted from the embedded MsgStream)