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