The Gaudi Framework  master (82fdf313)
Loading...
Searching...
No Matches
ThreadInitTask.cpp
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#include "ThreadInitTask.h"
16#include <GaudiKernel/SmartIF.h>
18#include <thread>
19
20namespace Gaudi {
21 namespace Concurrency {
22 thread_local bool ThreadInitDone{ false };
23 }
24} // namespace Gaudi
25
26std::atomic<bool> ThreadInitTask::m_execFailed( false );
27
29
31 MsgStream log( messageSvc, "ThreadInitTask" );
32
33 const auto debug = log.level() <= MSG::DEBUG;
34
35 if ( debug )
36 log << MSG::DEBUG << "execute() in thread 0x" << std::hex << pthread_self() << " at " << this << std::dec
37 << " state: " << ( m_terminate ? "terminate" : "initialize" ) << endmsg;
38
40 log << MSG::WARNING << "thread initialization has already been done on thread " << std::hex << pthread_self()
41 << endmsg;
42 }
43
44 // copy the tools array not to violate the const contract of the method
46
47 if ( tools.retrieve().isFailure() ) {
48 log << MSG::ERROR << "unable to retrieve ToolHandleArray " << tools << endmsg;
49 m_execFailed = true;
50 } else {
51
52 if ( tools.empty() ) {
53 log << MSG::DEBUG << "no entries in Tool Array" << endmsg;
55 } else {
56 if ( debug ) log << MSG::DEBUG << "executing in thread 0x" << std::hex << pthread_self() << std::dec << endmsg;
57
58 // only call terminate for threads that have been initialized
60 log << MSG::INFO << "Not calling terminateThread for thread 0x" << std::hex << pthread_self()
61 << " as it has not been initialized" << endmsg;
62 } else {
63
64 for ( auto& t : tools ) {
65 try {
66
67 if ( debug ) log << MSG::DEBUG << "calling IThreadInitTool " << t << endmsg;
68
69 if ( !m_terminate ) {
70 t->initThread();
72 } else {
73 t->terminateThread();
74 }
75
76 } catch ( const GaudiException& exc ) {
77 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x" << std::hex << pthread_self() << std::dec
78 << " threw GaudiException: " << exc << endmsg;
79 m_execFailed = true;
80 } catch ( const std::exception& exc ) {
81 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x" << std::hex << pthread_self() << std::dec
82 << " threw std::exception: " << exc.what() << endmsg;
83 m_execFailed = true;
84 } catch ( ... ) {
85 log << MSG::ERROR << "ThreadInitTool " << t << " in thread 0x" << std::hex << pthread_self() << std::dec
86 << " threw unknown exception" << endmsg;
87 m_execFailed = true;
88 }
89 }
90 }
91
92 tools.release().ignore();
93 }
94 }
95
96 if ( m_barrier ) {
97 log << MSG::DEBUG << "waiting at barrier in thread 0x" << std::hex << pthread_self() << std::dec << endmsg;
98 m_barrier->wait();
99 }
100}
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
Define general base for Gaudi exception.
const char * what() const override
method from std::exception
StatusCode release() override
Release all tools.
StatusCode retrieve() override
Retrieve all tools.
bool empty() const override
Return whether the list of tools is empty.
Definition of the MsgStream class used to transmit messages.
Definition MsgStream.h:29
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
boost::barrier * m_barrier
SmartIF< ISvcLocator > m_serviceLocator
ToolHandleArray< IThreadInitTool > m_tools
static std::atomic< bool > m_execFailed
void operator()() const
Execute the task.
Array of Handles to be used in lieu of vector of naked pointers to tools.
Definition ToolHandle.h:399
thread_local bool ThreadInitDone
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
@ DEBUG
Definition IMessageSvc.h:22
@ ERROR
Definition IMessageSvc.h:22
@ INFO
Definition IMessageSvc.h:22