recover of wrong flag checked it
[charm.git] / src / conv-com / petable.h
index ff8bc948a534caf6704dd0833899e8e56ad66cc6..28a07b4f7286ff5b376d64b4243c116b0756851a 100644 (file)
 #define NULL 0
 #endif
 
+#define CMK_COMMLIB_USE_VECTORIZE 0
+
 #define MSGQLEN 32
 
 typedef struct ptinfo {
   int refCount;
   int magic;
   int offset;
-  int freelistindex;
+  /*int freelistindex;*/
   int msgsize;
   void *msg;
   struct ptinfo * next;
 } PTinfo;
 
+/*
+ * This header is meant for usage with ExtractAndVectorize and
+ * ExtractAndVectorizeAll. It will contain a list of messages with its sizes.
+ * The parent class will later call a CmiFree to sizes and msgs. This will
+ * delete this two arrays, and also the containint ptvectorlist struct. This is
+ * done (in the two functions) by allocating a single message containing both
+ * the ptvectorlist struct, and the two arrays. Throught CmiReference
+ * (incremented only once), when both the arrays are deleted, the struct will
+ * also dirappear.
+ */
+
+typedef struct ptvectorlist {
+  int count;
+  int *sizes;
+  char **msgs;
+}* PTvectorlist;
+
+/*
 typedef struct {
   int refCount;
   int flag;
@@ -45,19 +65,28 @@ class GList {
        void Add(void *);
        void Delete();
 };
+*/
 
 #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 {\
-       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) {\
@@ -65,6 +94,8 @@ class GList {
   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];\
@@ -78,11 +109,12 @@ class PeTable {
     CkVec<PTinfo *> ptrvec;
 
     PTinfo *PTFreeList;
+    PTinfo *PTFreeChunks;
     // 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;
@@ -122,7 +154,7 @@ class PeTable {
         tmp->refCount=0;
         tmp->magic=0;
         tmp->offset=0;
-        tmp->freelistindex=-1;
+        /*tmp->freelistindex=-1;*/
         tmp->msgsize=size;
         tmp->msg=msg;
         
@@ -156,6 +188,9 @@ class PeTable {
     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();
 };