File indexing completed on 2025-08-05 08:16:10
0001 #include "Fun4AllMemoryTracker.h"
0002
0003 #include <TSystem.h>
0004
0005 #include <iostream>
0006 #include <utility> // for pair, make_pair
0007
0008 Fun4AllMemoryTracker *Fun4AllMemoryTracker::mInstance = nullptr;
0009
0010 Fun4AllMemoryTracker::Fun4AllMemoryTracker()
0011 : Fun4AllBase("Fun4AllMemoryTracker")
0012 {
0013 }
0014
0015 int Fun4AllMemoryTracker::GetRSSMemory()
0016 {
0017 ProcInfo_t procinfo;
0018 gSystem->GetProcInfo(&procinfo);
0019 return procinfo.fMemResident;
0020 }
0021
0022 Fun4AllMemoryTracker::~Fun4AllMemoryTracker()
0023 {
0024 mMemoryTrackerMap.clear();
0025 mStartMem.clear();
0026 }
0027
0028 void Fun4AllMemoryTracker::Snapshot(const std::string &trackername, const std::string &group)
0029 {
0030 std::string name = CreateFullTrackerName(trackername, group);
0031 auto iter = mMemoryTrackerMap.find(name);
0032 if (iter != mMemoryTrackerMap.end())
0033 {
0034 iter->second.push_back(GetRSSMemory());
0035 }
0036 else
0037 {
0038 std::vector<int> mvec;
0039 mvec.push_back(GetRSSMemory());
0040 mMemoryTrackerMap.insert(make_pair(name, mvec));
0041 }
0042 if (Verbosity() > 0)
0043 {
0044 std::cout << "Snapshot name: " << name << ", mem: " << GetRSSMemory() << std::endl;
0045 }
0046 return;
0047 }
0048
0049 void Fun4AllMemoryTracker::Start(const std::string &trackername, const std::string &group)
0050 {
0051 std::string name = CreateFullTrackerName(trackername, group);
0052 auto iter = mStartMem.find(name);
0053 int RSSMemory = GetRSSMemory();
0054 if (iter != mStartMem.end())
0055 {
0056 iter->second = RSSMemory;
0057 }
0058 else
0059 {
0060 mStartMem.insert(make_pair(name, RSSMemory));
0061 }
0062 if (Verbosity() > 0)
0063 {
0064 std::cout << "Start name: " << name << ", mem: " << RSSMemory << std::endl;
0065 }
0066 }
0067
0068 void Fun4AllMemoryTracker::Stop(const std::string &trackername, const std::string &group)
0069 {
0070 std::string name = CreateFullTrackerName(trackername, group);
0071 auto iter = mStartMem.find(name);
0072 int RSSMemory = GetRSSMemory();
0073 if (iter != mStartMem.end())
0074 {
0075 int diff = RSSMemory - iter->second;
0076 auto iterM = mMemoryTrackerMap.find(name);
0077 if (iterM != mMemoryTrackerMap.end())
0078 {
0079 iterM->second.push_back(diff);
0080 }
0081 else
0082 {
0083 std::vector<int> mvec;
0084 mvec.push_back(diff);
0085 mMemoryTrackerMap.insert(make_pair(name, mvec));
0086 }
0087 if (Verbosity() > 0)
0088 {
0089 std::cout << "Stop name: " << name << ", mem: " << RSSMemory << ", diff: " << diff << std::endl;
0090 }
0091 }
0092 return;
0093 }
0094
0095 std::string Fun4AllMemoryTracker::CreateFullTrackerName(const std::string &trackername, const std::string &group)
0096 {
0097 std::string name = trackername;
0098 if (!group.empty())
0099 {
0100 name = group + "_" + name;
0101 }
0102 return name;
0103 }
0104
0105 void Fun4AllMemoryTracker::PrintMemoryTracker(const std::string &name) const
0106 {
0107 std::map<std::string, std::vector<int>>::const_iterator iter;
0108 if (name.empty())
0109 {
0110 for (iter = mMemoryTrackerMap.begin(); iter != mMemoryTrackerMap.end(); ++iter)
0111 {
0112 std::cout << iter->first << ": ";
0113 std::vector<int> memvec = iter->second;
0114 for (int &vit : memvec)
0115 {
0116 std::cout << vit << " ";
0117 }
0118 std::cout << std::endl;
0119 }
0120 }
0121 else
0122 {
0123 iter = mMemoryTrackerMap.find(name);
0124 if (iter != mMemoryTrackerMap.end())
0125 {
0126 std::cout << "SubsysReco/OutputManager: " << iter->first << std::endl;
0127 std::vector<int> memvec = iter->second;
0128 for (int &vit : memvec)
0129 {
0130 std::cout << vit << " ";
0131 }
0132 std::cout << std::endl;
0133 }
0134 else
0135 {
0136 std::cout << "No Memory Tracker with name " << name << " found" << std::endl;
0137 std::cout << "Existing Memory Trackers:" << std::endl;
0138 for (iter = mMemoryTrackerMap.begin(); iter != mMemoryTrackerMap.end(); ++iter)
0139 {
0140 std::cout << iter->first << std::endl;
0141 }
0142 }
0143 }
0144 return;
0145 }
0146
0147 std::vector<int> Fun4AllMemoryTracker::GetMemoryVector(const std::string &name) const
0148 {
0149 std::vector<int> memvec;
0150 auto iter = mMemoryTrackerMap.find(name);
0151 if (iter != mMemoryTrackerMap.end())
0152 {
0153 memvec = iter->second;
0154 }
0155 return memvec;
0156 }