Fixed memory leak inside ComlibStrategy/OneTimeMulticastStrategy. The message would
[charm.git] / src / ck-com / ComlibStats.h
index 808dab1b757bd83c4a7766143668c30ba918acbb..0a1d1cf30d40f15f18a06119219173fe22760ce9 100644 (file)
@@ -1,10 +1,22 @@
 #ifndef COMLIB_STATS_H
 #define COMLIB_STATS_H
 
+/**
+   @addtogroup CharmComlib
+   @{
+   @file
+   
+   @brief Classes for storing simple statistics about messages send and received.
+*/
+
 #include "charm++.h"
 #include "convcomlibmanager.h"
 
 class ComlibLocalStats;
+
+/**
+   Old class that is no longer used.
+*/
 class ComlibComRec {
     int nmessages_sent;
     int totalbytes_sent;
@@ -32,7 +44,7 @@ class ComlibComRec {
     }
 
     ComlibComRec(int _npes) {
-        npes = npes;
+        npes = _npes;
         procMap = 0;
         totalbytes_sent = 0;
         totalbytes_received = 0;
@@ -174,85 +186,110 @@ class ComlibComRec {
     }
 };
 
+
+/**
+   Old class that is no longer used.
+*/
 class ComlibLocalStats {
  public:
     CkVec<ComlibComRec> cdata;
     int nstrats;
 
-    ComlibLocalStats(int _strats) {
-        nstrats = _strats;
-        cdata.resize(nstrats);
+    ComlibLocalStats(int _strats) : cdata(_strats) {
+      nstrats = _strats;
     }
     
-    ComlibLocalStats() {
-        nstrats = MAX_NUM_STRATS;
-        cdata.resize(nstrats);
+    ComlibLocalStats() : cdata(1) {
+      nstrats = 1;
     }
 
     void setNstrats(int nst) {
         nstrats = nst;
+        cdata.resize(nstrats);
     }
 
     inline void recordSend(int sid, int size, int dest) {
-        cdata[sid].recordSend(size, dest);
+      if(sid >= nstrats) {
+       nstrats = sid + 1;
+       cdata.resize(nstrats);
+      }
+
+      cdata[sid].recordSend(size, dest);
+
     }
 
     inline void recordRecv(int sid, int size, int src) {
-        cdata[sid].recordRecv(size, src);
+      if(sid >= nstrats) {
+       nstrats = sid + 1;
+       cdata.resize(nstrats);
+      }
+
+      cdata[sid].recordRecv(size, src);
     }
 
     inline void recordSendM(int sid, int size, int *dest_m, int ndest) {
-        cdata[sid].recordSendM(size, dest_m, ndest);
+      if(sid >= nstrats) {
+       nstrats = sid + 1;
+       cdata.resize(nstrats);
+      }
+
+      cdata[sid].recordSendM(size, dest_m, ndest);
     }
 
     inline void recordRecvM(int sid, int size, int *src_m, int nsrc) {
-        cdata[sid].recordRecvM(size, src_m, nsrc);
-    }
+      if(sid >= nstrats) {
+       nstrats = sid + 1;
+       cdata.resize(nstrats);
+      }
 
+      cdata[sid].recordRecvM(size, src_m, nsrc);
+    }
+    
     inline void reset() {
-        for(int count = 0; count < nstrats; count++)
-            cdata[count].reset();
+      for(int count = 0; count < nstrats; count++)
+       cdata[count].reset();
     }
 
     void pup(PUP::er &p) {
-        p | nstrats;
-        p | cdata;
+      p | nstrats;
+      p | cdata;
     }
 
     ComlibLocalStats & operator=(ComlibLocalStats &in) {
-        nstrats = in.nstrats;
-
-        cdata.resize(in.cdata.size());
-        for(int count = 0; count < in.nstrats; count++) {
-            if(in.cdata[count].isRecorded()) {
-                memcpy(&cdata[count],&in.cdata[count], sizeof(ComlibComRec));
-                
-                int npes = in.cdata[count].npes;
-                int mapsize = (npes / (sizeof(char)*8) + 1) * sizeof(char); 
-                cdata[count].procMap = (unsigned char*) CmiAlloc(mapsize);
-                memcpy(cdata[count].procMap, in.cdata[count].procMap, mapsize);
-            }
-            else
-                cdata[count].reset();
-        }
-
-        return *this;
+      nstrats = in.nstrats;
+
+      cdata.resize(in.cdata.size());
+      for(int count = 0; count < in.nstrats; count++) {
+       if(in.cdata[count].isRecorded()) {
+         memcpy(&cdata[count],&in.cdata[count], sizeof(ComlibComRec));
+         
+         int npes = in.cdata[count].npes;
+         int mapsize = (npes / (sizeof(char)*8) + 1) * sizeof(char); 
+         cdata[count].procMap = (unsigned char*) CmiAlloc(mapsize);
+         memcpy(cdata[count].procMap, in.cdata[count].procMap, mapsize);
+       }
+       else
+         cdata[count].reset();
+      }
+      
+      return *this;
     }
 };
 
 class ComlibGlobalStats {
  
-    ComlibLocalStats *statsArr;
-
+  ComlibLocalStats *statsArr;
+  
  public:
-
-    ComlibGlobalStats();
-    ~ComlibGlobalStats() {}
-
-    void updateStats(ComlibLocalStats &stats, int pe); 
-    
-    //The average amount of data communicated
-    void getAverageStats(int sid, double &, double &, double &, double &);
+  
+  ComlibGlobalStats();
+  ~ComlibGlobalStats() {}
+  
+  void updateStats(ComlibLocalStats &stats, int pe); 
+  
+  //The average amount of data communicated
+  void getAverageStats(int sid, double &, double &, double &, double &);
 };
 
+/*@}*/
 #endif