The Gaudi Framework  master (1304469f)
Loading...
Searching...
No Matches
AlgTask.h
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#pragma once
12
14#include "RetCodeGuard.h"
15
16// Framework include files
17#include <Gaudi/Algorithm.h>
24#include <GaudiKernel/SmartIF.h>
26
27#include <functional>
28
29namespace Gaudi {
30 namespace Concurrency {
31 extern thread_local bool ThreadInitDone;
32 }
33} // namespace Gaudi
34
35class AlgTask {
36public:
37 AlgTask( AvalancheSchedulerSvc* scheduler, ISvcLocator* svcLocator, IAlgExecStateSvc* aem, bool asynchronous )
38 : m_scheduler( scheduler ), m_aess( aem ), m_serviceLocator( svcLocator ), m_asynchronous( asynchronous ) {}
39
40 void operator()() const {
41
43 MsgStream log( messageSvc, "AlgTask" );
44
45 // Get task specification dynamically if it was not provided statically
47 log << MSG::DEBUG << "Getting taskspec for " << ( m_asynchronous ? "asynchronous" : "standard" ) << " algorithm"
48 << endmsg;
49 if ( !m_scheduler->next( ts, m_asynchronous ) ) {
50 log << MSG::WARNING << "Missing specification while task is running" << endmsg;
51 return;
52 }
53
54 EventContext& evtCtx = *( ts.contextPtr );
55 IAlgorithm*& iAlgoPtr = ts.algPtr;
56
57 Gaudi::Algorithm* this_algo = dynamic_cast<Gaudi::Algorithm*>( iAlgoPtr );
58 if ( !this_algo ) { throw GaudiException( "Cast to Algorithm failed!", "AlgTask", StatusCode::FAILURE ); }
59
60 bool eventfailed = false;
62
63 // Get the IProperty interface of the ApplicationMgr to pass it to RetCodeGuard
65
67 log << MSG::DEBUG << "New thread detected: 0x" << std::hex << pthread_self() << std::dec
68 << ". Doing thread local initialization." << endmsg;
69 if ( SmartIF<IThreadPoolSvc> tps{ m_serviceLocator->service( "ThreadPoolSvc" ) } ) {
70 tps->initThisThread();
71 } else {
72 log << MSG::ERROR << "Unable to get the ThreadPoolSvc to trigger thread local initialization" << endmsg;
73 throw GaudiException( "Retrieval of ThreadPoolSvc failed", "AlgTask", StatusCode::FAILURE );
74 }
75 }
76
77 // select the appropriate store
78 this_algo->whiteboard()->selectStore( evtCtx.valid() ? evtCtx.slot() : 0 ).ignore();
79 try {
81
82 if ( iAlgoPtr->sysExecute( evtCtx ).isFailure() ) {
83 log << MSG::WARNING << "Execution of algorithm " << ts.algName << " failed" << endmsg;
84 eventfailed = true;
85 }
86 rcg.ignore(); // disarm the guard
87 } catch ( const GaudiException& Exception ) {
88 log << MSG::FATAL << ".executeEvent(): Exception with tag=" << Exception.tag() << " thrown by " << ts.algName
89 << endmsg;
90 log << MSG::ERROR << Exception << endmsg;
91 eventfailed = true;
92 } catch ( const std::exception& Exception ) {
93 log << MSG::FATAL << ".executeEvent(): Standard std::exception thrown by " << ts.algName << endmsg;
94 log << MSG::ERROR << Exception.what() << endmsg;
95 eventfailed = true;
96 } catch ( ... ) {
97 log << MSG::FATAL << ".executeEvent(): UNKNOWN Exception thrown by " << ts.algName << endmsg;
98 eventfailed = true;
99 }
100
101 // A FAILURE in algorithm execution must be communicated to the framework
102 m_aess->updateEventStatus( eventfailed, evtCtx );
103
104 // Release algorithm
105 m_scheduler->m_algResourcePool->releaseAlgorithm( ts.algName, iAlgoPtr ).ignore();
106
107 // schedule a sign-off of the Algorithm execution
108 m_scheduler->m_actionsQueue.push(
109 [schdlr = this->m_scheduler, ts = std::move( ts )]() { return schdlr->signoff( ts ); } );
110
112 }
113
114private:
115 // Shortcuts to services
119 // Marks the task as asynchronous or not
120 bool m_asynchronous{ false };
121};
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
AvalancheSchedulerSvc * m_scheduler
Definition AlgTask.h:116
IAlgExecStateSvc * m_aess
Definition AlgTask.h:117
SmartIF< ISvcLocator > m_serviceLocator
Definition AlgTask.h:118
bool m_asynchronous
Definition AlgTask.h:120
void operator()() const
Definition AlgTask.h:40
AlgTask(AvalancheSchedulerSvc *scheduler, ISvcLocator *svcLocator, IAlgExecStateSvc *aem, bool asynchronous)
Definition AlgTask.h:37
This class represents an entry point to all the event specific data.
ContextID_t slot() const
bool valid() const
Base class from which all concrete algorithm classes should be derived.
Definition Algorithm.h:87
SmartIF< IHiveWhiteBoard > & whiteboard() const
Define general base for Gaudi exception.
Abstract interface for a service that manages the Algorithm execution states.
The IAlgorithm is the interface implemented by the Algorithm base class.
Definition IAlgorithm.h:36
virtual StatusCode sysExecute(const EventContext &)=0
System execution. This method invokes the execute() method of a concrete algorithm.
virtual StatusCode selectStore(size_t partitionIndex)=0
Activate an given 'slot' for all subsequent calls within the same thread id.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition ISvcLocator.h:42
Definition of the MsgStream class used to transmit messages.
Definition MsgStream.h:29
Helper class to set the application return code in case of early exit (e.g.
Small smart pointer class with automatic reference counting for IInterface.
Definition SmartIF.h:28
bool isFailure() const
Definition StatusCode.h:129
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition StatusCode.h:139
constexpr static const auto FAILURE
Definition StatusCode.h:100
constexpr int UnhandledException
thread_local bool ThreadInitDone
GAUDI_API void setCurrentContextEvt(long int evtN)
GAUDI_API void setCurrentContext(const EventContext *ctx)
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition __init__.py:1
@ WARNING
Definition IMessageSvc.h:22
@ FATAL
Definition IMessageSvc.h:22
@ DEBUG
Definition IMessageSvc.h:22
@ ERROR
Definition IMessageSvc.h:22
Struct to hold entries in the alg queues.