Wolfgang Thallergcc16 merge934c3885 months agoHistory
825 lines · 22.1 KB · C++
RawDownload
/* 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.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t