source: XIOS/dev/dev_ym/XIOS_COUPLING/src/mem_checker.cpp @ 2235

Last change on this file since 2235 was 2235, checked in by ymipsl, 3 years ago

small fix in memory report.
YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 2.7 KB
Line 
1#include "mem_checker.hpp"
2#include "mpi.hpp"
3#include <string>
4#include <map>
5#include <iostream>
6#include <sstream>
7#include <fstream>
8
9namespace xios
10{
11  CMemChecker CMemChecker::dummy_("") ;
12  std::map<std::string,CMemChecker> CMemChecker::allMemChecker_;
13  bool CMemChecker::enabled_=true;
14  bool CMemChecker::first_=true;
15
16  CMemChecker::CMemChecker(const std::string& name) : name_(name) 
17  { 
18    if (first_) check() ;
19    reset();
20  }
21
22  void CMemChecker::check(void)
23  {
24    std::ifstream statStream("/proc/self/stat",std::ios_base::in);
25    enabled_ &= statStream.good() ;
26    first_=false ;
27  }
28  double CMemChecker::getMem(void)
29  {
30    if (first_) check() ;
31    if (!enabled_) return 0;
32    std::ifstream statStream("/proc/self/stat",std::ios_base::in);
33    std::string dummy ;
34    for(int i=1;i<=22;i++) statStream>>dummy ;
35    unsigned long vsize; 
36    statStream>>vsize ;
37    return vsize ;
38  }
39 
40  void CMemChecker::suspend(void)
41  {
42    if (first_) check() ;
43    if (!enabled_) return ;
44    if (!suspended_) cumulatedMem_ += getMem() - lastMem_;
45    suspended_ = true;
46  }
47 
48  void CMemChecker::resume(void)
49  {
50    if (first_) check() ;
51    if (!enabled_) return ;
52    if (suspended_) lastMem_ = getMem();
53    suspended_ = false;
54  }
55 
56  void CMemChecker::reset(void)
57  {
58    if (first_) check() ;
59    if (!enabled_) return ;
60    cumulatedMem_ = 0.;
61    suspended_ = true;
62  }
63 
64  double CMemChecker::getCumulatedMem(void)
65  {
66    if (first_) check() ;
67    if (!enabled_) return 0;
68    return cumulatedMem_;
69  }
70 
71  CMemChecker& CMemChecker::get(const std::string name)
72  {
73    if (first_) check() ;
74    if (!enabled_) return dummy_ ;
75    else
76    {
77      std::map<std::string,CMemChecker>::iterator it = allMemChecker_.find(name);
78      if (it == allMemChecker_.end())
79        it = allMemChecker_.insert(std::make_pair(name, CMemChecker(name))).first;
80      return it->second;
81    }
82  }
83
84  std::string CMemChecker::getAllCumulatedMem(void)
85  {
86    if (first_) check() ;
87    if (!enabled_) return std::string(" MemChecker : memory consumption report not available") ; 
88    std::ostringstream strOut ;
89    const double Kb=1024 ;
90    const double Mb=Kb*1024 ;
91    const double Gb=Mb*1024 ;
92    const double Tb=Gb*1024 ;
93    for(std::map<std::string,CMemChecker>::iterator it=allMemChecker_.begin();it!=allMemChecker_.end();++it)
94    { 
95      strOut<<"MemChecker : "<<it->first<<"    -->   consumed memory : " ;
96      double mem=it->second.getCumulatedMem() ;
97      if (mem>=Tb) strOut<< mem / Tb<<" Tb"<<std::endl ;
98      else if (mem>=Gb) strOut<< mem / Gb<<" Gb"<<std::endl ;
99      else if (mem>=Mb) strOut<< mem / Mb<<" Mb"<<std::endl ;
100      else if (mem>=Kb) strOut<< mem / Kb<<" Kb"<<std::endl ;
101      else strOut<< mem <<" bytes"<<std::endl ;
102    }
103    return strOut.str() ;
104  }
105}
Note: See TracBrowser for help on using the repository browser.