00001
00002
00003
00004
00005
00006
00007
00008 #ifndef ROUTER_STRATEGY
00009 #define ROUTER_STRATEGY
00010
00011 #include "convcomlibmanager.h"
00012
00013 #include "gridrouter.h"
00014 #include "graphrouter.h"
00015 #include "de.h"
00016 #include "treerouter.h"
00017 #include "3dgridrouter.h"
00018 #include "prefixrouter.h"
00019
00020 class RouterStrategy : public Strategy {
00021
00022 Router * router;
00023 CkQ<MessageHolder *> msgQ;
00024 CkQ<char *> recvQ, procQ;
00025 CkQ<DummyMsg *> dummyQ;
00026
00027 comID id;
00028 int *pelist;
00029 int npes;
00030 int *procMap;
00031 int *bcast_pemap;
00032 int myPe;
00033 int routerID;
00034
00035 int doneHandle;
00036 int myDoneHandle;
00037
00038
00039 int doneFlag, bufferedDoneInserting;
00040
00041 void setReverseMap();
00042
00043 public:
00044
00045
00046
00047
00048 RouterStrategy(int stratid, int handle, int npes, int *pelist);
00049 RouterStrategy(CkMigrateMessage *m): Strategy(m){}
00050
00051 ~RouterStrategy();
00052
00053
00054 void insertMessage(MessageHolder *msg);
00055
00056 void doneInserting();
00057
00058
00059 void RecvManyMsg(char *msg);
00060 void ProcManyMsg(char *msg);
00061 void DummyEP(DummyMsg *m);
00062
00063 void Done(DummyMsg *m);
00064
00065 int * getProcMap() {return procMap;}
00066
00067 virtual void pup(PUP::er &p);
00068 PUPable_decl(RouterStrategy);
00069 };
00070
00071
00072
00073 inline void RouterStrategy::RecvManyMsg(char *msg) {
00074
00075
00076 int new_refno =0;
00077
00078
00079 ComlibPrintf("In RecvManyMsg at %d\n", CkMyPe());
00080
00081
00082
00083
00084 memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int),
00085 sizeof(int));
00086
00087 if(new_refno != id.refno)
00088 recvQ.push(msg);
00089 else
00090 router->RecvManyMsg(id, msg);
00091 }
00092
00093 inline void RouterStrategy::ProcManyMsg(char *msg) {
00094
00095
00096 int new_refno =0;
00097 ComlibPrintf("In ProcManyMsg at %d\n", CkMyPe());
00098
00099
00100 memcpy(&new_refno, (char*) msg + CmiReservedHeaderSize + sizeof(int),
00101 sizeof(int));
00102
00103 if(new_refno != id.refno)
00104 procQ.push(msg);
00105 else
00106 router->ProcManyMsg(id, msg);
00107 }
00108
00109 inline void RouterStrategy::DummyEP(DummyMsg *m) {
00110
00111 if(id.refno != m->id.refno)
00112 dummyQ.push(m);
00113 else {
00114 router->DummyEP(m->id, m->magic);
00115 CmiFree(m);
00116 }
00117 }
00118
00119 #endif