/* 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. */ #include "config.h" #include #include #include "util.h" #include "HeapData.h" void HeapData::init () { allocBytes = 0; leakBytes = 0; allocCnt = 0; leakCnt = 0; stackId = 0; histType = Histable::HEAPCALLSTACK; peakMemUsage = 0; timestamp = 0; pid = 0; userExpId = 0; aSmallestBytes = _10TB; aLargestBytes = 0; a0KB1KBCnt = 0; a1KB8KBCnt = 0; a8KB32KBCnt = 0; a32KB128KBCnt = 0; a128KB256KBCnt = 0; a256KB512KBCnt = 0; a512KB1000KBCnt = 0; a1000KB10MBCnt = 0; a10MB100MBCnt = 0; a100MB1GBCnt = 0; a1GB10GBCnt = 0; a10GB100GBCnt = 0; a100GB1TBCnt = 0; a1TB10TBCnt = 0; lSmallestBytes = _10TB; lLargestBytes = 0; l0KB1KBCnt = 0; l1KB8KBCnt = 0; l8KB32KBCnt = 0; l32KB128KBCnt = 0; l128KB256KBCnt = 0; l256KB512KBCnt = 0; l512KB1000KBCnt = 0; l1000KB10MBCnt = 0; l10MB100MBCnt = 0; l100MB1GBCnt = 0; l1GB10GBCnt = 0; l10GB100GBCnt = 0; l100GB1TBCnt = 0; l1TB10TBCnt = 0; } HeapData::HeapData (char *sName) { stackName = dbe_strdup (sName); peakStackIds = new Vector; peakTimestamps = new Vector; init (); } HeapData::HeapData (HeapData *hData) { stackName = dbe_strdup (hData->stackName); stackId = hData->stackId; histType = hData->histType; allocBytes = hData->allocBytes; leakBytes = hData->leakBytes; allocCnt = hData->allocCnt; leakCnt = hData->leakCnt; peakMemUsage = hData->peakMemUsage; timestamp = hData->timestamp; pid = hData->getPid (); userExpId = hData->getUserExpId (); peakStackIds = new Vector; Vector *sIds = hData->peakStackIds; uint64_t sId; if (sIds != NULL) for (int i = 0; i < sIds->size (); i++) { sId = sIds->fetch (i); peakStackIds->append (sId); } peakTimestamps = new Vector; Vector *pts = hData->peakTimestamps; hrtime_t ts; if (pts != NULL) for (int i = 0; i < pts->size (); i++) { ts = pts->fetch (i); peakTimestamps->append (ts); } aSmallestBytes = hData->aSmallestBytes; aLargestBytes = hData->aLargestBytes; a0KB1KBCnt = hData->a0KB1KBCnt; a1KB8KBCnt = hData->a1KB8KBCnt; a8KB32KBCnt = hData->a8KB32KBCnt; a32KB128KBCnt = hData->a32KB128KBCnt; a128KB256KBCnt = hData->a128KB256KBCnt; a256KB512KBCnt = hData->a256KB512KBCnt; a512KB1000KBCnt = hData->a512KB1000KBCnt; a1000KB10MBCnt = hData->a1000KB10MBCnt; a10MB100MBCnt = hData->a10MB100MBCnt; a100MB1GBCnt = hData->a100MB1GBCnt; a1GB10GBCnt = hData->a1GB10GBCnt; a10GB100GBCnt = hData->a10GB100GBCnt; a100GB1TBCnt = hData->a100GB1TBCnt; a1TB10TBCnt = hData->a1TB10TBCnt; lSmallestBytes = hData->lSmallestBytes; lLargestBytes = hData->lLargestBytes; l0KB1KBCnt = hData->l0KB1KBCnt; l1KB8KBCnt = hData->l1KB8KBCnt; l8KB32KBCnt = hData->l8KB32KBCnt; l32KB128KBCnt = hData->l32KB128KBCnt; l128KB256KBCnt = hData->l128KB256KBCnt; l256KB512KBCnt = hData->l256KB512KBCnt; l512KB1000KBCnt = hData->l512KB1000KBCnt; l1000KB10MBCnt = hData->l1000KB10MBCnt; l10MB100MBCnt = hData->l10MB100MBCnt; l100MB1GBCnt = hData->l100MB1GBCnt; l1GB10GBCnt = hData->l1GB10GBCnt; l10GB100GBCnt = hData->l10GB100GBCnt; l100GB1TBCnt = hData->l100GB1TBCnt; l1TB10TBCnt = hData->l1TB10TBCnt; } HeapData::~HeapData () { free (stackName); delete peakStackIds; delete peakTimestamps; } Histable* HeapData::convertto (Histable_type type, Histable*) { return type == histType ? this : NULL; } char* HeapData::get_name (Histable::NameFormat /*_nfmt*/) { return stackName; } char* HeapData::get_raw_name (Histable::NameFormat /*_nfmt*/) { return stackName; } void HeapData::set_name (char* _name) { free (stackName); stackName = dbe_strdup (_name); } void HeapData::setPeakMemUsage (int64_t pmu, uint64_t sId, hrtime_t ts, int procId, int uei) { if (peakMemUsage < pmu) { peakMemUsage = pmu; peakStackIds->reset (); peakStackIds->append (sId); peakTimestamps->reset (); peakTimestamps->append (ts); pid = procId; userExpId = uei; } else if (peakMemUsage == pmu) { for (int i = 0; i < peakStackIds->size (); i++) { uint64_t curSId = peakStackIds->fetch (i); if (curSId == sId) return; } peakStackIds->append (sId); peakTimestamps->append (ts); pid = procId; userExpId = uei; } } void HeapData::setAllocStat (int64_t nb) { if (aSmallestBytes > nb) aSmallestBytes = nb; if (aLargestBytes < nb) aLargestBytes = nb; if (nb >= 0 && nb <= _1KB) a0KB1KBCnt++; else if (nb <= _8KB) a1KB8KBCnt++; else if (nb <= _32KB) a8KB32KBCnt++; else if (nb <= _128KB) a32KB128KBCnt++; else if (nb <= _256KB) a128KB256KBCnt++; else if (nb <= _512KB) a256KB512KBCnt++; else if (nb <= _1000KB) a512KB1000KBCnt++; else if (nb <= _10MB) a1000KB10MBCnt++; else if (nb <= _100MB) a10MB100MBCnt++; else if (nb <= _1GB) a100MB1GBCnt++; else if (nb <= _10GB) a1GB10GBCnt++; else if (nb <= _100GB) a10GB100GBCnt++; else if (nb <= _1TB) a100GB1TBCnt++; else if (nb <= _10TB) a1TB10TBCnt++; } void HeapData::setLeakStat (int64_t nb) { if (lSmallestBytes > nb) lSmallestBytes = nb; if (lLargestBytes < nb) lLargestBytes = nb; if (nb >= 0 && nb <= _1KB) l0KB1KBCnt++; else if (nb <= _8KB) l1KB8KBCnt++; else if (nb <= _32KB) l8KB32KBCnt++; else if (nb <= _128KB) l32KB128KBCnt++; else if (nb <= _256KB) l128KB256KBCnt++; else if (nb <= _512KB) l256KB512KBCnt++; else if (nb <= _1000KB) l512KB1000KBCnt++; else if (nb <= _10MB) l1000KB10MBCnt++; else if (nb <= _100MB) l10MB100MBCnt++; else if (nb <= _1GB) l100MB1GBCnt++; else if (nb <= _10GB) l1GB10GBCnt++; else if (nb <= _100GB) l10GB100GBCnt++; else if (nb <= _1TB) l100GB1TBCnt++; else if (nb <= _10TB) l1TB10TBCnt++; }