Back to home page

sPhenix code displayed by LXR

 
 

    


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 }