|  | /* Copyright (C) 2021-2025 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.  */ | 
|  |  | 
|  | #ifndef _FILEDATA_H | 
|  | #define _FILEDATA_H | 
|  |  | 
|  | #include "gp-defs.h" | 
|  | #include "gp-time.h" | 
|  |  | 
|  | #include "vec.h" | 
|  | #include "data_pckts.h" | 
|  | #include "Histable.h" | 
|  |  | 
|  | #define FSTYPESZ  16 | 
|  |  | 
|  | #define VIRTUAL_FD_TOTAL    0 | 
|  | #define VIRTUAL_FD_STDIN    1 | 
|  | #define VIRTUAL_FD_STDOUT   2 | 
|  | #define VIRTUAL_FD_STDERR   3 | 
|  | #define VIRTUAL_FD_OTHERIO  4 | 
|  | #define VIRTUAL_FD_NONE     -1 | 
|  |  | 
|  | #define STDIN_FD            0 | 
|  | #define STDOUT_FD           1 | 
|  | #define STDERR_FD           2 | 
|  | #define OTHERIO_FD          -1 | 
|  |  | 
|  | #define OTHERIO_FILENAME    "<Other IO activity>" | 
|  | #define STDIN_FILENAME      "<stdin>" | 
|  | #define STDOUT_FILENAME     "<stdout>" | 
|  | #define STDERR_FILENAME     "<stderr>" | 
|  | #define TOTAL_FILENAME      NTXT("<Total>") | 
|  | #define UNKNOWNFD_FILENAME  "<pipe(), socket(), or other fds>" | 
|  |  | 
|  | #define _1KB        1024 | 
|  | #define _8KB        8192 | 
|  | #define _32KB       32768 | 
|  | #define _128KB      131072 | 
|  | #define _256KB      262144 | 
|  | #define _512KB      524288 | 
|  | #define _1000KB     1048576 | 
|  | #define _10MB       10485760 | 
|  | #define _100MB      104857600 | 
|  | #define _1GB        1073741824 | 
|  | #define _10GB       10737418240 | 
|  | #define _100GB      107374182400 | 
|  | #define _1TB        1099511627776 | 
|  | #define _10TB       10995116277760 | 
|  |  | 
|  | class FileData : public Histable | 
|  | { | 
|  | friend class IOActivity; | 
|  | public: | 
|  | FileData (const char *fName); | 
|  | FileData (FileData *fData); | 
|  | ~FileData (); | 
|  |  | 
|  | virtual char *get_name (Histable::NameFormat nfmt); | 
|  | virtual Histable *convertto (Histable_type, Histable* = NULL); | 
|  |  | 
|  | char *get_raw_name (Histable::NameFormat nfmt); | 
|  | void setFsType (FileSystem_type fst); | 
|  | void setFsType (const char* fst); | 
|  |  | 
|  | virtual Histable_type | 
|  | get_type () | 
|  | { | 
|  | return histType; | 
|  | }; | 
|  |  | 
|  | virtual uint64_t | 
|  | get_addr () | 
|  | { | 
|  | return virtualFd; | 
|  | }; | 
|  |  | 
|  | uint64_t | 
|  | get_index () | 
|  | { | 
|  | return virtualFd; | 
|  | }; | 
|  |  | 
|  | void init (); | 
|  |  | 
|  | char * | 
|  | getFileName () | 
|  | { | 
|  | return fileName; | 
|  | } | 
|  |  | 
|  | void | 
|  | addReadEvent (hrtime_t rt, int64_t nb) | 
|  | { | 
|  | readTime += rt; | 
|  | readBytes += nb; | 
|  | readCnt++; | 
|  | } | 
|  |  | 
|  | hrtime_t | 
|  | getReadTime () | 
|  | { | 
|  | return readTime; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getReadBytes () | 
|  | { | 
|  | return readBytes; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getReadCnt () | 
|  | { | 
|  | return readCnt; | 
|  | } | 
|  |  | 
|  | void | 
|  | addWriteEvent (hrtime_t wt, int64_t nb) | 
|  | { | 
|  | writeTime += wt; | 
|  | writeBytes += nb; | 
|  | writeCnt++; | 
|  | } | 
|  |  | 
|  | hrtime_t | 
|  | getWriteTime () | 
|  | { | 
|  | return writeTime; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getWriteBytes () | 
|  | { | 
|  | return writeBytes; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getWriteCnt () | 
|  | { | 
|  | return writeCnt; | 
|  | } | 
|  |  | 
|  | void | 
|  | addOtherEvent (hrtime_t ot) | 
|  | { | 
|  | otherTime += ot; | 
|  | otherCnt++; | 
|  | } | 
|  |  | 
|  | hrtime_t | 
|  | getOtherTime () | 
|  | { | 
|  | return otherTime; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getOtherCnt () | 
|  | { | 
|  | return otherCnt; | 
|  | } | 
|  |  | 
|  | void | 
|  | addErrorEvent (hrtime_t er) | 
|  | { | 
|  | errorTime += er; | 
|  | errorCnt++; | 
|  | } | 
|  |  | 
|  | hrtime_t | 
|  | getErrorTime () | 
|  | { | 
|  | return errorTime; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getErrorCnt () | 
|  | { | 
|  | return errorCnt; | 
|  | } | 
|  |  | 
|  | void setFileDesList (int fd); | 
|  |  | 
|  | Vector<int> * | 
|  | getFileDesList () | 
|  | { | 
|  | return fileDesList; | 
|  | } | 
|  |  | 
|  | void | 
|  | setFileDes (int fd) | 
|  | { | 
|  | fileDes = fd; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getFileDes () | 
|  | { | 
|  | return fileDes; | 
|  | } | 
|  |  | 
|  | void setVirtualFds (int64_t vfd); | 
|  |  | 
|  | Vector<int64_t> * | 
|  | getVirtualFds () | 
|  | { | 
|  | return virtualFds; | 
|  | } | 
|  |  | 
|  | char * | 
|  | getFsType () | 
|  | { | 
|  | return fsType; | 
|  | } | 
|  |  | 
|  | void | 
|  | setVirtualFd (int64_t vFd) | 
|  | { | 
|  | virtualFd = vFd; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getVirtualFd () | 
|  | { | 
|  | return virtualFd; | 
|  | } | 
|  |  | 
|  | void | 
|  | setHistType (Histable::Type hType) | 
|  | { | 
|  | histType = hType; | 
|  | } | 
|  |  | 
|  | Histable::Type | 
|  | getHistType () | 
|  | { | 
|  | return histType; | 
|  | } | 
|  |  | 
|  | void setWriteStat (hrtime_t wt, int64_t nb); | 
|  |  | 
|  | hrtime_t | 
|  | getWSlowestBytes () | 
|  | { | 
|  | return wSlowestBytes; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getWSmallestBytes () | 
|  | { | 
|  | return wSmallestBytes; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getWLargestBytes () | 
|  | { | 
|  | return wLargestBytes; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW0KB1KBCnt () | 
|  | { | 
|  | return w0KB1KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW1KB8KBCnt () | 
|  | { | 
|  | return w1KB8KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW8KB32KBCnt () | 
|  | { | 
|  | return w8KB32KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW32KB128KBCnt () | 
|  | { | 
|  | return w32KB128KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW128KB256KBCnt () | 
|  | { | 
|  | return w128KB256KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW256KB512KBCnt () | 
|  | { | 
|  | return w256KB512KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW512KB1000KBCnt () | 
|  | { | 
|  | return w512KB1000KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW1000KB10MBCnt () | 
|  | { | 
|  | return w1000KB10MBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW10MB100MBCnt () | 
|  | { | 
|  | return w10MB100MBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW100MB1GBCnt () | 
|  | { | 
|  | return w100MB1GBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW1GB10GBCnt () | 
|  | { | 
|  | return w1GB10GBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW10GB100GBCnt () | 
|  | { | 
|  | return w10GB100GBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW100GB1TBCnt () | 
|  | { | 
|  | return w100GB1TBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getW1TB10TBCnt () | 
|  | { | 
|  | return w1TB10TBCnt; | 
|  | } | 
|  |  | 
|  | void setReadStat (hrtime_t rt, int64_t nb); | 
|  |  | 
|  | hrtime_t | 
|  | getRSlowestBytes () | 
|  | { | 
|  | return rSlowestBytes; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getRSmallestBytes () | 
|  | { | 
|  | return rSmallestBytes; | 
|  | } | 
|  |  | 
|  | int64_t | 
|  | getRLargestBytes () | 
|  | { | 
|  | return rLargestBytes; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR0KB1KBCnt () | 
|  | { | 
|  | return r0KB1KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR1KB8KBCnt () | 
|  | { | 
|  | return r1KB8KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR8KB32KBCnt () | 
|  | { | 
|  | return r8KB32KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR32KB128KBCnt () | 
|  | { | 
|  | return r32KB128KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR128KB256KBCnt () | 
|  | { | 
|  | return r128KB256KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR256KB512KBCnt () | 
|  | { | 
|  | return r256KB512KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR512KB1000KBCnt () | 
|  | { | 
|  | return r512KB1000KBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR1000KB10MBCnt () | 
|  | { | 
|  | return r1000KB10MBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR10MB100MBCnt () | 
|  | { | 
|  | return r10MB100MBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR100MB1GBCnt () | 
|  | { | 
|  | return r100MB1GBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR1GB10GBCnt () | 
|  | { | 
|  | return r1GB10GBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR10GB100GBCnt () | 
|  | { | 
|  | return r10GB100GBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR100GB1TBCnt () | 
|  | { | 
|  | return r100GB1TBCnt; | 
|  | } | 
|  |  | 
|  | int32_t | 
|  | getR1TB10TBCnt () | 
|  | { | 
|  | return r1TB10TBCnt; | 
|  | } | 
|  |  | 
|  | private: | 
|  | char *fileName;           // File name | 
|  | hrtime_t readTime;        // The Total time for read operations; | 
|  | hrtime_t writeTime;       // The Total time for write operations; | 
|  | hrtime_t otherTime;       // The Total time for other IO operations; | 
|  | hrtime_t errorTime;       // The Total time for failed IO operations; | 
|  | int64_t readBytes;        //The total bytes read | 
|  | int64_t writeBytes;       //The total bytes written | 
|  | int32_t readCnt;          // The read count | 
|  | int32_t writeCnt;         // The write count | 
|  | int32_t otherCnt;         // The other IO count | 
|  | int32_t errorCnt;         // The failed IO count | 
|  | Vector<int> *fileDesList; // The list of file descriptors | 
|  | Vector<int64_t> *virtualFds; // The list of file virtual descriptors | 
|  | char fsType[FSTYPESZ];    // The file system type | 
|  | int64_t virtualFd;        // The virtual file descriptor | 
|  | int32_t fileDes;          // The file descriptor | 
|  | Histable::Type histType;  // The Histable type: IOACTFILE, IOACTVFD, ... | 
|  |  | 
|  | // Write statistics | 
|  | hrtime_t wSlowestBytes; | 
|  | int64_t wSmallestBytes; | 
|  | int64_t wLargestBytes; | 
|  | int32_t w0KB1KBCnt; | 
|  | int32_t w1KB8KBCnt; | 
|  | int32_t w8KB32KBCnt; | 
|  | int32_t w32KB128KBCnt; | 
|  | int32_t w128KB256KBCnt; | 
|  | int32_t w256KB512KBCnt; | 
|  | int32_t w512KB1000KBCnt; | 
|  | int32_t w1000KB10MBCnt; | 
|  | int32_t w10MB100MBCnt; | 
|  | int32_t w100MB1GBCnt; | 
|  | int32_t w1GB10GBCnt; | 
|  | int32_t w10GB100GBCnt; | 
|  | int32_t w100GB1TBCnt; | 
|  | int32_t w1TB10TBCnt; | 
|  |  | 
|  | // Read statistics | 
|  | hrtime_t rSlowestBytes; | 
|  | int64_t rSmallestBytes; | 
|  | int64_t rLargestBytes; | 
|  | int32_t r0KB1KBCnt; | 
|  | int32_t r1KB8KBCnt; | 
|  | int32_t r8KB32KBCnt; | 
|  | int32_t r32KB128KBCnt; | 
|  | int32_t r128KB256KBCnt; | 
|  | int32_t r256KB512KBCnt; | 
|  | int32_t r512KB1000KBCnt; | 
|  | int32_t r1000KB10MBCnt; | 
|  | int32_t r10MB100MBCnt; | 
|  | int32_t r100MB1GBCnt; | 
|  | int32_t r1GB10GBCnt; | 
|  | int32_t r10GB100GBCnt; | 
|  | int32_t r100GB1TBCnt; | 
|  | int32_t r1TB10TBCnt; | 
|  | }; | 
|  |  | 
|  | #endif |