/* Copyright (C) 2021 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 _HEAPDATA_H #define _HEAPDATA_H #include "gp-defs.h" #include "gp-time.h" #include "vec.h" #include "data_pckts.h" #include "Histable.h" #define TOTAL_HEAPNAME NTXT("") #define TOTAL_STACK_ID 0 #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 HeapData : public Histable { friend class HeapActivity; public: HeapData (char *sName); HeapData (HeapData *hData); ~HeapData (); char *get_raw_name (Histable::NameFormat nfmt); void init (); void setStackName (char* sName); void setPeakMemUsage (int64_t pmu, uint64_t sId, hrtime_t ts, int procId, int uei); virtual char *get_name (Histable::NameFormat nfmt); virtual void set_name (char * _name); virtual Histable *convertto (Histable_type, Histable* = NULL); virtual Histable_type get_type () { return histType; } virtual uint64_t get_addr () { return stackId; } uint64_t get_index () { return stackId; } char * getStackName () { return stackName; } void addAllocEvent (uint64_t nb) { allocBytes += nb; allocCnt++; } uint64_t getAllocBytes () { return allocBytes; } int32_t getAllocCnt () { return allocCnt; } void addLeakEvent (uint64_t nb) { leakBytes += nb; leakCnt++; } uint64_t getLeakBytes () { return leakBytes; } int32_t getLeakCnt () { return leakCnt; } void setStackId (uint64_t sId) { stackId = sId; } uint64_t getStackId () { return stackId; } void setTimestamp (hrtime_t ts) { timestamp = ts; } hrtime_t getTimestamp () { return timestamp; } void setHistType (Histable::Type hType) { histType = hType; } Histable::Type getHistType () { return histType; } int64_t getPeakMemUsage () { return peakMemUsage; } Vector * getPeakStackIds () { return peakStackIds; } Vector * getPeakTimestamps () { return peakTimestamps; } void setPid (int procId) { pid = procId; } int getPid () { return pid; } void setUserExpId (int uei) { userExpId = uei; } int getUserExpId () { return userExpId; } void setAllocStat (int64_t nb); int64_t getASmallestBytes () { return aSmallestBytes; } int64_t getALargestBytes () { return aLargestBytes; } int32_t getA0KB1KBCnt () { return a0KB1KBCnt; } int32_t getA1KB8KBCnt () { return a1KB8KBCnt; } int32_t getA8KB32KBCnt () { return a8KB32KBCnt; } int32_t getA32KB128KBCnt () { return a32KB128KBCnt; } int32_t getA128KB256KBCnt () { return a128KB256KBCnt; } int32_t getA256KB512KBCnt () { return a256KB512KBCnt; } int32_t getA512KB1000KBCnt () { return a512KB1000KBCnt; } int32_t getA1000KB10MBCnt () { return a1000KB10MBCnt; } int32_t getA10MB100MBCnt () { return a10MB100MBCnt; } int32_t getA100MB1GBCnt () { return a100MB1GBCnt; } int32_t getA1GB10GBCnt () { return a1GB10GBCnt; } int32_t getA10GB100GBCnt () { return a10GB100GBCnt; } int32_t getA100GB1TBCnt () { return a100GB1TBCnt; } int32_t getA1TB10TBCnt () { return a1TB10TBCnt; } void setLeakStat (int64_t nb); int64_t getLSmallestBytes () { return lSmallestBytes; } int64_t getLLargestBytes () { return lLargestBytes; } int32_t getL0KB1KBCnt () { return l0KB1KBCnt; } int32_t getL1KB8KBCnt () { return l1KB8KBCnt; } int32_t getL8KB32KBCnt () { return l8KB32KBCnt; } int32_t getL32KB128KBCnt () { return l32KB128KBCnt; } int32_t getL128KB256KBCnt () { return l128KB256KBCnt; } int32_t getL256KB512KBCnt () { return l256KB512KBCnt; } int32_t getL512KB1000KBCnt () { return l512KB1000KBCnt; } int32_t getL1000KB10MBCnt () { return l1000KB10MBCnt; } int32_t getL10MB100MBCnt () { return l10MB100MBCnt; } int32_t getL100MB1GBCnt () { return l100MB1GBCnt; } int32_t getL1GB10GBCnt () { return l1GB10GBCnt; } int32_t getL10GB100GBCnt () { return l10GB100GBCnt; } int32_t getL100GB1TBCnt () { return l100GB1TBCnt; } int32_t getL1TB10TBCnt () { return l1TB10TBCnt; } private: char *stackName; // stack name uint64_t allocBytes; // The total bytes allocated uint64_t leakBytes; // The total bytes leaked int32_t allocCnt; // The alloc count int32_t leakCnt; // The leak count Histable::Type histType; // The Histable type: HEAPCALLSTACK int64_t peakMemUsage; // Keep track of peak memory usage uint64_t stackId; Vector *peakStackIds; // The peak memory usage stack ids hrtime_t timestamp; Vector *peakTimestamps; // The peak data int pid; // The process id int userExpId; // The experiment id int64_t aSmallestBytes; int64_t aLargestBytes; int32_t a0KB1KBCnt; int32_t a1KB8KBCnt; int32_t a8KB32KBCnt; int32_t a32KB128KBCnt; int32_t a128KB256KBCnt; int32_t a256KB512KBCnt; int32_t a512KB1000KBCnt; int32_t a1000KB10MBCnt; int32_t a10MB100MBCnt; int32_t a100MB1GBCnt; int32_t a1GB10GBCnt; int32_t a10GB100GBCnt; int32_t a100GB1TBCnt; int32_t a1TB10TBCnt; int64_t lSmallestBytes; int64_t lLargestBytes; int32_t l0KB1KBCnt; int32_t l1KB8KBCnt; int32_t l8KB32KBCnt; int32_t l32KB128KBCnt; int32_t l128KB256KBCnt; int32_t l256KB512KBCnt; int32_t l512KB1000KBCnt; int32_t l1000KB10MBCnt; int32_t l10MB100MBCnt; int32_t l100MB1GBCnt; int32_t l1GB10GBCnt; int32_t l10GB100GBCnt; int32_t l100GB1TBCnt; int32_t l1TB10TBCnt; }; #endif