00001
00008 #ifndef ROUTER_H
00009 #define ROUTER_H
00010
00011
00012 #include "cklists.h"
00013 #include "convcomlibmanager.h"
00014 #include <math.h>
00015
00016
00017
00018
00019 #define MAXNUMMSGS 1000
00020
00024 typedef struct {
00025 int refno;
00026 int instanceID;
00027 char isAllToAll;
00028 } comID;
00029 inline void operator|(PUP::er& p, comID& id) {
00030 p | id.refno;
00031 p | id.instanceID;
00032 p | id.isAllToAll;
00033 }
00034
00035 typedef struct {
00036 int msgsize;
00037 void *msg;
00038 } msgstruct ;
00039
00040 typedef struct {
00041 char core[CmiReservedHeaderSize];
00042 comID id;
00043 int magic;
00044 int refno;
00045 } DummyMsg ;
00046
00047
00048 CkpvExtern(int, RouterRecvHandle);
00049
00050 CkpvExtern(int, RouterProcHandle);
00051
00052 CkpvExtern(int, RouterDummyHandle);
00053
00054
00055
00056 CkpvExtern(int, RecvdummyHandle);
00057
00058 inline double cubeRoot(double d) {
00059 return pow(d,1.0/3.0);
00060 }
00061
00062
00063
00064
00071 class Router
00072 {
00073
00074 protected:
00075 Strategy *container;
00076
00077 public:
00078 Router(Strategy *cont) : container(cont) {};
00079 virtual ~Router() {};
00080
00083 virtual void EachToAllMulticast(comID id, int size, void *msg, int more)
00084 {CmiPrintf("Not impl\n");}
00085
00094 virtual void EachToManyMulticast(comID id, int size, void *msg,
00095 int numPes, int *pelist, int more)
00096 {CmiPrintf("Not impl\n");}
00097
00099 virtual void EachToManyMulticastQ(comID id, CkQ<MessageHolder *> &msgq){
00100 MessageHolder *mhdl;
00101 int len = msgq.length();
00102 for(int count = 0; count < len - 1; count++) {
00103 mhdl = msgq.deq();
00104 EachToManyMulticast(id, mhdl->size, mhdl->getMessage(),
00105 mhdl->npes, mhdl->pelist, 1);
00106 delete mhdl;
00107 }
00108 mhdl = msgq.deq();
00109 EachToManyMulticast(id, mhdl->size, mhdl->getMessage(),
00110 mhdl->npes, mhdl->pelist, 0);
00111 delete mhdl;
00112 }
00113
00114
00115
00116 virtual void RecvManyMsg(comID, char *) {CmiPrintf("Not Impl\n");}
00117
00118
00119
00120 virtual void ProcManyMsg(comID, char *) {CmiPrintf("Not Impl\n");}
00121
00122
00123 virtual void DummyEP(comID, int ) {CmiPrintf("Base Dummy\n");}
00124
00128 virtual void SetMap(int *) {}
00129
00130
00131 void SendDummyMsg(comID id, int pe, int magic) {
00132
00133 ComlibPrintf("[%d] Send Dummy to %d\n", CkMyPe(), pe);
00134
00135 DummyMsg *m=(DummyMsg *)CmiAlloc(sizeof(DummyMsg));
00136 CmiSetHandler(m, CkpvAccess(RouterDummyHandle));
00137 m->id=id;
00138 m->magic=magic;
00139 CmiSyncSendAndFree(pe, sizeof(DummyMsg),(char*) m);
00140 }
00141
00143
00144
00145
00146
00148 void Done(comID id) {
00149 Strategy *myStrategy = ConvComlibGetStrategy(id.instanceID);
00150 myStrategy->notifyDone();
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 }
00163 };
00164
00165 #endif
00166
00167