ROOT logo
// @(#)root/new:$Name$:$Id: TMemStatInfo.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.             *
 *************************************************************************/

//****************************************************************************//
/*
      Mem Stat information -
.     TMemStatInfoStamp - counter
                   fTotalAllocCount;  //total number of allocation for stack sequence
                   fTotalAllocSize;   //total size of allocated memory
                   fAllocCount;       //current number of allocation-deallocation
                   fAllocSize;        //current allocated size
     TMemStatCodeInfo
     base code information - strings - fFunction and fLib (function description)
                          - stamps  -
     TMemStatInfoStamp  fLastStamp;     // last time stamp info
     TMemStatInfoStamp  fCurrentStamp;  // current  time stamp info
     TMemStatInfoStamp  fMaxStampSize;  // max current size stamp
     TMemStatInfoStamp  fMaxStamp;      // max current size stamp
     TMemStatStackInfo
     base stack information - array of pointers to Code informations
                          - stamps  -
     TMemStatInfoStamp  fLastStamp;     // last time stamp info
     TMemStatInfoStamp  fCurrentStamp;  // current  time stamp info
     TMemStatInfoStamp  fMaxStampSize;  // max current size stamp
     TMemStatInfoStamp  fMaxStamp;      // max current size stamp
*/
//****************************************************************************//

// ROOT
#include "Riostream.h"
#include "TObject.h"
// Memstat
#include "TMemStatInfo.h"
#include "TMemStatManager.h"
#include "TMemStatDepend.h"


ClassImp(TMemStatCodeInfo)
ClassImp(TMemStatInfoStamp)
ClassImp(TMemStatStackInfo)

//****************************************************************************//
//                                 TMemStatInfoStamp
//****************************************************************************//

//______________________________________________________________________________
TMemStatInfoStamp::TMemStatInfoStamp():
      fTotalAllocCount(0),  //total number of allocation for stack sequence
      fTotalAllocSize(0),   //total size of allocated memory
      fAllocCount(0),       //current number of allocation-deallocation
      fAllocSize(0),        //current allocated size
      fStampNumber(0),      //index of previous
      fID(0),               //code ID
      fStampType(0)
{
}

//______________________________________________________________________________
TMemStatInfoStamp::~TMemStatInfoStamp()
{
}

//______________________________________________________________________________
void TMemStatInfoStamp::Print(Option_t* /*option*/) const
{
   // TODO: Comment me

   cout << *this << endl;
}

//______________________________________________________________________________
std::ostream& operator << (std::ostream &_ostream, const TMemStatInfoStamp &_this)
{
   // TODO: Comment me

   _ostream
   << std::setw(fields_length[1]) << "TotalCount"
   << std::setw(fields_length[2]) << "TotalSize"
   << std::setw(fields_length[3]) << "Count"
   << std::setw(fields_length[4]) << "Size" << std::endl;

   // Setting a bit nicer formating
   // example: instead of 20600000 print 20,600,000
   std::locale loc("");
   std::locale loc_previous = _ostream.imbue(loc);
   _ostream.precision(2);
   _ostream << std::fixed;

   _ostream
   << std::setw(fields_length[1]) << _this.fTotalAllocCount
   << std::setw(fields_length[2]) << Memstat::dig2bytes(_this.fTotalAllocSize)
   << std::setw(fields_length[3]) << _this.fAllocCount
   << std::setw(fields_length[4]) << Memstat::dig2bytes(_this.fAllocSize);

   _ostream.imbue(loc_previous);

   return _ostream;
}

//****************************************************************************//
//                                 TMemStatCodeInfo
//****************************************************************************//

//______________________________________________________________________________
TMemStatCodeInfo::TMemStatCodeInfo():
      fLastStamp(),
      fCurrentStamp(),
      fMaxStampSize(),
      fMaxStamp(),
      fCode(0),
      fInfo(0),
      fFunction(),
      fLib(),
      fCodeID(0)
{
   // a ctor

   fLastStamp.fStampType    = TMemStatInfoStamp::kCode;
   fCurrentStamp.fStampType = TMemStatInfoStamp::kCode;
   fMaxStampSize.fStampType = TMemStatInfoStamp::kCode;
   fMaxStamp.fStampType     = TMemStatInfoStamp::kCode;
}

//______________________________________________________________________________
void TMemStatCodeInfo::Inc(Int_t memSize)
{
   // TODO: Comment me

   fCurrentStamp.Inc(memSize);
   if (fCurrentStamp.fAllocCount > fMaxStamp.fAllocCount)
      fMaxStamp = fCurrentStamp;
   if (fCurrentStamp.fAllocSize > fMaxStampSize.fAllocSize)
      fMaxStampSize = fCurrentStamp;
}

//______________________________________________________________________________
void TMemStatCodeInfo::SetInfo(void *info)
{
   //  Get function's real name from info descriptor

   char *zero = 0;
   fCode = (Long64_t)((char*)info - zero);
   TString strLine;
   TMemStatDepend::GetSymbols(info, fInfo, fLib, fFunction, strLine);
}

//______________________________________________________________________________
void TMemStatCodeInfo::Print(Option_t * /*option*/) const
{
   // TODO: Comment me

   StreemCurrAndMax(cout, *this) << endl;

   cout << fCodeID << "\t" << fInfo.Data() << endl;
   cout << fCodeID << "\t" <<  fLib.Data() << '\t' << fFunction.Data() << endl;
}

//______________________________________________________________________________
void TMemStatCodeInfo::MakeStamp(Int_t stampNumber)
{
   // make time stamp - only if change

   if (fCurrentStamp.Equal(fLastStamp))
      return;

   TMemStatInfoStamp &newStamp = TMemStatManager::GetInstance()->AddStamp();
   fCurrentStamp.fStampNumber = stampNumber;
   newStamp = fCurrentStamp;
   fLastStamp = newStamp;
}

//______________________________________________________________________________
std::ostream& operator << (std::ostream &_ostream, const TMemStatCodeInfo &_this)
{
   // TODO: Comment me
   _ostream
   << _this.fFunction.Data()
   << '\t' << _this.fLib.Data();

   return _ostream;
}


//****************************************************************************//
//                                 Storage of Stack information
//****************************************************************************//

//______________________________________________________________________________
TMemStatStackInfo::TMemStatStackInfo():
      TObject(),
      fSize(0),
      fLastStamp(),
      fCurrentStamp(),
      fMaxStampSize(),
      fMaxStamp(),
      fNextHash(-1),
      fStackSymbols(0),
      fSymbolIndexes(0),
      fStackID(0)
{
   // default ctor

   fLastStamp.fStampType    = TMemStatInfoStamp::kStack;
   fCurrentStamp.fStampType = TMemStatInfoStamp::kStack;
   fMaxStampSize.fStampType = TMemStatInfoStamp::kStack;
   fMaxStamp.fStampType     = TMemStatInfoStamp::kStack;
}

//______________________________________________________________________________
void TMemStatStackInfo::Init(int stacksize, void **stackptrs, TMemStatManager *manager, Int_t ID)
{
   //Initialize the stack
   fStackID = ID;
   fSize = stacksize;
   fLastStamp.fID   = fStackID;     // last time stamp info
   fCurrentStamp.fID = fStackID;    // current  time stamp info

   fStackSymbols  = new void*[stacksize];
   memcpy(fStackSymbols, stackptrs, stacksize * sizeof(void *));
   fSymbolIndexes = new UInt_t[stacksize];

   for (Int_t i = 0; i < stacksize; ++i) {
      TMemStatCodeInfo & cinfo =  manager->GetCodeInfo(stackptrs[i]);
      if (cinfo.fCode == 0)
         cinfo.SetInfo(stackptrs[i]);

      fSymbolIndexes[i] = cinfo.fCodeID;
   }
}

//______________________________________________________________________________
int TMemStatStackInfo::Equal(unsigned int size, void **ptr)
{
   // Return 0 if stack information not equal otherwise return 1.

   if (size != fSize)
      return 0;
   for (size_t i = 0; i < size; ++i)
      if (ptr[i] != fStackSymbols[i])
         return 0;
   return 1;
}

//______________________________________________________________________________
Bool_t TMemStatInfoStamp::Equal(TMemStatInfoStamp&stamp)
{
   // TODO: Comment me
   if (fTotalAllocCount != stamp.fTotalAllocCount)
      return kFALSE;
   if (fAllocCount != stamp.fAllocCount)
      return kFALSE;
   return kTRUE;
}

//______________________________________________________________________________
void TMemStatStackInfo::MakeStamp(Int_t stampNumber)
{
   // make time stamp - only if change

   if (fCurrentStamp.Equal(fLastStamp))
      return;

   TMemStatInfoStamp &newStamp = TMemStatManager::GetInstance()->AddStamp();
   fCurrentStamp.fStampNumber = stampNumber;
   newStamp = fCurrentStamp;
   fLastStamp = newStamp;
}

//______________________________________________________________________________
void TMemStatStackInfo::Inc(Int_t memSize, TMemStatManager *manager)
{
   // TODO: Comment me
   fCurrentStamp.Inc(memSize);
   if (fCurrentStamp.fAllocCount > fMaxStamp.fAllocCount)
      fMaxStamp = fCurrentStamp;
   if (fCurrentStamp.fAllocSize > fMaxStampSize.fAllocSize)
      fMaxStampSize = fCurrentStamp;
   for (UInt_t i = 0; i < fSize; ++i)
      manager->fCodeInfoArray[fSymbolIndexes[i]].Inc(memSize);
}

//______________________________________________________________________________
void TMemStatStackInfo::Dec(int memSize, TMemStatManager *manager)
{
   // TODO: Comment me
   if (fCurrentStamp.fAllocCount)
      fCurrentStamp.fAllocCount -= 1;
   fCurrentStamp.fAllocSize  -= memSize;
   for (UInt_t i = 0; i < fSize; ++i)
      manager->fCodeInfoArray[fSymbolIndexes[i]].Dec(memSize);
}

//______________________________________________________________________________
std::ostream& operator << (std::ostream &_ostream, const TMemStatStackInfo &_this)
{
   // TODO: Comment me
   return StreemCurrAndMax(_ostream, _this);
}
 TMemStatInfo.cxx:1
 TMemStatInfo.cxx:2
 TMemStatInfo.cxx:3
 TMemStatInfo.cxx:4
 TMemStatInfo.cxx:5
 TMemStatInfo.cxx:6
 TMemStatInfo.cxx:7
 TMemStatInfo.cxx:8
 TMemStatInfo.cxx:9
 TMemStatInfo.cxx:10
 TMemStatInfo.cxx:11
 TMemStatInfo.cxx:12
 TMemStatInfo.cxx:13
 TMemStatInfo.cxx:14
 TMemStatInfo.cxx:15
 TMemStatInfo.cxx:16
 TMemStatInfo.cxx:17
 TMemStatInfo.cxx:18
 TMemStatInfo.cxx:19
 TMemStatInfo.cxx:20
 TMemStatInfo.cxx:21
 TMemStatInfo.cxx:22
 TMemStatInfo.cxx:23
 TMemStatInfo.cxx:24
 TMemStatInfo.cxx:25
 TMemStatInfo.cxx:26
 TMemStatInfo.cxx:27
 TMemStatInfo.cxx:28
 TMemStatInfo.cxx:29
 TMemStatInfo.cxx:30
 TMemStatInfo.cxx:31
 TMemStatInfo.cxx:32
 TMemStatInfo.cxx:33
 TMemStatInfo.cxx:34
 TMemStatInfo.cxx:35
 TMemStatInfo.cxx:36
 TMemStatInfo.cxx:37
 TMemStatInfo.cxx:38
 TMemStatInfo.cxx:39
 TMemStatInfo.cxx:40
 TMemStatInfo.cxx:41
 TMemStatInfo.cxx:42
 TMemStatInfo.cxx:43
 TMemStatInfo.cxx:44
 TMemStatInfo.cxx:45
 TMemStatInfo.cxx:46
 TMemStatInfo.cxx:47
 TMemStatInfo.cxx:48
 TMemStatInfo.cxx:49
 TMemStatInfo.cxx:50
 TMemStatInfo.cxx:51
 TMemStatInfo.cxx:52
 TMemStatInfo.cxx:53
 TMemStatInfo.cxx:54
 TMemStatInfo.cxx:55
 TMemStatInfo.cxx:56
 TMemStatInfo.cxx:57
 TMemStatInfo.cxx:58
 TMemStatInfo.cxx:59
 TMemStatInfo.cxx:60
 TMemStatInfo.cxx:61
 TMemStatInfo.cxx:62
 TMemStatInfo.cxx:63
 TMemStatInfo.cxx:64
 TMemStatInfo.cxx:65
 TMemStatInfo.cxx:66
 TMemStatInfo.cxx:67
 TMemStatInfo.cxx:68
 TMemStatInfo.cxx:69
 TMemStatInfo.cxx:70
 TMemStatInfo.cxx:71
 TMemStatInfo.cxx:72
 TMemStatInfo.cxx:73
 TMemStatInfo.cxx:74
 TMemStatInfo.cxx:75
 TMemStatInfo.cxx:76
 TMemStatInfo.cxx:77
 TMemStatInfo.cxx:78
 TMemStatInfo.cxx:79
 TMemStatInfo.cxx:80
 TMemStatInfo.cxx:81
 TMemStatInfo.cxx:82
 TMemStatInfo.cxx:83
 TMemStatInfo.cxx:84
 TMemStatInfo.cxx:85
 TMemStatInfo.cxx:86
 TMemStatInfo.cxx:87
 TMemStatInfo.cxx:88
 TMemStatInfo.cxx:89
 TMemStatInfo.cxx:90
 TMemStatInfo.cxx:91
 TMemStatInfo.cxx:92
 TMemStatInfo.cxx:93
 TMemStatInfo.cxx:94
 TMemStatInfo.cxx:95
 TMemStatInfo.cxx:96
 TMemStatInfo.cxx:97
 TMemStatInfo.cxx:98
 TMemStatInfo.cxx:99
 TMemStatInfo.cxx:100
 TMemStatInfo.cxx:101
 TMemStatInfo.cxx:102
 TMemStatInfo.cxx:103
 TMemStatInfo.cxx:104
 TMemStatInfo.cxx:105
 TMemStatInfo.cxx:106
 TMemStatInfo.cxx:107
 TMemStatInfo.cxx:108
 TMemStatInfo.cxx:109
 TMemStatInfo.cxx:110
 TMemStatInfo.cxx:111
 TMemStatInfo.cxx:112
 TMemStatInfo.cxx:113
 TMemStatInfo.cxx:114
 TMemStatInfo.cxx:115
 TMemStatInfo.cxx:116
 TMemStatInfo.cxx:117
 TMemStatInfo.cxx:118
 TMemStatInfo.cxx:119
 TMemStatInfo.cxx:120
 TMemStatInfo.cxx:121
 TMemStatInfo.cxx:122
 TMemStatInfo.cxx:123
 TMemStatInfo.cxx:124
 TMemStatInfo.cxx:125
 TMemStatInfo.cxx:126
 TMemStatInfo.cxx:127
 TMemStatInfo.cxx:128
 TMemStatInfo.cxx:129
 TMemStatInfo.cxx:130
 TMemStatInfo.cxx:131
 TMemStatInfo.cxx:132
 TMemStatInfo.cxx:133
 TMemStatInfo.cxx:134
 TMemStatInfo.cxx:135
 TMemStatInfo.cxx:136
 TMemStatInfo.cxx:137
 TMemStatInfo.cxx:138
 TMemStatInfo.cxx:139
 TMemStatInfo.cxx:140
 TMemStatInfo.cxx:141
 TMemStatInfo.cxx:142
 TMemStatInfo.cxx:143
 TMemStatInfo.cxx:144
 TMemStatInfo.cxx:145
 TMemStatInfo.cxx:146
 TMemStatInfo.cxx:147
 TMemStatInfo.cxx:148
 TMemStatInfo.cxx:149
 TMemStatInfo.cxx:150
 TMemStatInfo.cxx:151
 TMemStatInfo.cxx:152
 TMemStatInfo.cxx:153
 TMemStatInfo.cxx:154
 TMemStatInfo.cxx:155
 TMemStatInfo.cxx:156
 TMemStatInfo.cxx:157
 TMemStatInfo.cxx:158
 TMemStatInfo.cxx:159
 TMemStatInfo.cxx:160
 TMemStatInfo.cxx:161
 TMemStatInfo.cxx:162
 TMemStatInfo.cxx:163
 TMemStatInfo.cxx:164
 TMemStatInfo.cxx:165
 TMemStatInfo.cxx:166
 TMemStatInfo.cxx:167
 TMemStatInfo.cxx:168
 TMemStatInfo.cxx:169
 TMemStatInfo.cxx:170
 TMemStatInfo.cxx:171
 TMemStatInfo.cxx:172
 TMemStatInfo.cxx:173
 TMemStatInfo.cxx:174
 TMemStatInfo.cxx:175
 TMemStatInfo.cxx:176
 TMemStatInfo.cxx:177
 TMemStatInfo.cxx:178
 TMemStatInfo.cxx:179
 TMemStatInfo.cxx:180
 TMemStatInfo.cxx:181
 TMemStatInfo.cxx:182
 TMemStatInfo.cxx:183
 TMemStatInfo.cxx:184
 TMemStatInfo.cxx:185
 TMemStatInfo.cxx:186
 TMemStatInfo.cxx:187
 TMemStatInfo.cxx:188
 TMemStatInfo.cxx:189
 TMemStatInfo.cxx:190
 TMemStatInfo.cxx:191
 TMemStatInfo.cxx:192
 TMemStatInfo.cxx:193
 TMemStatInfo.cxx:194
 TMemStatInfo.cxx:195
 TMemStatInfo.cxx:196
 TMemStatInfo.cxx:197
 TMemStatInfo.cxx:198
 TMemStatInfo.cxx:199
 TMemStatInfo.cxx:200
 TMemStatInfo.cxx:201
 TMemStatInfo.cxx:202
 TMemStatInfo.cxx:203
 TMemStatInfo.cxx:204
 TMemStatInfo.cxx:205
 TMemStatInfo.cxx:206
 TMemStatInfo.cxx:207
 TMemStatInfo.cxx:208
 TMemStatInfo.cxx:209
 TMemStatInfo.cxx:210
 TMemStatInfo.cxx:211
 TMemStatInfo.cxx:212
 TMemStatInfo.cxx:213
 TMemStatInfo.cxx:214
 TMemStatInfo.cxx:215
 TMemStatInfo.cxx:216
 TMemStatInfo.cxx:217
 TMemStatInfo.cxx:218
 TMemStatInfo.cxx:219
 TMemStatInfo.cxx:220
 TMemStatInfo.cxx:221
 TMemStatInfo.cxx:222
 TMemStatInfo.cxx:223
 TMemStatInfo.cxx:224
 TMemStatInfo.cxx:225
 TMemStatInfo.cxx:226
 TMemStatInfo.cxx:227
 TMemStatInfo.cxx:228
 TMemStatInfo.cxx:229
 TMemStatInfo.cxx:230
 TMemStatInfo.cxx:231
 TMemStatInfo.cxx:232
 TMemStatInfo.cxx:233
 TMemStatInfo.cxx:234
 TMemStatInfo.cxx:235
 TMemStatInfo.cxx:236
 TMemStatInfo.cxx:237
 TMemStatInfo.cxx:238
 TMemStatInfo.cxx:239
 TMemStatInfo.cxx:240
 TMemStatInfo.cxx:241
 TMemStatInfo.cxx:242
 TMemStatInfo.cxx:243
 TMemStatInfo.cxx:244
 TMemStatInfo.cxx:245
 TMemStatInfo.cxx:246
 TMemStatInfo.cxx:247
 TMemStatInfo.cxx:248
 TMemStatInfo.cxx:249
 TMemStatInfo.cxx:250
 TMemStatInfo.cxx:251
 TMemStatInfo.cxx:252
 TMemStatInfo.cxx:253
 TMemStatInfo.cxx:254
 TMemStatInfo.cxx:255
 TMemStatInfo.cxx:256
 TMemStatInfo.cxx:257
 TMemStatInfo.cxx:258
 TMemStatInfo.cxx:259
 TMemStatInfo.cxx:260
 TMemStatInfo.cxx:261
 TMemStatInfo.cxx:262
 TMemStatInfo.cxx:263
 TMemStatInfo.cxx:264
 TMemStatInfo.cxx:265
 TMemStatInfo.cxx:266
 TMemStatInfo.cxx:267
 TMemStatInfo.cxx:268
 TMemStatInfo.cxx:269
 TMemStatInfo.cxx:270
 TMemStatInfo.cxx:271
 TMemStatInfo.cxx:272
 TMemStatInfo.cxx:273
 TMemStatInfo.cxx:274
 TMemStatInfo.cxx:275
 TMemStatInfo.cxx:276
 TMemStatInfo.cxx:277
 TMemStatInfo.cxx:278
 TMemStatInfo.cxx:279
 TMemStatInfo.cxx:280
 TMemStatInfo.cxx:281
 TMemStatInfo.cxx:282
 TMemStatInfo.cxx:283
 TMemStatInfo.cxx:284
 TMemStatInfo.cxx:285
 TMemStatInfo.cxx:286
 TMemStatInfo.cxx:287
 TMemStatInfo.cxx:288
 TMemStatInfo.cxx:289
 TMemStatInfo.cxx:290
 TMemStatInfo.cxx:291
 TMemStatInfo.cxx:292
 TMemStatInfo.cxx:293
 TMemStatInfo.cxx:294
 TMemStatInfo.cxx:295
 TMemStatInfo.cxx:296
 TMemStatInfo.cxx:297
 TMemStatInfo.cxx:298
 TMemStatInfo.cxx:299
 TMemStatInfo.cxx:300
 TMemStatInfo.cxx:301
 TMemStatInfo.cxx:302
 TMemStatInfo.cxx:303
 TMemStatInfo.cxx:304
 TMemStatInfo.cxx:305
 TMemStatInfo.cxx:306