StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StMem.cxx
1 /***************************************************************************
2  *
3  * $Id: StMem.cxx,v 1.5 2012/12/12 23:50:40 fisyak Exp $
4  *
5  ***************************************************************************
6  *
7  * Description:
8  *
9  ***************************************************************************
10  **************************************************************************/
11 #include <stdio.h>
12 #include <stdlib.h>
13 #ifndef __APPLE__
14 #include <malloc.h>
15 #endif
16 #include <unistd.h>
17 #include "StMem.h"
18 double StMem::fUsed=0;
19 double StMem::Used()
20 {
21 #ifndef __APPLE__
22  struct mallinfo info;
23  info = mallinfo();
24  return double(info.uordblks + info.usmblks)/1000000;
25 #else
26  return 0;
27 #endif
28 }
29 
30 double StMem::ESize()
31 {
32  static char *ps = 0;
33  double res=0;
34  if (!ps) {
35  int pid = ::getpid();
36  ps = (char*)malloc(20);
37  sprintf(ps,"ps -l -p %d",pid);
38  }
39  FILE *pipe = ::popen(ps,"r");
40  if (!pipe) return 0.;
41 
42  char psBuf[130];
43  psBuf[0] = ' ';
44  while( !feof( pipe ) ) {
45  psBuf[1]=0;
46  if(!fgets( psBuf+1, 128, pipe)) continue;
47 // printf("%s\n",psBuf);
48  int ifild=0;char *c;
49 
50  for (c=psBuf; c[0]; c++) {
51  if (c[0]==' ' && c[1]!=' ') ifild++;
52  if (ifild == 10) break;
53  }
54  res = (double)atoi(c+1);
55  if (res) break;
56  }
57  ::pclose(pipe);
58  res *=::getpagesize()/(1024.*1024.);
59 
60  return res;
61 }
62 
63 void StMem::Print(const char *tit)
64 {
65  double used = Used();
66  double exec = ESize();
67 
68  if (tit) printf("\nStMem::%s",tit);
69  printf("\t total =%10.6f heap =%10.6f (%+10.6f)\n",exec, used,used-fUsed);
70  fUsed = used;
71 }