a little cleanup and conformation of usage of CmiChunkHeader. It will prevent in
authorFilippo Gioachin <gioachin@illinois.edu>
Sat, 16 Apr 2005 08:15:20 +0000 (08:15 +0000)
committerFilippo Gioachin <gioachin@illinois.edu>
Sat, 16 Apr 2005 08:15:20 +0000 (08:15 +0000)
future breaks of charm if this header is modified.
Moreover, fixed a bug (memory leak) for which a vector was not emptied at the
end of an iteration. This have performance impact since every insert will move all
the data present in the array many times.

src/conv-com/petable.C
src/conv-com/petable.h

index 3bdd3069d7235c7422a383029356d9f5c1db8663..dca13eb689797f7b6e82a4dc65abe2b9d6e5d593 100644 (file)
@@ -54,6 +54,7 @@ PeTable :: PeTable(int n)
   //CombBuffer=(char *)CmiAlloc(BIGBUFFERSIZE);
 
   PTFreeList=NULL;
   //CombBuffer=(char *)CmiAlloc(BIGBUFFERSIZE);
 
   PTFreeList=NULL;
+  PTFreeChunks=NULL;
 }
 
 PeTable :: ~PeTable()
 }
 
 PeTable :: ~PeTable()
@@ -66,9 +67,9 @@ PeTable :: ~PeTable()
   GarbageCollect();
   //CmiFree(ptrlist);
   PTinfo *tmp;
   GarbageCollect();
   //CmiFree(ptrlist);
   PTinfo *tmp;
-  while (PTFreeList) {
-       tmp=PTFreeList;
-       PTFreeList=tmp->next;
+  while (PTFreeChunks) {
+       tmp=PTFreeChunks;
+       PTFreeChunks=PTNEXTCHUNK(tmp);
        CmiFree(tmp);
   }
  // delete FreeList;
        CmiFree(tmp);
   }
  // delete FreeList;
@@ -406,6 +407,8 @@ int PeTable :: UnpackAndInsert(void *in)
       *rc=(int)((char *)in-actualmsg);
       //ComlibPrintf("I am inserting %d\n", *rc);
   }
       *rc=(int)((char *)in-actualmsg);
       //ComlibPrintf("I am inserting %d\n", *rc);
   }
+
+  ptrvec.removeAll();
   
   return(ufield);
 }
   
   return(ufield);
 }
@@ -441,8 +444,8 @@ int PeTable :: UnpackAndInsertAll(void *in, int npes, int *pelist){
   AllToAllHdr ahdr;
   UNPACK(AllToAllHdr, ahdr);
 
   AllToAllHdr ahdr;
   UNPACK(AllToAllHdr, ahdr);
 
-  if(sizeof(AllToAllHdr) % 8 != 0)
-      t += 8 - sizeof(AllToAllHdr) % 8;
+  if(sizeof(AllToAllHdr) & 7 != 0)
+      t += 8 - sizeof(AllToAllHdr) & 7;
 
   refno = ahdr.refno;
   id = ahdr.id;
 
   refno = ahdr.refno;
   id = ahdr.id;
@@ -454,30 +457,51 @@ int PeTable :: UnpackAndInsertAll(void *in, int npes, int *pelist){
   //Inserting a memory foot print may, change later
   CmiChunkHeader *chdr= (CmiChunkHeader*)((char*)in - sizeof(CmiChunkHeader));
 
   //Inserting a memory foot print may, change later
   CmiChunkHeader *chdr= (CmiChunkHeader*)((char*)in - sizeof(CmiChunkHeader));
 
+  int *ref;
+  int size;
+  char *msg;
   for(int count = 0; count < nmsgs; count++){
   for(int count = 0; count < nmsgs; count++){
-      int *ref = 0;
-      int size = 0;
-      char *msg = 0;
 
 
-      UNPACK(int, size);
-      ref = (int *)t;
-      t += sizeof(int);
+    t += sizeof(CmiChunkHeader);
 
 
-      *ref = (int)((char *)(&chdr->ref) - (char *)ref);
-      chdr->ref ++;
+    msg = t;
+    t += ALIGN8(size);
 
 
-      ComlibPrintf("ref = %d, global_ref = %d\n", *ref, chdr->ref);
+    // Get the size of the message, and set the ref field correctly for CmiFree
+    size = SIZEFIELD(msg);
+    REFFIELD(msg) = (int)((char *)&REFFIELD(in) - (char *)REFFIELD(msg));
 
 
-      msg = t;
-      t += ALIGN8(size);
-      
-      InsertMsgs(npes, pelist, size, msg);
+    // Do CmiReference(msg), this is done bypassing converse!
+    chdr->ref++;
+
+    /*
+    UNPACK(int, size);
+    ref = (int *)t;
+    t += sizeof(int);
+    
+    *ref = (int)((char *)(&chdr->ref) - (char *)ref);
+    chdr->ref ++;
+
+    ComlibPrintf("ref = %d, global_ref = %d\n", *ref, chdr->ref);
+    
+    msg = t;
+    t += ALIGN8(size);
+    */
+    InsertMsgs(npes, pelist, size, msg);
   }  
 
   CmiFree(in);
   return ufield;
 }
 
   }  
 
   CmiFree(in);
   return ufield;
 }
 
+PTvectorlist PeTable :: ExtractAndVectorize(comID id, int ufield, int npe, int *pelist) {
+
+}
+
+PTvectorlist PeTable :: ExtractAndVectorizeAll(comID id, int ufield) {
+
+}
+
 void PeTable :: GarbageCollect()
 {
 }
 void PeTable :: GarbageCollect()
 {
 }
index ff8bc948a534caf6704dd0833899e8e56ad66cc6..2e913470a2d15d8eddd7cdb5ffd8d06bb517adec 100644 (file)
@@ -18,12 +18,19 @@ typedef struct ptinfo {
   int refCount;
   int magic;
   int offset;
   int refCount;
   int magic;
   int offset;
-  int freelistindex;
+  /*int freelistindex;*/
   int msgsize;
   void *msg;
   struct ptinfo * next;
 } PTinfo;
 
   int msgsize;
   void *msg;
   struct ptinfo * next;
 } PTinfo;
 
+typedef struct ptvectorlist {
+  int count;
+  int *sizes;
+  char *msgs;
+}* PTvectorlist;
+
+/*
 typedef struct {
   int refCount;
   int flag;
 typedef struct {
   int refCount;
   int flag;
@@ -45,19 +52,28 @@ class GList {
        void Add(void *);
        void Delete();
 };
        void Add(void *);
        void Delete();
 };
+*/
 
 #define ALIGN8(x)       (int)((~7)&((x)+7))
 
 /* Reduce the no. of mallocs by allocating from
 
 #define ALIGN8(x)       (int)((~7)&((x)+7))
 
 /* Reduce the no. of mallocs by allocating from
- * a free list */
+ * a free list. By allocating 21 at a time, it allocates
+ * 512 contiguous bytes. */
 #define PTALLOC(ktmp) {\
   if (PTFreeList) {\
        ktmp=PTFreeList;\
        PTFreeList=ktmp->next;\
   }\
   else {\
 #define PTALLOC(ktmp) {\
   if (PTFreeList) {\
        ktmp=PTFreeList;\
        PTFreeList=ktmp->next;\
   }\
   else {\
-       ktmp=(PTinfo *)CmiAlloc(sizeof(PTinfo));\
-       }\
+       ktmp=(PTinfo *)CmiAlloc(21*sizeof(PTinfo)+sizeof(PTinfo *));\
+        for (int ii=1; ii<20; ++ii) {\
+          ktmp[ii].next = &(ktmp[ii+1]);\
+        }\
+        ktmp[20].next = NULL;\
+        PTFreeList=&(ktmp[1]);\
+        *((PTinfo**)(&ktmp[21]))=PTFreeChunks;\
+        PTFreeChunks=ktmp;\
+  }\
 }
 
 #define PTFREE(ktmp) {\
 }
 
 #define PTFREE(ktmp) {\
@@ -65,6 +81,8 @@ class GList {
   PTFreeList=ktmp;\
 }
 
   PTFreeList=ktmp;\
 }
 
+#define PTNEXTCHUNK(ktmp)  (*((PTinfo**)(&ktmp[21])));
+
 #define REALLOC(ktmp, ksize) {\
    PTinfo **junkptr=(PTinfo **)CmiAlloc(2*ksize*sizeof(void *));\
    for (int ki=0; ki<ksize;ki++) junkptr[ki]=ktmp[ki];\
 #define REALLOC(ktmp, ksize) {\
    PTinfo **junkptr=(PTinfo **)CmiAlloc(2*ksize*sizeof(void *));\
    for (int ki=0; ki<ksize;ki++) junkptr[ki]=ktmp[ki];\
@@ -78,11 +96,12 @@ class PeTable {
     CkVec<PTinfo *> ptrvec;
 
     PTinfo *PTFreeList;
     CkVec<PTinfo *> ptrvec;
 
     PTinfo *PTFreeList;
+    PTinfo *PTFreeChunks;
     // char * CombBuffer;
     int *msgnum, *MaxSize;
     int NumPes;
     int magic;
     // char * CombBuffer;
     int *msgnum, *MaxSize;
     int NumPes;
     int magic;
-    GList *FreeList;
+    //GList *FreeList;
 
     inline int TotalMsgSize(int npe, int *pelist, int *nm, int *nd) {
         register int totsize=0;
 
     inline int TotalMsgSize(int npe, int *pelist, int *nm, int *nd) {
         register int totsize=0;
@@ -122,7 +141,7 @@ class PeTable {
         tmp->refCount=0;
         tmp->magic=0;
         tmp->offset=0;
         tmp->refCount=0;
         tmp->magic=0;
         tmp->offset=0;
-        tmp->freelistindex=-1;
+        /*tmp->freelistindex=-1;*/
         tmp->msgsize=size;
         tmp->msg=msg;
         
         tmp->msgsize=size;
         tmp->msg=msg;
         
@@ -156,6 +175,9 @@ class PeTable {
     char * ExtractAndPack(comID, int, int, int *pelist, int *length); 
     char * ExtractAndPackAll(comID id, int ufield, int *length);
     
     char * ExtractAndPack(comID, int, int, int *pelist, int *length); 
     char * ExtractAndPackAll(comID id, int ufield, int *length);
     
+    struct ptvectorlist * ExtractAndVectorize(comID, int, int, int *pelist); 
+    struct ptvectorlist * ExtractAndVectorizeAll(comID id, int ufield);
+    
     void GarbageCollect();
     void Purge();
 };
     void GarbageCollect();
     void Purge();
 };