00001 #ifndef _sdag_H_
00002 #define _sdag_H_
00003
00004 #include "charm++.h"
00005
00006 class CMsgBuffer {
00007 public:
00008 int entry;
00009 void *msg;
00010 void *bgLog1;
00011 void *bgLog2;
00012 int refnum;
00013 CMsgBuffer *next;
00014
00015 CMsgBuffer(int e, void *m, void* l1, int r) : entry(e), msg(m), bgLog1(l1), bgLog2(NULL),refnum(r), next(NULL) {}
00016 CMsgBuffer(int e, void *m, int r) : entry(e), msg(m), bgLog1(NULL), bgLog2(NULL),refnum(r), next(NULL) {}
00017 CMsgBuffer(): bgLog1(NULL), bgLog2(NULL), next(NULL) {}
00018 void pup(PUP::er& p) {
00019 p|entry;
00020 CkPupMessage(p, &msg);
00021 p|refnum;
00022 if (p.isUnpacking()) {
00023 bgLog1 = bgLog2 = NULL;
00024 }
00025 }
00026 };
00027
00028 #define MAXARG 8
00029 #define MAXANY 8
00030 #define MAXREF 8
00031
00032 class CWhenTrigger {
00033 public:
00034 int whenID, nArgs;
00035 size_t args[MAXARG];
00036 int nAnyEntries;
00037 int anyEntries[MAXANY];
00038 int nEntries;
00039 int entries[MAXREF];
00040 int refnums[MAXREF];
00041
00042 CWhenTrigger *next;
00043 CWhenTrigger(int id, int na, int ne, int nae) :
00044 whenID(id), nArgs(na), nAnyEntries(nae), nEntries(ne), next(NULL) {}
00045 CWhenTrigger(): next(NULL) {}
00046 void pup(PUP::er& p) {
00047 p|whenID;
00048 p|nArgs;
00049 p(args, MAXARG);
00050 p|nAnyEntries;
00051 p(anyEntries, MAXANY);
00052 p|nEntries;
00053 p(entries, MAXREF);
00054 p(refnums, MAXREF);
00055
00056
00057
00058 p(args, MAXARG);
00059
00060 }
00061 };
00062
00063
00064
00065
00066
00067 class TListCWhenTrigger
00068 {
00069 private:
00070
00071 CWhenTrigger *first, *last;
00072 CWhenTrigger *current;
00073
00074 public:
00075
00076 TListCWhenTrigger(void) : first(0), last(0) {;}
00077
00078 void pup(PUP::er& p) {
00079 int nEntries=0;
00080 int cur=-1;
00081 if (!p.isUnpacking()) {
00082 for (CWhenTrigger *tmp = first; tmp; tmp=tmp->next, nEntries++)
00083 if (current == tmp) cur = nEntries;
00084 }
00085 p|nEntries;
00086 p|cur;
00087 if (p.isUnpacking()) {
00088 first = last = current = NULL;
00089 if (nEntries) {
00090 CWhenTrigger** unpackArray = new CWhenTrigger*[nEntries];
00091 for (int i=0; i<nEntries; i++) {
00092 unpackArray[i] = new CWhenTrigger;
00093 if (i!=0) unpackArray[i-1]->next=unpackArray[i];
00094 }
00095 first = unpackArray[0];
00096 last = unpackArray[nEntries-1];
00097 last->next = NULL;
00098 current = cur==-1?NULL:unpackArray[cur];
00099 delete [] unpackArray;
00100 }
00101 }
00102 for (CWhenTrigger *tmp = first; tmp; tmp=tmp->next) tmp->pup(p);
00103 }
00104
00105 int empty(void) { return ! first; }
00106
00107 CWhenTrigger *begin(void) {
00108 return (current = first);
00109 }
00110
00111 int end(void) {
00112 return (current == 0);
00113 }
00114
00115 CWhenTrigger *next (void) {
00116 return (current = current->next);
00117 }
00118
00119 CWhenTrigger *front(void)
00120 {
00121 return first;
00122 }
00123
00124 void remove(CWhenTrigger *data)
00125 {
00126
00127 if (first == 0)
00128 return;
00129
00130 if(first == data) {
00131 first = first->next;
00132 if(first==0) last=0;
00133 return;
00134 }
00135
00136 CWhenTrigger *nn;
00137 CWhenTrigger *prev = first;
00138 for(nn=first->next; nn; nn = nn->next) {
00139 if (nn == data) {
00140 prev->next = nn->next;
00141 if(nn==last)
00142 last=prev;
00143 return;
00144 }
00145 prev = nn;
00146 }
00147 }
00148
00149 void append(CWhenTrigger *data)
00150 {
00151 data->next = 0;
00152 if(first == 0) {
00153 last = first = data;
00154 } else {
00155 last->next = data;
00156 last = last->next;
00157 }
00158 }
00159 };
00160
00161 class TListCMsgBuffer
00162 {
00163 private:
00164
00165 CMsgBuffer *first, *last;
00166 CMsgBuffer *current;
00167
00168 public:
00169
00170 TListCMsgBuffer(void) : first(0), last(0) {}
00171
00172 void pup(PUP::er& p) {
00173 int nEntries=0;
00174 int cur=0;
00175 if (!p.isUnpacking()) {
00176 for (CMsgBuffer *tmp = first; tmp; tmp=tmp->next, nEntries++) {
00177 if (current == tmp) cur = nEntries;
00178 }
00179 }
00180 p|nEntries;
00181 p|cur;
00182 if (p.isUnpacking()) {
00183 first = last = current = NULL;
00184 if (nEntries) {
00185 CMsgBuffer** unpackArray = new CMsgBuffer*[nEntries];
00186 for (int i=0; i<nEntries; i++) {
00187 unpackArray[i] = new CMsgBuffer;
00188 if (i!=0) unpackArray[i-1]->next=unpackArray[i];
00189 }
00190 first = unpackArray[0];
00191 last = unpackArray[nEntries-1];
00192 current = unpackArray[cur];
00193 delete [] unpackArray;
00194 }
00195 }
00196 for (CMsgBuffer *tmp = first; tmp; tmp=tmp->next) tmp->pup(p);
00197 }
00198
00199 int empty(void) { return ! first; }
00200
00201 CMsgBuffer *begin(void) {
00202 return (current = first);
00203 }
00204
00205 int end(void) {
00206 return (current == 0);
00207 }
00208
00209 CMsgBuffer *next (void) {
00210 return (current = current->next);
00211 }
00212
00213 CMsgBuffer *front(void)
00214 {
00215 return first;
00216 }
00217
00218 void remove(CMsgBuffer *data)
00219 {
00220
00221 if (first == 0)
00222 return;
00223
00224 if(first == data) {
00225 first = first->next;
00226 if(first==0) last=0;
00227 return;
00228 }
00229
00230 CMsgBuffer *nn;
00231 CMsgBuffer *prev = first;
00232 for(nn=first->next; nn; nn = nn->next) {
00233 if (nn == data) {
00234 prev->next = nn->next;
00235 if(nn==last)
00236 last=prev;
00237 return;
00238 }
00239 prev = nn;
00240 }
00241 }
00242
00243 void append(CMsgBuffer *data)
00244 {
00245 data->next = 0;
00246 if(first == 0) {
00247 last = first = data;
00248 } else {
00249 last->next = data;
00250 last = last->next;
00251 }
00252 }
00253 };
00254
00255
00262 class CDep {
00263 int numEntries, numWhens;
00264 TListCWhenTrigger **whens;
00265 TListCMsgBuffer **buffers;
00266 int *numWhenDepends;
00267 int *numEntryDepends;
00268 TListCMsgBuffer ***whenDepends;
00269 TListCWhenTrigger ***entryDepends;
00270
00271 public:
00272 void pup(PUP::er& p) {
00273
00274
00275
00276
00277
00278 int i;
00279
00280 for (i=0; i<numWhens; i++) whens[i]->pup(p);
00281 for (i=0; i<numEntries; i++) buffers[i]->pup(p);
00282
00283 p(numWhenDepends, numWhens);
00284 p(numEntryDepends, numEntries);
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 }
00306
00307 CDep(int ne, int nw) : numEntries(ne), numWhens(nw) { initMem(); }
00308
00309 ~CDep() {
00310 int i;
00311 delete [] numWhenDepends;
00312 delete [] numEntryDepends;
00313 for(i=0;i<numWhens;i++) {
00314 delete whens[i];
00315 delete [] whenDepends[i];
00316 }
00317 for(i=0;i<numEntries;i++) {
00318 delete buffers[i];
00319 delete [] entryDepends[i];
00320 }
00321 delete [] whens;
00322 delete [] buffers;
00323 delete [] whenDepends;
00324 delete [] entryDepends;
00325 }
00326
00327 private:
00328 void initMem() {
00329
00330 whens = new TListCWhenTrigger *[numWhens];
00331 buffers = new TListCMsgBuffer *[numEntries];
00332 numWhenDepends = new int[numWhens];
00333 numEntryDepends = new int[numEntries];
00334 whenDepends = new TListCMsgBuffer **[numWhens];
00335 entryDepends = new TListCWhenTrigger **[numEntries];
00336 int i;
00337 for(i=0;i<numWhens;i++) {
00338 whens[i] = new TListCWhenTrigger();
00339 whenDepends[i] = new TListCMsgBuffer *[numEntries];
00340 numWhenDepends[i] = 0;
00341 }
00342 for(i=0;i<numEntries;i++) {
00343 buffers[i] = new TListCMsgBuffer();
00344 entryDepends[i] = new TListCWhenTrigger *[numWhens];
00345 numEntryDepends[i] = 0;
00346 }
00347 }
00348
00349 public:
00350
00351
00352 void addDepends(int whenID, int entry) {
00353 whenDepends[whenID][numWhenDepends[whenID]++] = buffers[entry];
00354 entryDepends[entry][numEntryDepends[entry]++] = whens[whenID];
00355 }
00356
00357
00358
00359
00360 void Register(CWhenTrigger *trigger)
00361 {
00362 whens[trigger->whenID]->append(trigger);
00363 }
00364
00365
00366
00367 void deRegister(CWhenTrigger *trigger)
00368 {
00369 whens[trigger->whenID]->remove(trigger);
00370 }
00371
00372
00373
00374 CMsgBuffer* bufferMessage(int entry, void *msg, void* log , int refnum)
00375 {
00376 CMsgBuffer *buf = new CMsgBuffer(entry, msg, log,refnum);
00377 buffers[entry]->append(buf);
00378 return buf;
00379 }
00380
00381
00382
00383
00384
00385
00386 CWhenTrigger *getTrigger(int entry, int refnum)
00387 {
00388 for(int i=0;i<numEntryDepends[entry];i++) {
00389 TListCWhenTrigger *wlist = entryDepends[entry][i];
00390 for(CWhenTrigger *elem=wlist->begin();
00391 !wlist->end();
00392 elem=wlist->next()) {
00393 if(elem==0)
00394 break;
00395 if(depSatisfied(elem)){
00396 deRegister(elem);
00397 return elem;
00398 }
00399 }
00400 }
00401 return 0;
00402 }
00403
00404
00405
00406
00407
00408 CMsgBuffer *getMessage(int entry, int refnum)
00409 {
00410 TListCMsgBuffer *list = buffers[entry];
00411 for(CMsgBuffer *elem=list->begin(); !list->end(); elem=list->next()) {
00412 if(elem==0)
00413 return 0;
00414 if(elem->refnum == refnum)
00415 return elem;
00416 }
00417 return 0;
00418 }
00419
00420
00421
00422
00423
00424 CMsgBuffer *getMessage(int entry)
00425 {
00426 return buffers[entry]->front();
00427 }
00428
00429
00430 void removeMessage(CMsgBuffer *msg)
00431 {
00432 TListCMsgBuffer *list = buffers[msg->entry];
00433 list->remove(msg);
00434 }
00435
00436
00437
00438 int depSatisfied(CWhenTrigger *trigger)
00439 {
00440 int i;
00441 for(i=0;i<trigger->nEntries;i++) {
00442 if(!getMessage(trigger->entries[i], trigger->refnums[i]))
00443 return 0;
00444 }
00445 for(i=0;i<trigger->nAnyEntries;i++) {
00446 if(!getMessage(trigger->anyEntries[i]))
00447 return 0;
00448 }
00449 return 1;
00450 }
00451 };
00452
00453
00459 class COverDep {
00460
00461 int numOverlaps, numWhens;
00462 TListCWhenTrigger **whens;
00463 int *numOverlapDepends;
00464 TListCWhenTrigger ***overlapDepends;
00465
00466 public:
00467 void pup(PUP::er& p) {
00468
00469
00470
00471
00472 int i;
00473 for (i=0; i<numWhens; i++) whens[i]->pup(p);
00474
00475 p(numOverlapDepends, numOverlaps);
00476 }
00477
00478 COverDep(int no, int nw) : numOverlaps(no), numWhens(nw) { initMem(); }
00479
00480 ~COverDep() {
00481 int i;
00482 delete [] numOverlapDepends;
00483 for(i=0;i<numWhens;i++) {
00484 delete whens[i];
00485 }
00486 for(i=0;i<numOverlaps;i++) {
00487 delete [] overlapDepends[i];
00488
00489 }
00490 delete [] whens;
00491 delete [] overlapDepends;
00492 }
00493
00494 private:
00495 void initMem() {
00496
00497 whens = new TListCWhenTrigger *[numWhens];
00498 numOverlapDepends = new int[numOverlaps];
00499 overlapDepends = new TListCWhenTrigger **[numOverlaps];
00500 int i;
00501 for(i=0;i<numWhens;i++) {
00502 whens[i] = new TListCWhenTrigger();
00503 }
00504 for(i=0;i<numOverlaps;i++) {
00505 overlapDepends[i] = new TListCWhenTrigger *[numWhens];
00506 numOverlapDepends[i] = 0;
00507 }
00508 }
00509
00510 public:
00511
00512
00513 void addOverlapDepends(int whenID, int overlap) {
00514 overlapDepends[overlap][whenID] = whens[whenID];
00515
00516 }
00517
00518
00519
00520
00521 void Register(CWhenTrigger *trigger)
00522 {
00523 whens[trigger->whenID]->append(trigger);
00524 }
00525
00526
00527
00528 void deRegister(CWhenTrigger *trigger)
00529 {
00530 whens[trigger->whenID]->remove(trigger);
00531 }
00532
00533
00534
00535
00536
00537
00538
00539 CWhenTrigger *getTrigger(int overlapID, int whenID)
00540 {
00541 TListCWhenTrigger *wlist = overlapDepends[overlapID][whenID];
00542 CWhenTrigger *elem=wlist->begin();
00543 if (elem == 0)
00544 return 0;
00545 else {
00546 deRegister(elem);
00547 return elem;
00548 }
00549 }
00550 };
00551
00552 class CCounter {
00553 private:
00554 unsigned int count;
00555 public:
00556 CCounter(int c) : count(c) {}
00557 CCounter(int first, int last, int stride) {
00558 count = ((last-first)/stride)+1;
00559 }
00560 void decrement(void) {count--;}
00561 int isDone(void) {return (count==0);}
00562 };
00563
00564 #endif