1 /* Copyright (C) 2021 Free Software Foundation, Inc. 2 Contributed by Oracle. 3 4 This file is part of GNU Binutils. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 #ifndef _HEAPDATA_H 22 #define _HEAPDATA_H 23 24 #include "gp-defs.h" 25 #include "gp-time.h" 26 27 #include "vec.h" 28 #include "data_pckts.h" 29 #include "Histable.h" 30 31 #define TOTAL_HEAPNAME NTXT("<Total>") 32 #define TOTAL_STACK_ID 0 33 #define _1KB 1024 34 #define _8KB 8192 35 #define _32KB 32768 36 #define _128KB 131072 37 #define _256KB 262144 38 #define _512KB 524288 39 #define _1000KB 1048576 40 #define _10MB 10485760 41 #define _100MB 104857600 42 #define _1GB 1073741824 43 #define _10GB 10737418240 44 #define _100GB 107374182400 45 #define _1TB 1099511627776 46 #define _10TB 10995116277760 47 48 class HeapData : public Histable 49 { 50 friend class HeapActivity; 51 public: 52 HeapData (char *sName); 53 HeapData (HeapData *hData); 54 ~HeapData (); 55 char *get_raw_name (Histable::NameFormat nfmt); 56 void init (); 57 void setStackName (char* sName); 58 void setPeakMemUsage (int64_t pmu, uint64_t sId, hrtime_t ts, int procId, int uei); 59 60 virtual char *get_name (Histable::NameFormat nfmt); 61 virtual void set_name (char * _name); 62 virtual Histable *convertto (Histable_type, Histable* = NULL); 63 64 virtual Histable_type get_type()65 get_type () 66 { 67 return histType; 68 } 69 70 virtual uint64_t get_addr()71 get_addr () 72 { 73 return stackId; 74 } 75 76 uint64_t get_index()77 get_index () 78 { 79 return stackId; 80 } 81 82 char * getStackName()83 getStackName () 84 { 85 return stackName; 86 } 87 88 void addAllocEvent(uint64_t nb)89 addAllocEvent (uint64_t nb) 90 { 91 allocBytes += nb; 92 allocCnt++; 93 } 94 95 uint64_t getAllocBytes()96 getAllocBytes () 97 { 98 return allocBytes; 99 } 100 101 int32_t getAllocCnt()102 getAllocCnt () 103 { 104 return allocCnt; 105 } 106 107 void addLeakEvent(uint64_t nb)108 addLeakEvent (uint64_t nb) 109 { 110 leakBytes += nb; 111 leakCnt++; 112 } 113 114 uint64_t getLeakBytes()115 getLeakBytes () 116 { 117 return leakBytes; 118 } 119 120 int32_t getLeakCnt()121 getLeakCnt () 122 { 123 return leakCnt; 124 } 125 126 void setStackId(uint64_t sId)127 setStackId (uint64_t sId) 128 { 129 stackId = sId; 130 } 131 132 uint64_t getStackId()133 getStackId () 134 { 135 return stackId; 136 } 137 138 void setTimestamp(hrtime_t ts)139 setTimestamp (hrtime_t ts) 140 { 141 timestamp = ts; 142 } 143 144 hrtime_t getTimestamp()145 getTimestamp () 146 { 147 return timestamp; 148 } 149 150 void setHistType(Histable::Type hType)151 setHistType (Histable::Type hType) 152 { 153 histType = hType; 154 } 155 156 Histable::Type getHistType()157 getHistType () 158 { 159 return histType; 160 } 161 162 int64_t getPeakMemUsage()163 getPeakMemUsage () 164 { 165 return peakMemUsage; 166 } 167 168 Vector<uint64_t> * getPeakStackIds()169 getPeakStackIds () 170 { 171 return peakStackIds; 172 } 173 174 Vector<hrtime_t> * getPeakTimestamps()175 getPeakTimestamps () 176 { 177 return peakTimestamps; 178 } 179 180 void setPid(int procId)181 setPid (int procId) 182 { 183 pid = procId; 184 } 185 186 int getPid()187 getPid () 188 { 189 return pid; 190 } 191 192 void setUserExpId(int uei)193 setUserExpId (int uei) 194 { 195 userExpId = uei; 196 } 197 198 int getUserExpId()199 getUserExpId () 200 { 201 return userExpId; 202 } 203 204 void setAllocStat (int64_t nb); 205 206 int64_t getASmallestBytes()207 getASmallestBytes () 208 { 209 return aSmallestBytes; 210 } 211 212 int64_t getALargestBytes()213 getALargestBytes () 214 { 215 return aLargestBytes; 216 } 217 218 int32_t getA0KB1KBCnt()219 getA0KB1KBCnt () 220 { 221 return a0KB1KBCnt; 222 } 223 224 int32_t getA1KB8KBCnt()225 getA1KB8KBCnt () 226 { 227 return a1KB8KBCnt; 228 } 229 230 int32_t getA8KB32KBCnt()231 getA8KB32KBCnt () 232 { 233 return a8KB32KBCnt; 234 } 235 236 int32_t getA32KB128KBCnt()237 getA32KB128KBCnt () 238 { 239 return a32KB128KBCnt; 240 } 241 242 int32_t getA128KB256KBCnt()243 getA128KB256KBCnt () 244 { 245 return a128KB256KBCnt; 246 } 247 248 int32_t getA256KB512KBCnt()249 getA256KB512KBCnt () 250 { 251 return a256KB512KBCnt; 252 } 253 254 int32_t getA512KB1000KBCnt()255 getA512KB1000KBCnt () 256 { 257 return a512KB1000KBCnt; 258 } 259 260 int32_t getA1000KB10MBCnt()261 getA1000KB10MBCnt () 262 { 263 return a1000KB10MBCnt; 264 } 265 266 int32_t getA10MB100MBCnt()267 getA10MB100MBCnt () 268 { 269 return a10MB100MBCnt; 270 } 271 272 int32_t getA100MB1GBCnt()273 getA100MB1GBCnt () 274 { 275 return a100MB1GBCnt; 276 } 277 278 int32_t getA1GB10GBCnt()279 getA1GB10GBCnt () 280 { 281 return a1GB10GBCnt; 282 } 283 284 int32_t getA10GB100GBCnt()285 getA10GB100GBCnt () 286 { 287 return a10GB100GBCnt; 288 } 289 290 int32_t getA100GB1TBCnt()291 getA100GB1TBCnt () 292 { 293 return a100GB1TBCnt; 294 } 295 296 int32_t getA1TB10TBCnt()297 getA1TB10TBCnt () 298 { 299 return a1TB10TBCnt; 300 } 301 302 void setLeakStat (int64_t nb); 303 304 int64_t getLSmallestBytes()305 getLSmallestBytes () 306 { 307 return lSmallestBytes; 308 } 309 310 int64_t getLLargestBytes()311 getLLargestBytes () 312 { 313 return lLargestBytes; 314 } 315 316 int32_t getL0KB1KBCnt()317 getL0KB1KBCnt () 318 { 319 return l0KB1KBCnt; 320 } 321 322 int32_t getL1KB8KBCnt()323 getL1KB8KBCnt () 324 { 325 return l1KB8KBCnt; 326 } 327 328 int32_t getL8KB32KBCnt()329 getL8KB32KBCnt () 330 { 331 return l8KB32KBCnt; 332 } 333 334 int32_t getL32KB128KBCnt()335 getL32KB128KBCnt () 336 { 337 return l32KB128KBCnt; 338 } 339 340 int32_t getL128KB256KBCnt()341 getL128KB256KBCnt () 342 { 343 return l128KB256KBCnt; 344 } 345 346 int32_t getL256KB512KBCnt()347 getL256KB512KBCnt () 348 { 349 return l256KB512KBCnt; 350 } 351 352 int32_t getL512KB1000KBCnt()353 getL512KB1000KBCnt () 354 { 355 return l512KB1000KBCnt; 356 } 357 358 int32_t getL1000KB10MBCnt()359 getL1000KB10MBCnt () 360 { 361 return l1000KB10MBCnt; 362 } 363 364 int32_t getL10MB100MBCnt()365 getL10MB100MBCnt () 366 { 367 return l10MB100MBCnt; 368 } 369 370 int32_t getL100MB1GBCnt()371 getL100MB1GBCnt () 372 { 373 return l100MB1GBCnt; 374 } 375 376 int32_t getL1GB10GBCnt()377 getL1GB10GBCnt () 378 { 379 return l1GB10GBCnt; 380 } 381 382 int32_t getL10GB100GBCnt()383 getL10GB100GBCnt () 384 { 385 return l10GB100GBCnt; 386 } 387 388 int32_t getL100GB1TBCnt()389 getL100GB1TBCnt () 390 { 391 return l100GB1TBCnt; 392 } 393 394 int32_t getL1TB10TBCnt()395 getL1TB10TBCnt () 396 { 397 return l1TB10TBCnt; 398 } 399 400 private: 401 char *stackName; // stack name 402 uint64_t allocBytes; // The total bytes allocated 403 uint64_t leakBytes; // The total bytes leaked 404 int32_t allocCnt; // The alloc count 405 int32_t leakCnt; // The leak count 406 Histable::Type histType; // The Histable type: HEAPCALLSTACK 407 int64_t peakMemUsage; // Keep track of peak memory usage 408 uint64_t stackId; 409 Vector<uint64_t> *peakStackIds; // The peak memory usage stack ids 410 hrtime_t timestamp; 411 Vector<hrtime_t> *peakTimestamps; // The peak data 412 int pid; // The process id 413 int userExpId; // The experiment id 414 415 int64_t aSmallestBytes; 416 int64_t aLargestBytes; 417 int32_t a0KB1KBCnt; 418 int32_t a1KB8KBCnt; 419 int32_t a8KB32KBCnt; 420 int32_t a32KB128KBCnt; 421 int32_t a128KB256KBCnt; 422 int32_t a256KB512KBCnt; 423 int32_t a512KB1000KBCnt; 424 int32_t a1000KB10MBCnt; 425 int32_t a10MB100MBCnt; 426 int32_t a100MB1GBCnt; 427 int32_t a1GB10GBCnt; 428 int32_t a10GB100GBCnt; 429 int32_t a100GB1TBCnt; 430 int32_t a1TB10TBCnt; 431 432 int64_t lSmallestBytes; 433 int64_t lLargestBytes; 434 int32_t l0KB1KBCnt; 435 int32_t l1KB8KBCnt; 436 int32_t l8KB32KBCnt; 437 int32_t l32KB128KBCnt; 438 int32_t l128KB256KBCnt; 439 int32_t l256KB512KBCnt; 440 int32_t l512KB1000KBCnt; 441 int32_t l1000KB10MBCnt; 442 int32_t l10MB100MBCnt; 443 int32_t l100MB1GBCnt; 444 int32_t l1GB10GBCnt; 445 int32_t l10GB100GBCnt; 446 int32_t l100GB1TBCnt; 447 int32_t l1TB10TBCnt; 448 }; 449 450 #endif 451