| The Gaudi Framework v29r1 (5cd95fa2)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

ThreadInitTask.cpp
Go to the documentation of this file.
1 #include "ThreadInitTask.h"
2 #include "GaudiKernel/IMessageSvc.h"
3 #include "GaudiKernel/ISvcLocator.h"
4 #include "GaudiKernel/IThreadInitTool.h"
5 #include "GaudiKernel/MsgStream.h"
6 #include "GaudiKernel/SmartIF.h"
7 #include "GaudiKernel/ToolHandle.h"
8 #include <thread>
9
10 std::atomic<bool> ThreadInitTask::m_execFailed( false );
11
12 tbb::task* ThreadInitTask::execute()
13 {
14
15 SmartIF<IMessageSvc> messageSvc( m_serviceLocator );
16 MsgStream log( messageSvc, "ThreadInitTask" );
17
18 const auto debug = log.level() <= MSG::DEBUG;
19
20 if ( debug )
21 log << MSG::DEBUG << "execute in thread 0x" << std::hex << pthread_self() << " at " << this << std::dec << endmsg;
22
23 if ( m_tools.retrieve().isFailure() ) {
24 log << MSG::ERROR << "unable to retrieve ToolHandleArray " << m_tools << endmsg;
25 m_execFailed = true;
26 } else {
27
28 if ( m_tools.size() == 0 ) {
29 log << MSG::INFO << "no entries in Tool Array" << endmsg;
30 } else {
31 if ( debug ) log << MSG::DEBUG << "executing in thread 0x" << std::hex << pthread_self() << std::dec << endmsg;
32
33 for ( auto& t : m_tools ) {
34
35 try {
36
37 if ( debug ) log << MSG::DEBUG << "calling IThreadInitTool " << t << endmsg;
38
39 if ( !m_terminate ) {
40 t->initThread();
41 } else {
42 t->terminateThread();
43 }
44
45 } catch ( const GaudiException& exc ) {
46 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x" << std::hex << pthread_self() << std::dec
47 << " threw GaudiException: " << exc << endmsg;
48 m_execFailed = true;
49 } catch ( const std::exception& exc ) {
50 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x" << std::hex << pthread_self() << std::dec
51 << " threw std::exception: " << exc.what() << endmsg;
52 m_execFailed = true;
53 } catch ( ... ) {
54 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x" << std::hex << pthread_self() << std::dec
55 << " threw unknown exception" << endmsg;
56 m_execFailed = true;
57 }
58 }
59
60 m_tools.release().ignore();
61 }
62 }
63
64 if ( m_barrier != 0 ) {
65 log << MSG::INFO << "waiting at barrier in thread 0x" << std::hex << pthread_self() << std::dec << endmsg;
66 m_barrier->wait();
67 }
68
69 return nullptr;
70 }
MsgStream
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
SmartIF< IMessageSvc >
ThreadInitTask::execute
tbb::task * execute() override
Execute the task.
Definition: ThreadInitTask.cpp:12
GaudiException
Define general base for Gaudi exception.
Definition: GaudiException.h:22
std::atomic< bool >
ThreadInitTask::m_serviceLocator
SmartIF< ISvcLocator > m_serviceLocator
Definition: ThreadInitTask.h:42
MsgStream.h
ThreadInitTask::m_execFailed
static std::atomic< bool > m_execFailed
Definition: ThreadInitTask.h:45
MSG::DEBUG
Definition: IMessageSvc.h:16
ThreadInitTask::m_tools
ToolHandleArray< IThreadInitTool > & m_tools
Definition: ThreadInitTask.h:39
ThreadInitTask.h
StatusCode::isFailure
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:86
GaudiHandleArray::retrieve
StatusCode retrieve()
Retrieve all tools.
Definition: GaudiHandle.h:528
std::exception::what
T what(T...args)
SmartIF.h
IMessageSvc.h
std::exception
STL class.
ThreadInitTask::m_terminate
bool m_terminate
Definition: ThreadInitTask.h:43
ThreadInitTask::m_barrier
boost::barrier * m_barrier
Definition: ThreadInitTask.h:41
ToolHandle.h
std::hex
T hex(T...args)
MSG::ERROR
Definition: IMessageSvc.h:16
GaudiHandleArray::size
size_type size() const
Definition: GaudiHandle.h:494
MsgStream::level
MSG::Level level() const
Retrieve output level.
Definition: MsgStream.h:108
IThreadInitTool.h
MSG::INFO
Definition: IMessageSvc.h:16
ISvcLocator.h
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
Gaudi.Configuration.log
log
Definition: Configuration.py:13