The Gaudi Framework  v29r0 (ff2e7097)
ThreadGaudi.cpp
Go to the documentation of this file.
1 // -*-C++-*-
2 
4 
5 #include <sstream>
6 
7 #include <iostream>
8 
11 
12 //
13 // getGaudiThreadIDfromName
14 // ------------------------
15 
17 {
19  ost << threadSeparator << iCopy << std::ends;
20  return ost.str();
21 }
22 
23 //
24 // getGaudiThreadIDfromName
25 // ------------------------
26 
28 {
29  std::string threadAppendix = "";
30 
31  // find parent if name of an AlgTool
32  std::string parent_name = name;
33  std::string tool_name = "";
34  size_t pp = name.find( "." );
35  if ( ( pp > 0 ) && ( pp <= name.length() ) ) {
36  parent_name = name.substr( 0, name.find( "." ) - 1 );
37  tool_name = name.substr( name.find( "." ) );
38  }
39 
40  // get from (parent_)name thread ID
41  pp = parent_name.find( threadSeparator );
42  if ( ( pp > 0 ) && ( pp <= parent_name.length() ) ) {
43  threadAppendix = parent_name.substr( parent_name.find( threadSeparator ) );
44  }
45  return threadAppendix;
46 }
47 
48 //
49 // getGaudiThreadGenericName
50 // -------------------------
51 
53 {
54  std::string genericName = name;
55 
56  // find parent if name of an AlgTool
57  std::string parent_name = name;
58  std::string tool_name = "";
59  size_t pp = name.find( "." );
60  if ( ( pp > 0 ) && ( pp <= name.length() ) ) {
61  parent_name = name.substr( 0, name.find( "." ) - 1 );
62  tool_name = name.substr( name.find( "." ) );
63  }
64 
65  // construct gneric name
66  pp = parent_name.find( threadSeparator );
67  if ( ( pp > 0 ) && ( pp <= parent_name.length() ) ) {
68  genericName = parent_name.substr( 0, parent_name.find( threadSeparator ) ) + tool_name;
69  }
70  return genericName;
71 }
72 
73 //
74 // isGaudiThreaded
75 //
76 bool isGaudiThreaded( const std::string& name ) { return ( !( getGaudiThreadIDfromName( name ).empty() ) ); }
77 
78 //
79 // ThreadGaudi
80 // -----------
81 
83 
84 ThreadGaudi::ThreadGaudi() : m_threadMap{new ThreadMap()} { ( *m_threadMap )[0] = ""; }
85 
87 {
88  if ( !ThreadGaudiInstance ) ThreadGaudiInstance = new ThreadGaudi();
89  return ThreadGaudiInstance;
90 }
91 
92 void ThreadGaudi::setThreadID( const std::string& threadID )
93 {
94  ThreadMap* p_threadMap = getThreadMap();
95  // get from name thread ID
97  if ( p_threadMap->count( s_pid ) == 0 ) {
98  ( *p_threadMap )[s_pid] = threadID;
99 #ifdef THREAD_GAUDI__DEBUG
100  std::cout << " *** ThreadGaudi setThreadID *** value set for *** " << threadID << " thread ID : " << s_pid
101  << std::endl;
102 #endif
103  }
104 }
105 
107 
109 {
110  ThreadMap* p_threadMap = getThreadMap();
112  if ( p_threadMap->find( s_pid ) != p_threadMap->end() ) {
113  return ( *p_threadMap->find( s_pid ) ).second;
114  } else {
115  return ( *p_threadMap->find( 0 ) ).second;
116  ;
117  }
118 }
std::unique_ptr< ThreadMap > m_threadMap
Definition: ThreadGaudi.h:29
static ThreadGaudi * instance()
singleton access
Definition: ThreadGaudi.cpp:86
const std::string & getThreadID()
get Gaudi ID of current pthread
void * ThreadHandle
A Thread handle.
Definition: System.h:109
ThreadGaudi * ThreadGaudiInstance
Definition: ThreadGaudi.cpp:82
T endl(T...args)
std::string getGaudiThreadIDfromID(int iCopy)
helper function to extract Gaudi Thread ID from thread copy number
Definition: ThreadGaudi.cpp:16
T end(T...args)
std::string getGaudiThreadGenericName(const std::string &name)
helper function to extract Gaudi instance name from thread copy name
Definition: ThreadGaudi.cpp:52
STL class.
singleton mapping the pthread ID to the Gaudi thread ID
Definition: ThreadGaudi.h:13
constexpr double second
STL class.
ThreadMap * getThreadMap()
access the whole map
std::map< System::ThreadHandle, std::string > ThreadMap
Definition: ThreadGaudi.h:16
void setThreadID(const std::string &threadID)
associate Gaudi ID to pthread
Definition: ThreadGaudi.cpp:92
const std::string threadSeparator
Definition: ThreadGaudi.cpp:9
const std::string algToolSeparator
Definition: ThreadGaudi.cpp:10
T count(T...args)
T find(T...args)
T length(T...args)
ThreadHandle threadSelf()
thread handle "accessor"
Definition: System.h:111
T ends(T...args)
bool isGaudiThreaded(const std::string &name)
test if current Gaudi object is running /will run in a thread
Definition: ThreadGaudi.cpp:76
T substr(T...args)
std::string getGaudiThreadIDfromName(const std::string &name)
helper function to extract Gaudi Thread ID from thread copy name
Definition: ThreadGaudi.cpp:27