/* Copyright (C) 2021-2026 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h"#include "DbeSession.h"#include "FileData.h"#include "StringBuilder.h"#include "i18n.h"#include "util.h"#include "IOActivity.h"#include "MetricList.h"#include "Application.h"#include "Experiment.h"#include "DbeView.h"#include "Exp_Layout.h"#include "i18n.h" IOActivity::IOActivity (DbeView *_dbev){ dbev = _dbev; fDataHash = NULL; fDataTotal = NULL; fDataObjs = NULL; fDataObjsFile = NULL; hasFile = false; fDataObjsVfd = NULL; hasVfd = false; fDataObjsCallStack = NULL; hasCallStack = false; fDataCalStkMap = NULL; fDataVfdMap = NULL; hist_data_file_all = NULL; hist_data_vfd_all = NULL; hist_data_callstack_all = NULL;} voidIOActivity::reset (){ int numExps = dbeSession->nexps (); FileData *fData = NULL; DefaultMap<int64_t, FileData*>* fDataMap; for (int k = 0; k < numExps; k++) { Experiment *exp = dbeSession->get_exp (k); fDataMap = exp->getFDataMap (); if (fDataMap == NULL) continue; fDataObjs = fDataMap->values (); if (fDataObjs == NULL) continue; int numFiles = fDataObjs->size (); for (int j = 0; j < numFiles; j++) { fData = fDataObjs->fetch (j); fData->init (); } } delete fDataHash; fDataHash = NULL; delete fDataTotal; fDataTotal = NULL; delete fDataObjsFile; fDataObjsFile = NULL; hasFile = false; delete fDataObjsVfd; fDataObjsVfd = NULL; hasVfd = false; delete fDataObjsCallStack; fDataObjsCallStack = NULL; hasCallStack = false; delete fDataObjs; fDataObjs = NULL; delete fDataCalStkMap; fDataCalStkMap = NULL; delete fDataVfdMap; fDataVfdMap = NULL; // These three pointers are deleted by DbeView // They are named iofile_data, iovfd_data, and iocs_data hist_data_file_all = NULL; hist_data_vfd_all = NULL; hist_data_callstack_all = NULL;} voidIOActivity::createHistItemTotals (Hist_data *hist_data, MetricList *mlist, Histable::Type hType, bool empty){ int mIndex; Metric *mtr; Hist_data::HistItem *hi; FileData *fData = NULL; if (fDataTotal == NULL) { fDataTotal = new FileData (TOTAL_FILENAME); fDataTotal->setHistType (hType); fDataTotal->setVirtualFd (VIRTUAL_FD_TOTAL); fDataTotal->id = 0; } fData = new FileData (fDataTotal); fData->setHistType (hType); hi = hist_data->append_hist_item (fData); Vec_loop (Metric *, mlist->get_items (), mIndex, mtr) { if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ()) continue; Metric::Type mtype = mtr->get_type (); ValueTag vType = mtr->get_vtype (); hist_data->total->value[mIndex].tag = vType; hi->value[mIndex].tag = vType; double prec = (double) NANOSEC; switch (mtype) { case BaseMetric::IO_READ_BYTES: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getReadBytes (); hi->value[mIndex].ll = fDataTotal->getReadBytes (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_READ_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getReadCnt (); hi->value[mIndex].ll = fDataTotal->getReadCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_READ_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getReadTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; case BaseMetric::IO_WRITE_BYTES: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getWriteBytes (); hi->value[mIndex].ll = fDataTotal->getWriteBytes (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_WRITE_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getWriteCnt (); hi->value[mIndex].ll = fDataTotal->getWriteCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_WRITE_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getWriteTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; case BaseMetric::IO_OTHER_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getOtherCnt (); hi->value[mIndex].ll = fDataTotal->getOtherCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_OTHER_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getOtherTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; case BaseMetric::IO_ERROR_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getErrorCnt (); hi->value[mIndex].ll = fDataTotal->getErrorCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_ERROR_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getErrorTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; default: break; } }} voidIOActivity::computeHistTotals (Hist_data *hist_data, MetricList *mlist){ int mIndex; Metric *mtr; Vec_loop (Metric *, mlist->get_items (), mIndex, mtr) { if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ()) continue; Metric::Type mtype = mtr->get_type (); ValueTag vType = mtr->get_vtype (); hist_data->total->value[mIndex].tag = vType; double prec = (double) NANOSEC; switch (mtype) { case BaseMetric::IO_READ_BYTES: hist_data->total->value[mIndex].ll = fDataTotal->getReadBytes (); break; case BaseMetric::IO_READ_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getReadCnt (); break; case BaseMetric::IO_READ_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getReadTime () / prec; break; case BaseMetric::IO_WRITE_BYTES: hist_data->total->value[mIndex].ll = fDataTotal->getWriteBytes (); break; case BaseMetric::IO_WRITE_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getWriteCnt (); break; case BaseMetric::IO_WRITE_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getWriteTime () / prec; break; case BaseMetric::IO_OTHER_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getOtherCnt (); break; case BaseMetric::IO_OTHER_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getOtherTime () / prec; break; case BaseMetric::IO_ERROR_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getErrorCnt (); break; case BaseMetric::IO_ERROR_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getErrorTime () / prec; break; default: break; } }} voidIOActivity::computeHistData (Hist_data *hist_data, MetricList *mlist, Hist_data::Mode mode, Histable *selObj){ Hist_data::HistItem *hi = NULL; int numObjs = fDataObjs->size (); int numMetrics = mlist->get_items ()->size (); for (int i = 0; i < numObjs; i++) { FileData *fData = fDataObjs->fetch (i); if (mode == Hist_data::ALL) hi = hist_data->append_hist_item (fData); else if (mode == Hist_data::SELF) { if (fData->id == selObj->id) hi = hist_data->append_hist_item (fData); else continue; } for (int mIndex = 0; mIndex < numMetrics; mIndex++) { Metric *mtr = mlist->get_items ()->fetch (mIndex); if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ()) continue; Metric::Type mtype = mtr->get_type (); ValueTag vType = mtr->get_vtype (); hi->value[mIndex].tag = vType; double prec = (double) NANOSEC; switch (mtype) { case BaseMetric::IO_READ_BYTES: hi->value[mIndex].ll = fData->getReadBytes (); break; case BaseMetric::IO_READ_CNT: hi->value[mIndex].ll = fData->getReadCnt (); break; case BaseMetric::IO_READ_TIME: hi->value[mIndex].d = (double) fData->getReadTime () / prec; break; case BaseMetric::IO_WRITE_BYTES: hi->value[mIndex].ll = fData->getWriteBytes (); break; case BaseMetric::IO_WRITE_CNT: hi->value[mIndex].ll = fData->getWriteCnt (); break; case BaseMetric::IO_WRITE_TIME: hi->value[mIndex].d = (double) fData->getWriteTime () / prec; break; case BaseMetric::IO_OTHER_CNT: hi->value[mIndex].ll = fData->getOtherCnt (); break; case BaseMetric::IO_OTHER_TIME: hi->value[mIndex].d = (double) fData->getOtherTime () / prec; break; case BaseMetric::IO_ERROR_CNT: hi->value[mIndex].ll = fData->getErrorCnt (); break; case BaseMetric::IO_ERROR_TIME: hi->value[mIndex].d = (double) fData->getErrorTime () / prec; break; default: break; } } }} Hist_data *IOActivity::compute_metrics (MetricList *mlist, Histable::Type type, Hist_data::Mode mode, Histable *selObj){ // it's already there, just return it if (mode == Hist_data::ALL) { if (type == Histable::IOACTFILE && hist_data_file_all) return hist_data_file_all; else if (type == Histable::IOACTVFD && hist_data_vfd_all) return hist_data_vfd_all; else if (type == Histable::IOCALLSTACK && hist_data_callstack_all) return hist_data_callstack_all; } bool has_data = false; Hist_data *hist_data = NULL; VMode viewMode = dbev->get_view_mode (); switch (type) { case Histable::IOACTVFD: if (!hasVfd) computeData (type); // computeData() creates fDataObjsVfd // fDataObjsVfd contains the list of vfd objects if (fDataObjsVfd != NULL) { // fDataObjs is used in other methods fDataObjs = fDataObjsVfd; has_data = true; } else has_data = false; if (has_data && mode == Hist_data::ALL && hist_data_vfd_all == NULL) { hist_data_vfd_all = new Hist_data (mlist, type, mode, true); hist_data = hist_data_vfd_all; } else if (has_data) hist_data = new Hist_data (mlist, type, mode, false); else { hist_data = new Hist_data (mlist, type, mode, false); createHistItemTotals (hist_data, mlist, type, true); return hist_data; } break; case Histable::IOACTFILE: if (!hasFile) computeData (type); // computeData() creates fDataObjsFile // fDataObjsFile contains the list of file objects if (fDataObjsFile != NULL) { fDataObjs = fDataObjsFile; has_data = true; } else has_data = false; if (has_data && mode == Hist_data::ALL && hist_data_file_all == NULL) { hist_data_file_all = new Hist_data (mlist, type, mode, true); hist_data = hist_data_file_all; } else if (has_data) hist_data = new Hist_data (mlist, type, mode, false); else { hist_data = new Hist_data (mlist, type, mode, false); createHistItemTotals (hist_data, mlist, type, true); return hist_data; } break; case Histable::IOCALLSTACK: if (!hasCallStack) computeCallStack (type, viewMode); // computeCallStack() creates fDataObjsCallStack // fDataObjsCallStack contains the list of call stack objects if (fDataObjsCallStack != NULL) { fDataObjs = fDataObjsCallStack; has_data = true; } else has_data = false; if (has_data && (mode == Hist_data::ALL) && (hist_data_callstack_all == NULL)) { hist_data_callstack_all = new Hist_data (mlist, type, mode, true); hist_data = hist_data_callstack_all; } else if (has_data) hist_data = new Hist_data (mlist, type, mode, false); else {Lines 1–500 of 825. Load more
/* Copyright (C) 2021-2026 Free Software Foundation, Inc. Contributed by Oracle. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #include "DbeSession.h" #include "FileData.h" #include "StringBuilder.h" #include "i18n.h" #include "util.h" #include "IOActivity.h" #include "MetricList.h" #include "Application.h" #include "Experiment.h" #include "DbeView.h" #include "Exp_Layout.h" #include "i18n.h" IOActivity::IOActivity (DbeView *_dbev) { dbev = _dbev; fDataHash = NULL; fDataTotal = NULL; fDataObjs = NULL; fDataObjsFile = NULL; hasFile = false; fDataObjsVfd = NULL; hasVfd = false; fDataObjsCallStack = NULL; hasCallStack = false; fDataCalStkMap = NULL; fDataVfdMap = NULL; hist_data_file_all = NULL; hist_data_vfd_all = NULL; hist_data_callstack_all = NULL; } void IOActivity::reset () { int numExps = dbeSession->nexps (); FileData *fData = NULL; DefaultMap<int64_t, FileData*>* fDataMap; for (int k = 0; k < numExps; k++) { Experiment *exp = dbeSession->get_exp (k); fDataMap = exp->getFDataMap (); if (fDataMap == NULL) continue; fDataObjs = fDataMap->values (); if (fDataObjs == NULL) continue; int numFiles = fDataObjs->size (); for (int j = 0; j < numFiles; j++) { fData = fDataObjs->fetch (j); fData->init (); } } delete fDataHash; fDataHash = NULL; delete fDataTotal; fDataTotal = NULL; delete fDataObjsFile; fDataObjsFile = NULL; hasFile = false; delete fDataObjsVfd; fDataObjsVfd = NULL; hasVfd = false; delete fDataObjsCallStack; fDataObjsCallStack = NULL; hasCallStack = false; delete fDataObjs; fDataObjs = NULL; delete fDataCalStkMap; fDataCalStkMap = NULL; delete fDataVfdMap; fDataVfdMap = NULL; // These three pointers are deleted by DbeView // They are named iofile_data, iovfd_data, and iocs_data hist_data_file_all = NULL; hist_data_vfd_all = NULL; hist_data_callstack_all = NULL; } void IOActivity::createHistItemTotals (Hist_data *hist_data, MetricList *mlist, Histable::Type hType, bool empty) { int mIndex; Metric *mtr; Hist_data::HistItem *hi; FileData *fData = NULL; if (fDataTotal == NULL) { fDataTotal = new FileData (TOTAL_FILENAME); fDataTotal->setHistType (hType); fDataTotal->setVirtualFd (VIRTUAL_FD_TOTAL); fDataTotal->id = 0; } fData = new FileData (fDataTotal); fData->setHistType (hType); hi = hist_data->append_hist_item (fData); Vec_loop (Metric *, mlist->get_items (), mIndex, mtr) { if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ()) continue; Metric::Type mtype = mtr->get_type (); ValueTag vType = mtr->get_vtype (); hist_data->total->value[mIndex].tag = vType; hi->value[mIndex].tag = vType; double prec = (double) NANOSEC; switch (mtype) { case BaseMetric::IO_READ_BYTES: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getReadBytes (); hi->value[mIndex].ll = fDataTotal->getReadBytes (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_READ_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getReadCnt (); hi->value[mIndex].ll = fDataTotal->getReadCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_READ_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getReadTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; case BaseMetric::IO_WRITE_BYTES: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getWriteBytes (); hi->value[mIndex].ll = fDataTotal->getWriteBytes (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_WRITE_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getWriteCnt (); hi->value[mIndex].ll = fDataTotal->getWriteCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_WRITE_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getWriteTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; case BaseMetric::IO_OTHER_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getOtherCnt (); hi->value[mIndex].ll = fDataTotal->getOtherCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_OTHER_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getOtherTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; case BaseMetric::IO_ERROR_CNT: if (!empty) { hist_data->total->value[mIndex].ll = fDataTotal->getErrorCnt (); hi->value[mIndex].ll = fDataTotal->getErrorCnt (); } else { hist_data->total->value[mIndex].ll = 0; hi->value[mIndex].ll = 0; } break; case BaseMetric::IO_ERROR_TIME: if (!empty) { hist_data->total->value[mIndex].d = (double) fDataTotal->getErrorTime () / prec; hi->value[mIndex].d = hist_data->total->value[mIndex].d; } else { hist_data->total->value[mIndex].d = 0.0; hi->value[mIndex].d = 0.0; } break; default: break; } } } void IOActivity::computeHistTotals (Hist_data *hist_data, MetricList *mlist) { int mIndex; Metric *mtr; Vec_loop (Metric *, mlist->get_items (), mIndex, mtr) { if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ()) continue; Metric::Type mtype = mtr->get_type (); ValueTag vType = mtr->get_vtype (); hist_data->total->value[mIndex].tag = vType; double prec = (double) NANOSEC; switch (mtype) { case BaseMetric::IO_READ_BYTES: hist_data->total->value[mIndex].ll = fDataTotal->getReadBytes (); break; case BaseMetric::IO_READ_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getReadCnt (); break; case BaseMetric::IO_READ_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getReadTime () / prec; break; case BaseMetric::IO_WRITE_BYTES: hist_data->total->value[mIndex].ll = fDataTotal->getWriteBytes (); break; case BaseMetric::IO_WRITE_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getWriteCnt (); break; case BaseMetric::IO_WRITE_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getWriteTime () / prec; break; case BaseMetric::IO_OTHER_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getOtherCnt (); break; case BaseMetric::IO_OTHER_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getOtherTime () / prec; break; case BaseMetric::IO_ERROR_CNT: hist_data->total->value[mIndex].ll = fDataTotal->getErrorCnt (); break; case BaseMetric::IO_ERROR_TIME: hist_data->total->value[mIndex].d = (double) fDataTotal->getErrorTime () / prec; break; default: break; } } } void IOActivity::computeHistData (Hist_data *hist_data, MetricList *mlist, Hist_data::Mode mode, Histable *selObj) { Hist_data::HistItem *hi = NULL; int numObjs = fDataObjs->size (); int numMetrics = mlist->get_items ()->size (); for (int i = 0; i < numObjs; i++) { FileData *fData = fDataObjs->fetch (i); if (mode == Hist_data::ALL) hi = hist_data->append_hist_item (fData); else if (mode == Hist_data::SELF) { if (fData->id == selObj->id) hi = hist_data->append_hist_item (fData); else continue; } for (int mIndex = 0; mIndex < numMetrics; mIndex++) { Metric *mtr = mlist->get_items ()->fetch (mIndex); if (!mtr->is_visible () && !mtr->is_tvisible () && !mtr->is_pvisible ()) continue; Metric::Type mtype = mtr->get_type (); ValueTag vType = mtr->get_vtype (); hi->value[mIndex].tag = vType; double prec = (double) NANOSEC; switch (mtype) { case BaseMetric::IO_READ_BYTES: hi->value[mIndex].ll = fData->getReadBytes (); break; case BaseMetric::IO_READ_CNT: hi->value[mIndex].ll = fData->getReadCnt (); break; case BaseMetric::IO_READ_TIME: hi->value[mIndex].d = (double) fData->getReadTime () / prec; break; case BaseMetric::IO_WRITE_BYTES: hi->value[mIndex].ll = fData->getWriteBytes (); break; case BaseMetric::IO_WRITE_CNT: hi->value[mIndex].ll = fData->getWriteCnt (); break; case BaseMetric::IO_WRITE_TIME: hi->value[mIndex].d = (double) fData->getWriteTime () / prec; break; case BaseMetric::IO_OTHER_CNT: hi->value[mIndex].ll = fData->getOtherCnt (); break; case BaseMetric::IO_OTHER_TIME: hi->value[mIndex].d = (double) fData->getOtherTime () / prec; break; case BaseMetric::IO_ERROR_CNT: hi->value[mIndex].ll = fData->getErrorCnt (); break; case BaseMetric::IO_ERROR_TIME: hi->value[mIndex].d = (double) fData->getErrorTime () / prec; break; default: break; } } } } Hist_data * IOActivity::compute_metrics (MetricList *mlist, Histable::Type type, Hist_data::Mode mode, Histable *selObj) { // it's already there, just return it if (mode == Hist_data::ALL) { if (type == Histable::IOACTFILE && hist_data_file_all) return hist_data_file_all; else if (type == Histable::IOACTVFD && hist_data_vfd_all) return hist_data_vfd_all; else if (type == Histable::IOCALLSTACK && hist_data_callstack_all) return hist_data_callstack_all; } bool has_data = false; Hist_data *hist_data = NULL; VMode viewMode = dbev->get_view_mode (); switch (type) { case Histable::IOACTVFD: if (!hasVfd) computeData (type); // computeData() creates fDataObjsVfd // fDataObjsVfd contains the list of vfd objects if (fDataObjsVfd != NULL) { // fDataObjs is used in other methods fDataObjs = fDataObjsVfd; has_data = true; } else has_data = false; if (has_data && mode == Hist_data::ALL && hist_data_vfd_all == NULL) { hist_data_vfd_all = new Hist_data (mlist, type, mode, true); hist_data = hist_data_vfd_all; } else if (has_data) hist_data = new Hist_data (mlist, type, mode, false); else { hist_data = new Hist_data (mlist, type, mode, false); createHistItemTotals (hist_data, mlist, type, true); return hist_data; } break; case Histable::IOACTFILE: if (!hasFile) computeData (type); // computeData() creates fDataObjsFile // fDataObjsFile contains the list of file objects if (fDataObjsFile != NULL) { fDataObjs = fDataObjsFile; has_data = true; } else has_data = false; if (has_data && mode == Hist_data::ALL && hist_data_file_all == NULL) { hist_data_file_all = new Hist_data (mlist, type, mode, true); hist_data = hist_data_file_all; } else if (has_data) hist_data = new Hist_data (mlist, type, mode, false); else { hist_data = new Hist_data (mlist, type, mode, false); createHistItemTotals (hist_data, mlist, type, true); return hist_data; } break; case Histable::IOCALLSTACK: if (!hasCallStack) computeCallStack (type, viewMode); // computeCallStack() creates fDataObjsCallStack // fDataObjsCallStack contains the list of call stack objects if (fDataObjsCallStack != NULL) { fDataObjs = fDataObjsCallStack; has_data = true; } else has_data = false; if (has_data && (mode == Hist_data::ALL) && (hist_data_callstack_all == NULL)) { hist_data_callstack_all = new Hist_data (mlist, type, mode, true); hist_data = hist_data_callstack_all; } else if (has_data) hist_data = new Hist_data (mlist, type, mode, false); else {