31 #include "TDirectory.h" 36 using namespace Gaudi;
37 typedef const string&
CSTR;
39 #define S_OK StatusCode::SUCCESS 40 #define S_FAIL StatusCode::FAILURE 57 if ( !status.
isSuccess() )
return error(
"Failed to initialize Service base class." );
59 m_incidentSvc = service(
"IncidentSvc" );
60 if ( !m_incidentSvc )
return error(
"Unable to localize interface from service:IncidentSvc" );
62 m_incidentSvc->addListener(
this, IncidentType::BeginEvent, 1,
false,
false );
63 m_incidentSvc->addListener(
this,
"NEW_STREAM", 1,
false,
false );
64 m_incidentSvc->addListener(
this,
"CONNECTED_OUTPUT", 1,
false,
false );
66 if ( m_ioPerfStats.empty() )
return error(
"Performance monitoring file IOPerfStats was not defined." );
68 TDirectory::TContext ctxt(
nullptr );
69 m_perfFile.reset(
new TFile( m_ioPerfStats.value().c_str(),
"RECREATE" ) );
70 if ( !m_perfFile )
return error(
"Could not create ROOT file." );
72 if ( !( m_perfTree =
new TTree(
"T",
"performance measurement" ) ) )
return error(
"Could not create tree." );
74 m_perfTree->Branch(
"utime", &m_utime,
"utime/l" );
75 m_perfTree->Branch(
"stime", &m_stime,
"stime/l" );
76 m_perfTree->Branch(
"vsize", &m_vsize,
"vsize/l" );
77 m_perfTree->Branch(
"rss", &m_rss,
"rss/L" );
78 m_perfTree->Branch(
"time", &m_time,
"time/L" );
80 m_perfTree->Branch(
"event_number", &m_eventNumber,
"event_number/L" );
81 m_perfTree->Branch(
"event_type", &m_eventType,
"event_type/I" );
83 if ( m_setStreams.empty() ) m_setStreams =
"undefined";
84 if ( m_basketSize.empty() ) m_basketSize =
"undefined";
85 if ( m_bufferSize.empty() ) m_bufferSize =
"undefined";
86 if ( m_splitLevel.empty() ) m_splitLevel =
"undefined";
88 auto map =
new TMap();
89 map->Add(
new TObjString(
"streams" ),
new TObjString( m_setStreams.value().c_str() ) );
90 map->Add(
new TObjString(
"basket_size" ),
new TObjString( m_basketSize.value().c_str() ) );
91 map->Add(
new TObjString(
"buffer_size" ),
new TObjString( m_bufferSize.value().c_str() ) );
92 map->Add(
new TObjString(
"split_level" ),
new TObjString( m_splitLevel.value().c_str() ) );
93 map->Write(
"params", TObject::kSingleKey );
97 void RootPerfMonSvc::record(
EventType eventType ) {
99 m_eventType = eventType;
100 m_utime = data.
utime;
101 m_stime = data.
stime;
102 m_vsize = data.
vsize;
108 void RootPerfMonSvc::handle(
const Incident& incident ) {
110 if ( !t.
compare( IncidentType::BeginEvent ) ) {
115 if ( !t.
compare(
"CONNECTED_OUTPUT" ) ) { m_outputs.insert( incident.
source() ); }
122 auto map =
new TMap();
123 for (
const auto& i : m_outputs ) {
124 const char* fn = i.c_str();
125 Long_t id, siz, flags, tim;
126 if ( 0 == gSystem->GetPathInfo( fn, &
id, &siz, &flags, &tim ) ) {
128 map->Add(
new TObjString( fn ),
new TObjString( text ) );
131 TDirectory::TContext ctxt( m_perfFile.get() );
132 map->Write(
"Outputs", TObject::kSingleKey );
141 m_incidentSvc.reset();
Definition of the MsgStream class used to transmit messages.
StatusCode initialize() override
StatusCode finalize() override
const std::string & type() const
Access to the incident type.
const std::string & source() const
Access to the source of the incident.
This class is used for returning status codes from appropriate routines.
Base class for all Incidents (computing events).
Header file for std:chrono::duration-based Counters.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.