| The Gaudi Framework v27r1

- 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 <thread>
3 #include "GaudiKernel/SmartIF.h"
4 #include "GaudiKernel/ISvcLocator.h"
5 #include "GaudiKernel/IThreadInitTool.h"
6 #include "GaudiKernel/ToolHandle.h"
7 #include "GaudiKernel/MsgStream.h"
8 #include "GaudiKernel/IMessageSvc.h"
9
10 std::atomic<bool> ThreadInitTask::m_execFailed(false);
11
12 tbb::task*
13 ThreadInitTask::execute() {
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()
22 << " at " << this
23 << std::dec << endmsg;
24
25 if (m_tools.retrieve().isFailure()) {
26 log << MSG::ERROR << "unable to retrieve ToolHandleArray " << m_tools
27 << endmsg;
28 m_execFailed = true;
29 } else {
30
31 if (m_tools.size() == 0) {
32 log << MSG::INFO << "no entries in Tool Array"
33 << endmsg;
34 } else {
35 if (debug)
36 log << MSG::DEBUG << "executing in thread 0x" << std::hex << pthread_self()
37 << std::dec << endmsg;
38
39 for ( auto t : m_tools ) {
40
41 try {
42
43 if (debug)
44 log << MSG::DEBUG << "calling IThreadInitTool " << t << endmsg;
45
46 if (!m_terminate) {
47 t->initThread();
48 } else {
49 t->terminateThread();
50 }
51
52 } catch( const GaudiException& exc ) {
53 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x"
54 << std::hex << pthread_self() << std::dec << " threw GaudiException: "
55 << exc << endmsg;
56 m_execFailed = true;
57 } catch (const std::exception& exc ) {
58 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x"
59 << std::hex << pthread_self() << std::dec << " threw std::exception: "
60 << exc.what() << endmsg;
61 m_execFailed = true;
62 } catch(...) {
63 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x"
64 << std::hex << pthread_self() << std::dec << " threw unknown exception"
65 << endmsg;
66 m_execFailed = true;
67 }
68
69 }
70
71 m_tools.release().ignore();
72
73 }
74 }
75
76
77 if (m_barrier != 0) {
78 log << MSG::INFO << "waiting at barrier in thread 0x" << std::hex << pthread_self()
79 << std::dec << endmsg;
80 m_barrier->wait();
81 }
82
83 return nullptr;
84
85 }
MsgStream
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
SmartIF< IMessageSvc >
GaudiException
Define general base for Gaudi exception.
Definition: GaudiException.h:23
std::atomic< bool >
ThreadInitTask::m_serviceLocator
SmartIF< ISvcLocator > m_serviceLocator
Definition: ThreadInitTask.h:35
MsgStream.h
MsgStream::level
MSG::Level level()
Retrieve output level.
Definition: MsgStream.h:112
Gaudi.Configuration.log
tuple log
Definition: Configuration.py:13
ThreadInitTask::m_execFailed
static std::atomic< bool > m_execFailed
Definition: ThreadInitTask.h:38
MSG::DEBUG
Definition: IMessageSvc.h:18
ThreadInitTask::m_tools
ToolHandleArray< IThreadInitTool > & m_tools
Definition: ThreadInitTask.h:32
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:517
std::exception::what
T what(T...args)
SmartIF.h
IMessageSvc.h
std::exception
STL class.
ThreadInitTask::execute
virtual tbb::task * execute()
Definition: ThreadInitTask.cpp:13
ThreadInitTask::m_terminate
bool m_terminate
Definition: ThreadInitTask.h:36
ThreadInitTask::m_barrier
boost::barrier * m_barrier
Definition: ThreadInitTask.h:34
ToolHandle.h
std::hex
T hex(T...args)
MSG::ERROR
Definition: IMessageSvc.h:21
GaudiHandleArray::size
size_type size() const
Definition: GaudiHandle.h:472
IThreadInitTool.h
MSG::INFO
Definition: IMessageSvc.h:19
ISvcLocator.h
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244