/* Copyright (C) 2021-2024 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 #include #include "util.h" #include "FileData.h" void FileData::init () { readTime = 0; writeTime = 0; otherTime = 0; errorTime = 0; readBytes = 0; writeBytes = 0; readCnt = 0; writeCnt = 0; otherCnt = 0; errorCnt = 0; wSlowestBytes = 0; wSmallestBytes = _10TB; wLargestBytes = 0; w0KB1KBCnt = 0; w1KB8KBCnt = 0; w8KB32KBCnt = 0; w32KB128KBCnt = 0; w128KB256KBCnt = 0; w256KB512KBCnt = 0; w512KB1000KBCnt = 0; w1000KB10MBCnt = 0; w10MB100MBCnt = 0; w100MB1GBCnt = 0; w1GB10GBCnt = 0; w10GB100GBCnt = 0; w100GB1TBCnt = 0; w1TB10TBCnt = 0; rSlowestBytes = 0; rSmallestBytes = _10TB; rLargestBytes = 0; r0KB1KBCnt = 0; r1KB8KBCnt = 0; r8KB32KBCnt = 0; r32KB128KBCnt = 0; r128KB256KBCnt = 0; r256KB512KBCnt = 0; r512KB1000KBCnt = 0; r1000KB10MBCnt = 0; r10MB100MBCnt = 0; r100MB1GBCnt = 0; r1GB10GBCnt = 0; r10GB100GBCnt = 0; r100GB1TBCnt = 0; r1TB10TBCnt = 0; } FileData::FileData (const char *fName) { fileName = dbe_strdup (fName); fileDesList = new Vector; virtualFds = new Vector; virtualFd = -1; fileDes = -1; fsType[0] = '\0'; histType = Histable::IOACTVFD; init (); } FileData::FileData (FileData *fData) { fileName = dbe_strdup (fData->fileName); fileDesList = new Vector; Vector *fdList = fData->fileDesList; int fd; if (fdList != NULL) for (int i = 0; i < fdList->size (); i++) if ((fd = fdList->fetch (i)) == -1) fileDesList->append (fd); virtualFds = new Vector; Vector *vfds = fData->virtualFds; int64_t vfd; if (vfds != NULL) for (int i = 0; i < vfds->size (); i++) if ((vfd = vfds->fetch (i)) == -1) virtualFds->append (vfd); virtualFd = fData->virtualFd; fileDes = fData->fileDes; histType = fData->histType; for (int i = 0; i < FSTYPESZ; i++) fsType[i] = fData->fsType[i]; readTime = fData->readTime; writeTime = fData->writeTime; otherTime = fData->otherTime; errorTime = fData->errorTime; readBytes = fData->readBytes; writeBytes = fData->writeBytes; readCnt = fData->readCnt; writeCnt = fData->writeCnt; otherCnt = fData->otherCnt; errorCnt = fData->errorCnt; wSlowestBytes = fData->wSlowestBytes; wSmallestBytes = fData->wSmallestBytes; wLargestBytes = fData->wLargestBytes; w0KB1KBCnt = fData->w0KB1KBCnt; w1KB8KBCnt = fData->w1KB8KBCnt; w8KB32KBCnt = fData->w8KB32KBCnt; w32KB128KBCnt = fData->w32KB128KBCnt; w128KB256KBCnt = fData->w128KB256KBCnt; w256KB512KBCnt = fData->w256KB512KBCnt; w512KB1000KBCnt = fData->w512KB1000KBCnt; w1000KB10MBCnt = fData->w1000KB10MBCnt; w10MB100MBCnt = fData->w10MB100MBCnt; w100MB1GBCnt = fData->w100MB1GBCnt; w1GB10GBCnt = fData->w1GB10GBCnt; w10GB100GBCnt = fData->w10GB100GBCnt; w100GB1TBCnt = fData->w100GB1TBCnt; w1TB10TBCnt = fData->w1TB10TBCnt; rSlowestBytes = fData->rSlowestBytes; rSmallestBytes = fData->rSmallestBytes; rLargestBytes = fData->rLargestBytes; r0KB1KBCnt = fData->r0KB1KBCnt; r1KB8KBCnt = fData->r1KB8KBCnt; r8KB32KBCnt = fData->r8KB32KBCnt; r32KB128KBCnt = fData->r32KB128KBCnt; r128KB256KBCnt = fData->r128KB256KBCnt; r256KB512KBCnt = fData->r256KB512KBCnt; r512KB1000KBCnt = fData->r512KB1000KBCnt; r1000KB10MBCnt = fData->r1000KB10MBCnt; r10MB100MBCnt = fData->r10MB100MBCnt; r100MB1GBCnt = fData->r100MB1GBCnt; r1GB10GBCnt = fData->r1GB10GBCnt; r10GB100GBCnt = fData->r10GB100GBCnt; r100GB1TBCnt = fData->r100GB1TBCnt; r1TB10TBCnt = fData->r1TB10TBCnt; } FileData::~FileData () { free (fileName); delete fileDesList; delete virtualFds; } void FileData::setVirtualFds (int64_t vfd) { for (int i = 0; i < virtualFds->size (); i++) if (vfd == virtualFds->fetch (i)) return; virtualFds->append (vfd); } void FileData::setFileDesList (int fd) { for (int i = 0; i < fileDesList->size (); i++) if (fd == fileDesList->fetch (i)) return; fileDesList->append (fd); } void FileData::setFsType (const char* fst) { size_t len = strlen (fst); if (len > 0 && len < FSTYPESZ) snprintf (fsType, sizeof (fsType), NTXT ("%s"), fst); else snprintf (fsType, sizeof (fsType), GTXT ("error")); } Histable* FileData::convertto (Histable_type type, Histable*) { return (type == histType ? this : NULL); } char* FileData::get_name (Histable::NameFormat /*_nfmt*/) { if (histType == Histable::IOACTVFD) { if (!streq (fileName, NTXT (""))) { if (fileDes >= 0) return dbe_sprintf (GTXT ("%s (IOVFD=%lld, FD=%d)"), fileName, (long long) virtualFd, (int) fileDes); return dbe_sprintf (GTXT ("%s (IOVFD=%lld)"), fileName, (long long) virtualFd); } else return fileName; } else if (histType == Histable::IOACTFILE) { if (!streq (fileName, NTXT (""))) { if (!streq (fsType, NTXT ("N/A"))) return dbe_sprintf (GTXT ("%s (FS=%s)"), fileName, fsType); return fileName; } return fileName; } return fileName; } char* FileData::get_raw_name (Histable::NameFormat /*_nfmt*/) { return fileName; } void FileData::setFsType (FileSystem_type fst) { const char *fsName; switch (fst) { case ZFS_TYPE: fsName = "zfs"; break; case NFS_TYPE: fsName = "nfs"; break; case UFS_TYPE: fsName = "ufs"; break; case UDFS_TYPE: fsName = "udfs"; break; case LOFS_TYPE: fsName = "lofs"; break; case VXFS_TYPE: fsName = "vxfs"; break; case TMPFS_TYPE: fsName = "tmpfs"; break; case PCFS_TYPE: fsName = "pcfs"; break; case HSFS_TYPE: fsName = "hsfs"; break; case PROCFS_TYPE: fsName = "procfs"; break; case FIFOFS_TYPE: fsName = "fifofs"; break; case SWAPFS_TYPE: fsName = "swapfs"; break; case CACHEFS_TYPE: fsName = "cachefs"; break; case AUTOFS_TYPE: fsName = "autofs"; break; case SPECFS_TYPE: fsName = "specfs"; break; case SOCKFS_TYPE: fsName = "sockfs"; break; case FDFS_TYPE: fsName = "fdfs"; break; case MNTFS_TYPE: fsName = "mntfs"; break; case NAMEFS_TYPE: fsName = "namefs"; break; case OBJFS_TYPE: fsName = "objfs"; break; case SHAREFS_TYPE: fsName = "sharefs"; break; case EXT2FS_TYPE: fsName = "ext2"; break; case EXT3FS_TYPE: fsName = "ext3"; break; case EXT4FS_TYPE: fsName = "ext4"; break; case UNKNOWNFS_TYPE: fsName = "N/A"; break; default: fsName = "N/A"; break; } setFsType (fsName); } void FileData::setWriteStat (hrtime_t wt, int64_t nb) { if (wSlowestBytes < wt) wSlowestBytes = wt; if (nb != 0 && wSmallestBytes > nb) wSmallestBytes = nb; if (wLargestBytes < nb) wLargestBytes = nb; if (nb >= 0 && nb <= _1KB) w0KB1KBCnt++; else if (nb <= _8KB) w1KB8KBCnt++; else if (nb <= _32KB) w8KB32KBCnt++; else if (nb <= _128KB) w32KB128KBCnt++; else if (nb <= _256KB) w128KB256KBCnt++; else if (nb <= _512KB) w256KB512KBCnt++; else if (nb <= _1000KB) w512KB1000KBCnt++; else if (nb <= _10MB) w1000KB10MBCnt++; else if (nb <= _100MB) w10MB100MBCnt++; else if (nb <= _1GB) w100MB1GBCnt++; else if (nb <= _10GB) w1GB10GBCnt++; else if (nb <= _100GB) w10GB100GBCnt++; else if (nb <= _1TB) w100GB1TBCnt++; else if (nb <= _10TB) w1TB10TBCnt++; } void FileData::setReadStat (hrtime_t rt, int64_t nb) { if (rSlowestBytes < rt) rSlowestBytes = rt; if (nb != 0 && rSmallestBytes > nb) rSmallestBytes = nb; if (rLargestBytes < nb) rLargestBytes = nb; if (nb >= 0 && nb <= _1KB) r0KB1KBCnt++; else if (nb <= _8KB) r1KB8KBCnt++; else if (nb <= _32KB) r8KB32KBCnt++; else if (nb <= _128KB) r32KB128KBCnt++; else if (nb <= _256KB) r128KB256KBCnt++; else if (nb <= _512KB) r256KB512KBCnt++; else if (nb <= _1000KB) r512KB1000KBCnt++; else if (nb <= _10MB) r1000KB10MBCnt++; else if (nb <= _100MB) r10MB100MBCnt++; else if (nb <= _1GB) r100MB1GBCnt++; else if (nb <= _10GB) r1GB10GBCnt++; else if (nb <= _100GB) r10GB100GBCnt++; else if (nb <= _1TB) r100GB1TBCnt++; else if (nb <= _10TB) r1TB10TBCnt++; }