21 #include "TDirectory.h"
27 using namespace Gaudi;
28 typedef const string&
CSTR;
30 #define S_OK StatusCode::SUCCESS
31 #define S_FAIL StatusCode::FAILURE
35 :
Service( nam, svc), m_incidentSvc(0)
45 RootPerfMonSvc::~RootPerfMonSvc() {
64 return error(
"Failed to initialize Service base class.");
66 if( !(status=service(
"IncidentSvc", m_incidentSvc)).isSuccess() )
67 return error(
"Unable to localize interface from service:IncidentSvc");
70 m_incidentSvc->addListener(
this,
"NEW_STREAM", 1,
false,
false);
71 m_incidentSvc->addListener(
this,
"CONNECTED_OUTPUT", 1,
false,
false);
73 if (m_ioPerfStats.empty())
74 return error(
"Performance monitoring file IOPerfStats was not defined.");
76 TDirectory::TContext ctxt(0);
77 if (!(m_perfFile =
new TFile(m_ioPerfStats.c_str(),
"RECREATE")))
78 return error(
"Could not create ROOT file.");
80 if (!(m_perfTree =
new TTree(
"T",
"performance measurement")))
81 return error(
"Could not create tree.");
83 m_perfTree->Branch(
"utime", &m_utime,
"utime/l");
84 m_perfTree->Branch(
"stime", &m_stime,
"stime/l");
85 m_perfTree->Branch(
"vsize", &m_vsize,
"vsize/l");
86 m_perfTree->Branch(
"rss", &m_rss,
"rss/L");
87 m_perfTree->Branch(
"time", &m_time,
"time/L");
89 m_perfTree->Branch(
"event_number", &m_eventNumber,
"event_number/L");
90 m_perfTree->Branch(
"event_type", &m_eventType,
"event_type/I");
92 if (m_setStreams.empty())
93 m_setStreams =
"undefined";
94 if (m_basketSize.empty())
95 m_basketSize =
"undefined";
96 if (m_bufferSize.empty())
97 m_bufferSize =
"undefined";
98 if (m_splitLevel.empty())
99 m_splitLevel =
"undefined";
101 TMap *
map =
new TMap();
102 map->Add(
new TObjString(
"streams"),
new TObjString(m_setStreams.c_str()));
103 map->Add(
new TObjString(
"basket_size"),
new TObjString(m_basketSize.c_str()));
104 map->Add(
new TObjString(
"buffer_size"),
new TObjString(m_bufferSize.c_str()));
105 map->Add(
new TObjString(
"split_level"),
new TObjString(m_splitLevel.c_str()));
106 map->Write(
"params", TObject::kSingleKey);
112 m_eventType = eventType;
113 m_utime = (ULong_t)data.
utime;
114 m_stime = (ULong_t)data.
stime;
115 m_vsize = (ULong_t)data.
vsize;
116 m_rss = (Long_t)data.
rss;
117 m_time = (Long_t)data.
time;
121 void RootPerfMonSvc::handle(
const Incident& incident) {
128 if ( !t.compare(
"CONNECTED_OUTPUT") ) {
129 m_outputs.insert(incident.
source());
137 TMap *
map =
new TMap();
139 const char* fn = (*i).c_str();
140 Long_t id, siz, flags, tim;
141 if ( 0 == gSystem->GetPathInfo(fn,&
id,&siz,&flags,&tim) ) {
142 ::sprintf(text,
"%ld",siz);
143 map->Add(
new TObjString(fn),
new TObjString(text));
146 TDirectory::TContext ctxt(m_perfFile);
147 map->Write(
"Outputs", TObject::kSingleKey);
156 releasePtr(m_incidentSvc);
160 deletePtr(m_perfFile);