ROOT logo
// @(#)root/new:$Name$:$Id: TMemStatManager.cxx 24658 2008-07-04 09:06:58Z anar $
// Author: D.Bertini and M.Ivanov   10/08/2000  -- 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.             *
 *************************************************************************/

//****************************************************************************//
/*
 TMemStatManager - manager class

 The current memory statistic is written to the file

 Important information  used for visualization
 std::vector<TMemStatStackInfo>       fStackVector;    // vector with stack symbols
 std::vector<TMemStatInfoStamp>       fStampVector;    // vector of stamp information
 std::vector<TTimeStamp>       fStampTime;      // vector of stamp information
 std::vector<TMemStatCodeInfo>        fCodeInfoArray;  // vector with code info
*/
//****************************************************************************//

// STD
#include <cstdio>
#include <string>

#include <malloc.h>
// ROOT
#include "TSystem.h"
#include "TEnv.h"
#include "TError.h"
#include "Riostream.h"
#include "TObject.h"
#include "TFile.h"
#include "TTree.h"
#include "TObjString.h"
// Memstat
#include "TMemStatDepend.h"
#include "TMemStatInfo.h"
#include "TMemStatManager.h"

const char * const g_cszFileName("memstat.root");
const Int_t g_STHashSize(65536);   //!current size of the hash table

ClassImp(TMemStatManager)

TMemStatManager * TMemStatManager::fgInstance = NULL;


//****************************************************************************//
//                                   Global Stack Table
//****************************************************************************//

TMemStatManager::TMemStatManager():
      TObject(),
      fSTHashTable(g_STHashSize, -1),           //!pointer to the hash table
      fCount(0),                 //!number of entries in table
      fStampNumber(0),           //current stamp number
      fStackVector(),            // vector with stack symbols
      fStampVector(),            // vector of stamp information
      fStampTime(),              // vector of stamp information
      fCodeInfoArray()        ,  // vector with code info
      fCodeInfoMap(),            //! map of code information
      fDebugLevel(0),            //!debug level
      fStampCallBack(0),         //! call back function to register stamp
      fPreviousMallocHook(TMemStatDepend::GetMallocHook()),    //!
      fPreviousFreeHook(TMemStatDepend::GetFreeHook()),      //!
      fLastStamp(),              //last written stamp
      fCurrentStamp(),           //current stamp
      fAutoStampSize(2000000),   //change of size invoking STAMP
      fAutoStampN(200000),       //change of number of allocation  STAMP
      fAutoStampDumpSize(50000), //change of number of allocation  STAMP
      fMinStampSize(100),        //minimal cut what will be dumped  to the tree
      fSize(65536),              //!size of hash table
      fLeak(NULL),               //!pointer to the hash table
      fAllocCount(0),            //!number of memory allocation blocks
      fMultDeleteTable(),        //!pointer to the table
      fDumpTree(0),              //!tree to dump information
      fDumpSysTree(0),           //!tree to dump information
      fUseGNUBuildinBacktrace(kFALSE)
{
   // Default constructor

   SetBit(kUserDisable, kTRUE);
   fStampCallBack = TMemStatManager::SAddStamps;         //! call back function

}

//______________________________________________________________________________
void TMemStatManager::Init()
{
   //Initialize MemStat manager - used only for instance

   SetBit(kUserDisable, kTRUE);

   fStampNumber = 0;
   fAllocCount = 0;
   FreeHashtable();
   fLeak = (TMemTable_t **) malloc(sizeof(void *) * fSize);
   fMultDeleteTable.fLeaks = 0;
   fMultDeleteTable.fAllocCount = 0;
   fMultDeleteTable.fTableSize = 0;
   fStackVector.reserve(fSize);             // vector with stack symbols
   fStampVector.reserve(fSize*10);          // vector of stamp information
   fCodeInfoArray.reserve(fSize);           // vector with code info
   fStampTime.reserve(fSize);
   fStampTime[0] = TTimeStamp();
   for (int i = 0; i < fSize; ++i) {
      fLeak[i] = (TMemTable_t *) malloc(sizeof(TMemTable_t));
      fLeak[i]->fAllocCount = 0;
      fLeak[i]->fMemSize = 0;
      fLeak[i]->fFirstFreeSpot = 0;
      fLeak[i]->fTableSize = 0;
      fLeak[i]->fLeaks = 0;
   }
   //Initialize ST table.
   fCount = 0;

   SetBit(kUserDisable, kTRUE);
}

//______________________________________________________________________________
TMemStatManager* TMemStatManager::GetInstance()
{
   // GetInstance of MemStatManager
   // Only instance catch the alloc and free hook

   if (!fgInstance) {
      fgInstance = new TMemStatManager;
      fgInstance->Init();
   }
   return fgInstance;
}

//______________________________________________________________________________
void TMemStatManager::Close()
{
   // to be documented

   delete fgInstance;
   fgInstance = NULL;
}

//______________________________________________________________________________
TMemStatManager::~TMemStatManager()
{
   //   Destructor
   //   if instance is destructed - the hooks are reseted to old hooks

   if (this != TMemStatManager::GetInstance())
      return;
   SetBit(kStatDisable);
   Disable();
   AddStamps("End");
   DumpTo(kTree, kTRUE, "End");
   DumpTo(kSysTree, kTRUE, "End");
   Disable();

   FreeHashtable();
}

//______________________________________________________________________________
void TMemStatManager::Enable()
{
   // Enable hooks

   if (this != GetInstance())
      return;

   // set hook to our functions
   TMemStatDepend::SetMallocHook(AllocHook);
   TMemStatDepend::SetFreeHook(FreeHook);
   SetBit(kUserDisable, kFALSE);
}

//______________________________________________________________________________
void TMemStatManager::Disable()
{
   // disble MemStatManager

   if (this != GetInstance())
      return;

   // set hook to our functions
   TMemStatDepend::SetMallocHook(fPreviousMallocHook);
   TMemStatDepend::SetFreeHook(fPreviousFreeHook);
   SetBit(kUserDisable, kTRUE);
}

//______________________________________________________________________________
void *TMemStatManager::AllocHook(size_t size, const void* /*caller*/)
{
   // AllocHook

   TMemStatManager* instance = TMemStatManager::GetInstance();
   TMemStatDepend::SetMallocHook(instance->fPreviousMallocHook);
   void *p = instance->AddPointer(size);
   TMemStatDepend::SetMallocHook(AllocHook);
   return p;
}

//______________________________________________________________________________
void TMemStatManager::FreeHook(void* ptr, const void* /*caller*/)
{
   // FreeHook

   TMemStatManager* instance = TMemStatManager::GetInstance();
   TMemStatDepend::SetFreeHook(instance->fPreviousFreeHook);
   instance->FreePointer(ptr);
   TMemStatDepend::SetFreeHook(FreeHook);
}

//______________________________________________________________________________
TMemStatStackInfo *TMemStatManager::STAddInfo(int size, void **stackptrs)
{
   // Add stack information to table.
   // add next stack to table

   const UInt_t currentSize = fStackVector.size();
   if (currentSize >= fStackVector.capacity())
      fStackVector.reserve(2*currentSize + 1);

   fStackVector.push_back(TMemStatStackInfo());
   TMemStatStackInfo *info = &(fStackVector[currentSize]);
   info->Init(size, stackptrs, this, currentSize);
   info->fStackID = currentSize;

   //add info to hash table
   const int hash = int(info->Hash() % g_STHashSize);
   Int_t hashIndex = fSTHashTable[hash];
   TMemStatStackInfo *info2 = NULL;

   if (-1 == hashIndex) {
      fSTHashTable[hash] = info->fStackID;
   } else {
      info2 = &fStackVector[hashIndex];
      while (hashIndex >= 0) {
         hashIndex = info2->fNextHash;
         if (hashIndex >= 0)
            info2 = &fStackVector[hashIndex];
      }
      info2->fNextHash = info->fStackID;
   }

   ++fCount;
   fStackVector.push_back(*info);
   return info;
}

//______________________________________________________________________________
TMemStatStackInfo *TMemStatManager::STFindInfo(int size, void **stackptrs)
{
   // Try to find stack info in hash table if doesn't find it will add it.

   const int hash = int(TMemStatStackInfo::HashStack(size, (void **)stackptrs) % g_STHashSize);

   if (fSTHashTable[hash] < 0)
      return STAddInfo(size, stackptrs); // hash value not in hash table

   Int_t hashIndex = fSTHashTable[hash];
   TMemStatStackInfo *info = NULL;

   info = &fStackVector[hashIndex];
   while (hashIndex >= 0) {
      if (info->Equal(size, stackptrs) == 1)
         return info;   // info found
      hashIndex = info->fNextHash;
      if (hashIndex >= 0)
         info = &fStackVector[hashIndex];
   }
   return STAddInfo(size, stackptrs);  // not found info - create new
}

//______________________________________________________________________________
void TMemStatManager::SAddStamps(const char * stampname)
{
   //
   // static version add  stamps to the list of stamps for changed stacks
   //
   TMemStatManager *man = GetInstance();
   man->AddStamps(stampname);
}

//______________________________________________________________________________
void  TMemStatManager::AddStamps(const char * stampname)
{
   // add the stamp to the list of stamps

   const UInt_t ssize = fStackVector.size();
   for (UInt_t i = 0; i < ssize; ++i) {
      if (fStackVector[i].fCurrentStamp.fAllocSize > fMinStampSize)
         fStackVector[i].MakeStamp(fStampNumber);
   }
   const UInt_t csize = fCodeInfoArray.size();
   for (UInt_t i = 0; i < csize; ++i) {
      if (fCodeInfoArray[i].fCurrentStamp.fAllocSize > fMinStampSize)
         fCodeInfoArray[i].MakeStamp(fStampNumber);
   }

   fCurrentStamp.fID = -1;
   fCurrentStamp.fStampNumber = fStampNumber;
   AddStamp() = fCurrentStamp;

   fStampTime[fStampNumber] = TTimeStamp();
   if (fStampVector.size() >= fAutoStampDumpSize || stampname) {
      DumpTo(kTree, kTRUE, stampname);
      DumpTo(kSysTree, kTRUE, stampname);
   }
   ++fStampNumber;
}

//______________________________________________________________________________
TMemStatInfoStamp &TMemStatManager::AddStamp()
{
   // add one stamp to the list of stamps

   const UInt_t size = fStampVector.size();
   fStampVector.push_back(TMemStatInfoStamp());
   TMemStatInfoStamp &stamp =  fStampVector[size];
   stamp.fStampNumber = fStampNumber;
   return stamp;
}

//______________________________________________________________________________
TMemStatCodeInfo &TMemStatManager::GetCodeInfo(void *address)
{
   //  to be documented

   TMemStatCodeInfo *info(NULL);
   const UInt_t index = fCodeInfoMap[address];
   if (index > 0) {
      info = &(fCodeInfoArray[fCodeInfoMap[address]]);
   } else {
      const UInt_t size = fCodeInfoArray.size();
      fCodeInfoArray.push_back(TMemStatCodeInfo());
      info = &(fCodeInfoArray[size]);
      fCodeInfoMap[address] = size;
      info->fCodeID = size;
      info->fCurrentStamp.fID = info->fCodeID;
      info->fLastStamp.fID = info->fCodeID;
   }
   return *info;
}

//______________________________________________________________________________
void TMemStatManager::RehashLeak(int newSize)
{
   // Rehash leak pointers.

   if (newSize <= fSize)
      return;
   TMemTable_t **newLeak = (TMemTable_t **) malloc(sizeof(void *) * newSize);
   for (int i = 0; i < newSize; ++i) {
      //build new branches
      newLeak[i] = (TMemTable_t *) malloc(sizeof(TMemTable_t));
      newLeak[i]->fAllocCount = 0;
      newLeak[i]->fMemSize = 0;
      newLeak[i]->fFirstFreeSpot = 0;
      newLeak[i]->fTableSize = 0;
      newLeak[i]->fLeaks = 0;
   }
   for (int ib = 0; ib < fSize; ++ib) {
      TMemTable_t *branch = fLeak[ib];
      for (int i = 0; i < branch->fTableSize; i++)
         if (branch->fLeaks[i].fAddress != 0) {
            int hash = int(TString::Hash(&branch->fLeaks[i].fAddress, sizeof(void*)) % newSize);
            TMemTable_t *newbranch = newLeak[hash];
            if (newbranch->fAllocCount >= newbranch->fTableSize) {
               int newTableSize =
                  newbranch->fTableSize ==
                  0 ? 16 : newbranch->fTableSize * 2;
               newbranch->fLeaks =
                  (TMemInfo_t *) realloc(newbranch->fLeaks,
                                         sizeof(TMemInfo_t) * newTableSize);
               if (!newbranch->fLeaks) {
                  Error("TMemStatManager::AddPointer", "realloc failure");
                  _exit(1);
               }
               memset(newbranch->fLeaks + newbranch->fTableSize, 0,
                      sizeof(TMemInfo_t) * (newTableSize -
                                            newbranch->fTableSize));
               newbranch->fTableSize = newTableSize;
            }
            memcpy(&newbranch->fLeaks[newbranch->fAllocCount],
                   &branch->fLeaks[i], sizeof(TMemInfo_t));
            newbranch->fAllocCount++;
            newbranch->fMemSize += branch->fLeaks[i].fSize;
         }
      free(branch->fLeaks);
      free(branch);
   }                 //loop over all old branches and rehash information
   free(fLeak);
   fLeak = newLeak;
   fSize = newSize;
}

//______________________________________________________________________________
void *TMemStatManager::AddPointer(size_t  size, void *ptr)
{
   // Add pointer to table.

   if (TestBit(kUserDisable) || TestBit(kStatDisable)) {
      return malloc(size);
   }

   Bool_t status = TestBit(kStatRoutine);
   SetBit(kStatRoutine, kTRUE);

   void *p = NULL;

   if (ptr == 0) {
      p = malloc(size);
      if (!p) {
         Error("TMemStatManager::AddPointer", "malloc failure");
         TMemStatManager::GetInstance()->Disable();
         TMemStatManager::GetInstance()->Close();
         _exit(1);
      }
   } else {
      p = realloc((char *) ptr, size);
      if (!p) {
         Error("TMemStatManager::AddPointer", "realloc failure");
         TMemStatManager::GetInstance()->Disable();
         TMemStatManager::GetInstance()->Close();
         _exit(1);
      }
      SetBit(kStatRoutine, status);
      return p;
   }
   if (status) {
      SetBit(kStatRoutine, status);
      return p;
   }

   if (!fSize)
      Init();
   ++fAllocCount;
   if ((fAllocCount / fSize) > 128)
      RehashLeak(fSize * 2);
   int hash = int(TString::Hash(&p, sizeof(void*)) % fSize);
   TMemTable_t *branch = fLeak[hash];
   branch->fAllocCount++;
   branch->fMemSize += size;

   fCurrentStamp.Inc(size);
   if ((fCurrentStamp.fTotalAllocCount - fLastStamp.fTotalAllocCount) > fAutoStampN ||
         (fCurrentStamp.fAllocCount - fLastStamp.fAllocCount) > Int_t(fAutoStampN) ||
         (fCurrentStamp.fTotalAllocSize - fLastStamp.fTotalAllocSize) > fAutoStampSize ||
         (fCurrentStamp.fAllocSize - fLastStamp.fAllocSize) > Int_t(fAutoStampSize)) {
      AddStamps();
      fLastStamp = fCurrentStamp;
      if (fAutoStampN < 0.001*fLastStamp.fTotalAllocCount) fAutoStampN = 1 + UInt_t(0.001 * fLastStamp.fTotalAllocCount);
      if (fAutoStampSize < 0.001*fLastStamp.fTotalAllocSize) fAutoStampSize = 1 + UInt_t(0.001 * fLastStamp.fTotalAllocSize);
   }

   for (;;) {
      for (int i = branch->fFirstFreeSpot; i < branch->fTableSize; ++i)
         if (branch->fLeaks[i].fAddress == 0) {
            branch->fLeaks[i].fAddress = p;
            branch->fLeaks[i].fSize = size;
            void *stptr[TMemStatStackInfo::kStackHistorySize + 1];
            int stackentries = TMemStatDepend::Backtrace(stptr, TMemStatStackInfo::kStackHistorySize, fUseGNUBuildinBacktrace);
            TMemStatStackInfo *info = STFindInfo(stackentries, stptr);
            info->Inc(size, this);
            if (info->fCurrentStamp.fStampNumber == 0) {
               info->MakeStamp(fStampNumber);  // add stamp after each addition
            }
            branch->fLeaks[i].fStackIndex = info->fStackID;
            branch->fFirstFreeSpot = i + 1;
            SetBit(kStatRoutine, status);
            return p;
         }

      int newTableSize =
         branch->fTableSize == 0 ? 16 : branch->fTableSize * 2;
      branch->fLeaks =
         (TMemInfo_t *) realloc(branch->fLeaks,
                                sizeof(TMemInfo_t) * newTableSize);
      if (!branch->fLeaks) {
         Error("TMemStatManager::AddPointer", "realloc failure (2)");
         _exit(1);
      }
      memset(branch->fLeaks + branch->fTableSize, 0, sizeof(TMemInfo_t) *
             (newTableSize - branch->fTableSize));
      branch->fTableSize = newTableSize;
   }
}

//______________________________________________________________________________
void TMemStatManager::FreePointer(void *p)
{
   // Free pointer.

   if (p == 0)
      return;
   if (TestBit(kUserDisable) || TestBit(kStatDisable)) {
      free(p);
      return;
   }

   const Bool_t status = TestBit(kStatRoutine);
   SetBit(kStatRoutine, kTRUE);

   if (status) {
      SetBit(kStatRoutine, status);
      return;
   }

   const int hash = static_cast<int>(TString::Hash(&p, sizeof(void*)) % fSize);
   --fAllocCount;
   TMemTable_t *branch = fLeak[hash];
   for (int i = 0; i < branch->fTableSize; i++) {
      if (branch->fLeaks[i].fAddress == p) {
         branch->fLeaks[i].fAddress = 0;
         branch->fMemSize -= branch->fLeaks[i].fSize;
         if (i < branch->fFirstFreeSpot)
            branch->fFirstFreeSpot = i;
         free(p);
         TMemStatStackInfo *info =
            &(fStackVector[branch->fLeaks[i].fStackIndex]);
         info->Dec(branch->fLeaks[i].fSize, this);
         fCurrentStamp.Dec(branch->fLeaks[i].fSize);
         branch->fAllocCount--;
         SetBit(kStatRoutine, status);
         return;
      }
   }
   //
   //if try to delete non existing pointer
   //printf("***TMemStatManager::FreePointer: Multiple deletion %8p ** ?  \n",p);
   //  printf("-+-+%8p  \n",p);
   //free(p);
   if (fMultDeleteTable.fTableSize + 1 > fMultDeleteTable.fAllocCount) {
      int newTableSize =
         fMultDeleteTable.fTableSize ==
         0 ? 16 : fMultDeleteTable.fTableSize * 2;
      fMultDeleteTable.fLeaks =
         (TMemInfo_t *) realloc(fMultDeleteTable.fLeaks,
                                sizeof(TMemInfo_t) * newTableSize);
      fMultDeleteTable.fAllocCount = newTableSize;
   }

   fMultDeleteTable.fLeaks[fMultDeleteTable.fTableSize].fAddress = 0;
   //void *sp = 0;
   void *stptr[TMemStatStackInfo::kStackHistorySize + 1];
   int stackentries = TMemStatDepend::Backtrace(stptr, TMemStatStackInfo::kStackHistorySize, fUseGNUBuildinBacktrace);
   TMemStatStackInfo *info = STFindInfo(stackentries/*j*/, stptr);
   info->Dec(0, this);
   fMultDeleteTable.fLeaks[fMultDeleteTable.fTableSize].fStackIndex =
      info->fStackID;
   fMultDeleteTable.fTableSize++;
   SetBit(kStatRoutine, status);
}

//______________________________________________________________________________
void TMemStatManager::DumpTo(EDumpTo _DumpTo, Bool_t _clearStamps, const char *_stampName)
{
   //write current status to file
   const Bool_t status = TestBit(TMemStatManager::kStatDisable);
   SetBit(TMemStatManager::kStatDisable, kTRUE);
   if (!fDumpFile.get())
      fDumpFile.reset( TFile::Open(g_cszFileName, "recreate") );
   //
   TTimeStamp stamp;
   MemInfo_t  memInfo;
   ProcInfo_t procInfo;
   gSystem->GetMemInfo(&memInfo);
   gSystem->GetProcInfo(&procInfo);
   Float_t memUsage[4] = { memInfo.fMemUsed, memInfo.fSwapUsed,
                           procInfo.fMemResident*0.001, procInfo.fMemVirtual*0.001};
   // No need to delete this pointer
   TTimeStamp *ptimeStamp(new TTimeStamp);
   // pass ownership to an auto_ptr
   auto_ptr<TTimeStamp> ptimeStamp_(ptimeStamp);

   TObjString *pnameStamp =
      (_stampName != 0) ? new TObjString(_stampName) : new TObjString(Form("autoStamp%d", fStampNumber));
   // pass ownership to an auto_ptr
   auto_ptr<TObjString> pnameStamp_(pnameStamp);

   const TMemStatManager * pmanager = this;
   Int_t stampNumber = fStampNumber;

   // pass ownership to an auto_ptr
   TMemStatInfoStamp *currentStamp(new TMemStatInfoStamp(fCurrentStamp));
   // pass ownership to an auto_ptr
   auto_ptr<TMemStatInfoStamp> currentStamp_(currentStamp);

   TTree *pDumpTo(NULL);
   bool bNewTree = false;
   switch (_DumpTo) {
   case kTree:
      if (!fDumpTree) {
         fDumpTree = new TTree("MemStat", "MemStat");
         bNewTree = true;
      }
      pDumpTo = fDumpTree;
      break;
   case kSysTree:
      if (!fDumpSysTree) {
         fDumpSysTree = new TTree("MemSys", "MemSys");
         bNewTree = true;
      }
      pDumpTo = fDumpSysTree;
      break;
   default: // TODO: Log me!
      return;
   }

   if (bNewTree) {
      if (kTree == _DumpTo)
         pDumpTo->Branch("Manager", "TMemStatManager", &pmanager);
      pDumpTo->Branch("StampTime.", "TTimeStamp", &ptimeStamp);
      pDumpTo->Branch("StampName.", "TObjString", &pnameStamp);
      pDumpTo->Branch("StampNumber", &stampNumber, "StampNumber/I");
      pDumpTo->Branch("CurrentStamp", "TMemStatInfoStamp", &currentStamp);
      pDumpTo->Branch("Mem0", &memUsage[0], "Mem0/F");
      pDumpTo->Branch("Mem1", &memUsage[1], "Mem1/F");
      pDumpTo->Branch("Mem2", &memUsage[2], "Mem2/F");
      pDumpTo->Branch("Mem3", &memUsage[3], "Mem3/F");
   } else {
      if (kTree == _DumpTo)
         pDumpTo->SetBranchAddress("Manager", &pmanager);
      pDumpTo->SetBranchAddress("StampTime.", &ptimeStamp);
      pDumpTo->SetBranchAddress("StampName.", &pnameStamp);
      pDumpTo->SetBranchAddress("StampNumber", &stampNumber);
      pDumpTo->SetBranchAddress("CurrentStamp", &currentStamp);
      pDumpTo->SetBranchAddress("Mem0", &memUsage[0]);
      pDumpTo->SetBranchAddress("Mem1", &memUsage[1]);
      pDumpTo->SetBranchAddress("Mem2", &memUsage[2]);
      pDumpTo->SetBranchAddress("Mem3", &memUsage[3]);
   }

   pDumpTo->Fill();
   pDumpTo->AutoSave("Stat");
   if (_clearStamps)
      fStampVector.clear();
   SetBit(TMemStatManager::kStatDisable, status);
}
 TMemStatManager.cxx:1
 TMemStatManager.cxx:2
 TMemStatManager.cxx:3
 TMemStatManager.cxx:4
 TMemStatManager.cxx:5
 TMemStatManager.cxx:6
 TMemStatManager.cxx:7
 TMemStatManager.cxx:8
 TMemStatManager.cxx:9
 TMemStatManager.cxx:10
 TMemStatManager.cxx:11
 TMemStatManager.cxx:12
 TMemStatManager.cxx:13
 TMemStatManager.cxx:14
 TMemStatManager.cxx:15
 TMemStatManager.cxx:16
 TMemStatManager.cxx:17
 TMemStatManager.cxx:18
 TMemStatManager.cxx:19
 TMemStatManager.cxx:20
 TMemStatManager.cxx:21
 TMemStatManager.cxx:22
 TMemStatManager.cxx:23
 TMemStatManager.cxx:24
 TMemStatManager.cxx:25
 TMemStatManager.cxx:26
 TMemStatManager.cxx:27
 TMemStatManager.cxx:28
 TMemStatManager.cxx:29
 TMemStatManager.cxx:30
 TMemStatManager.cxx:31
 TMemStatManager.cxx:32
 TMemStatManager.cxx:33
 TMemStatManager.cxx:34
 TMemStatManager.cxx:35
 TMemStatManager.cxx:36
 TMemStatManager.cxx:37
 TMemStatManager.cxx:38
 TMemStatManager.cxx:39
 TMemStatManager.cxx:40
 TMemStatManager.cxx:41
 TMemStatManager.cxx:42
 TMemStatManager.cxx:43
 TMemStatManager.cxx:44
 TMemStatManager.cxx:45
 TMemStatManager.cxx:46
 TMemStatManager.cxx:47
 TMemStatManager.cxx:48
 TMemStatManager.cxx:49
 TMemStatManager.cxx:50
 TMemStatManager.cxx:51
 TMemStatManager.cxx:52
 TMemStatManager.cxx:53
 TMemStatManager.cxx:54
 TMemStatManager.cxx:55
 TMemStatManager.cxx:56
 TMemStatManager.cxx:57
 TMemStatManager.cxx:58
 TMemStatManager.cxx:59
 TMemStatManager.cxx:60
 TMemStatManager.cxx:61
 TMemStatManager.cxx:62
 TMemStatManager.cxx:63
 TMemStatManager.cxx:64
 TMemStatManager.cxx:65
 TMemStatManager.cxx:66
 TMemStatManager.cxx:67
 TMemStatManager.cxx:68
 TMemStatManager.cxx:69
 TMemStatManager.cxx:70
 TMemStatManager.cxx:71
 TMemStatManager.cxx:72
 TMemStatManager.cxx:73
 TMemStatManager.cxx:74
 TMemStatManager.cxx:75
 TMemStatManager.cxx:76
 TMemStatManager.cxx:77
 TMemStatManager.cxx:78
 TMemStatManager.cxx:79
 TMemStatManager.cxx:80
 TMemStatManager.cxx:81
 TMemStatManager.cxx:82
 TMemStatManager.cxx:83
 TMemStatManager.cxx:84
 TMemStatManager.cxx:85
 TMemStatManager.cxx:86
 TMemStatManager.cxx:87
 TMemStatManager.cxx:88
 TMemStatManager.cxx:89
 TMemStatManager.cxx:90
 TMemStatManager.cxx:91
 TMemStatManager.cxx:92
 TMemStatManager.cxx:93
 TMemStatManager.cxx:94
 TMemStatManager.cxx:95
 TMemStatManager.cxx:96
 TMemStatManager.cxx:97
 TMemStatManager.cxx:98
 TMemStatManager.cxx:99
 TMemStatManager.cxx:100
 TMemStatManager.cxx:101
 TMemStatManager.cxx:102
 TMemStatManager.cxx:103
 TMemStatManager.cxx:104
 TMemStatManager.cxx:105
 TMemStatManager.cxx:106
 TMemStatManager.cxx:107
 TMemStatManager.cxx:108
 TMemStatManager.cxx:109
 TMemStatManager.cxx:110
 TMemStatManager.cxx:111
 TMemStatManager.cxx:112
 TMemStatManager.cxx:113
 TMemStatManager.cxx:114
 TMemStatManager.cxx:115
 TMemStatManager.cxx:116
 TMemStatManager.cxx:117
 TMemStatManager.cxx:118
 TMemStatManager.cxx:119
 TMemStatManager.cxx:120
 TMemStatManager.cxx:121
 TMemStatManager.cxx:122
 TMemStatManager.cxx:123
 TMemStatManager.cxx:124
 TMemStatManager.cxx:125
 TMemStatManager.cxx:126
 TMemStatManager.cxx:127
 TMemStatManager.cxx:128
 TMemStatManager.cxx:129
 TMemStatManager.cxx:130
 TMemStatManager.cxx:131
 TMemStatManager.cxx:132
 TMemStatManager.cxx:133
 TMemStatManager.cxx:134
 TMemStatManager.cxx:135
 TMemStatManager.cxx:136
 TMemStatManager.cxx:137
 TMemStatManager.cxx:138
 TMemStatManager.cxx:139
 TMemStatManager.cxx:140
 TMemStatManager.cxx:141
 TMemStatManager.cxx:142
 TMemStatManager.cxx:143
 TMemStatManager.cxx:144
 TMemStatManager.cxx:145
 TMemStatManager.cxx:146
 TMemStatManager.cxx:147
 TMemStatManager.cxx:148
 TMemStatManager.cxx:149
 TMemStatManager.cxx:150
 TMemStatManager.cxx:151
 TMemStatManager.cxx:152
 TMemStatManager.cxx:153
 TMemStatManager.cxx:154
 TMemStatManager.cxx:155
 TMemStatManager.cxx:156
 TMemStatManager.cxx:157
 TMemStatManager.cxx:158
 TMemStatManager.cxx:159
 TMemStatManager.cxx:160
 TMemStatManager.cxx:161
 TMemStatManager.cxx:162
 TMemStatManager.cxx:163
 TMemStatManager.cxx:164
 TMemStatManager.cxx:165
 TMemStatManager.cxx:166
 TMemStatManager.cxx:167
 TMemStatManager.cxx:168
 TMemStatManager.cxx:169
 TMemStatManager.cxx:170
 TMemStatManager.cxx:171
 TMemStatManager.cxx:172
 TMemStatManager.cxx:173
 TMemStatManager.cxx:174
 TMemStatManager.cxx:175
 TMemStatManager.cxx:176
 TMemStatManager.cxx:177
 TMemStatManager.cxx:178
 TMemStatManager.cxx:179
 TMemStatManager.cxx:180
 TMemStatManager.cxx:181
 TMemStatManager.cxx:182
 TMemStatManager.cxx:183
 TMemStatManager.cxx:184
 TMemStatManager.cxx:185
 TMemStatManager.cxx:186
 TMemStatManager.cxx:187
 TMemStatManager.cxx:188
 TMemStatManager.cxx:189
 TMemStatManager.cxx:190
 TMemStatManager.cxx:191
 TMemStatManager.cxx:192
 TMemStatManager.cxx:193
 TMemStatManager.cxx:194
 TMemStatManager.cxx:195
 TMemStatManager.cxx:196
 TMemStatManager.cxx:197
 TMemStatManager.cxx:198
 TMemStatManager.cxx:199
 TMemStatManager.cxx:200
 TMemStatManager.cxx:201
 TMemStatManager.cxx:202
 TMemStatManager.cxx:203
 TMemStatManager.cxx:204
 TMemStatManager.cxx:205
 TMemStatManager.cxx:206
 TMemStatManager.cxx:207
 TMemStatManager.cxx:208
 TMemStatManager.cxx:209
 TMemStatManager.cxx:210
 TMemStatManager.cxx:211
 TMemStatManager.cxx:212
 TMemStatManager.cxx:213
 TMemStatManager.cxx:214
 TMemStatManager.cxx:215
 TMemStatManager.cxx:216
 TMemStatManager.cxx:217
 TMemStatManager.cxx:218
 TMemStatManager.cxx:219
 TMemStatManager.cxx:220
 TMemStatManager.cxx:221
 TMemStatManager.cxx:222
 TMemStatManager.cxx:223
 TMemStatManager.cxx:224
 TMemStatManager.cxx:225
 TMemStatManager.cxx:226
 TMemStatManager.cxx:227
 TMemStatManager.cxx:228
 TMemStatManager.cxx:229
 TMemStatManager.cxx:230
 TMemStatManager.cxx:231
 TMemStatManager.cxx:232
 TMemStatManager.cxx:233
 TMemStatManager.cxx:234
 TMemStatManager.cxx:235
 TMemStatManager.cxx:236
 TMemStatManager.cxx:237
 TMemStatManager.cxx:238
 TMemStatManager.cxx:239
 TMemStatManager.cxx:240
 TMemStatManager.cxx:241
 TMemStatManager.cxx:242
 TMemStatManager.cxx:243
 TMemStatManager.cxx:244
 TMemStatManager.cxx:245
 TMemStatManager.cxx:246
 TMemStatManager.cxx:247
 TMemStatManager.cxx:248
 TMemStatManager.cxx:249
 TMemStatManager.cxx:250
 TMemStatManager.cxx:251
 TMemStatManager.cxx:252
 TMemStatManager.cxx:253
 TMemStatManager.cxx:254
 TMemStatManager.cxx:255
 TMemStatManager.cxx:256
 TMemStatManager.cxx:257
 TMemStatManager.cxx:258
 TMemStatManager.cxx:259
 TMemStatManager.cxx:260
 TMemStatManager.cxx:261
 TMemStatManager.cxx:262
 TMemStatManager.cxx:263
 TMemStatManager.cxx:264
 TMemStatManager.cxx:265
 TMemStatManager.cxx:266
 TMemStatManager.cxx:267
 TMemStatManager.cxx:268
 TMemStatManager.cxx:269
 TMemStatManager.cxx:270
 TMemStatManager.cxx:271
 TMemStatManager.cxx:272
 TMemStatManager.cxx:273
 TMemStatManager.cxx:274
 TMemStatManager.cxx:275
 TMemStatManager.cxx:276
 TMemStatManager.cxx:277
 TMemStatManager.cxx:278
 TMemStatManager.cxx:279
 TMemStatManager.cxx:280
 TMemStatManager.cxx:281
 TMemStatManager.cxx:282
 TMemStatManager.cxx:283
 TMemStatManager.cxx:284
 TMemStatManager.cxx:285
 TMemStatManager.cxx:286
 TMemStatManager.cxx:287
 TMemStatManager.cxx:288
 TMemStatManager.cxx:289
 TMemStatManager.cxx:290
 TMemStatManager.cxx:291
 TMemStatManager.cxx:292
 TMemStatManager.cxx:293
 TMemStatManager.cxx:294
 TMemStatManager.cxx:295
 TMemStatManager.cxx:296
 TMemStatManager.cxx:297
 TMemStatManager.cxx:298
 TMemStatManager.cxx:299
 TMemStatManager.cxx:300
 TMemStatManager.cxx:301
 TMemStatManager.cxx:302
 TMemStatManager.cxx:303
 TMemStatManager.cxx:304
 TMemStatManager.cxx:305
 TMemStatManager.cxx:306
 TMemStatManager.cxx:307
 TMemStatManager.cxx:308
 TMemStatManager.cxx:309
 TMemStatManager.cxx:310
 TMemStatManager.cxx:311
 TMemStatManager.cxx:312
 TMemStatManager.cxx:313
 TMemStatManager.cxx:314
 TMemStatManager.cxx:315
 TMemStatManager.cxx:316
 TMemStatManager.cxx:317
 TMemStatManager.cxx:318
 TMemStatManager.cxx:319
 TMemStatManager.cxx:320
 TMemStatManager.cxx:321
 TMemStatManager.cxx:322
 TMemStatManager.cxx:323
 TMemStatManager.cxx:324
 TMemStatManager.cxx:325
 TMemStatManager.cxx:326
 TMemStatManager.cxx:327
 TMemStatManager.cxx:328
 TMemStatManager.cxx:329
 TMemStatManager.cxx:330
 TMemStatManager.cxx:331
 TMemStatManager.cxx:332
 TMemStatManager.cxx:333
 TMemStatManager.cxx:334
 TMemStatManager.cxx:335
 TMemStatManager.cxx:336
 TMemStatManager.cxx:337
 TMemStatManager.cxx:338
 TMemStatManager.cxx:339
 TMemStatManager.cxx:340
 TMemStatManager.cxx:341
 TMemStatManager.cxx:342
 TMemStatManager.cxx:343
 TMemStatManager.cxx:344
 TMemStatManager.cxx:345
 TMemStatManager.cxx:346
 TMemStatManager.cxx:347
 TMemStatManager.cxx:348
 TMemStatManager.cxx:349
 TMemStatManager.cxx:350
 TMemStatManager.cxx:351
 TMemStatManager.cxx:352
 TMemStatManager.cxx:353
 TMemStatManager.cxx:354
 TMemStatManager.cxx:355
 TMemStatManager.cxx:356
 TMemStatManager.cxx:357
 TMemStatManager.cxx:358
 TMemStatManager.cxx:359
 TMemStatManager.cxx:360
 TMemStatManager.cxx:361
 TMemStatManager.cxx:362
 TMemStatManager.cxx:363
 TMemStatManager.cxx:364
 TMemStatManager.cxx:365
 TMemStatManager.cxx:366
 TMemStatManager.cxx:367
 TMemStatManager.cxx:368
 TMemStatManager.cxx:369
 TMemStatManager.cxx:370
 TMemStatManager.cxx:371
 TMemStatManager.cxx:372
 TMemStatManager.cxx:373
 TMemStatManager.cxx:374
 TMemStatManager.cxx:375
 TMemStatManager.cxx:376
 TMemStatManager.cxx:377
 TMemStatManager.cxx:378
 TMemStatManager.cxx:379
 TMemStatManager.cxx:380
 TMemStatManager.cxx:381
 TMemStatManager.cxx:382
 TMemStatManager.cxx:383
 TMemStatManager.cxx:384
 TMemStatManager.cxx:385
 TMemStatManager.cxx:386
 TMemStatManager.cxx:387
 TMemStatManager.cxx:388
 TMemStatManager.cxx:389
 TMemStatManager.cxx:390
 TMemStatManager.cxx:391
 TMemStatManager.cxx:392
 TMemStatManager.cxx:393
 TMemStatManager.cxx:394
 TMemStatManager.cxx:395
 TMemStatManager.cxx:396
 TMemStatManager.cxx:397
 TMemStatManager.cxx:398
 TMemStatManager.cxx:399
 TMemStatManager.cxx:400
 TMemStatManager.cxx:401
 TMemStatManager.cxx:402
 TMemStatManager.cxx:403
 TMemStatManager.cxx:404
 TMemStatManager.cxx:405
 TMemStatManager.cxx:406
 TMemStatManager.cxx:407
 TMemStatManager.cxx:408
 TMemStatManager.cxx:409
 TMemStatManager.cxx:410
 TMemStatManager.cxx:411
 TMemStatManager.cxx:412
 TMemStatManager.cxx:413
 TMemStatManager.cxx:414
 TMemStatManager.cxx:415
 TMemStatManager.cxx:416
 TMemStatManager.cxx:417
 TMemStatManager.cxx:418
 TMemStatManager.cxx:419
 TMemStatManager.cxx:420
 TMemStatManager.cxx:421
 TMemStatManager.cxx:422
 TMemStatManager.cxx:423
 TMemStatManager.cxx:424
 TMemStatManager.cxx:425
 TMemStatManager.cxx:426
 TMemStatManager.cxx:427
 TMemStatManager.cxx:428
 TMemStatManager.cxx:429
 TMemStatManager.cxx:430
 TMemStatManager.cxx:431
 TMemStatManager.cxx:432
 TMemStatManager.cxx:433
 TMemStatManager.cxx:434
 TMemStatManager.cxx:435
 TMemStatManager.cxx:436
 TMemStatManager.cxx:437
 TMemStatManager.cxx:438
 TMemStatManager.cxx:439
 TMemStatManager.cxx:440
 TMemStatManager.cxx:441
 TMemStatManager.cxx:442
 TMemStatManager.cxx:443
 TMemStatManager.cxx:444
 TMemStatManager.cxx:445
 TMemStatManager.cxx:446
 TMemStatManager.cxx:447
 TMemStatManager.cxx:448
 TMemStatManager.cxx:449
 TMemStatManager.cxx:450
 TMemStatManager.cxx:451
 TMemStatManager.cxx:452
 TMemStatManager.cxx:453
 TMemStatManager.cxx:454
 TMemStatManager.cxx:455
 TMemStatManager.cxx:456
 TMemStatManager.cxx:457
 TMemStatManager.cxx:458
 TMemStatManager.cxx:459
 TMemStatManager.cxx:460
 TMemStatManager.cxx:461
 TMemStatManager.cxx:462
 TMemStatManager.cxx:463
 TMemStatManager.cxx:464
 TMemStatManager.cxx:465
 TMemStatManager.cxx:466
 TMemStatManager.cxx:467
 TMemStatManager.cxx:468
 TMemStatManager.cxx:469
 TMemStatManager.cxx:470
 TMemStatManager.cxx:471
 TMemStatManager.cxx:472
 TMemStatManager.cxx:473
 TMemStatManager.cxx:474
 TMemStatManager.cxx:475
 TMemStatManager.cxx:476
 TMemStatManager.cxx:477
 TMemStatManager.cxx:478
 TMemStatManager.cxx:479
 TMemStatManager.cxx:480
 TMemStatManager.cxx:481
 TMemStatManager.cxx:482
 TMemStatManager.cxx:483
 TMemStatManager.cxx:484
 TMemStatManager.cxx:485
 TMemStatManager.cxx:486
 TMemStatManager.cxx:487
 TMemStatManager.cxx:488
 TMemStatManager.cxx:489
 TMemStatManager.cxx:490
 TMemStatManager.cxx:491
 TMemStatManager.cxx:492
 TMemStatManager.cxx:493
 TMemStatManager.cxx:494
 TMemStatManager.cxx:495
 TMemStatManager.cxx:496
 TMemStatManager.cxx:497
 TMemStatManager.cxx:498
 TMemStatManager.cxx:499
 TMemStatManager.cxx:500
 TMemStatManager.cxx:501
 TMemStatManager.cxx:502
 TMemStatManager.cxx:503
 TMemStatManager.cxx:504
 TMemStatManager.cxx:505
 TMemStatManager.cxx:506
 TMemStatManager.cxx:507
 TMemStatManager.cxx:508
 TMemStatManager.cxx:509
 TMemStatManager.cxx:510
 TMemStatManager.cxx:511
 TMemStatManager.cxx:512
 TMemStatManager.cxx:513
 TMemStatManager.cxx:514
 TMemStatManager.cxx:515
 TMemStatManager.cxx:516
 TMemStatManager.cxx:517
 TMemStatManager.cxx:518
 TMemStatManager.cxx:519
 TMemStatManager.cxx:520
 TMemStatManager.cxx:521
 TMemStatManager.cxx:522
 TMemStatManager.cxx:523
 TMemStatManager.cxx:524
 TMemStatManager.cxx:525
 TMemStatManager.cxx:526
 TMemStatManager.cxx:527
 TMemStatManager.cxx:528
 TMemStatManager.cxx:529
 TMemStatManager.cxx:530
 TMemStatManager.cxx:531
 TMemStatManager.cxx:532
 TMemStatManager.cxx:533
 TMemStatManager.cxx:534
 TMemStatManager.cxx:535
 TMemStatManager.cxx:536
 TMemStatManager.cxx:537
 TMemStatManager.cxx:538
 TMemStatManager.cxx:539
 TMemStatManager.cxx:540
 TMemStatManager.cxx:541
 TMemStatManager.cxx:542
 TMemStatManager.cxx:543
 TMemStatManager.cxx:544
 TMemStatManager.cxx:545
 TMemStatManager.cxx:546
 TMemStatManager.cxx:547
 TMemStatManager.cxx:548
 TMemStatManager.cxx:549
 TMemStatManager.cxx:550
 TMemStatManager.cxx:551
 TMemStatManager.cxx:552
 TMemStatManager.cxx:553
 TMemStatManager.cxx:554
 TMemStatManager.cxx:555
 TMemStatManager.cxx:556
 TMemStatManager.cxx:557
 TMemStatManager.cxx:558
 TMemStatManager.cxx:559
 TMemStatManager.cxx:560
 TMemStatManager.cxx:561
 TMemStatManager.cxx:562
 TMemStatManager.cxx:563
 TMemStatManager.cxx:564
 TMemStatManager.cxx:565
 TMemStatManager.cxx:566
 TMemStatManager.cxx:567
 TMemStatManager.cxx:568
 TMemStatManager.cxx:569
 TMemStatManager.cxx:570
 TMemStatManager.cxx:571
 TMemStatManager.cxx:572
 TMemStatManager.cxx:573
 TMemStatManager.cxx:574
 TMemStatManager.cxx:575
 TMemStatManager.cxx:576
 TMemStatManager.cxx:577
 TMemStatManager.cxx:578
 TMemStatManager.cxx:579
 TMemStatManager.cxx:580
 TMemStatManager.cxx:581
 TMemStatManager.cxx:582
 TMemStatManager.cxx:583
 TMemStatManager.cxx:584
 TMemStatManager.cxx:585
 TMemStatManager.cxx:586
 TMemStatManager.cxx:587
 TMemStatManager.cxx:588
 TMemStatManager.cxx:589
 TMemStatManager.cxx:590
 TMemStatManager.cxx:591
 TMemStatManager.cxx:592
 TMemStatManager.cxx:593
 TMemStatManager.cxx:594
 TMemStatManager.cxx:595
 TMemStatManager.cxx:596
 TMemStatManager.cxx:597
 TMemStatManager.cxx:598
 TMemStatManager.cxx:599
 TMemStatManager.cxx:600
 TMemStatManager.cxx:601
 TMemStatManager.cxx:602
 TMemStatManager.cxx:603
 TMemStatManager.cxx:604
 TMemStatManager.cxx:605
 TMemStatManager.cxx:606
 TMemStatManager.cxx:607
 TMemStatManager.cxx:608
 TMemStatManager.cxx:609
 TMemStatManager.cxx:610
 TMemStatManager.cxx:611
 TMemStatManager.cxx:612
 TMemStatManager.cxx:613
 TMemStatManager.cxx:614
 TMemStatManager.cxx:615
 TMemStatManager.cxx:616
 TMemStatManager.cxx:617
 TMemStatManager.cxx:618
 TMemStatManager.cxx:619
 TMemStatManager.cxx:620
 TMemStatManager.cxx:621
 TMemStatManager.cxx:622
 TMemStatManager.cxx:623
 TMemStatManager.cxx:624
 TMemStatManager.cxx:625
 TMemStatManager.cxx:626
 TMemStatManager.cxx:627
 TMemStatManager.cxx:628
 TMemStatManager.cxx:629
 TMemStatManager.cxx:630
 TMemStatManager.cxx:631
 TMemStatManager.cxx:632
 TMemStatManager.cxx:633
 TMemStatManager.cxx:634
 TMemStatManager.cxx:635
 TMemStatManager.cxx:636
 TMemStatManager.cxx:637
 TMemStatManager.cxx:638
 TMemStatManager.cxx:639
 TMemStatManager.cxx:640
 TMemStatManager.cxx:641
 TMemStatManager.cxx:642