added a variable higherLevel and a method deliverer to be used to uniform the
[charm.git] / src / conv-com / petable.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #ifndef PETABLE_H
9 #define PETABLE_H
10
11 #ifndef NULL
12 #define NULL 0
13 #endif
14
15 #define MSGQLEN 32
16
17 typedef struct ptinfo {
18   int refCount;
19   int magic;
20   int offset;
21   int freelistindex;
22   int msgsize;
23   void *msg;
24   struct ptinfo * next;
25 } PTinfo;
26
27 typedef struct {
28   int refCount;
29   int flag;
30   void * ptr;
31 } InNode;
32
33 class GList {
34  private:
35         InNode *InList;
36         int InListIndex;
37  public:
38         GList();
39         ~GList();
40         int AddWholeMsg(void *);
41         void setRefcount(int, int);
42         void DeleteWholeMsg(int);
43         void DeleteWholeMsg(int, int);
44         void GarbageCollect();
45         void Add(void *);
46         void Delete();
47 };
48
49 #define ALIGN8(x)       (int)((~7)&((x)+7))
50
51 /* Reduce the no. of mallocs by allocating from
52  * a free list */
53 #define PTALLOC(ktmp) {\
54   if (PTFreeList) {\
55         ktmp=PTFreeList;\
56         PTFreeList=ktmp->next;\
57   }\
58   else {\
59         ktmp=(PTinfo *)CmiAlloc(sizeof(PTinfo));\
60         }\
61 }
62
63 #define PTFREE(ktmp) {\
64   ktmp->next=PTFreeList;\
65   PTFreeList=ktmp;\
66 }
67
68 #define REALLOC(ktmp, ksize) {\
69    PTinfo **junkptr=(PTinfo **)CmiAlloc(2*ksize*sizeof(void *));\
70    for (int ki=0; ki<ksize;ki++) junkptr[ki]=ktmp[ki];\
71    CmiFree(ktmp);\
72    ktmp=junkptr;\
73 }
74
75 class PeTable {
76   private:
77     PTinfo ***PeList;
78     CkVec<PTinfo *> ptrvec;
79
80     PTinfo *PTFreeList;
81     //  char * CombBuffer;
82     int *msgnum, *MaxSize;
83     int NumPes;
84     int magic;
85     GList *FreeList;
86
87     inline int TotalMsgSize(int npe, int *pelist, int *nm, int *nd) {
88         register int totsize=0;
89         magic++;
90         *nm=0;
91         *nd=0;        
92         
93         for (int i=0;i<npe;i++) {            
94             int index = pelist[i];            
95             *nm += msgnum[index];
96             
97             ComlibPrintf("%d: NUM MSGS %d, %d\n", CmiMyPe(), index, 
98                          msgnum[index]);
99             
100             for (int j=0;j<msgnum[index];j++) {
101                 if (PeList[index][j]->magic != magic) {                    
102                     int tmp_size = PeList[index][j]->msgsize;
103                     tmp_size = ALIGN8(tmp_size);                
104                     totsize += tmp_size;                
105                     totsize += sizeof(int)+sizeof(int);                    
106                     PeList[index][j]->magic=magic;
107                     (*nd)++;
108                 }
109             }
110         }
111         return(totsize);
112     }
113
114  public:
115     
116     PeTable(int n);
117     ~PeTable();
118     
119     inline void InsertMsgs(int npe, int *pelist, int size, void *msg) {
120         PTinfo *tmp;
121         PTALLOC(tmp);
122         tmp->refCount=0;
123         tmp->magic=0;
124         tmp->offset=0;
125         tmp->freelistindex=-1;
126         tmp->msgsize=size;
127         tmp->msg=msg;
128         
129         for (int j=0;j<npe;j++) {
130             tmp->refCount++;
131             int index=pelist[j];
132             
133             ComlibPrintf("[%d] Inserting %d %d %d\n", CkMyPe(), 
134                          msgnum[index], index, size);
135             
136             if (msgnum[index] >= MaxSize[index]) {
137                 REALLOC(PeList[index], MaxSize[index]);
138                 MaxSize[index] *= 2;
139             }
140             PeList[index][msgnum[index]]=tmp;
141             msgnum[index]++;
142         }
143     }
144
145     inline void InsertMsgs(int npe, int *pelist, int nmsgs, void **msglist){
146         msgstruct **m=(msgstruct **)msglist;
147         for (int i=0;i<nmsgs;i++)
148             InsertMsgs(npe, pelist, m[i]->msgsize, m[i]->msg);
149     }
150         
151     void ExtractAndDeliverLocalMsgs(int pe);
152     
153     int UnpackAndInsert(void *in);
154     int UnpackAndInsertAll(void *in, int npes, int *pelist);
155     
156     char * ExtractAndPack(comID, int, int, int *pelist, int *length); 
157     char * ExtractAndPackAll(comID id, int ufield, int *length);
158     
159     void GarbageCollect();
160     void Purge();
161 };
162
163 #endif