1193323Sed/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
2193323Sed   Contributed by Oracle.
3193323Sed
4193323Sed   This file is part of GNU Binutils.
5193323Sed
6193323Sed   This program is free software; you can redistribute it and/or modify
7193323Sed   it under the terms of the GNU General Public License as published by
8193323Sed   the Free Software Foundation; either version 3, or (at your option)
9193323Sed   any later version.
10193323Sed
11193323Sed   This program is distributed in the hope that it will be useful,
12193323Sed   but WITHOUT ANY WARRANTY; without even the implied warranty of
13193323Sed   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14193323Sed   GNU General Public License for more details.
15193323Sed
16263763Sdim   You should have received a copy of the GNU General Public License
17249423Sdim   along with this program; if not, write to the Free Software
18263508Sdim   Foundation, 51 Franklin Street - Fifth Floor, Boston,
19193323Sed   MA 02110-1301, USA.  */
20263763Sdim
21193323Sed#include "config.h"
22193323Sed#include "DbeSession.h"
23193323Sed#include "FileData.h"
24193323Sed#include "StringBuilder.h"
25193323Sed#include "i18n.h"
26193323Sed#include "util.h"
27203954Srdivacky#include "IOActivity.h"
28249423Sdim#include "MetricList.h"
29249423Sdim#include "Application.h"
30249423Sdim#include "Experiment.h"
31198090Srdivacky#include "DbeView.h"
32193323Sed#include "Exp_Layout.h"
33193323Sed#include "i18n.h"
34193323Sed
35193323SedIOActivity::IOActivity (DbeView *_dbev)
36193323Sed{
37193323Sed  dbev = _dbev;
38193323Sed  fDataHash = NULL;
39218893Sdim  fDataTotal = NULL;
40218893Sdim  fDataObjs = NULL;
41218893Sdim  fDataObjsFile = NULL;
42218893Sdim  hasFile = false;
43218893Sdim  fDataObjsVfd = NULL;
44218893Sdim  hasVfd = false;
45263508Sdim  fDataObjsCallStack = NULL;
46218893Sdim  hasCallStack = false;
47218893Sdim  fDataCalStkMap = NULL;
48218893Sdim  fDataVfdMap = NULL;
49218893Sdim  hist_data_file_all = NULL;
50218893Sdim  hist_data_vfd_all = NULL;
51218893Sdim  hist_data_callstack_all = NULL;
52218893Sdim}
53218893Sdim
54218893Sdimvoid
55218893SdimIOActivity::reset ()
56234353Sdim{
57218893Sdim  int numExps = dbeSession->nexps ();
58218893Sdim  FileData *fData = NULL;
59263508Sdim  DefaultMap<int64_t, FileData*>* fDataMap;
60218893Sdim  for (int k = 0; k < numExps; k++)
61218893Sdim    {
62218893Sdim      Experiment *exp = dbeSession->get_exp (k);
63263508Sdim      fDataMap = exp->getFDataMap ();
64218893Sdim      if (fDataMap == NULL)
65218893Sdim	continue;
66218893Sdim
67218893Sdim      fDataObjs = fDataMap->values ();
68218893Sdim      if (fDataObjs == NULL)
69218893Sdim	continue;
70263508Sdim      int numFiles = fDataObjs->size ();
71218893Sdim      for (int j = 0; j < numFiles; j++)
72218893Sdim	{
73218893Sdim	  fData = fDataObjs->fetch (j);
74218893Sdim	  fData->init ();
75218893Sdim	}
76218893Sdim    }
77218893Sdim
78218893Sdim  delete fDataHash;
79218893Sdim  fDataHash = NULL;
80251662Sdim  delete fDataTotal;
81251662Sdim  fDataTotal = NULL;
82251662Sdim
83251662Sdim  delete fDataObjsFile;
84263763Sdim  fDataObjsFile = NULL;
85263763Sdim  hasFile = false;
86251662Sdim
87251662Sdim  delete fDataObjsVfd;
88251662Sdim  fDataObjsVfd = NULL;
89263763Sdim  hasVfd = false;
90263763Sdim
91263763Sdim  delete fDataObjsCallStack;
92251662Sdim  fDataObjsCallStack = NULL;
93251662Sdim  hasCallStack = false;
94251662Sdim
95251662Sdim  delete fDataObjs;
96251662Sdim  fDataObjs = NULL;
97251662Sdim  delete fDataCalStkMap;
98251662Sdim  fDataCalStkMap = NULL;
99251662Sdim  delete fDataVfdMap;
100251662Sdim  fDataVfdMap = NULL;
101251662Sdim
102251662Sdim  // These three pointers are deleted by DbeView
103263763Sdim  // They are named iofile_data, iovfd_data, and iocs_data
104263763Sdim  hist_data_file_all = NULL;
105263763Sdim  hist_data_vfd_all = NULL;
106251662Sdim  hist_data_callstack_all = NULL;
107251662Sdim}
108251662Sdim
109251662Sdimvoid
110251662SdimIOActivity::createHistItemTotals (Hist_data *hist_data, MetricList *mlist,
111251662Sdim				  Histable::Type hType, bool empty)
112251662Sdim{
113251662Sdim  int mIndex;
114251662Sdim  Metric *mtr;
115251662Sdim  Hist_data::HistItem *hi;
116251662Sdim  FileData *fData = NULL;
117251662Sdim
118251662Sdim  if (fDataTotal == NULL)
119251662Sdim    {
120251662Sdim      fDataTotal = new FileData (TOTAL_FILENAME);
121251662Sdim      fDataTotal->setHistType (hType);
122251662Sdim      fDataTotal->setVirtualFd (VIRTUAL_FD_TOTAL);
123251662Sdim      fDataTotal->id = 0;
124251662Sdim    }
125251662Sdim
126251662Sdim  fData = new FileData (fDataTotal);
127251662Sdim  fData->setHistType (hType);
128251662Sdim  hi = hist_data->append_hist_item (fData);
129251662Sdim  Vec_loop (Metric *, mlist->get_items (), mIndex, mtr)
130251662Sdim  {
131251662Sdim    if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ())
132251662Sdim      continue;
133251662Sdim
134251662Sdim    Metric::Type mtype = mtr->get_type ();
135251662Sdim    ValueTag vType = mtr->get_vtype ();
136251662Sdim    hist_data->total->value[mIndex].tag = vType;
137251662Sdim    hi->value[mIndex].tag = vType;
138251662Sdim    double prec = (double) NANOSEC;
139251662Sdim    switch (mtype)
140251662Sdim      {
141251662Sdim      case BaseMetric::IO_READ_BYTES:
142251662Sdim	if (!empty)
143251662Sdim	  {
144251662Sdim	    hist_data->total->value[mIndex].ll = fDataTotal->getReadBytes ();
145251662Sdim	    hi->value[mIndex].ll = fDataTotal->getReadBytes ();
146251662Sdim	  }
147251662Sdim	else
148251662Sdim	  {
149251662Sdim	    hist_data->total->value[mIndex].ll = 0;
150251662Sdim	    hi->value[mIndex].ll = 0;
151251662Sdim	  }
152251662Sdim	break;
153251662Sdim      case BaseMetric::IO_READ_CNT:
154251662Sdim	if (!empty)
155251662Sdim	  {
156251662Sdim	    hist_data->total->value[mIndex].ll = fDataTotal->getReadCnt ();
157251662Sdim	    hi->value[mIndex].ll = fDataTotal->getReadCnt ();
158193323Sed	  }
159193323Sed	else
160251662Sdim	  {
161251662Sdim	    hist_data->total->value[mIndex].ll = 0;
162251662Sdim	    hi->value[mIndex].ll = 0;
163251662Sdim	  }
164251662Sdim	break;
165251662Sdim      case BaseMetric::IO_READ_TIME:
166251662Sdim	if (!empty)
167251662Sdim	  {
168251662Sdim	    hist_data->total->value[mIndex].d =
169251662Sdim		    (double) fDataTotal->getReadTime () / prec;
170198090Srdivacky	    hi->value[mIndex].d = hist_data->total->value[mIndex].d;
171198090Srdivacky	  }
172251662Sdim	else
173198090Srdivacky	  {
174210299Sed	    hist_data->total->value[mIndex].d = 0.0;
175263508Sdim	    hi->value[mIndex].d = 0.0;
176251662Sdim	  }
177251662Sdim	break;
178251662Sdim      case BaseMetric::IO_WRITE_BYTES:
179251662Sdim	if (!empty)
180198090Srdivacky	  {
181251662Sdim	    hist_data->total->value[mIndex].ll = fDataTotal->getWriteBytes ();
182251662Sdim	    hi->value[mIndex].ll = fDataTotal->getWriteBytes ();
183251662Sdim	  }
184251662Sdim	else
185251662Sdim	  {
186263508Sdim	    hist_data->total->value[mIndex].ll = 0;
187218893Sdim	    hi->value[mIndex].ll = 0;
188218893Sdim	  }
189193323Sed	break;
190193323Sed      case BaseMetric::IO_WRITE_CNT:
191193323Sed	if (!empty)
192193323Sed	  {
193251662Sdim	    hist_data->total->value[mIndex].ll = fDataTotal->getWriteCnt ();
194239462Sdim	    hi->value[mIndex].ll = fDataTotal->getWriteCnt ();
195193323Sed	  }
196251662Sdim	else
197251662Sdim	  {
198193323Sed	    hist_data->total->value[mIndex].ll = 0;
199193323Sed	    hi->value[mIndex].ll = 0;
200249423Sdim	  }
201249423Sdim	break;
202249423Sdim      case BaseMetric::IO_WRITE_TIME:
203193323Sed	if (!empty)
204193323Sed	  {
205193323Sed	    hist_data->total->value[mIndex].d =
206193323Sed		    (double) fDataTotal->getWriteTime () / prec;
207193323Sed	    hi->value[mIndex].d = hist_data->total->value[mIndex].d;
208193323Sed	  }
209251662Sdim	else
210210299Sed	  {
211193323Sed	    hist_data->total->value[mIndex].d = 0.0;
212193323Sed	    hi->value[mIndex].d = 0.0;
213193323Sed	  }
214249423Sdim	break;
215193323Sed      case BaseMetric::IO_OTHER_CNT:
216219077Sdim	if (!empty)
217263508Sdim	  {
218218893Sdim	    hist_data->total->value[mIndex].ll = fDataTotal->getOtherCnt ();
219218893Sdim	    hi->value[mIndex].ll = fDataTotal->getOtherCnt ();
220218893Sdim	  }
221218893Sdim	else
222218893Sdim	  {
223218893Sdim	    hist_data->total->value[mIndex].ll = 0;
224251662Sdim	    hi->value[mIndex].ll = 0;
225251662Sdim	  }
226218893Sdim	break;
227249423Sdim      case BaseMetric::IO_OTHER_TIME:
228219077Sdim	if (!empty)
229218893Sdim	  {
230193323Sed	    hist_data->total->value[mIndex].d =
231249423Sdim		    (double) fDataTotal->getOtherTime () / prec;
232249423Sdim	    hi->value[mIndex].d = hist_data->total->value[mIndex].d;
233219077Sdim	  }
234249423Sdim	else
235193323Sed	  {
236249423Sdim	    hist_data->total->value[mIndex].d = 0.0;
237249423Sdim	    hi->value[mIndex].d = 0.0;
238251662Sdim	  }
239249423Sdim	break;
240193323Sed      case BaseMetric::IO_ERROR_CNT:
241193323Sed	if (!empty)
242251662Sdim	  {
243251662Sdim	    hist_data->total->value[mIndex].ll = fDataTotal->getErrorCnt ();
244251662Sdim	    hi->value[mIndex].ll = fDataTotal->getErrorCnt ();
245251662Sdim	  }
246251662Sdim	else
247251662Sdim	  {
248251662Sdim	    hist_data->total->value[mIndex].ll = 0;
249263508Sdim	    hi->value[mIndex].ll = 0;
250251662Sdim	  }
251251662Sdim	break;
252251662Sdim      case BaseMetric::IO_ERROR_TIME:
253251662Sdim	if (!empty)
254251662Sdim	  {
255251662Sdim	    hist_data->total->value[mIndex].d = (double) fDataTotal->getErrorTime () / prec;
256251662Sdim	    hi->value[mIndex].d = hist_data->total->value[mIndex].d;
257251662Sdim	  }
258263763Sdim	else
259251662Sdim	  {
260251662Sdim	    hist_data->total->value[mIndex].d = 0.0;
261251662Sdim	    hi->value[mIndex].d = 0.0;
262251662Sdim	  }
263251662Sdim	break;
264251662Sdim      default:
265251662Sdim	break;
266251662Sdim      }
267251662Sdim  }
268251662Sdim}
269251662Sdim
270251662Sdimvoid
271251662SdimIOActivity::computeHistTotals (Hist_data *hist_data, MetricList *mlist)
272251662Sdim{
273251662Sdim  int mIndex;
274251662Sdim  Metric *mtr;
275251662Sdim  Vec_loop (Metric *, mlist->get_items (), mIndex, mtr)
276251662Sdim  {
277251662Sdim    if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ())
278251662Sdim      continue;
279251662Sdim
280251662Sdim    Metric::Type mtype = mtr->get_type ();
281251662Sdim    ValueTag vType = mtr->get_vtype ();
282251662Sdim    hist_data->total->value[mIndex].tag = vType;
283251662Sdim    double prec = (double) NANOSEC;
284251662Sdim    switch (mtype)
285251662Sdim      {
286251662Sdim      case BaseMetric::IO_READ_BYTES:
287251662Sdim	hist_data->total->value[mIndex].ll = fDataTotal->getReadBytes ();
288251662Sdim	break;
289251662Sdim      case BaseMetric::IO_READ_CNT:
290251662Sdim	hist_data->total->value[mIndex].ll = fDataTotal->getReadCnt ();
291251662Sdim	break;
292251662Sdim      case BaseMetric::IO_READ_TIME:
293251662Sdim	hist_data->total->value[mIndex].d =
294251662Sdim		(double) fDataTotal->getReadTime () / prec;
295251662Sdim	break;
296251662Sdim      case BaseMetric::IO_WRITE_BYTES:
297251662Sdim	hist_data->total->value[mIndex].ll = fDataTotal->getWriteBytes ();
298251662Sdim	break;
299251662Sdim      case BaseMetric::IO_WRITE_CNT:
300251662Sdim	hist_data->total->value[mIndex].ll = fDataTotal->getWriteCnt ();
301251662Sdim	break;
302251662Sdim      case BaseMetric::IO_WRITE_TIME:
303251662Sdim	hist_data->total->value[mIndex].d =
304251662Sdim		(double) fDataTotal->getWriteTime () / prec;
305251662Sdim	break;
306251662Sdim      case BaseMetric::IO_OTHER_CNT:
307251662Sdim	hist_data->total->value[mIndex].ll = fDataTotal->getOtherCnt ();
308251662Sdim	break;
309251662Sdim      case BaseMetric::IO_OTHER_TIME:
310251662Sdim	hist_data->total->value[mIndex].d =
311251662Sdim		(double) fDataTotal->getOtherTime () / prec;
312251662Sdim	break;
313251662Sdim      case BaseMetric::IO_ERROR_CNT:
314251662Sdim	hist_data->total->value[mIndex].ll = fDataTotal->getErrorCnt ();
315251662Sdim	break;
316251662Sdim      case BaseMetric::IO_ERROR_TIME:
317251662Sdim	hist_data->total->value[mIndex].d =
318251662Sdim		(double) fDataTotal->getErrorTime () / prec;
319251662Sdim	break;
320249423Sdim      default:
321249423Sdim	break;
322249423Sdim      }
323249423Sdim  }
324249423Sdim}
325263508Sdim
326249423Sdimvoid
327249423SdimIOActivity::computeHistData (Hist_data *hist_data, MetricList *mlist,
328249423Sdim			     Hist_data::Mode mode, Histable *selObj)
329249423Sdim{
330249423Sdim
331249423Sdim  Hist_data::HistItem *hi = NULL;
332249423Sdim  int numObjs = fDataObjs->size ();
333249423Sdim  int numMetrics = mlist->get_items ()->size ();
334249423Sdim
335249423Sdim  for (int i = 0; i < numObjs; i++)
336198090Srdivacky    {
337198090Srdivacky      FileData *fData = fDataObjs->fetch (i);
338249423Sdim      if (mode == Hist_data::ALL)
339249423Sdim	hi = hist_data->append_hist_item (fData);
340249423Sdim      else if (mode == Hist_data::SELF)
341249423Sdim	{
342249423Sdim	  if (fData->id == selObj->id)
343263508Sdim	    hi = hist_data->append_hist_item (fData);
344249423Sdim	  else
345249423Sdim	    continue;
346193323Sed	}
347193323Sed
348207618Srdivacky      for (int mIndex = 0; mIndex < numMetrics; mIndex++)
349193323Sed	{
350198090Srdivacky	  Metric *mtr = mlist->get_items ()->fetch (mIndex);
351198090Srdivacky	  if (!mtr->is_visible () && !mtr->is_tvisible ()
352223017Sdim	      && !mtr->is_pvisible ())
353239462Sdim	    continue;
354198090Srdivacky
355198090Srdivacky	  Metric::Type mtype = mtr->get_type ();
356218893Sdim	  ValueTag vType = mtr->get_vtype ();
357193323Sed	  hi->value[mIndex].tag = vType;
358198090Srdivacky
359198090Srdivacky	  double prec = (double) NANOSEC;
360193323Sed	  switch (mtype)
361218893Sdim	    {
362263508Sdim	    case BaseMetric::IO_READ_BYTES:
363218893Sdim	      hi->value[mIndex].ll = fData->getReadBytes ();
364218893Sdim	      break;
365218893Sdim	    case BaseMetric::IO_READ_CNT:
366218893Sdim	      hi->value[mIndex].ll = fData->getReadCnt ();
367234353Sdim	      break;
368218893Sdim	    case BaseMetric::IO_READ_TIME:
369218893Sdim	      hi->value[mIndex].d = (double) fData->getReadTime () / prec;
370218893Sdim	      break;
371193323Sed	    case BaseMetric::IO_WRITE_BYTES:
372218893Sdim	      hi->value[mIndex].ll = fData->getWriteBytes ();
373218893Sdim	      break;
374218893Sdim	    case BaseMetric::IO_WRITE_CNT:
375218893Sdim	      hi->value[mIndex].ll = fData->getWriteCnt ();
376218893Sdim	      break;
377218893Sdim	    case BaseMetric::IO_WRITE_TIME:
378193323Sed	      hi->value[mIndex].d = (double) fData->getWriteTime () / prec;
379218893Sdim	      break;
380218893Sdim	    case BaseMetric::IO_OTHER_CNT:
381193323Sed	      hi->value[mIndex].ll = fData->getOtherCnt ();
382193323Sed	      break;
383218893Sdim	    case BaseMetric::IO_OTHER_TIME:
384218893Sdim	      hi->value[mIndex].d = (double) fData->getOtherTime () / prec;
385218893Sdim	      break;
386193323Sed	    case BaseMetric::IO_ERROR_CNT:
387218893Sdim	      hi->value[mIndex].ll = fData->getErrorCnt ();
388218893Sdim	      break;
389234353Sdim	    case BaseMetric::IO_ERROR_TIME:
390218893Sdim	      hi->value[mIndex].d = (double) fData->getErrorTime () / prec;
391218893Sdim	      break;
392219077Sdim	    default:
393218893Sdim	      break;
394193323Sed	    }
395193323Sed	}
396193323Sed    }
397218893Sdim}
398218893Sdim
399218893SdimHist_data *
400218893SdimIOActivity::compute_metrics (MetricList *mlist, Histable::Type type,
401218893Sdim			     Hist_data::Mode mode, Histable *selObj)
402218893Sdim{
403218893Sdim
404218893Sdim  // it's already there, just return it
405218893Sdim  if (mode == Hist_data::ALL)
406218893Sdim    {
407218893Sdim      if (type == Histable::IOACTFILE && hist_data_file_all)
408218893Sdim	return hist_data_file_all;
409218893Sdim      else if (type == Histable::IOACTVFD && hist_data_vfd_all)
410218893Sdim	return hist_data_vfd_all;
411218893Sdim      else if (type == Histable::IOCALLSTACK && hist_data_callstack_all)
412218893Sdim	return hist_data_callstack_all;
413218893Sdim    }
414193323Sed
415218893Sdim  bool has_data = false;
416193323Sed  Hist_data *hist_data = NULL;
417218893Sdim  VMode viewMode = dbev->get_view_mode ();
418218893Sdim
419218893Sdim  switch (type)
420218893Sdim    {
421263508Sdim    case Histable::IOACTVFD:
422218893Sdim      if (!hasVfd)
423218893Sdim	computeData (type);
424218893Sdim
425218893Sdim      // computeData() creates fDataObjsVfd
426218893Sdim      // fDataObjsVfd contains the list of vfd objects
427218893Sdim      if (fDataObjsVfd != NULL)
428218893Sdim	{
429234353Sdim	  // fDataObjs is used in other methods
430218893Sdim	  fDataObjs = fDataObjsVfd;
431218893Sdim	  has_data = true;
432193323Sed	}
433218893Sdim      else
434218893Sdim	has_data = false;
435218893Sdim
436218893Sdim      if (has_data && mode == Hist_data::ALL && hist_data_vfd_all == NULL)
437218893Sdim	{
438218893Sdim	  hist_data_vfd_all = new Hist_data (mlist, type, mode, true);
439218893Sdim	  hist_data = hist_data_vfd_all;
440234353Sdim	}
441218893Sdim      else if (has_data)
442218893Sdim	hist_data = new Hist_data (mlist, type, mode, false);
443218893Sdim      else
444218893Sdim	{
445218893Sdim	  hist_data = new Hist_data (mlist, type, mode, false);
446218893Sdim	  createHistItemTotals (hist_data, mlist, type, true);
447218893Sdim	  return hist_data;
448234353Sdim	}
449218893Sdim      break;
450218893Sdim    case Histable::IOACTFILE:
451218893Sdim      if (!hasFile)
452218893Sdim	computeData (type);
453218893Sdim
454218893Sdim      // computeData() creates fDataObjsFile
455193323Sed      // fDataObjsFile contains the list of file objects
456218893Sdim      if (fDataObjsFile != NULL)
457218893Sdim	{
458218893Sdim	  fDataObjs = fDataObjsFile;
459218893Sdim	  has_data = true;
460218893Sdim	}
461218893Sdim      else
462218893Sdim	has_data = false;
463218893Sdim
464218893Sdim      if (has_data && mode == Hist_data::ALL && hist_data_file_all == NULL)
465234353Sdim	{
466218893Sdim	  hist_data_file_all = new Hist_data (mlist, type, mode, true);
467218893Sdim	  hist_data = hist_data_file_all;
468218893Sdim	}
469218893Sdim      else if (has_data)
470218893Sdim	hist_data = new Hist_data (mlist, type, mode, false);
471218893Sdim      else
472218893Sdim	{
473218893Sdim	  hist_data = new Hist_data (mlist, type, mode, false);
474218893Sdim	  createHistItemTotals (hist_data, mlist, type, true);
475218893Sdim	  return hist_data;
476218893Sdim	}
477218893Sdim      break;
478193323Sed    case Histable::IOCALLSTACK:
479193323Sed      if (!hasCallStack)
480218893Sdim	computeCallStack (type, viewMode);
481263508Sdim
482218893Sdim      // computeCallStack() creates fDataObjsCallStack
483218893Sdim      // fDataObjsCallStack contains the list of call stack objects
484218893Sdim      if (fDataObjsCallStack != NULL)
485218893Sdim	{
486218893Sdim	  fDataObjs = fDataObjsCallStack;
487218893Sdim	  has_data = true;
488218893Sdim	}
489218893Sdim      else
490218893Sdim	has_data = false;
491218893Sdim
492193323Sed      if (has_data && (mode == Hist_data::ALL) && (hist_data_callstack_all == NULL))
493198090Srdivacky	{
494234353Sdim	  hist_data_callstack_all = new Hist_data (mlist, type, mode, true);
495218893Sdim	  hist_data = hist_data_callstack_all;
496218893Sdim	}
497218893Sdim      else if (has_data)
498234353Sdim	hist_data = new Hist_data (mlist, type, mode, false);
499218893Sdim      else
500218893Sdim	{
501218893Sdim	  hist_data = new Hist_data (mlist, type, mode, false);
502218893Sdim	  createHistItemTotals (hist_data, mlist, type, true);
503218893Sdim	  return hist_data;
504218893Sdim	}
505218893Sdim      break;
506218893Sdim    default:
507193323Sed      fprintf (stderr,
508207618Srdivacky	    "IOActivity cannot process data due to wrong Histable (type=%d) \n",
509193323Sed	       type);
510198090Srdivacky      abort ();
511198090Srdivacky    }
512193323Sed
513193323Sed  if (mode == Hist_data::ALL || (mode == Hist_data::SELF && selObj->id == 0))
514193323Sed    createHistItemTotals (hist_data, mlist, type, false);
515193323Sed  else
516193323Sed    computeHistTotals (hist_data, mlist);
517199481Srdivacky  computeHistData (hist_data, mlist, mode, selObj);
518210299Sed
519193323Sed  // Determine by which metric to sort if any
520193323Sed  bool rev_sort = mlist->get_sort_rev ();
521218893Sdim  int sort_ind = -1;
522218893Sdim  int nmetrics = mlist->get_items ()->size ();
523203954Srdivacky  for (int mind = 0; mind < nmetrics; mind++)
524193323Sed    if (mlist->get_sort_ref_index () == mind)
525193323Sed      sort_ind = mind;
526198090Srdivacky
527198090Srdivacky  hist_data->sort (sort_ind, rev_sort);
528198090Srdivacky  hist_data->compute_minmax ();
529198090Srdivacky  return hist_data;
530198090Srdivacky}
531198090Srdivacky
532193323Sedvoid
533193323SedIOActivity::computeData (Histable::Type type)
534198090Srdivacky{
535193323Sed  bool has_iodata = false;
536193323Sed  reset ();
537249423Sdim  int64_t histableId = 0; // It is used by fDataAggr only
538249423Sdim  // fData uses vfd for histable id
539249423Sdim
540249423Sdim  fDataHash = new HashMap<char*, FileData*>;
541249423Sdim  FileData *fData = NULL;
542249423Sdim  FileData *fDataAggr = NULL;
543263508Sdim
544249423Sdim  fDataTotal = new FileData (TOTAL_FILENAME);
545249423Sdim  fDataTotal->setHistType (type);
546249423Sdim  fDataTotal->setVirtualFd (VIRTUAL_FD_TOTAL);
547249423Sdim  fDataTotal->id = histableId++;
548249423Sdim
549249423Sdim  FileData *fDataStdin = new FileData (STDIN_FILENAME);
550249423Sdim  fDataStdin->setFileDes (STDIN_FD);
551249423Sdim  fDataStdin->setHistType (type);
552249423Sdim  fDataStdin->setFsType ("N/A");
553249423Sdim  fDataStdin->id = histableId++;
554251662Sdim
555251662Sdim  FileData *fDataStdout = new FileData (STDOUT_FILENAME);
556251662Sdim  fDataStdout->setFileDes (STDOUT_FD);
557249423Sdim  fDataStdout->setHistType (type);
558249423Sdim  fDataStdout->setFsType ("N/A");
559249423Sdim  fDataStdout->id = histableId++;
560249423Sdim
561249423Sdim  FileData *fDataStderr = new FileData (STDERR_FILENAME);
562249423Sdim  fDataStderr->setFileDes (STDERR_FD);
563249423Sdim  fDataStderr->setHistType (type);
564249423Sdim  fDataStderr->setFsType ("N/A");
565249423Sdim  fDataStderr->id = histableId++;
566249423Sdim
567249423Sdim  FileData *fDataOtherIO = new FileData (OTHERIO_FILENAME);
568251662Sdim  fDataOtherIO->setFileDes (OTHERIO_FD);
569251662Sdim  fDataOtherIO->setHistType (type);
570251662Sdim  fDataOtherIO->setFsType ("N/A");
571251662Sdim  fDataOtherIO->id = histableId++;
572251662Sdim
573249423Sdim  DefaultMap<int64_t, FileData*>* fDataMap;
574249423Sdim  fDataObjsFile = NULL;
575249423Sdim  fDataObjsVfd = NULL;
576249423Sdim
577249423Sdim  // get the list of io events from DbeView
578249423Sdim  int numExps = dbeSession->nexps ();
579249423Sdim
580249423Sdim  for (int k = 0; k < numExps; k++)
581249423Sdim    {
582249423Sdim      DataView *ioPkts = dbev->get_filtered_events (k, DATA_IOTRACE);
583249423Sdim      if (ioPkts == NULL || ioPkts->getSize () <= 0)
584249423Sdim	continue;
585249423Sdim      Experiment *exp = dbeSession->get_exp (k);
586249423Sdim      fDataMap = exp->getFDataMap ();
587249423Sdim      if (fDataMap == NULL)
588249423Sdim	continue;
589249423Sdim      delete fDataVfdMap;
590249423Sdim      fDataVfdMap = new DefaultMap<long, FileData*>;
591249423Sdim
592249423Sdim      long sz = ioPkts->getSize ();
593249423Sdim      for (long i = 0; i < sz; ++i)
594249423Sdim	{
595249423Sdim	  hrtime_t event_duration = ioPkts->getLongValue (PROP_EVT_TIME, i);
596249423Sdim	  int64_t nByte = ioPkts->getLongValue (PROP_IONBYTE, i);
597249423Sdim	  IOTrace_type ioType = (IOTrace_type) ioPkts->getIntValue (PROP_IOTYPE, i);
598251662Sdim	  int64_t vFd = ioPkts->getLongValue (PROP_IOVFD, i);
599251662Sdim	  if (vFd >= 0)
600251662Sdim	    {
601251662Sdim	      fData = fDataMap->get (vFd);
602251662Sdim	      if (fData == NULL)
603251662Sdim		continue;
604251662Sdim	    }
605251662Sdim	  else
606251662Sdim	    continue;
607251662Sdim
608251662Sdim	  if (fDataVfdMap->get (vFd) == NULL)
609251662Sdim	    fDataVfdMap->put (vFd, fData);
610251662Sdim
611251662Sdim	  switch (ioType)
612249423Sdim	    {
613251662Sdim	    case READ_TRACE:
614251662Sdim	      fData->addReadEvent (event_duration, nByte);
615251662Sdim	      // Set the Histable id for IOVFD
616251662Sdim	      fData->id = fData->getVirtualFd ();
617251662Sdim	      fDataTotal->addReadEvent (event_duration, nByte);
618251662Sdim	      fDataTotal->setReadStat (event_duration, nByte);
619251662Sdim	      break;
620251662Sdim	    case WRITE_TRACE:
621251662Sdim	      fData->addWriteEvent (event_duration, nByte);
622251662Sdim	      // Set the Histable id for IOVFD
623251662Sdim	      fData->id = fData->getVirtualFd ();
624251662Sdim	      fDataTotal->addWriteEvent (event_duration, nByte);
625251662Sdim	      fDataTotal->setWriteStat (event_duration, nByte);
626251662Sdim	      break;
627251662Sdim	    case OPEN_TRACE:
628251662Sdim	      fData->addOtherEvent (event_duration);
629251662Sdim	      // Set the Histable id for IOVFD
630251662Sdim	      fData->id = fData->getVirtualFd ();
631251662Sdim	      fDataTotal->addOtherEvent (event_duration);
632251662Sdim	      break;
633251662Sdim	    case CLOSE_TRACE:
634251662Sdim	    case OTHERIO_TRACE:
635251662Sdim	      fData->addOtherEvent (event_duration);
636251662Sdim	      // Set the Histable id for IOVFD
637251662Sdim	      fData->id = fData->getVirtualFd ();
638251662Sdim	      fDataTotal->addOtherEvent (event_duration);
639251662Sdim	      break;
640251662Sdim	    case READ_TRACE_ERROR:
641251662Sdim	    case WRITE_TRACE_ERROR:
642251662Sdim	    case OPEN_TRACE_ERROR:
643251662Sdim	    case CLOSE_TRACE_ERROR:
644251662Sdim	    case OTHERIO_TRACE_ERROR:
645251662Sdim	      fData->addErrorEvent (event_duration);
646251662Sdim	      // Set the Histable id for IOVFD
647251662Sdim	      fData->id = fData->getVirtualFd ();
648249423Sdim	      fDataTotal->addErrorEvent (event_duration);
649249423Sdim	      break;
650249423Sdim
651198090Srdivacky	    case IOTRACETYPE_LAST:
652239462Sdim	      break;
653207618Srdivacky	    }
654251662Sdim
655251662Sdim	  if (type == Histable::IOACTFILE)
656251662Sdim	    {
657251662Sdim	      fDataAggr = fDataHash->get (fData->getFileName ());
658251662Sdim	      if (fDataAggr == NULL)
659263508Sdim		{
660263508Sdim		  bool setInfo = false;
661263508Sdim		  if (vFd == VIRTUAL_FD_STDIN)
662263508Sdim		    fDataAggr = fDataStdin;
663263508Sdim		  else if (vFd == VIRTUAL_FD_STDOUT)
664263508Sdim		    fDataAggr = fDataStdout;
665263508Sdim		  else if (vFd == VIRTUAL_FD_STDERR)
666263508Sdim		    fDataAggr = fDataStderr;
667263508Sdim		  else if (vFd == VIRTUAL_FD_OTHERIO)
668263508Sdim		    fDataAggr = fDataOtherIO;
669263508Sdim		  else
670263508Sdim		    {
671263508Sdim		      fDataAggr = new FileData (fData->getFileName ());
672263508Sdim		      setInfo = true;
673263508Sdim		    }
674263508Sdim		  fDataHash->put (fData->getFileName (), fDataAggr);
675263508Sdim
676263508Sdim		  if (setInfo)
677263508Sdim		    {
678263508Sdim		      fDataAggr->setFsType (fData->getFsType ());
679263508Sdim		      fDataAggr->setHistType (type);
680251662Sdim		      // Set the Histable id for aggregated file name
681251662Sdim		      fDataAggr->id = histableId;
682251662Sdim		      fDataAggr->setVirtualFd (histableId);
683251662Sdim		      histableId++;
684239462Sdim		    }
685263508Sdim		}
686263508Sdim
687263508Sdim	      fDataAggr->setFileDesList (fData->getFileDes ());
688263508Sdim	      fDataAggr->setVirtualFds (fData->getVirtualFd ());
689239462Sdim	      switch (ioType)
690239462Sdim		{
691239462Sdim		case READ_TRACE:
692239462Sdim		  fDataAggr->addReadEvent (event_duration, nByte);
693239462Sdim		  break;
694239462Sdim		case WRITE_TRACE:
695203954Srdivacky		  fDataAggr->addWriteEvent (event_duration, nByte);
696203954Srdivacky		  break;
697193323Sed		case OPEN_TRACE:
698193323Sed		  fDataAggr->addOtherEvent (event_duration);
699193323Sed		  break;
700223017Sdim		case CLOSE_TRACE:
701239462Sdim		case OTHERIO_TRACE:
702198090Srdivacky		  fDataAggr->addOtherEvent (event_duration);
703193323Sed		  break;
704193323Sed		case READ_TRACE_ERROR:
705193323Sed		case WRITE_TRACE_ERROR:
706193323Sed		case OPEN_TRACE_ERROR:
707193323Sed		case CLOSE_TRACE_ERROR:
708193323Sed		case OTHERIO_TRACE_ERROR:
709193323Sed		  fDataAggr->addErrorEvent (event_duration);
710218893Sdim		  break;
711218893Sdim		case IOTRACETYPE_LAST:
712263508Sdim		  break;
713218893Sdim		}
714218893Sdim	    }
715218893Sdim	  has_iodata = true;
716218893Sdim	}
717218893Sdim      if (sz > 0)
718218893Sdim	{
719218893Sdim	  if (fDataObjsVfd == NULL)
720218893Sdim	    fDataObjsVfd = new Vector<FileData*>;
721218893Sdim	  fDataObjsVfd->addAll (fDataVfdMap->values ());
722218893Sdim	  hasVfd = true;
723218893Sdim	}
724218893Sdim    }
725218893Sdim  if (has_iodata && type == Histable::IOACTFILE)
726218893Sdim    {
727218893Sdim      fDataObjsFile = fDataHash->values ()->copy ();
728263508Sdim      hasFile = true;
729263508Sdim    }
730218893Sdim}
731218893Sdim
732218893Sdimvoid
733218893SdimIOActivity::computeCallStack (Histable::Type type, VMode viewMode)
734263508Sdim{
735263508Sdim  bool has_data = false;
736193323Sed  int64_t stackIndex = 0;
737193323Sed  FileData *fData = NULL;
738193323Sed  delete fDataCalStkMap;
739193323Sed  fDataCalStkMap = new DefaultMap<void*, FileData*>;
740218893Sdim  delete fDataTotal;
741219077Sdim  fDataTotal = new FileData (TOTAL_FILENAME);
742193323Sed  fDataTotal->setHistType (type);
743218893Sdim
744218893Sdim  // There is no call stack for total, use the index for id
745218893Sdim  fDataTotal->id = stackIndex++;
746193323Sed
747218893Sdim  // get the list of io events from DbeView
748193323Sed  int numExps = dbeSession->nexps ();
749218893Sdim  for (int k = 0; k < numExps; k++)
750218893Sdim    {
751263508Sdim      DataView *ioPkts = dbev->get_filtered_events (k, DATA_IOTRACE);
752218893Sdim      if (ioPkts == NULL || ioPkts->getSize () <= 0)
753218893Sdim	continue;
754218893Sdim      long sz = ioPkts->getSize ();
755193323Sed      for (long i = 0; i < sz; ++i)
756193323Sed	{
757198090Srdivacky	  hrtime_t event_duration = ioPkts->getLongValue (PROP_EVT_TIME, i);
758193323Sed	  int64_t nByte = ioPkts->getLongValue (PROP_IONBYTE, i);
759193323Sed	  void *stackId = getStack (viewMode, ioPkts, i);
760218893Sdim	  IOTrace_type ioType =
761193323Sed		  (IOTrace_type) ioPkts->getIntValue (PROP_IOTYPE, i);
762193323Sed	  int64_t vFd = ioPkts->getLongValue (PROP_IOVFD, i);
763218893Sdim
764193323Sed	  if (stackId != NULL && vFd > 0)
765193323Sed	    {
766218893Sdim	      fData = fDataCalStkMap->get (stackId);
767193323Sed	      if (fData == NULL)
768218893Sdim		{
769218893Sdim		  char *stkName = dbe_sprintf (GTXT ("Stack 0x%llx"),
770218893Sdim					       (unsigned long long) stackId);
771193323Sed		  fData = new FileData (stkName);
772193323Sed		  fDataCalStkMap->put (stackId, fData);
773218893Sdim		  fData->id = (int64_t) stackId;
774218893Sdim		  fData->setVirtualFd (stackIndex);
775218893Sdim		  stackIndex++;
776218893Sdim		  fData->setHistType (type);
777218893Sdim		}
778218893Sdim	    }
779218893Sdim	  else
780218893Sdim	    continue;
781218893Sdim
782219077Sdim	  switch (ioType)
783193323Sed	    {
784193323Sed	    case READ_TRACE:
785193323Sed	      fData->addReadEvent (event_duration, nByte);
786218893Sdim	      fDataTotal->addReadEvent (event_duration, nByte);
787218893Sdim	      fDataTotal->setReadStat (event_duration, nByte);
788193323Sed	      break;
789218893Sdim	    case WRITE_TRACE:
790218893Sdim	      fData->addWriteEvent (event_duration, nByte);
791263508Sdim	      fDataTotal->addWriteEvent (event_duration, nByte);
792218893Sdim	      fDataTotal->setWriteStat (event_duration, nByte);
793218893Sdim	      break;
794218893Sdim	    case OPEN_TRACE:
795218893Sdim	      fData->addOtherEvent (event_duration);
796218893Sdim	      fDataTotal->addOtherEvent (event_duration);
797218893Sdim	      break;
798218893Sdim	    case CLOSE_TRACE:
799218893Sdim	    case OTHERIO_TRACE:
800218893Sdim	      fData->addOtherEvent (event_duration);
801193323Sed	      fDataTotal->addOtherEvent (event_duration);
802193323Sed	      break;
803193323Sed	    case READ_TRACE_ERROR:
804218893Sdim	    case WRITE_TRACE_ERROR:
805218893Sdim	    case OPEN_TRACE_ERROR:
806203954Srdivacky	      fData->addErrorEvent (event_duration);
807193323Sed	      fDataTotal->addErrorEvent (event_duration);
808218893Sdim	      break;
809234353Sdim	    case CLOSE_TRACE_ERROR:
810193323Sed	    case OTHERIO_TRACE_ERROR:
811193323Sed	      fData->addErrorEvent (event_duration);
812193323Sed	      fDataTotal->addErrorEvent (event_duration);
813193323Sed	      break;
814218893Sdim	    case IOTRACETYPE_LAST:
815234353Sdim	      break;
816193323Sed	    }
817218893Sdim	  has_data = true;
818218893Sdim	}
819218893Sdim    }
820218893Sdim  if (has_data)
821218893Sdim    {
822218893Sdim      fDataObjsCallStack = fDataCalStkMap->values ()->copy ();
823218893Sdim      hasCallStack = true;
824263508Sdim    }
825218893Sdim}
826218893Sdim