AlgResourcePool Class Reference

The AlgResourcePool is a concrete implementation of the IAlgResourcePool interface. More...

#include <GaudiHive/AlgResourcePool.h>

Inheritance diagram for AlgResourcePool:
Collaboration diagram for AlgResourcePool:

Public Member Functions

 AlgResourcePool (const std::string &name, ISvcLocator *svc)
 
 ~AlgResourcePool ()
 
virtual StatusCode start ()
 
virtual StatusCode initialize ()
 
virtual StatusCode acquireAlgorithm (const std::string &name, IAlgorithm *&algo, bool blocking=false)
 Acquire a certain algorithm using its name. More...
 
virtual StatusCode releaseAlgorithm (const std::string &name, IAlgorithm *&algo)
 Release a certain algorithm. More...
 
virtual StatusCode acquireResource (const std::string &name)
 Acquire a certain resource. More...
 
virtual StatusCode releaseResource (const std::string &name)
 Release a certrain resource. More...
 
virtual std::list< IAlgorithm * > getFlatAlgList ()
 
virtual std::list< IAlgorithm * > getTopAlgList ()
 
virtual StatusCode beginRun ()
 
virtual StatusCode endRun ()
 
virtual StatusCode stop ()
 
virtual concurrency::ExecutionFlowGraphgetExecutionFlowGraph () const
 
- Public Member Functions inherited from extends< BASE, Interfaces >
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::string > getInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 ~extends () override=default
 Virtual destructor. More...
 
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::string > getInterfaceNames () const override
 Implementation of IInterface::getInterfaceNames. More...
 
 ~extends () override=default
 Virtual destructor. More...
 
- Public Member Functions inherited from extend_interfaces< Interfaces...>
 ~extend_interfaces () override=default
 Virtual destructor. More...
 
 ~extend_interfaces () override=default
 Virtual destructor. More...
 

Private Types

typedef tbb::concurrent_bounded_queue< IAlgorithm * > concurrentQueueIAlgPtr
 
typedef std::list< SmartIF< IAlgorithm > > ListAlg
 
typedef boost::dynamic_bitset state_type
 

Private Member Functions

StatusCode decodeTopAlgs ()
 Decode the top alg list. More...
 
StatusCode flattenSequencer (Algorithm *sequencer, ListAlg &alglist, const std::string &parentName, unsigned int recursionDepth=0)
 Recursively flatten an algList. More...
 

Private Attributes

std::mutex m_resource_mutex
 
bool m_lazyCreation
 
state_type m_available_resources
 
std::map< size_t, concurrentQueueIAlgPtr * > m_algqueue_map
 
std::map< size_t, state_typem_resource_requirements
 
std::map< size_t, size_t > m_n_of_allowed_instances
 
std::map< size_t, unsigned int > m_n_of_created_instances
 
std::map< std::string, unsigned int > m_resource_indices
 
StringArrayProperty m_topAlgNames
 The names of the algorithms to be passed to the algorithm manager. More...
 
ListAlg m_algList
 The list of all algorithms created withing the Pool which are not top. More...
 
ListAlg m_topAlgList
 The list of top algorithms. More...
 
ListAlg m_flatUniqueAlgList
 The flat list of algorithms w/o clones. More...
 
std::list< IAlgorithm * > m_flatUniqueAlgPtrList
 The flat list of algorithms w/o clones which is returned. More...
 
std::list< IAlgorithm * > m_topAlgPtrList
 The top list of algorithms. More...
 
concurrency::ExecutionFlowGraphm_EFGraph
 OMG yet another hack. More...
 

Additional Inherited Members

- Public Types inherited from extends< BASE, Interfaces >
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces...>
 Typedef to the base of this class. More...
 
using base_class = extends
 Typedef to this class. More...
 
using extend_interfaces_base = extend_interfaces< Interfaces...>
 Typedef to the base of this class. More...
 
- 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...
 
using ext_iids = typename Gaudi::interface_list_cat< typename Interfaces::ext_iids...>::type
 take union of the ext_iids of all Interfaces... More...
 

Detailed Description

The AlgResourcePool is a concrete implementation of the IAlgResourcePool interface.

It either creates all instances upfront or lazily. Internal bookkeeping is done via hashes of the algo names.

Author
Benedikt Hegner

Definition at line 34 of file AlgResourcePool.h.

Member Typedef Documentation

typedef tbb::concurrent_bounded_queue<IAlgorithm*> AlgResourcePool::concurrentQueueIAlgPtr
private

Definition at line 63 of file AlgResourcePool.h.

typedef std::list<SmartIF<IAlgorithm> > AlgResourcePool::ListAlg
private

Definition at line 64 of file AlgResourcePool.h.

typedef boost::dynamic_bitset AlgResourcePool::state_type
private

Definition at line 65 of file AlgResourcePool.h.

Constructor & Destructor Documentation

AlgResourcePool::AlgResourcePool ( const std::string &  name,
ISvcLocator svc 
)

Definition at line 19 of file AlgResourcePool.cpp.

19  :
21 {
22  declareProperty("CreateLazily", m_lazyCreation = false );
23  declareProperty("TopAlg", m_topAlgNames );
24 }
StringArrayProperty m_topAlgNames
The names of the algorithms to be passed to the algorithm manager.
extends base_class
Typedef to this class.
Definition: extends.h:14
state_type m_available_resources
concurrency::ExecutionFlowGraph * m_EFGraph
OMG yet another hack.
AlgResourcePool::~AlgResourcePool ( )

Definition at line 29 of file AlgResourcePool.cpp.

29  {
30 
31  for (auto& algoId_algoQueue : m_algqueue_map){
32  auto* queue = algoId_algoQueue.second;
33  delete queue;
34  }
35 
36  delete m_EFGraph;
37 }
std::map< size_t, concurrentQueueIAlgPtr * > m_algqueue_map
concurrency::ExecutionFlowGraph * m_EFGraph
OMG yet another hack.

Member Function Documentation

StatusCode AlgResourcePool::acquireAlgorithm ( const std::string &  name,
IAlgorithm *&  algo,
bool  blocking = false 
)
virtual

Acquire a certain algorithm using its name.

Definition at line 90 of file AlgResourcePool.cpp.

90  {
91 
92  std::hash<std::string> hash_function;
93  size_t algo_id = hash_function(name);
94  auto itQueueIAlgPtr = m_algqueue_map.find(algo_id);
95 
96  if (itQueueIAlgPtr == m_algqueue_map.end()) {
97  error() << "Algorithm " << name << " requested, but not recognised"
98  << endmsg;
99  algo = nullptr;
100  return StatusCode::FAILURE;
101  }
102 
103  StatusCode sc;
104  if (blocking) {
105  itQueueIAlgPtr->second->pop(algo);
106  sc = StatusCode::SUCCESS;
107  } else {
108  sc = itQueueIAlgPtr->second->try_pop(algo);
109  }
110 
111  if(sc.isFailure())
112  if (msgLevel(MSG::DEBUG))
113  debug() << "No instance of algorithm " << name << " could be retrieved in non-blocking mode" << endmsg;
114 
115  // if (m_lazyCreation ) {
116  // TODO: fill the lazyCreation part
117  //}
118  if (sc.isSuccess()){
119  algo->resetExecuted();
120  state_type requirements = m_resource_requirements[algo_id];
121  m_resource_mutex.lock();
122  if (requirements.is_subset_of(m_available_resources)) {
123  m_available_resources^=requirements;
124  } else {
125  sc = StatusCode::FAILURE;
126  error() << "Failure to allocate resources of algorithm " << name << endmsg;
127  itQueueIAlgPtr->second->push(algo);
128  }
129  m_resource_mutex.unlock();
130  }
131  return sc;
132 }
std::map< size_t, concurrentQueueIAlgPtr * > m_algqueue_map
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
std::mutex m_resource_mutex
virtual void resetExecuted()=0
Reset the Algorithm executed state for the current event.
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
state_type m_available_resources
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
boost::dynamic_bitset state_type
std::map< size_t, state_type > m_resource_requirements
StatusCode AlgResourcePool::acquireResource ( const std::string &  name)
virtual

Acquire a certain resource.

Definition at line 153 of file AlgResourcePool.cpp.

153  {
154  m_resource_mutex.lock();
156  m_resource_mutex.unlock();
157  return StatusCode::SUCCESS;
158 }
std::mutex m_resource_mutex
state_type m_available_resources
std::map< std::string, unsigned int > m_resource_indices
StatusCode AlgResourcePool::beginRun ( )
virtual

Definition at line 373 of file AlgResourcePool.cpp.

373  {
374  auto algBeginRun = [&] (SmartIF<IAlgorithm>& algoSmartIF) -> StatusCode {
375  StatusCode sc = algoSmartIF->sysBeginRun();
376  if (!sc.isSuccess()) {
377  warning() << "beginRun() of algorithm " << algoSmartIF->name() << " failed" << endmsg;
378  return StatusCode::FAILURE;
379  }
380  return StatusCode::SUCCESS;
381  };
382  // Call the beginRun() method of all algorithms
383  for (auto& algoSmartIF : m_flatUniqueAlgList ) {
384  if (algBeginRun(algoSmartIF).isFailure())
385  return StatusCode::FAILURE;
386  }
387 
388  return StatusCode::SUCCESS;
389 }
ListAlg m_flatUniqueAlgList
The flat list of algorithms w/o clones.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
StatusCode AlgResourcePool::decodeTopAlgs ( )
private

Decode the top alg list.

Definition at line 221 of file AlgResourcePool.cpp.

221  {
222 
223  SmartIF<IAlgManager> algMan ( serviceLocator() );
224  if (!algMan.isValid()){
225  error() << "Algorithm manager could not be properly fetched." << endmsg;
226  return StatusCode::FAILURE;
227  }
228 
229  // Useful lambda not to repeat ourselves --------------------------
230  auto createAlg = [&algMan,this] (const std::string& item_type,
231  const std::string& item_name,
232  IAlgorithm*& algo){
233  StatusCode createAlgSc = algMan->createAlgorithm(item_type,
234  item_name,
235  algo,
236  true,
237  false);
238  if (createAlgSc.isFailure())
239  this->warning() << "Algorithm " << item_type << "/" << item_name
240  << " could not be created." << endmsg;
241  };
242  // End of lambda --------------------------------------------------
243 
245 
246  // Fill the top alg list ----
247  const std::vector<std::string>& topAlgNames = m_topAlgNames.value();
248  for (auto& name : topAlgNames) {
249  IAlgorithm* algo(nullptr);
250 
252  const std::string& item_name = item.name();
253  const std::string& item_type = item.type();
254  SmartIF<IAlgorithm> algoSmartIF (algMan->algorithm(item_name,false));
255 
256  if (!algoSmartIF.isValid()){
257  createAlg(item_type,item_name,algo);
258  algoSmartIF = algo;
259  }
260  // Init and start
261  algoSmartIF->sysInitialize();
262  m_topAlgList.push_back(algoSmartIF);
263  }
264  // Top Alg list filled ----
265 
266  // start forming the control flow graph by adding the head node
267  m_EFGraph->addHeadNode("EVENT LOOP",true,true,false);
268 
269  // Now we unroll it ----
270  for (auto& algoSmartIF : m_topAlgList){
271  Algorithm* algorithm = dynamic_cast<Algorithm*> (algoSmartIF.get());
272  if (!algorithm) fatal() << "Conversion from IAlgorithm to Algorithm failed" << endmsg;
273  sc = flattenSequencer(algorithm, m_flatUniqueAlgList, "EVENT LOOP");
274  }
275  if (outputLevel() <= MSG::DEBUG){
276  debug() << "List of algorithms is: " << endmsg;
277  for (auto& algo : m_flatUniqueAlgList)
278  debug() << " o " << algo->type() << "/" << algo->name() << " @ " << algo << endmsg;
279  }
280 
281  // Unrolled ---
282 
283  // Now let's manage the clones
284  unsigned int resource_counter(0);
285  std::hash<std::string> hash_function;
286  for (auto& ialgoSmartIF : m_flatUniqueAlgList) {
287 
288  const std::string& item_name = ialgoSmartIF->name();
289 
290  verbose() << "Treating resource management and clones of " << item_name << endmsg;
291 
292  Algorithm* algo = dynamic_cast<Algorithm*> ( ialgoSmartIF.get() );
293  if (!algo) fatal() << "Conversion from IAlgorithm to Algorithm failed" << endmsg;
294  const std::string& item_type = algo->type();
295 
296  size_t algo_id = hash_function(item_name);
298  m_algqueue_map[algo_id] = queue;
299 
300  // DP TODO Do it properly with SmartIFs, also in the queues
301  IAlgorithm* ialgo(ialgoSmartIF.get());
302 
303  queue->push(ialgo);
304  m_algList.push_back(ialgo);
305  m_n_of_allowed_instances[algo_id] = ialgo->cardinality();
306  m_n_of_created_instances[algo_id] = 1;
307 
308  state_type requirements(0);
309 
310  for (auto& resource_name : ialgo->neededResources()){
311  auto ret = m_resource_indices.insert(std::pair<std::string, unsigned int>(resource_name,resource_counter));
312  // insert successful means == wasn't known before. So increment counter
313  if (ret.second==true) {
314  ++resource_counter;
315  }
316  // Resize for every algo according to the found resources
317  requirements.resize(resource_counter);
318  // in any case the return value holds the proper product index
319  requirements[ret.first->second] = true;
320 
321  }
322 
323  m_resource_requirements[algo_id] = requirements;
324 
325  // potentially create clones; if not lazy creation we have to do it now
326  if (!m_lazyCreation) {
327  for (unsigned int i =1, end =ialgo->cardinality();i<end; ++i){
328  debug() << "type/name to create clone of: " << item_type << "/" << item_name << endmsg;
329  IAlgorithm* ialgoClone(nullptr);
330  createAlg(item_type,item_name,ialgoClone);
331  ialgoClone->sysInitialize();
332  queue->push(ialgoClone);
333  m_n_of_created_instances[algo_id]+=1;
334  }
335  }
336 
338 
339  }
340 
341  // Now resize all the requirement bitsets to the same size
342  for (auto& kv : m_resource_requirements) {
343  kv.second.resize(resource_counter);
344  }
345 
346  // Set all resources to be available
347  m_available_resources.resize(resource_counter);
348  m_available_resources.set();
349 
350  return sc;
351 }
ListAlg m_flatUniqueAlgList
The flat list of algorithms w/o clones.
StringArrayProperty m_topAlgNames
The names of the algorithms to be passed to the algorithm manager.
std::map< size_t, concurrentQueueIAlgPtr * > m_algqueue_map
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
const std::string & type() const override
The type of the algorithm object.
Definition: Algorithm.h:167
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
state_type m_available_resources
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:9
std::map< size_t, size_t > m_n_of_allowed_instances
tbb::concurrent_bounded_queue< IAlgorithm * > concurrentQueueIAlgPtr
auto end(reverse_wrapper< T > &w)
Definition: reverse.h:47
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
concurrency::ExecutionFlowGraph * m_EFGraph
OMG yet another hack.
The IAlgorithm is the interface implemented by the Algorithm base class.
Definition: IAlgorithm.h:23
const TYPE & value() const
explicit conversion
Definition: Property.h:341
boost::dynamic_bitset state_type
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:77
StatusCode flattenSequencer(Algorithm *sequencer, ListAlg &alglist, const std::string &parentName, unsigned int recursionDepth=0)
Recursively flatten an algList.
std::map< size_t, state_type > m_resource_requirements
tuple item
print s1,s2
Definition: ana.py:146
void addHeadNode(const std::string &headName, bool modeOR, bool allPass, bool isLazy)
Add a node, which has no parents.
ListAlg m_topAlgList
The list of top algorithms.
std::map< std::string, unsigned int > m_resource_indices
void attachAlgorithmsToNodes(const std::string &algo_name, const T &container)
Attach pointers to real Algorithms (and their clones) to Algorithm nodes of the graph.
list i
Definition: ana.py:128
std::map< size_t, unsigned int > m_n_of_created_instances
ListAlg m_algList
The list of all algorithms created withing the Pool which are not top.
StatusCode AlgResourcePool::endRun ( )
virtual

Definition at line 393 of file AlgResourcePool.cpp.

393  {
394 
395  auto algEndRun = [&] (SmartIF<IAlgorithm>& algoSmartIF) -> StatusCode {
396  StatusCode sc = algoSmartIF->sysEndRun();
397  if (!sc.isSuccess()) {
398  warning() << "endRun() of algorithm " << algoSmartIF->name() << " failed" << endmsg;
399  return StatusCode::FAILURE;
400  }
401  return StatusCode::SUCCESS;
402  };
403  // Call the beginRun() method of all top algorithms
404  for (auto& algoSmartIF : m_flatUniqueAlgList ) {
405  if (algEndRun(algoSmartIF).isFailure())
406  return StatusCode::FAILURE;
407  }
408  for (auto& algoSmartIF : m_topAlgList ) {
409  if (algEndRun(algoSmartIF).isFailure())
410  return StatusCode::FAILURE;
411  }
412  return StatusCode::SUCCESS;
413 }
ListAlg m_flatUniqueAlgList
The flat list of algorithms w/o clones.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
ListAlg m_topAlgList
The list of top algorithms.
StatusCode AlgResourcePool::flattenSequencer ( Algorithm sequencer,
ListAlg alglist,
const std::string &  parentName,
unsigned int  recursionDepth = 0 
)
private

Recursively flatten an algList.

Definition at line 171 of file AlgResourcePool.cpp.

171  {
172 
174 
175  std::vector<Algorithm*>* subAlgorithms = algo->subAlgorithms();
176  if ( //we only want to add basic algorithms -> have no subAlgs
177  // and exclude the case of empty GaudiSequencers
178  (subAlgorithms->empty() and not (algo->type() == "GaudiSequencer"))
179  // we want to add non-empty GaudiAtomicSequencers
180  or (algo->type() == "GaudiAtomicSequencer" and not subAlgorithms->empty())){
181 
182  debug() << std::string(recursionDepth, ' ') << algo->name() << " is " <<
183  (algo->type() != "GaudiAtomicSequencer" ? "not a sequencer" : "an atomic sequencer")
184  << ". Appending it" << endmsg;
185 
186  alglist.emplace_back(algo);
187  m_EFGraph->addAlgorithmNode(algo,parentName,false,false);
188  return sc;
189  }
190 
191  // Recursively unroll
192  ++recursionDepth;
193  debug() << std::string(recursionDepth, ' ') << algo->name() << " is a sequencer. Flattening it." << endmsg;
194  bool modeOR = false;
195  bool allPass = false;
196  bool isLazy = false;
197  if ("GaudiSequencer" == algo->type()) {
198  modeOR = (algo->getProperty("ModeOR").toString() == "True")? true : false;
199  allPass = (algo->getProperty("IgnoreFilterPassed").toString() == "True")? true : false;
200  isLazy = (algo->getProperty("ShortCircuit").toString() == "True")? true : false;
201  if (allPass) isLazy = false; // standard GaudiSequencer behavior on all pass is to execute everything
202  }
203  sc = m_EFGraph->addDecisionHubNode(algo,parentName,modeOR,allPass,isLazy);
204  if (sc.isFailure()) {
205  error() << "Failed to add DecisionHub " << algo->name() << " to execution flow graph" << endmsg;
206  return sc;
207  }
208 
209  for (Algorithm* subalgo : *subAlgorithms ) {
210  sc = flattenSequencer(subalgo,alglist,algo->name(),recursionDepth);
211  if (sc.isFailure()) {
212  error() << "Algorithm " << subalgo->name() << " could not be flattened" << endmsg;
213  return sc;
214  }
215  }
216  return sc;
217 }
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
StatusCode addDecisionHubNode(Algorithm *daughterAlgo, const std::string &parentName, bool modeOR, bool allPass, bool isLazy)
Add a node, which aggregates decisions of direct daughter nodes.
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
concurrency::ExecutionFlowGraph * m_EFGraph
OMG yet another hack.
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:77
StatusCode addAlgorithmNode(Algorithm *daughterAlgo, const std::string &parentName, bool inverted, bool allPass)
Add algorithm node.
StatusCode flattenSequencer(Algorithm *sequencer, ListAlg &alglist, const std::string &parentName, unsigned int recursionDepth=0)
Recursively flatten an algList.
virtual concurrency::ExecutionFlowGraph* AlgResourcePool::getExecutionFlowGraph ( ) const
inlinevirtual

Definition at line 60 of file AlgResourcePool.h.

60 {return m_EFGraph;}
concurrency::ExecutionFlowGraph * m_EFGraph
OMG yet another hack.
std::list< IAlgorithm * > AlgResourcePool::getFlatAlgList ( )
virtual

Definition at line 355 of file AlgResourcePool.cpp.

355  {
356  m_flatUniqueAlgPtrList.clear();
357  for (auto algoSmartIF :m_flatUniqueAlgList )
358  m_flatUniqueAlgPtrList.push_back(const_cast<IAlgorithm*>(algoSmartIF.get()));
359  return m_flatUniqueAlgPtrList;
360 }
ListAlg m_flatUniqueAlgList
The flat list of algorithms w/o clones.
std::list< IAlgorithm * > m_flatUniqueAlgPtrList
The flat list of algorithms w/o clones which is returned.
std::list< IAlgorithm * > AlgResourcePool::getTopAlgList ( )
virtual

Definition at line 364 of file AlgResourcePool.cpp.

364  {
365  m_topAlgPtrList.clear();
366  for (auto algoSmartIF :m_topAlgList )
367  m_topAlgPtrList.push_back(const_cast<IAlgorithm*>(algoSmartIF.get()));
368  return m_topAlgPtrList;
369 }
std::list< IAlgorithm * > m_topAlgPtrList
The top list of algorithms.
ListAlg m_topAlgList
The list of top algorithms.
StatusCode AlgResourcePool::initialize ( )
virtual

Definition at line 42 of file AlgResourcePool.cpp.

42  {
43 
45  if (!sc.isSuccess())
46  warning () << "Base class could not be started" << endmsg;
47 
48  // Try to recover the topAlgList from the ApplicationManager for backward-compatibility
49  if (m_topAlgNames.value().empty()){
50  info() << "TopAlg list empty. Recovering the one of Application Manager" << endmsg;
51  const Gaudi::Utils::TypeNameString appMgrName("ApplicationMgr/ApplicationMgr");
52  SmartIF<IProperty> appMgrProps (serviceLocator()->service(appMgrName));
53  m_topAlgNames.assign(appMgrProps->getProperty("TopAlg"));
54  }
55 
56  // XXX: Prepare empty Control Flow graph
57  const std::string& name = "ExecutionFlowGraph";
58  SmartIF<ISvcLocator> svc = serviceLocator();
60 
61  sc = decodeTopAlgs();
62  if (sc.isFailure())
63  warning() << "Algorithms could not be properly decoded." << endmsg;
64 
65  // let's assume all resources are there
67  return StatusCode::SUCCESS;
68 }
StringArrayProperty m_topAlgNames
The names of the algorithms to be passed to the algorithm manager.
StatusCode initialize() override
Definition: Service.cpp:63
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
state_type m_available_resources
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:9
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
concurrency::ExecutionFlowGraph * m_EFGraph
OMG yet another hack.
const TYPE & value() const
explicit conversion
Definition: Property.h:341
bool assign(const Property &source) override
get the value from another property
Definition: Property.h:269
StatusCode decodeTopAlgs()
Decode the top alg list.
StatusCode AlgResourcePool::releaseAlgorithm ( const std::string &  name,
IAlgorithm *&  algo 
)
virtual

Release a certain algorithm.

Definition at line 136 of file AlgResourcePool.cpp.

136  {
137 
138  std::hash<std::string> hash_function;
139  size_t algo_id = hash_function(name);
140 
141  // release resources used by the algorithm
142  m_resource_mutex.lock();
144  m_resource_mutex.unlock();
145 
146  //release algorithm itself
147  m_algqueue_map[algo_id]->push(algo);
148  return StatusCode::SUCCESS;
149  }
std::map< size_t, concurrentQueueIAlgPtr * > m_algqueue_map
std::mutex m_resource_mutex
state_type m_available_resources
std::map< size_t, state_type > m_resource_requirements
StatusCode AlgResourcePool::releaseResource ( const std::string &  name)
virtual

Release a certrain resource.

Definition at line 162 of file AlgResourcePool.cpp.

162  {
163  m_resource_mutex.lock();
165  m_resource_mutex.unlock();
166  return StatusCode::SUCCESS;
167 }
std::mutex m_resource_mutex
state_type m_available_resources
std::map< std::string, unsigned int > m_resource_indices
StatusCode AlgResourcePool::start ( )
virtual

Definition at line 72 of file AlgResourcePool.cpp.

72  {
73 
74  StatusCode startSc = Service::start();
75  if ( ! startSc.isSuccess() ) return startSc;
76 
77  // sys-Start the algos
78  for (auto& ialgo : m_algList){
79  startSc = ialgo->sysStart();
80  if (startSc.isFailure()){
81  error() << "Unable to start Algorithm: " << ialgo->name() << endmsg;
82  return startSc;
83  }
84  }
85  return StatusCode::SUCCESS;
86 }
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
StatusCode start() override
Definition: Service.cpp:147
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
ListAlg m_algList
The list of all algorithms created withing the Pool which are not top.
StatusCode AlgResourcePool::stop ( )
virtual

Definition at line 417 of file AlgResourcePool.cpp.

417  {
418 
419  StatusCode stopSc = Service::stop();
420  if ( ! stopSc.isSuccess() ) return stopSc;
421 
422  // sys-Stop the algos
423  for (auto& ialgo : m_algList){
424  stopSc = ialgo->sysStop();
425  if (stopSc.isFailure()){
426  error() << "Unable to stop Algorithm: " << ialgo->name() << endmsg;
427  return stopSc;
428  }
429  }
430  return StatusCode::SUCCESS;
431 }
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:76
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
StatusCode stop() override
Definition: Service.cpp:141
ListAlg m_algList
The list of all algorithms created withing the Pool which are not top.

Member Data Documentation

ListAlg AlgResourcePool::m_algList
private

The list of all algorithms created withing the Pool which are not top.

Definition at line 86 of file AlgResourcePool.h.

std::map<size_t,concurrentQueueIAlgPtr*> AlgResourcePool::m_algqueue_map
private

Definition at line 70 of file AlgResourcePool.h.

state_type AlgResourcePool::m_available_resources
private

Definition at line 69 of file AlgResourcePool.h.

concurrency::ExecutionFlowGraph* AlgResourcePool::m_EFGraph
private

OMG yet another hack.

Definition at line 101 of file AlgResourcePool.h.

ListAlg AlgResourcePool::m_flatUniqueAlgList
private

The flat list of algorithms w/o clones.

Definition at line 92 of file AlgResourcePool.h.

std::list<IAlgorithm*> AlgResourcePool::m_flatUniqueAlgPtrList
private

The flat list of algorithms w/o clones which is returned.

Definition at line 95 of file AlgResourcePool.h.

bool AlgResourcePool::m_lazyCreation
private

Definition at line 68 of file AlgResourcePool.h.

std::map<size_t,size_t> AlgResourcePool::m_n_of_allowed_instances
private

Definition at line 72 of file AlgResourcePool.h.

std::map<size_t,unsigned int> AlgResourcePool::m_n_of_created_instances
private

Definition at line 73 of file AlgResourcePool.h.

std::map<std::string,unsigned int> AlgResourcePool::m_resource_indices
private

Definition at line 74 of file AlgResourcePool.h.

std::mutex AlgResourcePool::m_resource_mutex
private

Definition at line 67 of file AlgResourcePool.h.

std::map<size_t,state_type> AlgResourcePool::m_resource_requirements
private

Definition at line 71 of file AlgResourcePool.h.

ListAlg AlgResourcePool::m_topAlgList
private

The list of top algorithms.

Definition at line 89 of file AlgResourcePool.h.

StringArrayProperty AlgResourcePool::m_topAlgNames
private

The names of the algorithms to be passed to the algorithm manager.

Definition at line 83 of file AlgResourcePool.h.

std::list<IAlgorithm*> AlgResourcePool::m_topAlgPtrList
private

The top list of algorithms.

Definition at line 98 of file AlgResourcePool.h.


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