ROOT logo
// @(#)root/memstat:$Name$:$Id: TMemStatManager.h 30815 2009-10-20 13:49:22Z rdm $
// Author: D.Bertini and M.Ivanov   18/06/2007 -- Anar Manafov (A.Manafov@gsi.de) 28/04/2008

/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TMemStatManager
#define ROOT_TMemStatManager

//****************************************************************************//
//
//  TMemStatManager
//  Memory statistic manager class
//
//****************************************************************************//
// STD
#include <map>
#include <vector>
#include <memory>
#include <cstdlib>
// ROOT
#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TTimeStamp
#include "TTimeStamp.h"
#endif
// Memstat
#ifndef ROOT_TMemStatDepend
#include "TMemStatDepend.h"
#endif
#ifndef ROOT_TmemStatInfo
#include "TMemStatInfo.h"
#endif


class TTree;
class TMemStatStackInfo;

typedef std::vector<Int_t> IntVector_t;
typedef std::auto_ptr<TFile> TFilePtr_t;

class TMemStatManager: public TObject
{
   struct TMemInfo_t {
      void   *fAddress;    //mem address
      size_t  fSize;       //size of the allocated memory
      Int_t   fStackIndex; //index of the stack info
   };

   struct TMemTable_t {
      Int_t     fAllocCount;    //number of memory allocation blocks
      Int_t     fMemSize;       //total memory allocated size
      Int_t     fTableSize;     //amount of entries in the below array
      Int_t     fFirstFreeSpot; //where is the first free spot in the leaks array?
      TMemInfo_t *fLeaks;         //leak table
   };

   struct TDeleteTable_t {
      Int_t     fAllocCount;    //how many memory blocks do we have
      Int_t     fTableSize;     //amount of entries in the below array
      TMemInfo_t *fLeaks;         //leak table
   };

public:
   typedef std::vector<TMemStatCodeInfo> CodeInfoContainer_t;

   enum EStatusBits {
      kUserDisable = BIT(18),       // user disable-enable switch  switch
      kStatDisable = BIT(16),       // true if disable statistic
      kStatRoutine = BIT(17)        // indicator inside of stat routine  (AddPointer or FreePointer)
   };
   enum EDumpTo { kTree, kSysTree };

   TMemStatManager();
   virtual ~TMemStatManager();

   void Enable();                              //enable memory statistic
   void Disable();                             //Disable memory statistic
   void SetAutoStamp(UInt_t sizeMem, UInt_t n, UInt_t max) {
      fAutoStampSize = sizeMem;
      fAutoStampN = n;
      fAutoStampDumpSize = max;
   }
   void AddStamps(const char * stampname = 0);           //add  stamps to the list of stamps for changed stacks
   static void SAddStamps(const Char_t * stampname);             // static version add  stamps to the list of stamps for changed stacks

   static TMemStatManager* GetInstance();       //get instance of class - ONLY ONE INSTANCE
   static void Close();                         //close MemStatManager
   TMemStatInfoStamp &AddStamp();                   //add one stamp to the list of stamps
   TMemStatCodeInfo &GetCodeInfo(void *address);
   UInt_t GetCodeInfoIndex(void *address) {
      return fCodeInfoMap[address];
   }
   void DumpTo(EDumpTo _DumpTo, Bool_t _clearStamps = kTRUE, const char * _stampName = 0);  //write current status to file

public:
   typedef void (*StampCallback_t)(const Char_t * desription);
   //stack data members
   IntVector_t fSTHashTable; //!pointer to the hash table
   Int_t fCount;        //!number of entries in table
   Int_t fStampNumber;  //current stamp number
   std::vector<TMemStatStackInfo> fStackVector;            // vector with stack symbols
   std::vector<TMemStatInfoStamp> fStampVector;            // vector of stamp information
   std::vector<TTimeStamp> fStampTime;              // vector of stamp information
   CodeInfoContainer_t  fCodeInfoArray;          // vector with code info
   std::map<const void*, UInt_t> fCodeInfoMap;      //! map of code information
   Int_t fDebugLevel;                               //!debug level
   TMemStatManager::StampCallback_t fStampCallBack; //!call back function
   void SetUseGNUBuildinBacktrace(Bool_t _NewVal) {
      fUseGNUBuildinBacktrace = _NewVal;
   }

protected:
   TMemStatDepend::MallocHookFunc_t fPreviousMallocHook;    //!old malloc function
   TMemStatDepend::FreeHookFunc_t fPreviousFreeHook;        //!old free function
   void Init();
   TMemStatStackInfo *STAddInfo(Int_t size, void **stackptrs);
   TMemStatStackInfo *STFindInfo(Int_t size, void **stackptrs);
   void RehashLeak(Int_t newSize);                  //rehash leak pointers
   void *AddPointer(size_t size, void *ptr = 0);    //add pointer to the table
   void FreePointer(void *p);                       //free pointer
   static void *AllocHook(size_t size, const void* /*caller*/);
   static void FreeHook(void* ptr, const void* /*caller*/);
   TMemStatInfoStamp fLastStamp;           //last written stamp
   TMemStatInfoStamp fCurrentStamp;        //current stamp
   UInt_t fAutoStampSize;           //change of size invoking STAMP
   UInt_t fAutoStampN;              //change of number of allocation  STAMP
   UInt_t fAutoStampDumpSize;       //
   Int_t fMinStampSize;             // the minimal size to be dumped to tree
   //  memory information
   Int_t fSize;                     //!size of hash table
   TMemTable_t **fLeak;               //!pointer to the hash table
   Int_t fAllocCount;               //!number of memory allocation blocks
   TDeleteTable_t fMultDeleteTable;   //!pointer to the table
   TFilePtr_t fDumpFile;              //!file to dump current information
   TTree *fDumpTree;                //!tree to dump information
   TTree *fDumpSysTree;             //!tree to dump information
   static TMemStatManager *fgInstance; // pointer to instance
   static void *fgStackTop;             // stack top pointer

   void FreeHashtable() {
      if (!fLeak)
         return;

      for (Int_t i = 0; i < fSize; ++i)
         free(fLeak[i]);
      free(fLeak);
   }

   Bool_t fUseGNUBuildinBacktrace;

   ClassDef(TMemStatManager, 1) // a manager of memstat sessions.
};

#endif
 TMemStatManager.h:1
 TMemStatManager.h:2
 TMemStatManager.h:3
 TMemStatManager.h:4
 TMemStatManager.h:5
 TMemStatManager.h:6
 TMemStatManager.h:7
 TMemStatManager.h:8
 TMemStatManager.h:9
 TMemStatManager.h:10
 TMemStatManager.h:11
 TMemStatManager.h:12
 TMemStatManager.h:13
 TMemStatManager.h:14
 TMemStatManager.h:15
 TMemStatManager.h:16
 TMemStatManager.h:17
 TMemStatManager.h:18
 TMemStatManager.h:19
 TMemStatManager.h:20
 TMemStatManager.h:21
 TMemStatManager.h:22
 TMemStatManager.h:23
 TMemStatManager.h:24
 TMemStatManager.h:25
 TMemStatManager.h:26
 TMemStatManager.h:27
 TMemStatManager.h:28
 TMemStatManager.h:29
 TMemStatManager.h:30
 TMemStatManager.h:31
 TMemStatManager.h:32
 TMemStatManager.h:33
 TMemStatManager.h:34
 TMemStatManager.h:35
 TMemStatManager.h:36
 TMemStatManager.h:37
 TMemStatManager.h:38
 TMemStatManager.h:39
 TMemStatManager.h:40
 TMemStatManager.h:41
 TMemStatManager.h:42
 TMemStatManager.h:43
 TMemStatManager.h:44
 TMemStatManager.h:45
 TMemStatManager.h:46
 TMemStatManager.h:47
 TMemStatManager.h:48
 TMemStatManager.h:49
 TMemStatManager.h:50
 TMemStatManager.h:51
 TMemStatManager.h:52
 TMemStatManager.h:53
 TMemStatManager.h:54
 TMemStatManager.h:55
 TMemStatManager.h:56
 TMemStatManager.h:57
 TMemStatManager.h:58
 TMemStatManager.h:59
 TMemStatManager.h:60
 TMemStatManager.h:61
 TMemStatManager.h:62
 TMemStatManager.h:63
 TMemStatManager.h:64
 TMemStatManager.h:65
 TMemStatManager.h:66
 TMemStatManager.h:67
 TMemStatManager.h:68
 TMemStatManager.h:69
 TMemStatManager.h:70
 TMemStatManager.h:71
 TMemStatManager.h:72
 TMemStatManager.h:73
 TMemStatManager.h:74
 TMemStatManager.h:75
 TMemStatManager.h:76
 TMemStatManager.h:77
 TMemStatManager.h:78
 TMemStatManager.h:79
 TMemStatManager.h:80
 TMemStatManager.h:81
 TMemStatManager.h:82
 TMemStatManager.h:83
 TMemStatManager.h:84
 TMemStatManager.h:85
 TMemStatManager.h:86
 TMemStatManager.h:87
 TMemStatManager.h:88
 TMemStatManager.h:89
 TMemStatManager.h:90
 TMemStatManager.h:91
 TMemStatManager.h:92
 TMemStatManager.h:93
 TMemStatManager.h:94
 TMemStatManager.h:95
 TMemStatManager.h:96
 TMemStatManager.h:97
 TMemStatManager.h:98
 TMemStatManager.h:99
 TMemStatManager.h:100
 TMemStatManager.h:101
 TMemStatManager.h:102
 TMemStatManager.h:103
 TMemStatManager.h:104
 TMemStatManager.h:105
 TMemStatManager.h:106
 TMemStatManager.h:107
 TMemStatManager.h:108
 TMemStatManager.h:109
 TMemStatManager.h:110
 TMemStatManager.h:111
 TMemStatManager.h:112
 TMemStatManager.h:113
 TMemStatManager.h:114
 TMemStatManager.h:115
 TMemStatManager.h:116
 TMemStatManager.h:117
 TMemStatManager.h:118
 TMemStatManager.h:119
 TMemStatManager.h:120
 TMemStatManager.h:121
 TMemStatManager.h:122
 TMemStatManager.h:123
 TMemStatManager.h:124
 TMemStatManager.h:125
 TMemStatManager.h:126
 TMemStatManager.h:127
 TMemStatManager.h:128
 TMemStatManager.h:129
 TMemStatManager.h:130
 TMemStatManager.h:131
 TMemStatManager.h:132
 TMemStatManager.h:133
 TMemStatManager.h:134
 TMemStatManager.h:135
 TMemStatManager.h:136
 TMemStatManager.h:137
 TMemStatManager.h:138
 TMemStatManager.h:139
 TMemStatManager.h:140
 TMemStatManager.h:141
 TMemStatManager.h:142
 TMemStatManager.h:143
 TMemStatManager.h:144
 TMemStatManager.h:145
 TMemStatManager.h:146
 TMemStatManager.h:147
 TMemStatManager.h:148
 TMemStatManager.h:149
 TMemStatManager.h:150
 TMemStatManager.h:151
 TMemStatManager.h:152
 TMemStatManager.h:153
 TMemStatManager.h:154
 TMemStatManager.h:155
 TMemStatManager.h:156
 TMemStatManager.h:157
 TMemStatManager.h:158
 TMemStatManager.h:159
 TMemStatManager.h:160
 TMemStatManager.h:161