The Gaudi Framework  master (37c0b60a)
AlgTask.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 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 #ifndef GAUDIHIVE_ALGTASK_H
12 #define GAUDIHIVE_ALGTASK_H
13 
14 #include "AvalancheSchedulerSvc.h"
15 #include "RetCodeGuard.h"
16 
17 // Framework include files
18 #include <Gaudi/Algorithm.h>
22 #include <GaudiKernel/IProperty.h>
25 #include <GaudiKernel/SmartIF.h>
27 
28 #include <functional>
29 
30 namespace Gaudi {
31  namespace Concurrency {
32  extern thread_local bool ThreadInitDone;
33  }
34 } // namespace Gaudi
35 
36 class AlgTask {
37 public:
39  : m_scheduler( scheduler ), m_aess( aem ), m_serviceLocator( svcLocator ), m_asynchronous( asynchronous ) {}
40 
41  void operator()() const {
42 
44  MsgStream log( messageSvc, "AlgTask" );
45 
46  // Get task specification dynamically if it was not provided statically
48  log << MSG::DEBUG << "Getting taskspec for " << ( m_asynchronous ? "asynchronous" : "standard" ) << " algorithm"
49  << endmsg;
50  if ( !m_scheduler->next( ts, m_asynchronous ) ) {
51  log << MSG::WARNING << "Missing specification while task is running" << endmsg;
52  return;
53  }
54 
55  EventContext& evtCtx = *( ts.contextPtr );
56  IAlgorithm*& iAlgoPtr = ts.algPtr;
57 
58  Gaudi::Algorithm* this_algo = dynamic_cast<Gaudi::Algorithm*>( iAlgoPtr );
59  if ( !this_algo ) { throw GaudiException( "Cast to Algorithm failed!", "AlgTask", StatusCode::FAILURE ); }
60 
61  bool eventfailed = false;
63 
64  // Get the IProperty interface of the ApplicationMgr to pass it to RetCodeGuard
65  const SmartIF<IProperty> appmgr( m_serviceLocator );
66 
68  log << MSG::DEBUG << "New thread detected: 0x" << std::hex << pthread_self() << std::dec
69  << ". Doing thread local initialization." << endmsg;
70  if ( SmartIF<IThreadPoolSvc> tps{ m_serviceLocator->service( "ThreadPoolSvc" ) } ) {
71  tps->initThisThread();
72  } else {
73  log << MSG::ERROR << "Unable to get the ThreadPoolSvc to trigger thread local initialization" << endmsg;
74  throw GaudiException( "Retrieval of ThreadPoolSvc failed", "AlgTask", StatusCode::FAILURE );
75  }
76  }
77 
78  // select the appropriate store
79  this_algo->whiteboard()->selectStore( evtCtx.valid() ? evtCtx.slot() : 0 ).ignore();
80  try {
82 
83  if ( iAlgoPtr->sysExecute( evtCtx ).isFailure() ) {
84  log << MSG::WARNING << "Execution of algorithm " << ts.algName << " failed" << endmsg;
85  eventfailed = true;
86  }
87  rcg.ignore(); // disarm the guard
88  } catch ( const GaudiException& Exception ) {
89  log << MSG::FATAL << ".executeEvent(): Exception with tag=" << Exception.tag() << " thrown by " << ts.algName
90  << endmsg;
91  log << MSG::ERROR << Exception << endmsg;
92  eventfailed = true;
93  } catch ( const std::exception& Exception ) {
94  log << MSG::FATAL << ".executeEvent(): Standard std::exception thrown by " << ts.algName << endmsg;
95  log << MSG::ERROR << Exception.what() << endmsg;
96  eventfailed = true;
97  } catch ( ... ) {
98  log << MSG::FATAL << ".executeEvent(): UNKNOWN Exception thrown by " << ts.algName << endmsg;
99  eventfailed = true;
100  }
101 
102  // A FAILURE in algorithm execution must be communicated to the framework
103  m_aess->updateEventStatus( eventfailed, evtCtx );
104 
105  // Release algorithm
106  m_scheduler->m_algResourcePool->releaseAlgorithm( ts.algName, iAlgoPtr ).ignore();
107 
108  // schedule a sign-off of the Algorithm execution
110  [schdlr = this->m_scheduler, ts = std::move( ts )]() { return schdlr->signoff( ts ); } );
111 
113  }
114 
115 private:
116  // Shortcuts to services
120  // Marks the task as asynchronous or not
121  bool m_asynchronous{ false };
122 };
123 
124 #endif
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
EventContext::valid
bool valid() const
Definition: EventContext.h:54
IAlgorithm::sysExecute
virtual StatusCode sysExecute(const EventContext &)=0
System execution. This method invokes the execute() method of a concrete algorithm.
Gaudi::Hive::setCurrentContext
GAUDI_API void setCurrentContext(const EventContext *ctx)
Definition: ThreadLocalContext.cpp:41
RetCodeGuard::ignore
void ignore()
Definition: RetCodeGuard.h:22
AvalancheSchedulerSvc::TaskSpec
Struct to hold entries in the alg queues.
Definition: AvalancheSchedulerSvc.h:322
std::exception
STL class.
Gaudi.Configuration.log
log
Definition: Configuration.py:28
std::move
T move(T... args)
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
Gaudi::Concurrency::ThreadInitDone
thread_local bool ThreadInitDone
Definition: ThreadInitTask.cpp:22
RetCodeGuard
Helper class to set the application return code in case of early exit (e.g.
Definition: RetCodeGuard.h:19
MSG::WARNING
@ WARNING
Definition: IMessageSvc.h:25
IMessageSvc.h
AlgTask::m_asynchronous
bool m_asynchronous
Definition: AlgTask.h:121
AlgTask::m_serviceLocator
SmartIF< ISvcLocator > m_serviceLocator
Definition: AlgTask.h:119
std::hex
T hex(T... args)
Gaudi::Algorithm::whiteboard
SmartIF< IHiveWhiteBoard > & whiteboard() const
Definition: Algorithm.cpp:568
RetCodeGuard.h
Gaudi::svcLocator
GAUDI_API ISvcLocator * svcLocator()
SmartIF.h
IAlgorithm
Definition: IAlgorithm.h:38
compareRootHistos.ts
ts
Definition: compareRootHistos.py:488
EventContext::slot
ContextID_t slot() const
Definition: EventContext.h:51
Gaudi::Algorithm
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:90
AvalancheSchedulerSvc
Definition: AvalancheSchedulerSvc.h:114
IAlgExecStateSvc
Abstract interface for a service that manages the Algorithm execution states.
Definition: IAlgExecStateSvc.h:79
Algorithm.h
SmartIF< IMessageSvc >
Gaudi::ReturnCode::UnhandledException
constexpr int UnhandledException
Definition: AppReturnCode.h:37
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
AvalancheSchedulerSvc::m_algResourcePool
SmartIF< IAlgResourcePool > m_algResourcePool
Cache for the algorithm resource pool.
Definition: AvalancheSchedulerSvc.h:314
MsgStream
Definition: MsgStream.h:33
Gaudi
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition: __init__.py:1
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:25
AvalancheSchedulerSvc::next
bool next(TaskSpec &ts, bool asynchronous)
Definition: AvalancheSchedulerSvc.h:377
AlgTask::AlgTask
AlgTask(AvalancheSchedulerSvc *scheduler, ISvcLocator *svcLocator, IAlgExecStateSvc *aem, bool asynchronous)
Definition: AlgTask.h:38
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
ThreadLocalContext.h
EventContext.h
AlgTask::m_aess
IAlgExecStateSvc * m_aess
Definition: AlgTask.h:118
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:25
EventContext
Definition: EventContext.h:34
AvalancheSchedulerSvc::m_actionsQueue
tbb::concurrent_bounded_queue< action > m_actionsQueue
Queue where closures are stored and picked for execution.
Definition: AvalancheSchedulerSvc.h:319
AlgTask
Definition: AlgTask.h:36
IProperty.h
AlgTask::operator()
void operator()() const
Definition: AlgTask.h:41
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
ISvcLocator.h
IAlgExecStateSvc.h
IAlgExecStateSvc::updateEventStatus
virtual void updateEventStatus(const bool &b, const EventContext &ctx)=0
GPUAvalancheSchedulerSimpleTest.scheduler
scheduler
Definition: GPUAvalancheSchedulerSimpleTest.py:84
IThreadPoolSvc.h
Gaudi::Hive::setCurrentContextEvt
GAUDI_API void setCurrentContextEvt(long int evtN)
Definition: ThreadLocalContext.cpp:32
AvalancheSchedulerSvc.h
AlgTask::m_scheduler
AvalancheSchedulerSvc * m_scheduler
Definition: AlgTask.h:117